RDS for My 的角色型權限模型SQL - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

RDS for My 的角色型權限模型SQL

從 RDS for MySQL 8.0.36 版開始,您無法直接修改mysql資料庫中的資料表。特別是,您無法透過在grant資料表上執行資料操作語言 (DML) 操作來建立資料庫使用者。反之,您可以使用我的SQL帳戶管理陳述式CREATE USER,例如 GRANT、 和 REVOKE,將角色型權限授予使用者。您也無法建立其他類型的物件,例如 mysql 資料庫中已存放的程序。您仍然可以查詢 mysql 資料表。如果您使用二進位日誌複寫,則對來源資料庫執行個體上mysql資料表所做的變更不會複寫至目標叢集。

在某些情況下,您的應用程式可能會使用捷徑來建立使用者或其他物件,方法是插入至 mysql 資料表。若是這樣,請變更您應用程式的程式碼來使用對應的陳述式,例如 CREATE USER

若要在從外部 MySQL 資料庫遷移期間匯出資料庫使用者的中繼資料,請使用下列其中一種方法:

  • 將 MySQL Shell 的執行個體傾印公用程式與篩選條件搭配使用,以排除使用者、角色和授予。下列範例顯示要使用的命令語法。確定 outputUrl 是空的。

    mysqlsh user@host -- util.dumpInstance(outputUrl,{excludeSchemas:['mysql'],users: true})

    如需詳細資訊,請參閱我的SQL參考手冊中的執行個體傾印公用程式、結構描述傾印公用程式和資料表傾印公用程式

  • 使用mysqlpump用戶端公用程式。此範例包含除mysql系統資料庫中的資料表以外的所有資料表。它也包含 CREATE USERGRANT陳述式,以複寫遷移資料庫中的所有使用者SQL。

    mysqlpump --exclude-databases=mysql --users

若要簡化許多使用者或應用程式的權限管理,您可以使用 CREATE ROLE 陳述式來建立具有一組權限的角色。然後,您可以使用 GRANTSET ROLE 陳述式,以及 current_role 函數,將角色指派給使用者或應用程式、切換目前角色,並檢查哪些角色有效。如需 MySQL 8.0 中角色型許可系統的詳細資訊,請參閱我的SQL參考手冊中的使用角色

重要

我們強烈建議您不要直接在您的應用程式中使用主要使用者。而是遵循最佳實務,使用以應用程式所需的最低權限建立的資料庫使用者。

從 8.0.36 版開始, RDS for MySQL 包含具有下列所有權限的特殊角色。此角色已命名為 rds_superuser_role。每個資料庫執行個體的主要管理使用者已授與此角色。rds_superuser_role 角色包含所有資料庫物件的下列權限:

  • ALTER

  • APPLICATION_PASSWORD_ADMIN

  • ALTER ROUTINE

  • CREATE

  • CREATE ROLE

  • CREATE ROUTINE

  • CREATE TEMPORARY TABLES

  • CREATE USER

  • CREATE VIEW

  • DELETE

  • DROP

  • DROP ROLE

  • EVENT

  • EXECUTE

  • INDEX

  • INSERT

  • LOCK TABLES

  • PROCESS

  • REFERENCES

  • RELOAD

  • REPLICATION CLIENT

  • REPLICATION SLAVE

  • ROLE_ADMIN

  • SET_USER_ID

  • SELECT

  • SHOW DATABASES

  • SHOW VIEW

  • TRIGGER

  • UPDATE

  • XA_RECOVER_ADMIN

角色定義還包括 WITH GRANT OPTION,以便管理使用者可以將該角色授與其他使用者。特別是,管理員必須授予使用 MySQL 叢集作為目標執行二進位日誌複寫所需的任何權限。

提示

若要查看許可的完整詳細資訊,請使用下列陳述式。

SHOW GRANTS FOR rds_superuser_role@'%';

當您在 RDS for MySQL 8.0.36 版及更高版本中使用角色授予存取權時,您也可以使用 SET ROLE role_nameSET ROLE ALL陳述式來啟用角色。下列範例會顯示作法。以適當的角色名稱替代 CUSTOM_ROLE

# Grant role to user mysql> GRANT CUSTOM_ROLE TO 'user'@'domain-or-ip-address' # Check the current roles for your user. In this case, the CUSTOM_ROLE role has not been activated. # Only the rds_superuser_role is currently in effect. mysql> SELECT CURRENT_ROLE(); +--------------------------+ | CURRENT_ROLE() | +--------------------------+ | `rds_superuser_role`@`%` | +--------------------------+ 1 row in set (0.00 sec) # Activate all roles associated with this user using SET ROLE. # You can activate specific roles or all roles. # In this case, the user only has 2 roles, so we specify ALL. mysql> SET ROLE ALL; Query OK, 0 rows affected (0.00 sec) # Verify role is now active mysql> SELECT CURRENT_ROLE(); +--------------------------------------------------+ | CURRENT_ROLE() | +--------------------------------------------------+ | `CUSTOM_ROLE`@`%`,`rds_superuser_role`@`%` | +--------------------------------------------------+