欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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_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 [email protected]"%" ;
    

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

  2. 新建一个用户,让他可以拥有suhw_db库的所有权限

    grant all privileges on suhw_db.* to [email protected]"%" ;
    
  3. 新建一个只能对suhw_db库中的表进行SELECTUPDATE操作的用户

    grant SELECT, UPDATE privileges on suhw_db.* to [email protected]"%";
    
  4. 新建一个对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插件来完成此功能

  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 [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)

至此密码策略生效



参考

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