【问题标题】:Best practices for temporarily enabling and disabling a MySQL user account?临时启用和禁用 MySQL 用户帐户的最佳实践?
【发布时间】:2014-06-10 07:11:03
【问题描述】:

我有一个 MySQL 用户帐户,它(仅)用作部署过程的一部分以更改数据库(添加/删除表和列等)。因为这个用户帐户具有这些高权限,所以我想在大多数情况下保持禁用它,并且仅在我们实际进行涉及数据库更改的部署时启用它。最好的方法是什么?几个存储过程(proc_enable、proc_disable 或类似)中的某些内容会非常好,但我似乎找不到任何最佳实践,而且 MySQL 似乎没有简单的启用/禁用切换。

【问题讨论】:

    标签: mysql data-migration user-permissions


    【解决方案1】:

    对于 MySQL 5.7.6 及更高版本(以及 MariaDB 10.4.2 及更高版本),可以使用以下命令锁定和解锁用户帐户:

    ALTER USER 'user_name'@'host' ACCOUNT LOCK;
    ALTER USER 'user_name'@'host' ACCOUNT UNLOCK;
    

    当帐户被锁定时,尝试登录将导致以下消息:

    Access denied for user 'user_name'@'host'.
    Account is locked.
    

    来源:

    【讨论】:

    • 适用于 MaxScale + MariaDB 10.5
    • @sparse 我已更新答案以包含 MariaDB 的版本信息。在 MySQL 中实现此功能后,他们在实现此功能时有些延迟,因此显式版本也应该会有所帮助
    【解决方案2】:

    在尝试了各种方法后,我将用户的主机字段设置为无意义的值,然后返回一个有效值以在需要时重新启用该帐户。此方法可以通过管理员工具或具有适当权限的帐户的 mysql 命令提示符轻松完成,并且不需要保存密码哈希以供以后恢复。

    【讨论】:

    • 这会保留附加给用户的权限吗?
    • @dolmen 我在 MySQL 8.0.25 上测试了这个。创建一个用户,在 . 上添加 SELECT 并在 db.* 上添加 INSERT,然后刷新权限。然后我将主机更改为另一个值,然后刷新权限,INSERT 消失了,但 SELECT 仍然存在(这对我来说很奇怪,为什么一个人会保持与用户的联系,而另一个人却没有)。反过来做了同样的事情,并附加了 INSERT 和 SELECT 权限。也就是说,在恢复到原始主机后,特权被保留,至少对于这次测试。
    • @dolmen 是的,确实如此。
    【解决方案3】:

    将用户的密码哈希(mysql.user.Password)设置为无效的虚拟值(例如,"!")以禁用帐户,并将其设置回原始值以重新启用它。

    【讨论】:

    • 有趣的事实:当您认为自己很聪明,只需将前面的 * 替换为 !,以便您可以轻松地重新启用该帐户时,它就不起作用了。这被忽略了。并不是说你的答案是错误的。替换整个字符串当然可以。
    • @fancyPants 你更新表格后FLUSH PERMISSIONS了吗?
    • 是的,我当然做了,不过是FLUSH PRIVILEGES。
    猜你喜欢
    • 2013-01-17
    • 2021-06-26
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多