MySQL 用户和角色管理入门

MySQL 8.0 正式版目前已发布,MySQL 8.0 增加了很多新的功能,具体可参考「MySQL 8.0 正式版 8.0.11 发布!」一文。

MySQL 8.0 在用户管理方面增加了角色管理,默认的密码加密方式也做了调整,由之前的 改为了 。同时加上 MySQL 5.7 的禁用用户和用户过期的功能,MySQL 在用户管理方面的功能和安全性都较之前版本大大的增强了。

在本教程中,我们将介绍 MySQL 下用户管理上的一些新特性和如何使用角色来简化权限管理。

注:本教程大部分特性要 MySQL 8.0 + 以上版本才支持。

MySQL 用户管理

验证插件和密码加密方式的变化

在 MySQL 8.0 中, 是默认的身份验证插件而不是之前版本的 ,默认的密码加密方式是 。

如果需要保持之前的验证方式并保持之前版本的密码加密方式需要在配置文件 my.cnf 中修改以下配置项并重启服务后生效。

注:此选项暂不支持 MySQL 8.0 动态修改特性。

将 MySQL 8.0 中已有的 密码修改为 的模式。

注:如果没有特殊的原因,建议使用更安全的新加密方式。

用户授权和修改密码

MySQL 8.0 的用户授权语句和之前版本有所区别,老版本的常用授权语句在 MySQL 8.0 版本中 已不能使用,如使用旧版本授权语句会报错。

在 MySQL 8.0 用之前版本授权语句创建用户。

在 MySQL 8.0 版本中正确授权语句。

密码过期时间管理

MySQL 从 5.6.6 开始引入密码自动过期的新功能,并在 MySQL 5.7.4 版本中改进了用户密码过期时间这个特性。现在可以通过一个全局变量 来设置一个全局的自动密码过期策略。

其默认值为 0,表示禁用自动密码过期。 的值如是是正整数 N ,则表示允许的设置密码生存周期 为 N,单位为天 。

全局密码到期策略默认为永久,不过期。

如果你要建立一个全局策略,让所有用户的密码的使用期限为六个月,可在服务端配置文件 my.cnf 中修改 配置项的值为 180。

如果你要恢复全局策略,让所有用户的密码永不过期,可在服务端配置文件 my.cnf 中修改 配置项的值为 0。

参数是支持永久动态设置的,你也可以用以下命令在 MySQL 命令行下直接设置生效。

创建和修改带有密码过期时间的用户示例

创建或修改一个用户的密码过期时间为 90 天。

创建或修改一个用户的密码过期时间为永不过期。

创建或修改一个遵循全局到期策略的用户。

查看用户的密码过期时间。

锁定/解锁用户帐户

从 MySQL 5.7.8 开始,用户管理方面添加了锁定/解锁用户帐户的新特性。下面我们就来看下这个特性的一些具体示例。

创建一个带帐户锁的用户

接下来尝试用新创建的用户登陆,此时会得到一个 ERROR 3118 错误消息提示。

如果你需要解锁此用户,此时就需要使用以下语句对其进行解锁了。

现在,这个用户就已经解锁,再次尝试登陆。

修改一个用户为锁定状态

如果用户已建立,你也可以这样锁定用户帐户。

设置 MySQL 用户密码重用策略

从 MySQL 8.0 开始允许限制重复使用以前的密码。可以根据密码更改次数、已用时间或两者来建立密码重用限制。帐户的密码历史由过去分配的密码组成,MySQL 可以限制从此历史记录中选择新密码。

如果根据密码更改次数限制帐户,则无法从指定数量的最新密码中选择新密码。例如:如果密码更改的最小数量设置为 3,则新密码不能与任何最近的3个密码相同。

如果根据密码修改时间来限制帐户,则无法将指定时间历史记录中的密码中选择为新密码。例如:如果密码重用间隔设置为 60,则新密码不得在最近 60 天内选择的密码相同。

注:空密码不记录在密码历史记录中,并随时可以重复使用。

要建立全局密码重用策略,可修改 和 系统变量。该变量可在服务配置文件 my.cnf 中配置,以禁止重复使用最近 6 个密码或最近 180 天内使用过的任何密码为例。

该参数是支持永久动态设置,也可以直接用下面语句进行设置。

MySQL 角色管理

MySQL 数据库中通常都会出现多个拥有相同权限集合的用户,在之前版本中只有分别向多个用户授予和撤销权限才能实现单独更改每个用户的权限。在用户数量比较多的时候,这样的操作是非常耗时的。

