MySQL安全登录策略

打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

MySQL密码复杂度策略设置

MySQL 系统自带有 validate_password 插件,此插件可以验证密码强度,未达到规定强度的密码则不答应被设置。MySQL 5.7 及
8.0 版本默认环境下貌似都不启用该插件,这也使得我们可以随意设置密码,好比设置为
123、123456等。如果我们想从根源上规范密码强度,可以启用该插件,下面一起来看下怎样通过此插件来设置密码复杂度策略。


  • 查看是否已安装此插件
进入 MySQL 命令行,通过 show plugins;或者show variables like ‘validate%’;
相关参数可以判断是否已安装此插件。若没有相关参数则代表未安装此插件
安装前查抄 为空则分析未安装此插件
  1. mysql> show variables like 'validate%';
  2. Empty set (0.42 sec)
复制代码

  • 安装 validate_password 插件,通过 INSTALL PLUGIN 命令可安装此插件,每个平台的文件名后缀都不同 对于 Unix 和类 Unix 系统,为.so,对于 Windows 为.dll
  1. mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
  2. Query OK, 0 rows affected, 1 warning (0.80 sec)
复制代码

  • 查看 validate_password 相关参数
  1. mysql> show variables like 'validate%';
  2. +--------------------------------------+--------+
  3. | Variable_name                        | Value  |
  4. +--------------------------------------+--------+
  5. | validate_password_check_user_name    | ON     |
  6. | validate_password_dictionary_file    |        |
  7. | validate_password_length             | 8      |
  8. | validate_password_mixed_case_count   | 1      |
  9. | validate_password_number_count       | 1      |
  10. | validate_password_policy             | MEDIUM |
  11. | validate_password_special_char_count | 1      |
  12. +--------------------------------------+--------+
  13. 7 rows in set (0.01 sec)
复制代码

  • 密码复杂度策略具体设置
  1. 例:密码至少 10 位且包含大小写字母、数字、特殊字符
  2. mysql> set global validate_password_length = 10;
  3. Query OK, 0 rows affected (0.00 sec)
  4. mysql> show variables like 'validate%';
  5. +--------------------------------------+--------+
  6. | Variable_name                        | Value  |
  7. +--------------------------------------+--------+
  8. | validate_password_check_user_name    | ON     |
  9. | validate_password_dictionary_file    |        |
  10. | validate_password_length             | 10     |
  11. | validate_password_mixed_case_count   | 1      |
  12. | validate_password_number_count       | 1      |
  13. | validate_password_policy             | MEDIUM |
  14. | validate_password_special_char_count | 1      |
  15. +--------------------------------------+--------+
  16. 7 rows in set (0.01 sec)
  17. #若想永久生效,建议将以下参数写入配置文件my.cnf
  18. vim /etc/my.cnf
  19. [mysqld]
  20. plugin-load = validate_password.so
  21. validate_password_length = 10
  22. validate_password_policy = 1
  23. validate-password = FORCE_PLUS_PERMANENT
复制代码

  • 密码强度相关参数解释:
  1. 1、validate_password_policy:
  2. 代表的密码策略,默认是MEDIUM 可配置的值有以下:
  3. 0 or LOW 仅需需符合密码长度(由参数validate_password_length指定)
  4. 1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
  5. 2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中
  6. 2、validate_password_dictionary_file:
  7. 用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件中存在的密码不得使用。
  8. 3、validate_password_length:
  9. 用来设置密码的最小长度,默认值是8
  10. 4、validate_password_mixed_case_count:
  11. 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。
  12. 5、validate_password_number_count:
  13. 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0
  14. 6、validate_password_special_char_count:
  15. 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0
复制代码
MySQL密码策略和登录失败处理


  • 查看是否已安装 connection_control% 插件,为空则分析未安装此插件
  1. mysql> show variables like 'connection_control%';
  2. Empty set (0.01 sec)
复制代码

  • 安装插件(windows中为 " connection_control.dll ", liunx中为 " connection_control.so ")
  1. mysql> INSTALL PLUGIN CONNECTION_CONTROL soname 'connection_control.so';
  2. Query OK, 0 rows affected (0.25 sec)
