《数据库》第一次作业: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)已被证明非常容易破解
查看数据库当前密码策略:
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 |
+----------------------------------------------+-----------------+
- 查看密码设置策略
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)
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 | 检查长度、数字、大小写、特殊字符、字典文件 |
- 设置密码强度检查参数
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)
修改密码
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 表
mysql> select user(); # 查看当前的用户信息mysql> use mysql;mysql> show tables;mysql> desc user;mysql> select user,host,authentication_string from user;
3. 新建登陆账户
- 格式
create user 'username'@'localhost' identified by 'password';
- 含义
username: 创建的用户名
localhost: 指定该用户在哪个主机上可以登陆,如果是本地用户可用 localhost ,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %
password: 该用户的登陆密码
- 示例
mysql> create user 'test1'@'localhost' identified by '123456';
# 注意:密码要符合密码设置规则mysql> select user, host, plugin from mysql.user; # 查看信息mysql> exit
ByePS 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等编辑权限
密码设置合理
定期清理不使用的账户,将其收回权限或删除
常见的用户权限
- 查看权限
mysql> exit
ByePS C:\Users\Administrator> mysql -u root -pmysql> 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默认权限即连接登录的权限
- 赋权语法
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' [identified by '密码'];
- 分析
权限列表: 用户的操作权限,如 SELECT , INSERT , UPDATE ,CREATE 等,如果要授予所有的权限则使用 ALL
数据库名: 数据库名,如果 * 代表所有数据库
表名:如果 * 代表所有数据表
localhost: 指定该用户在哪个主机上可以登陆,如果是本地用户可用 localhost ,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %
- 示例1:创建test1账户,赋权
# 使用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权限,仅通过某个网段登录
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
ByePS C:\Users\Administrator> mysql -u test2 -p123456 -h 10.100.170.198mysql> exit
Bye
10.100.170.198
示例3:创建test3账户,设置密码,赋与所有权限,仅通过%登录,登录后创建test4账户并赋权
PS C:\Users\Administrator> mysql -u root -pmysql> 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
ByePS C:\Users\Administrator> mysql -u test3 -p123456mysql> 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所有权限中不包含给账户赋权的权限grantmysql> exit
ByePS C:\Users\Administrator> mysql -u root -p # 登录root账户给test3账户赋与给别的账户赋权的权限mysql> grant all on *.* to 'test3'@'%' with grant option; # 给test3添加赋权的权限mysql> exit
ByePS 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权限
mysql> grant system_user on *.* to 'root'@'localhost'; # 给root赋权system_user权限
# 注意:登录主机是%还是localhost
5. 回收权限
格式
revoke 权限列表/all on 库名.表名 from '用户名'@'来源地址';# revoke跟grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可
示例4:回收所有权限
mysql> select user();
+-----------------+
| user() |
+-----------------+
| test3@localhost |
+-----------------+mysql> exit
ByePS C:\Users\Administrator> mysql -u root -pmysql> 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. 删除账户
格式
drop user '用户名'@'访问主机名';
示例5:删除所有账户
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)