使用 root 用户,无法向用户授予角色的 RDS 问题。

4
我有一个mysql rds实例,当你创建实例时,需要声明一个root用户和密码。
接下来我使用terraform创建了一个新的用户并授予角色。但是我遇到了以下错误:
 Error running SQL (GRANT 'test_role' TO 'test_user'@'%'): Error 1227: Access denied; you need (at least one of) the WITH ADMIN, ROLE_ADMIN, SUPER privilege(s) for this operation

撇开terraform不谈,如果我尝试直接使用mysql为用户分配角色,则会收到相同的错误信息。

CREATE ROLE 'test_role';
GRANT SELECT, EXECUTE ON checkpoint_gg.* TO 'test_role';
CREATE USER 'test_user'@'%' IDENTIFIED BY 'password';
GRANT 'test_role' TO 'test_user'@'%';

显示'root'@'%'的授权信息;

'GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE ROLE, DROP ROLE ON *.* TO `root`@`%` WITH GRANT OPTION'
'GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,INNODB_REDO_LOG_ARCHIVE,PASSWORDLESS_USER_ADMIN,SHOW_ROUTINE ON *.* TO `root`@`%` WITH GRANT OPTION'

mysql 8


看起来这是一个类似的未解决问题,来自2019年 - https://stackoverflow.com/questions/56442801/grant-role-to-user-denied-with-error-code-1227-in-mysql-8-0-aws - Kay
我已经成功使用MySQL客户端(而非terraform资源mysql_grant)为新的MySQL用户授予权限,并设置RDS管理员用户,用于在RDS实例创建时完成该操作。我想知道是否terraform正在尝试在管理员用户准备就绪之前运行mysql_grant。在RDS实例就绪后,您能否使用RDS管理员用户手动创建新用户和角色?在资源块mysql_role.checkpoint_developer中添加terraform元参数depends_on = [mysql_role.checkpoint_developer]可能会有所帮助,在其他资源块中相应地添加depends_on - paulg
使用MySQL Workbench,我尝试手动将角色授予用户并得到了相同的错误。因此,我不认为这是问题所在(即使terraform日志显示已创建用户)。我不完全确定您所说的授予权限是什么意思,我正在尝试将角色分配给用户。我可以向用户应用mysql_grant,但无法应用mysql_role。 - Kay
您可以查看我的问题更新,即使运行原始的SQL,最后一步GRANT 'test_role' TO 'test_user'@'%'; 也会出现与@paulg相同的错误。 - Kay
我已经删除了terraform配置,并将问题的内容减少到设置赏金。 - Kay
2个回答

6

我联系了aws技术支持,他们成功复制了该问题并提出了解决方案。

aws技术支持

由于RDS是一项托管服务,为了维护系统的完整性和稳定性,即使是DB实例的主用户也不会被授予超级用户权限,因此,预计会出现此类错误消息,因为默认情况下,RDS MySQL主用户没有ADMIN、ROLE_ADMIN、SUPER特权。

他们建议,有趣的是,主/根用户可以将这些角色分配给自己。

GRANT ROLE_ADMIN on *.* to root;

一旦它获得了该特权,我们就可以将角色授予用户。

GRANT 'test_role' TO 'test_user'@'%';

我不知道主管理员用户(非rdsadmin)可以授予自己管理员角色,即使它本身不是管理员或没有超级权限。


那么没有超级管理员账户,我们该如何管理数据库呢?我们创建的超级用户只有 USAGE 权限? - mahen3d
传奇!这个方法真是太有效了。 - undefined

-3
  1. 请尝试使用除root以外的主用户名创建rds集群,它可以是保留用户名。

  2. 如错误中所述,您的用户没有ADMIN、ROLE_ADMIN或SUPER权限。授予其中一个权限。 同时确保您实际上使用的是@'%'用户,而不是@'localhost'


嘿,冷静点,我只是想帮你。 如果你没有变量来设置用户名,这并不意味着tf模块在幕后没有它。https://awscli.amazonaws.com/v2/documentation/api/2.0.34/reference/rds/create-db-cluster.html[--master-username ] [--master-user-password ]https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance username = "foo" password = "foobarbaz" - Michal Koškin
https://dev.mysql.com/doc/refman/8.0/en/reserved-accounts.html https://dba.stackexchange.com/questions/52278/not-able-to-login-on-mysql-in-aws-rds-using-root - Michal Koškin
你提到的所有内容都没有帮助。 - Kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接