on  it road.com

主机名模式

使用包含 % 或者 _ 通配符的主机模式设置一个帐户,使用户能够从整个域或者子网中的任何主机进行连接。
如果在编写帐户管理语句时省略帐户名的主机部分,MySQL 假定主机名为 %。

%.example.com 的主机值与 example.com 域中的任何主机匹配。
主机值 192.168.% 匹配 192.168 子网中的任何主机。
主机值 % 匹配任何主机,允许用户从任何主机连接。
使用带有子网掩码的 IP 地址,使用户能够从具有该子网内地址的任何主机进行连接。
例如,值 10.0.0.0/255.255.255.0 与 IP 地址的前 24 位中具有 10.0.0 的任何主机匹配。

避免在主机名中使用通配符,除非绝对必要并经过适当审计以避免滥用或者意外暴露。
运行定期检查如下:

mysql> SELECT User, Host FROM mysql.user WHERE Host LIKE '%\%%';

用户名和主机名示例:

  • john@10.20.30.40
  • john@'10.20.30.%'
  • john@'%.ourdomain.com'
  • john@'10.20.30.0/255.255.255.0'

要指定匿名用户帐户(即匹配任何用户名的帐户),请为帐户名称的用户名部分指定一个空字符串:

mysql> CREATE USER ''@'localhost';

避免创建匿名帐户,尤其是没有密码的帐户(如上例所示)。
这有助于避免因开放对 MySQL 安装的访问而带来的安全风险。
如果主机匹配两个或者多个模式,MySQL 会选择最具体的模式。

查看用户帐户设置

查询mysql数据库查看用户身份信息:

mysql> SELECT user, host, password
-> FROM mysql.user WHERE user='root'; 
+------+-----------+-------------------------------------------+ 
| user | host      | password                                  | 
+------+-----------+-------------------------------------------+ 
| root | localhost | *2447D497B9A6A15F2776055CB2D1E9F86758182F | 
| root | 127.0.0.1 | *2447D497B9A6A15F2776055CB2D1E9F86758182F | 
| root | ::1       | *2447D497B9A6A15F2776055CB2D1E9F86758182F |
+------+-----------+-------------------------------------------+ 
3 rows in set (0.00 sec)

查看所有用户信息,包括权限:

mysql> SELECT * FROM mysql.user\G 
* 1. row * 
...
   Select_priv: Y
   Insert_priv: Y
   Update_priv: Y
   Delete_priv: Y
...

mysql 数据库包含服务器上所有用户帐户的信息。
要查看此信息,请运行上面显示的 SELECT 语句。
*_priv 字段中的值 Y 表示权限已启用。
root 帐户具有完全访问权限。
它的所有权限列都具有值 Y。

除了权限之外,用户表还包含在身份验证过程中有用的其他信息。
例如,我们可以在以下输出中看到 tester 用户:

  • 有密码(在Password列中以加密形式可见),并且这个密码没有过期(在password_expired列中用N表示)
  • 没有定义的资源限制(由 max_* 列中的 0 表示)
  • 没有任何 SSL 或者 x509 设置(由 ssl_* 和 x509_* 列中的空白值表示)
  • 使用 mysql_native_password 插件进行身份验证(插件名称列在插件列中。)
*** 1. row ***
                  Host: localhost
                  User: testuser
              Password: *14E65567ABDB5135D0CFD9A70B3032C179A49EE7
           Select_priv: Y
           Insert_priv: N
...
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string:
      password_expired: N
MySQL 用户管理

在 MySQL 中管理用户使我们能够控制用户可以做什么和不能做什么。

  • 创建具有适合其功能的不同权限的用户帐户。
  • 避免使用 root 帐户 - 限制受感染的应用程序并防止在日常维护期间出错。
  • 通过正确分配个人用户权限来确保数据完整性。允许授权用户完成他们的工作。防止未经授权的用户访问超出其权限的数据。

操作用户帐户

使用 RENAME USER 语句重命名用户帐户:

RENAME USER 'jim'@'localhost' TO 'james'@'localhost';

上述查询更改现有帐户的帐户名称或者更改帐户名称的用户名或者主机名部分,或者两者。

使用 DROP USER 语句删除用户帐户:

DROP USER 'jim'@'localhost';

上述查询撤销现有帐户的所有权限,然后删除该帐户。
它还从它们存在的任何授权表中删除帐户的所有记录。

确认密码

为所有用户帐户分配强大的唯一密码。
避免使用容易被猜到的密码。
使用以下 SELECT 语句列出任何帐户
没有密码:

