《数据库》第一次作业:MySQL数据库账户及授权

1. 密码策略

  • 从 MySQL 8.0开始,默认身份验证插件从 mysql_native_password 更改为 caching_sha2_password

  • MySQL 5.7 的默认密码插件一直以来都是 mysql_native_password。拥有密码验证快的优点,无需在网络中发送实际密码,并且不需要加密的连接。然而,mysql_native_password 依赖于 SHA1 算法,但 NIST(美国国家标准与技术研究院)已建议停止使用 SHA1 算法,因为 SHA1 和其他哈希算法(例如 MD5)已被证明非常容易破解

  • 查看数据库当前密码策略:

sql 复制代码
mysql> show  variables like "%password%";
+----------------------------------------------+-----------------+
| Variable_name                                | Value           |
+----------------------------------------------+-----------------+
| # 是否自动生成RSA密钥对文件
  caching_sha2_password_auto_generate_rsa_keys | ON              |
| # 哈希回合数
  caching_sha2_password_digest_rounds          | 5000            |
| # RSA 私钥文件
  caching_sha2_password_private_key_path       | private_key.pem |
| # RSA 公钥文件
  caching_sha2_password_public_key_path        | public_key.pem  |
| # MySQL密码过期时间,单位为天
  default_password_lifetime                    | 0               |
| # 超时断开
  disconnect_on_expired_password               | ON              |
| # 随机密码长度
  generated_random_password_length             | 20              |
| # 是否支持代理用户控制认证插件
  mysql_native_password_proxy_users            | OFF             |
| # 不允许用户使用最近n次使用过的密码
  password_history                             | 0               |
| # 修改密码时是否需要提供当前用户使用的密码,OFF不需要,ON需要
  password_require_current                     | OFF             |
| # 不允许用户使用最近n天内使用过的密码
  password_reuse_interval                      | 0               |
| 
  report_password                              |                 |
| 
  sha256_password_auto_generate_rsa_keys       | ON              |
| 
  sha256_password_private_key_path             | private_key.pem |
| 
  sha256_password_proxy_users                  | OFF             |
| 
  sha256_password_public_key_path              | public_key.pem  |
+----------------------------------------------+-----------------+
  • 查看密码设置策略
sql 复制代码
mysql> show  variables like "%password%";
+----------------------------------------------+-----------------+
| Variable_name                                | Value           |
+----------------------------------------------+-----------------+
| # 是否自动生成RSA密钥对文件
  caching_sha2_password_auto_generate_rsa_keys | ON              |
| # 哈希回合数
  caching_sha2_password_digest_rounds          | 5000            |
| # RSA 私钥文件
  caching_sha2_password_private_key_path       | private_key.pem |
| # RSA 公钥文件
  caching_sha2_password_public_key_path        | public_key.pem  |
| # MySQL密码过期时间,单位为天
  default_password_lifetime                    | 0               |
| # 超时断开
  disconnect_on_expired_password               | ON              |
| # 随机密码长度
  generated_random_password_length             | 20              |
| # 是否支持代理用户控制认证插件
  mysql_native_password_proxy_users            | OFF             |
| # 不允许用户使用最近n次使用过的密码
  password_history                             | 0               |
| # 修改密码时是否需要提供当前用户使用的密码,OFF不需要,ON需要
  password_require_current                     | OFF             |
| # 不允许用户使用最近n天内使用过的密码
  password_reuse_interval                      | 0               |
| 
  report_password                              |                 |
| 
  sha256_password_auto_generate_rsa_keys       | ON              |
| 
  sha256_password_private_key_path             | private_key.pem |
| 
  sha256_password_proxy_users                  | OFF             |
| 
  sha256_password_public_key_path              | public_key.pem  |
+----------------------------------------------+-----------------+
  • 密码强度检查等级解释(validate_password.policy)
sql 复制代码
mysql> SHOW VARIABLES LIKE 'validate_password%';
Empty set (0.01 sec)
# 注意:若显示为空,则表示未安装插件
mysql> INSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.01 sec)

mysql> show  variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| # 是否能将密码设置成当前用户名
  validate_password.check_user_name    | ON     |
| # 插件用于验证密码强度的字典文件路径,默认为空
  validate_password.dictionary_file    |        |
| # 密码最小长度,默认为8,有最小值为4的限制
  validate_password.length             | 8      |
| # 密码至少要包含的小写字母和大写字母的个数
  validate_password.mixed_case_count   | 1      |
| # 密码至少要包含的数字个数
  validate_password.number_count       | 1      |
| # 密码强度检查等级
  validate_password.policy             | MEDIUM |
| # 密码必须包含的特殊字符个数
  validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
  • 设置密码强度检查等级解释(validate_password.policy)
