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








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