MySQL - 用戶權限控制和密碼策略

項目安全測試時發現數據庫用戶權限不合理,並且缺失密碼複雜度校驗,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_schemasuhw_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 '密碼'];
  1. 新建一個用戶,讓他可以擁有所有庫的所有權限

    grant all privileges on *.* to suhw@"%" ;
    

    其中*.*就表明了所有庫的所有表

  2. 新建一個用戶,讓他可以擁有suhw_db庫的所有權限

    grant all privileges on suhw_db.* to suhw@"%" ;
    
  3. 新建一個只能對suhw_db庫中的表進行SELECTUPDATE操作的用戶

    grant SELECT, UPDATE privileges on suhw_db.* to suhw@"%";
    
  4. 新建一個對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插件來完成此功能

  1. 查看是否安裝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     |
...
  1. 若沒有,查看插件存放目錄
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,直接安裝即可

  1. 安裝
mysql> install plugin validate_password soname 'validate_password.so';
Query OK, 0 rows affected (0.07 sec)
  1. 查看安裝結果
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)

至此密碼策略生效



參考

  1. https://www.cnblogs.com/alonely/p/10927541.html
  2. https://www.yiibai.com/mysql/grant.html








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章