等级 检查对象
0 or LOW 检查长度
1 or MEDIUM 检查长度、数字、大小写、特殊字符
2 or STRONG 检查长度、数字、大小写、特殊字符、字典文件
  • 设置密码强度检查参数
sql 复制代码
mysql> show variables like 'validate_password.%';  # 查看密码策略

# 设置密码验证强度检查策略
mysql> set global validate_password.policy=low;  # 或0

# 设置至少要包含大/小写字母的个数
mysql> set  global  validate_password.mixed_case_count=0;

# 设置至少要包含数字的个数
mysql> set  global  validate_password.number_count=6;

# 设置至少包含特殊字符个数
mysql> set  global  validate_password.special_char_count=0;

# 设置密码长度
mysql> set  global  validate_password.length=6;  


mysql> show variables like 'validate_password.%';  # 再次查看
+-------------------------------------------------+-------+
| Variable_name                                   | Value |
+-------------------------------------------------+-------+
| validate_password.changed_characters_percentage | 0     |
| validate_password.check_user_name               | ON    |
| validate_password.dictionary_file               |       |
| validate_password.length                        | 6     |
| validate_password.mixed_case_count              | 0     |
| validate_password.number_count                  | 6     |
| validate_password.policy                        | LOW   |
| validate_password.special_char_count            | 0     |
+-------------------------------------------------+-------+
8 rows in set, 1 warning (0.00 sec)

mysql> flush  privileges;       # 刷新权限,生效
Query OK, 0 rows affected (0.01 sec)
  • 修改密码
sql 复制代码
mysql> select user, host, plugin from mysql.user;  # 查看root用户信息

mysql> alter user 'root'@'localhost' identified by '123456';
# 注意:主机名为localhost,远程主机为%

mysql> flush  privileges;
Query OK, 0 rows affected (0.01 sec)

2. 登陆账户管理

  • mysql8的账户权限管理原则:先创建账户,在赋予权限

  • 用户信息存放在 mysql数据库下的 user 表

sql 复制代码
mysql> select user();   # 查看当前的用户信息

mysql> use mysql;

mysql> show tables;

mysql> desc user;

mysql> select user,host,authentication_string from user;

3. 新建登陆账户

  • 格式
sql 复制代码
create  user  'username'@'localhost'  identified  by  'password';
  • 含义
  • username: 创建的用户名

  • localhost: 指定该用户在哪个主机上可以登陆,如果是本地用户可用 localhost ,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %

  • password: 该用户的登陆密码

  • 示例
sql 复制代码
mysql> create user  'test1'@'localhost' identified by '123456';
# 注意:密码要符合密码设置规则

mysql> select user, host, plugin from mysql.user;  # 查看信息

mysql> exit
Bye

PS C:\Users\Administrator> mysql -u test1 -p
Enter password: ******    # test账户登录

mysql> show databases;   # 只能看到有限的库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.01 sec)

4. 账户授权

  • 作用:通过账户权限限制普通账户的工作范围及内容,赋权原则如下:

    • root账号绝对禁止允许任何IP都可以访问,即登录方式不能用%

    • 应用账号和管理账号要分离

    • 赋权最小化,即一般只给select权限,最好不要给update、insert等编辑权限

    • 密码设置合理

    • 定期清理不使用的账户,将其收回权限或删除

  • 常见的用户权限

  • 查看权限
sql 复制代码
mysql> exit
Bye

PS C:\Users\Administrator> mysql -u root -p

mysql> show  grants;   # 查看当前账户

mysql> show  grants for  'test1'@'localhost';  # 查看其它账户权限
+----------------------------------+
| Grants for test1@%                |
+----------------------------------+
| GRANT USAGE ON *.* TO `test1`@`localhost` |
+----------------------------------+
1 row in set (0.00 sec)
# 上例显示test账户只有usage默认权限即连接登录的权限
  • 赋权语法
sql 复制代码
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' [identified  by '密码'];
  • 分析
  • 权限列表: 用户的操作权限,如 SELECT , INSERT , UPDATE ,CREATE 等,如果要授予所有的权限则使用 ALL

  • 数据库名: 数据库名,如果 * 代表所有数据库

  • 表名:如果 * 代表所有数据表

  • localhost: 指定该用户在哪个主机上可以登陆,如果是本地用户可用 localhost ,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %

  • 示例1:创建test1账户,赋权
sql 复制代码
# 使用root账户登录
mysql> grant select on *.* to 'test1'@'localhost';  # 赋予mysql库的查询权限
Query OK, 0 rows affected (0.01 sec)

mysql> show  grants for  'test1'@'localhost';

mysql> select * from  mysql.user where user='test1'\G   # 查看user表的权限信息

mysql> \q
Bye
PS C:\Users\Administrator> mysql -u test1 -p   # 重新登录
Enter password: ******

