《数据库》第一次作业: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)
相关推荐
IT项目管理10 分钟前
达梦数据库DMDRS搭建单向dm8-dm8数据同步
数据库
果子⌂31 分钟前
Docker-构建镜像并实现LNMP架构
mysql·nginx·docker·容器·架构·php
咖丨喱1 小时前
【Action帧简要分析】
服务器·数据库·asp.net
没饭吃!1 小时前
NHibernate案例
数据库·hibernate
泷羽Sec-静安1 小时前
OSCP官方靶场-Solstice WP
服务器·网络·数据库
IvanCodes2 小时前
Oracle 视图
大数据·数据库·sql·oracle
Trust yourself2432 小时前
使用阿里云/腾讯云安装完成mysql使用不了
mysql·阿里云·腾讯云
德育处主任Pro2 小时前
「py数据分析」04如何将 Python 爬取的数据保存为 CSV 文件
数据库·python·数据分析
许白掰2 小时前
Linux入门篇学习——Linux 编写第一个自己的命令
linux·运维·数据库·嵌入式硬件·学习
打不了嗝 ᥬ᭄2 小时前
文件系统----底层架构
linux·运维·数据库