复制代码

  • 查看相关参数
  1. mysql> show variables like 'connection_control%';
  2. +-------------------------------------------------+------------+
  3. | Variable_name                                   | Value      |
  4. +-------------------------------------------------+------------+
  5. | connection_control_failed_connections_threshold | 3          |
  6. | connection_control_max_connection_delay         | 2147483647 |
  7. | connection_control_min_connection_delay         | 1000       |
  8. +-------------------------------------------------+------------+
  9. 3 rows in set (0.01 sec)
复制代码

  • 参数解释
  1. 1、connection_control_failed_connections_threshold:
  2. 单个用户登录失败(由于密码错误引起)次数上限,默认3次
  3. 2、connection_control_max_connection_delay:  
  4. 失败上限之后再次尝试登录前最大等待时间,单位ms
  5. 3、connection_control_min_connection_delay:  
  6. 失败上限之后再次尝试登录前最小等待时间,默认1秒(1000ms)
复制代码

  • 设置单个用户密码登录失败上限次数和等候时间
  1. # 单个用户密码登录失败的上限次数
  2. set global connection_control_failed_connections_threshold=5;
  3. # 达到失败上限后等待30秒再次尝试登录
  4. set global connection_control_min_connection_delay=30000;
复制代码

  • 卸载插件命令
  1. mysql> UNINSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
  2. mysql> UNINSTALL PLUGIN CONNECTION_CONTROL;
复制代码
MySQL开启SSL


  • 查抄 MySQL 是否已经开启了SSL
  1. mysql> show variables like "%ssl%";
  2. +-------------------------------------+-----------------+
  3. | Variable_name                       | Value           |
  4. +-------------------------------------+-----------------+
  5. | admin_ssl_ca                        |                 |
  6. | admin_ssl_capath                    |                 |
  7. | admin_ssl_cert                      |                 |
  8. | admin_ssl_cipher                    |                 |
  9. | admin_ssl_crl                       |                 |
  10. | admin_ssl_crlpath                   |                 |
  11. | admin_ssl_key                       |                 |
  12. | have_openssl                        | YES             |
  13. | have_ssl                            | YES             |
  14. | mysqlx_ssl_ca                       |                 |
  15. | mysqlx_ssl_capath                   |                 |
  16. | mysqlx_ssl_cert                     |                 |
  17. | mysqlx_ssl_cipher                   |                 |
  18. | mysqlx_ssl_crl                      |                 |
  19. | mysqlx_ssl_crlpath                  |                 |
  20. | mysqlx_ssl_key                      |                 |
  21. | performance_schema_show_processlist | OFF             |
  22. | ssl_ca                              | ca.pem          |
  23. | ssl_capath                          |                 |
  24. | ssl_cert                            | server-cert.pem |
  25. | ssl_cipher                          |                 |
  26. | ssl_crl                             |                 |
  27. | ssl_crlpath                         |                 |
  28. | ssl_fips_mode                       | OFF             |
  29. | ssl_key                             | server-key.pem  |
  30. | ssl_session_cache_mode              | ON              |
  31. | ssl_session_cache_timeout           | 300             |
  32. +-------------------------------------+-----------------+
  33. 27 rows in set (0.01 sec)
  34. # have_openssl、have_ssl 参数为YES 代表已经开启,如果是DISABLE则表示没有。
复制代码

  • 如果没有如上参数,则须要停止 MySQL 举行安装
  1. systemctl stop mysqld
  2. #在mysql bin目录下有一个mysql_ssl_rsa_setup文件,执行它开始安装ssl
  3. ./mysql_ssl_rsa_setup
  4. #安装完成后,会生成一些私钥公钥在mysql data目录下
  5. [root@localhost]ll *.pem
  6. -rw------- 1 mysql mysql 1675 Jun 12 17:22 ca-key.pem         #CA私钥
  7. -rw-r--r-- 1 mysql mysql 1074 Jun 12 17:22 ca.pem             #自签的CA证书,客户端连接也需要提供
  8. -rw-r--r-- 1 mysql mysql 1078 Jun 12 17:22 client-cert.pem    #客户端连接服务器端需要提供的证书文件
  9. -rw------- 1 mysql mysql 1675 Jun 12 17:22 client-key.pem     #客户端连接服务器端需要提供的私钥文件
  10. -rw------- 1 mysql mysql 1675 Jun 12 17:22 private_key.pem    #私钥/公钥对的私有成员
  11. -rw-r--r-- 1 mysql mysql 451 Jun 12 17:22  public_key.pem     #私钥/公钥对的共有成员
  12. -rw-r--r-- 1 mysql mysql 1078 Jun 12 17:22 server-cert.pem    #服务器端证书文件
  13. -rw------- 1 mysql mysql 1675 Jun 12 17:22 server-key.pem     #服务器端私钥文件
  14. #注意这些密钥的权限问题,如果需要则执行:chown -R mysql.mysql *.pem
