MySQL密码复杂度策略设置
MySQL 系统自带有 validate_password 插件,此插件可以验证密码强度,未达到规定强度的密码则不答应被设置。MySQL 5.7 及
8.0 版本默认环境下貌似都不启用该插件,这也使得我们可以随意设置密码,好比设置为
123、123456等。如果我们想从根源上规范密码强度,可以启用该插件,下面一起来看下怎样通过此插件来设置密码复杂度策略。
进入 MySQL 命令行,通过 show plugins;或者show variables like ‘validate%’;
相关参数可以判断是否已安装此插件。若没有相关参数则代表未安装此插件
安装前查抄 为空则分析未安装此插件
- mysql> show variables like 'validate%';
- Empty set (0.42 sec)
复制代码
- 安装 validate_password 插件,通过 INSTALL PLUGIN 命令可安装此插件,每个平台的文件名后缀都不同 对于 Unix 和类 Unix 系统,为.so,对于 Windows 为.dll
- mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
- Query OK, 0 rows affected, 1 warning (0.80 sec)
复制代码
- 查看 validate_password 相关参数
- mysql> show variables like 'validate%';
- +--------------------------------------+--------+
- | Variable_name | Value |
- +--------------------------------------+--------+
- | validate_password_check_user_name | ON |
- | 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.01 sec)
复制代码- 例:密码至少 10 位且包含大小写字母、数字、特殊字符
- mysql> set global validate_password_length = 10;
- Query OK, 0 rows affected (0.00 sec)
- mysql> show variables like 'validate%';
- +--------------------------------------+--------+
- | Variable_name | Value |
- +--------------------------------------+--------+
- | validate_password_check_user_name | ON |
- | validate_password_dictionary_file | |
- | validate_password_length | 10 |
- | 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.01 sec)
- #若想永久生效,建议将以下参数写入配置文件my.cnf
- vim /etc/my.cnf
- [mysqld]
- plugin-load = validate_password.so
- validate_password_length = 10
- validate_password_policy = 1
- validate-password = FORCE_PLUS_PERMANENT
复制代码- 1、validate_password_policy:
- 代表的密码策略,默认是MEDIUM 可配置的值有以下:
- 0 or LOW 仅需需符合密码长度(由参数validate_password_length指定)
- 1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
- 2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中
- 2、validate_password_dictionary_file:
- 用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件中存在的密码不得使用。
- 3、validate_password_length:
- 用来设置密码的最小长度,默认值是8
- 4、validate_password_mixed_case_count:
- 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。
- 5、validate_password_number_count:
- 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0
- 6、validate_password_special_char_count:
- 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0
复制代码 MySQL密码策略和登录失败处理
- 查看是否已安装 connection_control% 插件,为空则分析未安装此插件
- mysql> show variables like 'connection_control%';
- Empty set (0.01 sec)
复制代码
- 安装插件(windows中为 " connection_control.dll ", liunx中为 " connection_control.so ")
- mysql> INSTALL PLUGIN CONNECTION_CONTROL soname 'connection_control.so';
- Query OK, 0 rows affected (0.25 sec)
复制代码- mysql> show variables like 'connection_control%';
- +-------------------------------------------------+------------+
- | Variable_name | Value |
- +-------------------------------------------------+------------+
- | connection_control_failed_connections_threshold | 3 |
- | connection_control_max_connection_delay | 2147483647 |
- | connection_control_min_connection_delay | 1000 |
- +-------------------------------------------------+------------+
- 3 rows in set (0.01 sec)
复制代码- 1、connection_control_failed_connections_threshold:
- 单个用户登录失败(由于密码错误引起)次数上限,默认3次
- 2、connection_control_max_connection_delay:
- 失败上限之后再次尝试登录前最大等待时间,单位ms
- 3、connection_control_min_connection_delay:
- 失败上限之后再次尝试登录前最小等待时间,默认1秒(1000ms)
复制代码- # 单个用户密码登录失败的上限次数
- set global connection_control_failed_connections_threshold=5;
- # 达到失败上限后等待30秒再次尝试登录
- set global connection_control_min_connection_delay=30000;
复制代码- mysql> UNINSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
- mysql> UNINSTALL PLUGIN CONNECTION_CONTROL;
复制代码 MySQL开启SSL
- mysql> show variables like "%ssl%";
- +-------------------------------------+-----------------+
- | Variable_name | Value |
- +-------------------------------------+-----------------+
- | admin_ssl_ca | |
- | admin_ssl_capath | |
- | admin_ssl_cert | |
- | admin_ssl_cipher | |
- | admin_ssl_crl | |
- | admin_ssl_crlpath | |
- | admin_ssl_key | |
- | have_openssl | YES |
- | have_ssl | YES |
- | mysqlx_ssl_ca | |
- | mysqlx_ssl_capath | |
- | mysqlx_ssl_cert | |
- | mysqlx_ssl_cipher | |
- | mysqlx_ssl_crl | |
- | mysqlx_ssl_crlpath | |
- | mysqlx_ssl_key | |
- | performance_schema_show_processlist | OFF |
- | ssl_ca | ca.pem |
- | ssl_capath | |
- | ssl_cert | server-cert.pem |
- | ssl_cipher | |
- | ssl_crl | |
- | ssl_crlpath | |
- | ssl_fips_mode | OFF |
- | ssl_key | server-key.pem |
- | ssl_session_cache_mode | ON |
- | ssl_session_cache_timeout | 300 |
- +-------------------------------------+-----------------+
- 27 rows in set (0.01 sec)
- # have_openssl、have_ssl 参数为YES 代表已经开启,如果是DISABLE则表示没有。
复制代码
- 如果没有如上参数,则须要停止 MySQL 举行安装
- systemctl stop mysqld
- #在mysql bin目录下有一个mysql_ssl_rsa_setup文件,执行它开始安装ssl
- ./mysql_ssl_rsa_setup
- #安装完成后,会生成一些私钥公钥在mysql data目录下
- [root@localhost]ll *.pem
- -rw------- 1 mysql mysql 1675 Jun 12 17:22 ca-key.pem #CA私钥
- -rw-r--r-- 1 mysql mysql 1074 Jun 12 17:22 ca.pem #自签的CA证书,客户端连接也需要提供
- -rw-r--r-- 1 mysql mysql 1078 Jun 12 17:22 client-cert.pem #客户端连接服务器端需要提供的证书文件
- -rw------- 1 mysql mysql 1675 Jun 12 17:22 client-key.pem #客户端连接服务器端需要提供的私钥文件
- -rw------- 1 mysql mysql 1675 Jun 12 17:22 private_key.pem #私钥/公钥对的私有成员
- -rw-r--r-- 1 mysql mysql 451 Jun 12 17:22 public_key.pem #私钥/公钥对的共有成员
- -rw-r--r-- 1 mysql mysql 1078 Jun 12 17:22 server-cert.pem #服务器端证书文件
- -rw------- 1 mysql mysql 1675 Jun 12 17:22 server-key.pem #服务器端私钥文件
- #注意这些密钥的权限问题,如果需要则执行:chown -R mysql.mysql *.pem
复制代码- [mysqld]
- ssl-ca=/usr/local/mysql/data/ca.pem
- ssl-cert=/usr/local/mysql/data/client-cert.pem
- ssl-key=/usr/local/mysql/data/client-key.pem
-
- [mysql]
- ssl-ca=/usr/local/mysql/data/ca.pem
- ssl-cert=/usr/local/mysql/data/client-cert.pem
- ssl-key=/usr/local/mysql/data/client-key.pem
复制代码- systemctl start mysqld
- mysql> show variables like "%ssl%";
复制代码
- 使用 \s 或 status 命令查看当前 mysql 毗连是否使用了ssl
- mysql> \s
- --------------
- mysql Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)
- Connection id: 17
- Current database:
- Current user: root@localhost
- SSL: Not in use # 这里表示没有使用ssl
- Current pager: stdout
- Using outfile: ''
- Using delimiter: ;
- Server version: 8.0.32 MySQL Community Server - GPL
- Protocol version: 10
- Connection: Localhost via UNIX socket
- Server characterset: utf8mb4
- Db characterset: utf8mb4
- Client characterset: utf8mb4
- Conn. characterset: utf8mb4
- UNIX socket: /var/lib/mysql/mysql.sock
- Binary data as: Hexadecimal
- Uptime: 2 days 8 min 15 sec
- Threads: 3 Questions: 45 Slow queries: 0 Opens: 152 Flush tables: 3 Open tables: 71 Queries per second avg: 0.000
- --------------
- # 如果不想使用ssl则登录时添加如下参数:
- mysql -uroot -proot --ssl=0 或
- mysql -uroot -proot --ssl-mode=DISABLED
复制代码- #新建用户
- mysql> grant select on *.* to 'dba'@'%' identified by 'xxx' REQUIRE SSL;
- #修改用户
- mysql> ALTER USER 'dba'@'%' REQUIRE SSL;
- #刷新权限
- flush privileges;
复制代码 MySQL开启日记审计
- mysql> show global variables like '%general%';
- +------------------+------------------------------+
- | Variable_name | Value |
- +------------------+------------------------------+
- | general_log | OFF |
- | general_log_file | /var/lib/mysql/localhost.log |
- +------------------+------------------------------+
- 2 rows in set (0.18 sec)
- mysql> show global variables like 'log_timestamps';
- +----------------+-------+
- | Variable_name | Value |
- +----------------+-------+
- | log_timestamps | UTC |
- +----------------+-------+
- 1 row in set (0.01 sec)
复制代码
- 暂时开启审计功能
暂时开启的在MySQL重启后会主动失效,须要重新设置。
- mysql> set global general_log = on; #on为开启,off为关闭
- mysql> set global general_log_file = "/var/lib/mysql/localhost.log "; #审计信息存储位置
- mysql> set global log_timestamps = SYSTEM; #设置日志文件的输出时间为系统时间
复制代码- vim /etc/my.cnf
- [mysqld]
- general_log = on
- general_log_file = /var/lib/mysql/localhost.log
- log_timestamps = SYSTEM
- #重启mysql
- systemctl restart mysqld
复制代码 学习网络安全技术的方法无非三种:
第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、盘算机构成原理原理、数据结构、操作系统原理、数据库系统、
盘算机网络、人工智能、自然语言处理、社会盘算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。
第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-
些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉本身没有进步,轻易劝退。
如果你对网络安全入门感兴趣,那么你须要的话可以点击这里 |