項目安全測試時發現數據庫用戶權限不合理,並且缺失密碼複雜度校驗,So藉機學習一波
環境信息
root@505e4d918942:~# 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 suhw@"%" 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 suhw@"%" ;
其中
*.*
就表明了所有庫的所有表 -
新建一個用戶,讓他可以擁有
suhw_db
庫的所有權限grant all privileges on suhw_db.* to suhw@"%" ;
-
新建一個只能對
suhw_db
庫中的表進行SELECT
和UPDATE
操作的用戶grant SELECT, UPDATE privileges on suhw_db.* to suhw@"%";
-
新建一個對
shuw_db
庫中test
表只有SELECT
操作權限的用戶grant SELECT privileges on suhw_db.test to suhw@"%";
查看用戶權限
mysql> show grants for suhw@"%";
+---------------------------------------------------+
| Grants for suhw@% |
+---------------------------------------------------+
| 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 suhw@"%" = password("111");
ERROR 1819 (HY000): Your password does not satisfy the current policy requirement
換一個符合密碼複雜度的密碼
mysql> set password for suhw@"%" = password("Aa@123456");
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