复制代码

  • 添加ssl参数到my.cnf配置文件
  1. [mysqld]
  2. ssl-ca=/usr/local/mysql/data/ca.pem
  3. ssl-cert=/usr/local/mysql/data/client-cert.pem
  4. ssl-key=/usr/local/mysql/data/client-key.pem
  5. [mysql]
  6. ssl-ca=/usr/local/mysql/data/ca.pem
  7. ssl-cert=/usr/local/mysql/data/client-cert.pem
  8. ssl-key=/usr/local/mysql/data/client-key.pem
复制代码

  • 启动 MySQL 后,登录查看 ssl 状态
  1. systemctl start mysqld
  2. mysql> show variables like "%ssl%";
复制代码

  • 使用 \s 或 status 命令查看当前 mysql 毗连是否使用了ssl
  1. mysql> \s
  2. --------------
  3. mysql  Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)
  4. Connection id:                17
  5. Current database:
  6. Current user:                root@localhost
  7. SSL:                        Not in use       # 这里表示没有使用ssl
  8. Current pager:                stdout
  9. Using outfile:                ''
  10. Using delimiter:        ;
  11. Server version:                8.0.32 MySQL Community Server - GPL
  12. Protocol version:        10
  13. Connection:                Localhost via UNIX socket
  14. Server characterset:        utf8mb4
  15. Db     characterset:        utf8mb4
  16. Client characterset:        utf8mb4
  17. Conn.  characterset:        utf8mb4
  18. UNIX socket:                /var/lib/mysql/mysql.sock
  19. Binary data as:                Hexadecimal
  20. Uptime:                        2 days 8 min 15 sec
  21. Threads: 3  Questions: 45  Slow queries: 0  Opens: 152  Flush tables: 3  Open tables: 71  Queries per second avg: 0.000
  22. --------------
  23. # 如果不想使用ssl则登录时添加如下参数:
  24. mysql -uroot -proot --ssl=0  或
  25. mysql -uroot -proot --ssl-mode=DISABLED
复制代码

  • 怎样设置某用户使用逼迫使用ssl
  1. #新建用户
  2. mysql> grant select on *.* to 'dba'@'%' identified by 'xxx' REQUIRE SSL;
  3. #修改用户
  4. mysql> ALTER USER 'dba'@'%' REQUIRE SSL;
  5. #刷新权限
  6. flush privileges;
复制代码
MySQL开启日记审计


  • 查看是否开启审计日记
  1. mysql> show global variables like '%general%';
  2. +------------------+------------------------------+
  3. | Variable_name    | Value                        |
  4. +------------------+------------------------------+
  5. | general_log      | OFF                          |
  6. | general_log_file | /var/lib/mysql/localhost.log |
  7. +------------------+------------------------------+
  8. 2 rows in set (0.18 sec)
  9. mysql> show global variables like 'log_timestamps';
  10. +----------------+-------+
  11. | Variable_name  | Value |
  12. +----------------+-------+
  13. | log_timestamps | UTC   |
  14. +----------------+-------+
  15. 1 row in set (0.01 sec)
复制代码

  • 暂时开启审计功能
    暂时开启的在MySQL重启后会主动失效,须要重新设置。
  1. mysql> set global general_log = on;    #on为开启,off为关闭
  2. mysql> set global general_log_file = "/var/lib/mysql/localhost.log ";    #审计信息存储位置
  3. mysql> set global log_timestamps = SYSTEM;     #设置日志文件的输出时间为系统时间
复制代码

  • 永世开启审计功能
  1. vim /etc/my.cnf
  2. [mysqld]
  3. general_log = on                                          
  4. general_log_file = /var/lib/mysql/localhost.log      
  5. log_timestamps = SYSTEM                              
  6. #重启mysql
  7. systemctl restart mysqld
复制代码
学习网络安全技术的方法无非三种:
第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、盘算机构成原理原理、数据结构、操作系统原理、数据库系统、
盘算机网络、人工智能、自然语言处理、社会盘算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。
第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-
些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉本身没有进步,轻易劝退。
如果你对网络安全入门感兴趣,那么你须要的话可以点击这里

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表