mysql> show  databases;

mysql> exit
Bye
  • 示例2:创建test2账户,设置密码,赋权select和create权限,仅通过某个网段登录
sql 复制代码
PS C:\Users\Administrator> mysql -u root -p
Enter password: ******

# 需要查本机的IP网段
mysql> create user  'test2'@'10.100.170.%' identified by '123456';

mysql> select user, host, plugin from mysql.user;

mysql> show  grants for  'test2'@'10.100.170.%';

mysql>  grant select,create on *.* to 'test2'@'10.100.170.%';

mysql> show  grants for  'test2'@'10.100.170.%';

mysql> exit
Bye

PS C:\Users\Administrator> mysql -u test2 -p123456 -h 10.100.170.198

mysql> exit
Bye
10.100.170.198
  • 示例3:创建test3账户,设置密码,赋与所有权限,仅通过%登录,登录后创建test4账户并赋权
sql 复制代码
PS C:\Users\Administrator> mysql -u root -p

mysql> create user  'test3'@'%' identified by '123456';

mysql> select user, host, plugin from mysql.user;

mysql> show  grants for  'test3'@'%';

mysql> grant all  on *.* to 'test3'@'%';

mysql> show  grants for  'test3'@'%';

mysql> exit
Bye

PS C:\Users\Administrator> mysql -u test3 -p123456

mysql> create  database  mydbx_temp1;

mysql> create user  'test4'@'%' identified by '123456';

mysql> select user, host, plugin from mysql.user;

mysql> show  grants for  'test4'@'%';   # 查看test4账户权限

mysql> select  user();   # 查看当前登录的账户

mysql> grant select on *.* to 'test4'@'%';  # 被拒绝,无权给test4账户赋权
ERROR 1045 (28000): Access denied for user 'test3'@'%' (using password: YES)

# 注意:all所有权限中不包含给账户赋权的权限grant

mysql> exit
Bye

PS C:\Users\Administrator> mysql -u root -p  # 登录root账户给test3账户赋与给别的账户赋权的权限

mysql> grant all  on *.* to 'test3'@'%' with grant option;  # 给test3添加赋权的权限

mysql> exit
Bye

PS C:\Users\Administrator> mysql -u test3 -p123456   # 登录test3账户

mysql> grant select on *.* to 'test4'@'%';  # 给test4赋权
Query OK, 0 rows affected (0.01 sec)
  • 注意:若赋权不成功则先给root账户增加system_user权限
sql 复制代码
mysql> grant  system_user on *.* to  'root'@'localhost';  # 给root赋权system_user权限
# 注意:登录主机是%还是localhost

5. 回收权限

格式

sql 复制代码
revoke  权限列表/all  on  库名.表名  from  '用户名'@'来源地址';

# revoke跟grant 的语法差不多,只需要把关键字 "to" 换成 "from" 即可
  • 示例4:回收所有权限
sql 复制代码
mysql> select  user();
+-----------------+
| user()          |
+-----------------+
| test3@localhost |
+-----------------+

mysql> exit
Bye

PS C:\Users\Administrator> mysql -u root -p

mysql> select user, host, plugin , select_priv from mysql.user; 
# select_priv查询权限

mysql> show  grants for  'test4'@'%';  # 查看test4账户的权限

mysql> revoke select  on *.*  from 'test4'@'%';   # 回收select权限

mysql> show  grants for  'test4'@'%';

mysql> revoke all  on *.*  from 'test3'@'%';   # 回收所有权限

mysql> show  grants for  'test3'@'%';

mysql> revoke all  on *.*  from 'test2'@'10.100.170.%';  # 同上

mysql> show  grants for 'test2'@'10.100.170.%';

mysql> revoke all  on *.*  from 'test1'@'localhost';

mysql> show  grants for  'test1'@'localhost';

6. 删除账户

格式

sql 复制代码
drop user '用户名'@'访问主机名';
  • 示例5:删除所有账户
sql 复制代码
mysql> select user, host  from mysql.user;

mysql> drop  user 'test1'@'localhost';  
Query OK, 0 rows affected (0.01 sec)

mysql> drop  user 'test2'@'10.100.170.%';
Query OK, 0 rows affected (0.01 sec)

mysql> drop  user test3;  # 注意:主机为%可以不写
Query OK, 0 rows affected (0.01 sec)

mysql> drop  user test4;
Query OK, 0 rows affected (0.00 sec)

mysql> select user, host  from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
相关推荐
斯普信专业组2 分钟前
构建基于MCP的MySQL智能运维平台:从开源服务端到交互式AI助手
运维·mysql·开源·mcp
Elastic 中国社区官方博客3 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.7 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐11 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_999913 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学1 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 小时前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道2 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议