MySQL 8.0 为了用户权限管理更容易,提供了一个角色管理的新功能。角色是指定的权限集合,和用户帐户一样可以对角色进行权限的授予和撤消。如果用户被授予角色权限,则该用户拥有该角色的权限。

MySQL 8.0 提供的角色管理功能如下:

创建角色并授予用户角色权限

这里我们以几种常见场景为例。

应用程序需要读/写权限。

运维人员需要完全访问数据库。

部分开发人员需要读取权限。

部分开发人员需要读写权限。

如果要向多个用户授予相同的权限集,则应按如下步骤来进行。

创建新的角色

授予角色权限

授予用户角色

首先,我们创建四个角色。为了清楚区分角色的权限,建议将角色名称命名得比较直观。

注:角色名称格式类似于由用户和主机部分组成的用户帐户,如:role_name@host_name。如果省略主机部分,则默认为 “%”,表示任何主机。

创建好角色后,我们就给角色授予对应的权限。要授予角色权限,您可以使用 语句。

注:这里假定需授权的数据库名称为 wordpress。

最后根据实际情况,我们将指定用户加入到对应的角色。假设需要一个应用程序使用的帐户、一个运维人员帐户、一个是开发人员只读帐户和两个开发人员读写帐户。

创建新用户

给用户分配角色

如果要将多个用户同时加入多个角色,可以使用类似语句。

检查角色权限

要验证角色是否正确分配,可以使用 语句。

正如你所看到的,和之前版本不同的是 只返回授予角色。如果要显示角色所代表的权限,需要加上 子句和授权角色的名称。

设置默认角色

现在,如果您使用 dev01 用户帐户连接到 MySQL,并尝试访问 wordpress 数据库会出现以下错误。

这是因为在向用户帐户授予角色后,当用户帐户连接到数据库服务器时,它并不会自动使角色变为活动状态。

这里返回 NONE,就意味着当前没有启用任何角色。要在每次用户帐户连接到数据库服务器时指定哪些角色应该处于活动状态,需用使用 语句来指定。

再次使用 dev01 用户帐户连接到 MySQL 数据库服务器并调用 函数,您将看到 dev01 用户帐户的默认角色。

最后通过将当前数据库切换到 wordpress 数据库,并执行 语句和 语句来测试 dev01 帐户的权限。

如上面结果所示,当我们发出 语句时,就收到一个错误。因为 dev01 用户帐户只有读取访问权限。

设置活动角色

用户帐户可以通过指定哪个授权角色处于活动状态来修改当前用户在当前会话中的有效权限。

将活动角色设置为 NONE,表示没有活动角色。

将活动角色设置为所有授予的角色。

将活动角色设置为由 语句设置的默认角色。

同时设置多个活动的角色。

撤消角色或角色权限

正如可以授权某个用户的角色一样,也可以从用户帐户中撤销这些角色。要从用户帐户中撤销角色需要使用 语句。

也可以用于修改角色权限。这不仅影响角色本身权限,还影响任何授予该角色的用户权限。假设想临时让所有开发用户只读,可以使用 从 dev_write 角色中撤消修改权限。我们先来看下用户帐户 dev02 撤消前的权限。

接下来从 dev_write 角色中撤消掉修改权限。

最后我们在来看看 dev02 用户帐户当前权限。

从上面的结果可以看出,角色中撤销权限会影响到该角色中任何用户的权限。因此 dev02 现在已经没有表修改权限(INSERT,UPDATE,和 DELETE 权限已经去掉)。如果要恢复角色的修改权限,只需重新授予它们即可。

删除角色

要删除一个或多个角色,可以使用 语句。

如同 语句一样,删除角色会从授权它的每个帐户中撤消该角色。例如,要删除 dev_read,dev_write角色,可使用以下语句。

复制用户帐户权限到另一个用户

MySQL 8.0 将每一个用户帐户视为角色,因此可以将用户帐户授予另一个用户帐户。例如:将一开发人员帐号权限复制到另一开发人员帐号。

创建一个新的开发用户帐户

将 dev02 用户帐户的权限复制到 dev04 用户帐户

查看 dev04 用户帐户的权限

参考文档

http://www.google.com

http://t.cn/RuTna0t

http://t.cn/RuTnEPH

http://t.cn/RuTnFGz

http://t.cn/RuTnFGz

今日思想

你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

——史蒂夫·乔布斯

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180508G0VGR900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券