MySQL安全登录策略
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:
用来设置密码的最小长度,默认值是84、validate_password_mixed_case_count:
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。5、validate_password_number_count:
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是06、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:
失败上限之后再次尝试登录前最大等待时间,单位ms3、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 是否已经开启了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
- 添加ssl参数到my.cnf配置文件
[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
- 启动 MySQL 后,登录查看 ssl 状态
systemctl start mysqldmysql> 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 secThreads: 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
- 如何设置某用户使用强制使用ssl
#新建用户
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
MySQL安全登录策略相关推荐
- 远程主机访问mysql权限_如何给远程主机开启mysql远程登录权限
# 如何给远程主机开启mysql远程登录权限 > 在千锋学习PHP的有些学员会在阿里或者腾讯云去购买自己的云服务器.在初级阶段的项目上线时会遇到一个问题,就是无法使用远程连接工具操作自己线上的m ...
- android servlet 登陆,Android Studio+Servlet+MySql实现登录注册
一.Android 项目当中设置明文传输 1.设置明文传输的xml 2.引入上述创建的xml android:networkSecurityConfig="@xml/network_secu ...
- Mysql 8 密码策略之组件方式及ERROR 1819
Mysql 8 密码策略组件方式 问题描述 创建用户时提示密码不满足当前的策略定义,错误代码是ERROR 1819 (HY000). Your password does not satisfy th ...
- MySql安装及Navicat连接(解决Starting the server失败;mysql输入密码登录报错1045(28000),不输入密码却能登录;Navicat连接报错2059)
1.安装过程中经常会出现Starting the server配置失败(参考博客MySQL安装 starting the server失败的解决办法_weixin_44021888的博客-CSDN博客 ...
- ubuntu安装完mysql无法登录_Ubuntu安装mysql8后无法登陆怎么解决
设置mysql为无密码启动 修改MySQL的登录设置:gedit /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables保存并退出 重新启动mysqld,清空密码 ...
- 易语言 mysql_易语言MySql注册登录
易语言MySql注册登录 用到的主要易语言命令: 连接MySql (, , , , ) 执行SQL语句 (, ) 取记录集 () 读字段值 (, , ) 释放记录集 () 断开MySql () 命令介 ...
- 在Linux环境下mysql的root密码忘记解决方法 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 2.修改MySQL的登录设置: # vi /etc/my.c
在Linux环境下mysql的root密码忘记解决方法 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 2.修改MySQL的登录设置: # vi /etc/my.cnf ...
- mysql登录报错error1045,mysql创建登录报错ERROR1045(28000)
.如下图(第四个): 而本人创建的用户为: Mysql> grant all on itcase.* to 'test'@'%' identified by '123456'; ...
- 易语言MySql注册登录
易语言MySql注册登录 用到的主要易语言命令: 连接MySql (, , , , ) 执行SQL语句 (, ) 取记录集 () 读字段值 (, , ) 释放记录集 () 断开MySql () 命令介 ...
最新文章
- 线段树扫描线求矩形周长详解
- python小程序代码50 到100行-Python代码不到四十行简单暴力,微信跳一跳小程序轻松过万...
- spring cloud使用hystrix实现断路保护机制
- SpringMVC简介-传统的Model1和Model2/MVC思想及其优势/Spring MVC的优势
- C语言学习之1到10的奇数相乘1到10的偶数相乘
- 网站程序安全分析器 VB源码
- 打印狗的健康值Java_嵌入式狗的JAVA之路 HTML 补课
- 收藏 | 深度学习框架简史:TensorFlow和PyTorch双头垄断
- 【深度学习】CNN模型的可视化-1
- Laravel 使用firstOrCreate 报错MassAssignmentException
- 本地SVN帐号密码破解
- 恶劣天气 3D 目标检测数据集收集
- 魔方还原代码 python_如何用C语言还原三阶魔方?
- 历届奥斯卡最佳影片及下载地址
- es监控工具cerebro 安装使用教程
- Unity高级知识点总结:性能优化与图形渲染进阶!
- 解决硬盘分区错误, 纯Dos磁盘工具Diskpart的用法.
- 【Zabbix】Zabbix微信告警配置演示
- 【老李的模拟赛】【#6】【2014-08-12】
- 趣图:这种贱贱的骚操作,你们试过么?
热门文章
- 如何控制项目边界,与客户项目负责人结成同盟军
- 手机如何优雅地自动化登录校园网?
- 威廉·欧奈尔:为何我的A股账户只持有一只股票?(建议收藏)
- python操作键盘输入中文_python模拟鼠标点击和键盘输入的操作
- python中show函数_Pycharm(Python)下imshow函数显示问题的解决方法
- 压缩感知学习(一):压缩感知的起源
- linux添加失败的原因,linux下execvp失败设置errno=7的原因是什么?
- [VCS]filelist.list的做法
- 事务(Transaction)的简单理解
- 日志组的状态:CURRENT、ACTIVE、INACTIVE