MySQL - 用户权限控制和密码策略
程序员文章站
2022-05-31 17:34:21
...
项目安全测试时发现数据库用户权限不合理,并且缺失密码复杂度校验,So借机学习一波
环境信息
[email protected]:~# mysql -V
mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper
设置用户权限
例: 新增suhw
用户,只给访问suhw_db
数据库的权限
mysql> create user suhw;
Query OK, 0 rows affected (0.00 sec)
# 创建数据库
mysql> create database suhw_db;
Query OK, 1 row affected (0.00 sec)
# 赋予权限
mysql> grant all privileges on suhw_db.* to [email protected]"%" identified by "111";
Query OK, 0 rows affected, 1 warning (0.00 sec)
# 刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
此时使用suhw
用户进来就只能看到information_schema
和suhw_db
。
而information_schema
是只要用户建立后就能看到的,该数据库记录的是用户被授权的信息,information_schema库的表是只读表,其实是视图。如COLUMNS表(视图)就记录了该用户拥有权限的数据库表和列的信息
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| suhw_db |
+--------------------+
2 rows in set (0.00 sec)
grant
用法
grant [权限1,权限2...] on 某库.某表 to 新用户名@'主机名/IP地址' [identified by '密码'];
-
新建一个用户,让他可以拥有所有库的所有权限
grant all privileges on *.* to [email protected]"%" ;
其中
*.*
就表明了所有库的所有表 -
新建一个用户,让他可以拥有
suhw_db
库的所有权限grant all privileges on suhw_db.* to [email protected]"%" ;
-
新建一个只能对
suhw_db
库中的表进行SELECT
和UPDATE
操作的用户grant SELECT, UPDATE privileges on suhw_db.* to [email protected]"%";
-
新建一个对
shuw_db
库中test
表只有SELECT
操作权限的用户grant SELECT privileges on suhw_db.test to [email protected]"%";
查看用户权限
mysql> show grants for [email protected]"%";
+---------------------------------------------------+
| Grants for [email protected]% |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO 'suhw'@'%' |
| GRANT ALL PRIVILEGES ON `suhw_db`.* TO 'suhw'@'%' |
+---------------------------------------------------+
2 rows in set (0.00 sec)
可以查看mysql.db
查看对应权限
mysql> select * from db where User='suhw'\G
*************************** 1. row ***************************
Host: %
Db: suhw_db
User: suhw
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
1 row in set (0.02 sec)
除了可以通过mysql.db
查看用户对于数据库的权限以外,还有user
表和tables_priv
表都可查看
表名 | 作用 |
---|---|
user |
查看登录到MySQL 的用户信息 |
db |
查看哪些用户拥有哪些数据库的对应权限 |
tables_priv |
查看用户拥有那些表的操作权限 |
可以通过db表来控制一个用户对整个数据库的操作权限,也可通过tables_priv
更细致的划分对于某个表的权限
设置密码策略
由于安全测试中不允许MySQL
账户设置弱密码(例如111), 所以就需要考虑使用validate_password
插件来完成此功能
- 查看是否安装validate_password
mysql> show plugins;
+----------------------------+----------+--------------------+---------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+---------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
...
- 若没有,查看插件存放目录
mysql> show variables like 'plugin_dir';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| plugin_dir | /usr/lib/mysql/plugin/ |
+---------------+------------------------+
1 row in set (0.01 sec)
发现对应路径下有我们所需要的validate_password.so
,直接安装即可
- 安装
mysql> install plugin validate_password soname 'validate_password.so';
Query OK, 0 rows affected (0.07 sec)
- 查看安装结果
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| 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)
安装完成后,默认采用MEDIUM
策略
变量含义说明
字段 | 说明 |
---|---|
validate_password_check_user_name | 设置为ON的时候表示能将密码设置成当前用户名。 |
validate_password_dictionary_file | 用于检查密码的字典文件的路径名。 |
validate_password_length | 所需密码的最小字符数。 |
validate_password_mixed_case_count | 密码中大小写字符个数 |
validate_password_number_count | 密码中数字个数 |
validate_password_policy | 密码策略 |
validate_password_special_char_count | 特殊字符个数 |
此时修改弱密码试试
mysql> set password for [email protected]"%" = password("111");
ERROR 1819 (HY000): Your password does not satisfy the current policy requirement
换一个符合密码复杂度的密码
mysql> set password for [email protected]"%" = password("[email protected]");
Query OK, 0 rows affected, 1 warning (0.01 sec)
至此密码策略生效
参考
- https://www.cnblogs.com/alonely/p/10927541.html
- https://www.yiibai.com/mysql/grant.html
下一篇: mysql创建用户控制权限