SELECT Host, User FROM mysql.user WHERE Password = '';

识别重复密码:

SELECT User FROM mysql.user GROUP BY password HAVING count(user)>1;

要使任何用户密码过期,请使用以下查询:

ALTER USER jim@localhost PASSWORD EXPIRE;

要发出上述示例中的 SELECT 语句,我们必须使用对 mysql 架构或者 mysql.user 表具有 SELECT 权限的用户帐户进行连接。
我们可以拥有多个应用于特定用户名的帐户。
例如,如果用户 jim 从两个位置登录并且我们为每个位置设置帐户,例如 jim@localhost 和 jim@'192.168.14.38',则标识为 jim 的两个帐户可能具有相同的密码。

我们可以使用 ALTER USER...PASSWORD EXPIRE 语句使用户的密码过期。
如果密码过期,我们必须在下次登录时使用 SET PASSWORD 语句更改密码。
我们执行的所有不以 SET 开头的语句都会返回错误,直到我们更改密码,如下例所示:

mysql> SELECT * FROM City WHERE 1=2;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
mysql> SET PASSWORD = PASSWORD('new_pwd'); 
Query OK, 0 rows affected (0.01 sec) 
mysql> SELECT * FROM City WHERE 1=2;
Empty set (0.00 sec)

创建用户帐户

帐户名称由用户名和用户必须从其连接到服务器的客户端主机的名称组成。
帐户名称的格式为 'user_name'@'host_name '。
用户名最长可达 16 个字符。
如果用户名和主机名包含特殊字符(例如破折号),则必须在用户名和主机名周围使用单引号。
如果值作为不带引号的标识符有效,则引号是可选的。
但是,我们始终可以使用引号。

例如,使用 CREATE USER...IDENTIFIED BY 语句建立一个帐户:
– 对于名为 jim 的用户
– 从本地主机连接
– 使用密码 Abc123

CREATE USER 'jim'@'localhost' IDENTIFIED BY 'Abc123';

创建账户时避免可能的安全风险:

  • 不要创建没有密码的帐户。
  • 不要创建匿名帐户。
  • 如果可能,请在指定帐户主机名时避免使用通配符。

用户账户验证

当我们连接到 MySQL 服务器并执行查询时,它会对我们进行身份验证并授权活动。

  • 身份验证:验证用户的身份。这是访问控制的第一阶段。每次连接时都必须成功验证。如果我们未能通过身份验证,连接将失败,客户端将断开连接。
  • 授权:验证用户的权限。访问控制的第二阶段针对验证成功的活动连接上的每个请求进行。对于每个请求,MySQL 会确定我们要执行的操作,然后检查我们是否有足够的权限来执行此操作。

设置账户密码

在不更改任何权限的情况下更改现有帐户密码的最常见方法是使用 SET PASSWORD 语句。
例如,要将本地主机上 jim 的密码设置为 NewPass,请使用以下语句:

mysql> SET PASSWORD FOR jim@localhost = PASSWORD('NewPass');

如果我们以非 root 用户身份登录并且用户没有 mysql 数据库的 UPDATE 权限,则我们只能更改自己的密码。
通过使用不带 FOR 子句的 SET PASSWORD 语句来执行此操作:

mysql> SET PASSWORD = PASSWORD('NewPass');

使用 SET PASSWORD 时,请使用 PASSWORD() 函数对密码进行加密。
请注意,CREATE USER 语句会自动加密我们提供的密码,因此在使用 CREATE USER 创建用户时无需使用 PASSWORD() 函数。

使用以下 mysqladmin 命令从 shell 设置密码:

shell> mysqladmin -u root password 'rootpass'
shell> mysqladmin -u root -h host_name password 'rootpass'

在前面的示例中,'rootpass' 表示 root 密码,'host_name' 是 root 帐户访问 MySQL 服务器的主机名。

本地身份验证

当我们使用本机密码身份验证插件(默认身份验证机制)连接到 MySQL 服务器时,它会将我们指定的用户名、我们连接的主机以及密码与 mysql.user 表中的行进行匹配,以确定是否我们可以连接并执行操作。

要使用 mysql 客户端连接到本地服务器,请为要使用的帐户指定用户名和密码:

shell> mysql -u[username] -p[password]

请注意,在 mysql.user 表中与用户关联的主机名是指我们从中连接的主机的名称,而不是服务器主机的名称。

要连接到未安装在客户端本地主机上的服务器,请提供要连接的服务器的主机名:

shell> mysql -u[username] -p[password] -h[server_host]
日期:2020-09-17 00:11:15 来源:oir作者:oir