前言
作为数据库运维人员,需要理性看待数据库等保测评相关工作,完全按照测评结果对数据库进行整改,或完全忽略测评结果都是不可取的,过犹不及,物极必反。
比如MySQL和Oracle为了防止密码被暴力破解的连接错误密码延时功能,随着连续输错密码次数的增加,连接的延时也会逐渐增加,如果设置了此功能,可能未见其利,先见其害,开发能人员一般是不受运维人员约束的,如果某个程序使用错误的密码一直尝试连接数据库,并且启用了密码延时功能,势必会导致正常连接也出现延时的问题,所以要结合实际情况进行整改。
简介
本次主要讲解以下8部分内容。
1.MySQL 用户密码加密方式;
环境说明
MySQL:5.7.44
1.MySQL 用户密码加密方式
5.7,默认使用插件mysql_native_password
create user cjc01@'localhost' identified with mysql_native_password by 'a';
也支持sha256_password
create user cjc02@'localhost' identified with sha256_password by 'a';
8.0开始,默认使用插件caching_sha2_password
create user cjc03@'localhost' identified with caching_sha2_password by 'a';
8.0之前,没有caching_sha2_password插件
ERROR 1524 (HY000): Plugin 'caching_sha2_password' is not loaded
其中,mysql_native_password 和 caching_sha2_password 插件默认使用什么加密算法:
mysql_native_password:使用的是SHA1加密算法。
链接如下:
https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase_authentication_methods_native_password_authentication.html
SHA1( password ) XOR SHA1( "20-bytes random data from server" <concat> SHA1( SHA1( password ) )
caching_sha2_password:使用的是SHA256加密算法。
链接如下:
https://dev.mysql.com/doc/dev/mysql-server/latest/page_caching_sha2_authentication_exchanges.html
MySQL [(none)]> select user,host,plugin from mysql.user where user like 'cjc%';
2.MySQL 用户密码策略
默认没有安装密码策略插件
MySQL [(none)]> show variables like 'validate_password%';
MySQL [(none)]> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
安装密码策略插件
MySQL [(none)]> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
查看默认密码策略
MySQL [(none)]> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
MySQL [(none)]> show variables like 'validate_password%';
默认策略说明:
validate_password_check_user_name :OFF
测试
新增用户,需要满足密码策略
create user cjc04@'localhost' identified with mysql_native_password by 'a';
MySQL [(none)]> create user cjc04@'localhost' identified with mysql_native_password by 'cjcA12345!';
修改密码策略
SET GLOBAL validate_password_policy=LOW;
配置参数
[root@cjc-db-01 mysql]# vi etc/my.cnf
重启
动态参数,也可以不重启
[mysql@cjc-db-01 ~]$ mysqladmin -uroot -p shutdown
查看修改后的密码策略
[mysql@cjc-db-01 ~]$ mysql -uroot -p
卸载密码策略插件
mysql> UNINSTALL PLUGIN validate_password;
mysql> show variables like 'validate_password%';
[root@cjc-db-01 ~]# vi mysqldata/3308/conf/my.cnf
3.MySQL 用户密码有效期
全局配置:
default_password_lifetime
用户级别配置:
ALTER USER 'your_username'@'your_host' PASSWORD EXPIRE INTERVAL N DAY;# N代表几天
当密码过期时,用户必须更改密码才能继续访问数据库。
default_password_lifetime密码有效期,单位为天。
该变量的默认值为0,表示密码没有有效期限制。
MySQL [(none)]> SHOW VARIABLES LIKE 'default_password_lifetime';
MySQL [(none)]> SELECT USER,HOST,PLUGIN,password_expired FROM mysql.user;
全局配置,密码有效期100天。
MySQL [(none)]> set global default_password_lifetime=100;
MySQL [(none)]> SELECT USER,HOST,PLUGIN,password_expired,password_lifetime FROM mysql.user;
用户级别配置:设置cjc01用户密码2天后过期
MySQL [(none)]> ALTER USER 'cjc01'@'localhost' PASSWORD EXPIRE INTERVAL 2 DAY;
MySQL [(none)]> SELECT USER,HOST,PLUGIN,password_expired,password_lifetime FROM mysql.user;
查询密码剩余时间
MySQL [(none)]> SELECT USER,HOST,password_lifetime,password_last_changed,now() FROM mysql.user;
修改操作系统时间,为当前时间+1月
[root@cjc-db-01 ~]# date
cjc01用户密码已过期,无法登录
MySQL [(none)]> SELECT USER,HOST,password_expired,password_lifetime,password_last_changed,now() FROM mysql.user;
[mysql@cjc-db-01 ~]$ mysql -ucjc01 -p
其他用户可以正常登录
[mysql@cjc-db-01 ~]$ mysql -ucjc04 -p
调到1年
[root@cjc-db-01 ~]# date -s "2025-06-18 16:00:30"
所有用户密码都到期,无法登录
[mysql@cjc-db-01 ~]$ mysql -uroot -p
[mysql@cjc-db-01 ~]$ mysql -ucjc01 -p
[mysql@cjc-db-01 ~]$ mysql -ucjc04 -p
4.MySQL 连接控制
默认没有安装连接控制的插件,该插件用来控制客户端在登录操作连续失败一定次数后的响应的延迟,可有效的防止客户端暴力登录的风险。
该插件包含以下两个组件:
CONNECTION_CONTROL:
查看
MySQL [(none)]> show variables like 'connection%';
安装插件
MySQL [(none)]> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
查看插件
MySQL [(none)]> show variables like 'connection%';
参数说明:
connection_control_failed_connections_threshold
当客户端连接数据库连续失败到达一定次数后,服务端会进行一段时间的响应延迟,连续失败尝试的次数越多,响应延迟时间越长。
MySQL [(none)]> SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
测试如下:连续输错10次密码
[mysql@cjc-db-01 ~]$ cat conn.sh
通过时间可以看到,前三次连接没有延时,第四次开始延时越来越长,第十次连接需要等待7秒,才会出现密码错误的提示。
[mysql@cjc-db-01 ~]$ sh conn.sh
MySQL [(none)]> SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
首次输入正确密码,也会继续延时,后面延时计数会重新计算。
[mysql@cjc-db-01 ~]$ mysql -ucjc01 -pa
5.MySQL 连接超时
查看超时参数
MySQL [(none)]> show global variables like '%timeout%';
连接参数又关的参数:
wait_timeout/interactive_timeout
其他参数说明:
connect_timeout
172800=48小时=2天
MySQL [(none)]> show global variables like 'wait_timeout';
MySQL [(none)]> show global variables like 'interactive_timeout';
[mysql@cjc-db-01 log]$ cat etc/my.cnf|grep -E "interactive_timeout|wait_timeout"
测试,修改参数
MySQL [(none)]> set global wait_timeout=60;
MySQL [(none)]> show global variables like 'interactive_timeout';
MySQL [(none)]> show global variables like 'wait_timeout';
Your MySQL connection id is 35
查看error.log
连接重连
MySQL [(none)]> select user,host,plugin from mysql.user where user like 'cjc%';
6.MySQL 审计
MySQL专用审计功能 MySQL Enterprise Audit 在MySQL商业产品(commercial product)的企业版数据库( MySQL Enterprise Edition)中提供,在社区版数据库(MySQL Community Edition)中不提供Audit审计功能。
https://dev.mysql.com/doc/refman/8.0/en/audit-log.html
社区版启用审计有两种选择,1是开启general_log,2是使用mysql分支审计插件。
1.general_log
**先看看general_log:**默认没有开启general_log。
mysql> show variables like 'general_log%';
mysql> set global general_log=on;
测试,创建一个20列的表t1。
mysql> use cjc
查看生成的general.log日志大小1.3KB,对性能有一定影响。
[mysql@cjc-db-01 log]$ ls -lrth general.log
2.审计插件
默认没有审计插件
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'audit%';
在MySQL社区版中审计插件说明:
数据库审计功能主要将用户对数据库的各类操作行为记录审计日志,以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。
审计是一项非常重要的工作,也是企业数据安全体系的重要组成部分,等保测评中也要求有审计日志。
对于 DBA 而言,数据库审计也极其重要,特别是发生人为事故后,审计日志便于进行责任追溯,问题查找。
当前 MySQL 社区版本并没有提供相关的插件使用,虽然 MySQL 提供有 binlog 及 general log ,这二者虽然具备部分审计功能,但一般不当做审计日志来看待。
常见的审计插件有 MariaDB Audit Plugin、Percona Audit Log Plugin、McAfee MySQL Audit Plugin 三种,MariaDB 自带的审计插件比较适合用于 MySQL 社区版,下面我们来学习下如何使用审计插件来实现审计功能。
MariaDB Auditing Plugin的安装
MariaDB 审计插件的名称是 server_audit.so(Windows系统下是 server_audit.dll ),要注意的是,审计插件一直在更新,不同版本的审计插件功能也不同,推荐使用 >= 1.4.4 版本的插件。
由于 MariaDB Auditing Plugin 集成在MariaDB里面,没有单独提供,所以我们需要先下载一个MariaDB。
MariaDB版本的选择,
最开始下载的是mariadb-10.11.8-linux-systemd-x86_64.tar.gz,安装插件报如下错误,不兼容。
mysql> INSTALL PLUGIN server_audit SONAME 'server_audit.so';
重新下载mariadb-10.5.25-linux-systemd-x86_64.tar.gz版本
https://mariadb.org/download/
进入plugin子目录,查看下是否要另外安装依赖
mysql> show global variables like 'plugin_dir';
[root@cjc-db-01 plugin]# pwd
可以正常安装插件
mysql> INSTALL PLUGIN server_audit SONAME 'server_audit.so';
但后面使用审计时,引起了MySQL宕机,兼容应该还有问题,谨慎使用!
查看审计插件
mysql> show variables like '%server_audit%';
参数说明
server_audit_events:
启用审计功能
set global server_audit_logging=on;
添加以下配置,使得配置永久生效:
[mysql@cjc-db-01 log]$ vi mysqldata/3308/conf/my.cnf
测试:MySQL直接宕机?
mysql> use cjc;
查看审计日志:
[mysql@cjc-db-01 log]$ tail -100f mysql_audit.log
查看error.log
[mysql@cjc-db-01 log]$ tail -500f error.log
卸载审计
[root@cjc-db-01 plugin]# rm -r /mysqldata/app/5.7.44/lib/plugin/server_audit.so
7.MySQL 传输加密SSL
MySQL数据库5.7 、8.0以后默认都开启SSL,如需关闭SSL,可以把have_ssl 设为off。
MYSQL版本5.7.44,默认开启了ssl,同时 datadir 目录下自动生成证书文件。
[root@cjc-db-01 ~]# ls -lrth mysqldata/3308/data/*.pem
登录测试
[mysql@cjc-db-01 ~]$ mysql -ucjc -p -h192.168.1.6 -P3308
查看参数
mysql> show variables like '%ssl%';
mysql> show variables like '%auto_generate_certs%';
mysql> select user,host,plugin,ssl_type from mysql.user where user like 'cjc%';
对cjc用户启用SSL
mysql> ALTER USER 'cjc'@'%' REQUIRE SSL;
登录测试
[mysql@cjc-db-01 ~]$ mysql -ucjc -p -h192.168.1.6 -P3308
使用SSL登录
[mysql@cjc-db-01 ~]$ mysql --ssl-ca=/mysqldata/3308/data/ca.pem --ssl-cert=/mysqldata/3308/data/client-cert.pem --ssl-key=/mysqldata/3308/data/client-key.pem --ssl-cipher=AES128-SHA -u cjc -p
mysql> show global status like 'Ssl_cipher';
8.MySQL 数据加密
TDE( Transparent Data Encryption,透明数据加密) 指的是无需修改应用就可以实现数据的加解密,在数据写磁盘的时候加密,读的时候自动解密。
加密后其他人即使能够访问数据库文件,没有key也无法读取数据,从而达到防止非法访问的目的。
对于不同的版本,支持的文件加密也是有区别的,8.0.23或以上,支持的加密包括有:独立表空间、通用表空间、DoubleWrite文件、mysql系统表空间、Redo log和UndoLog文件的加密。
启用加密后,对于备份策略也需要调整,需要考虑到master键的保存,并不时作备份恢复测试,确保即使生产数据完全丢失也可以恢复数据。
安装插件
[mysql@cjc-db-01 3308]$ mkdir /mysqldata/3308/tde
检查
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
mysql> INSTALL PLUGIN keyring_udf SONAME'keyring_udf.so';
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
修改配置文件
[mysql@cjc-db-01 3308]$ vi /mysqldata/3308/conf/my.cnf
重启
[mysql@cjc-db-01 ~]$ mysqladmin -uroot -p shutdown
mysql> show variables like 'keyring%';
创建加密表
mysql> create table t2(id int) ENCRYPTION='Y';
mysql> insert into t2 values(1),(2),(3);
创建普通表
mysql> create table t3(id int);
查看
mysql> SELECT TABLE_SCHEMA,TABLE_NAME,ENGINE,CREATE_OPTIONS FROM information_schema.tables WHERE CREATE_OPTIONS='ENCRYPTION="Y"';
[mysql@cjc-db-01 cjc]$ ls -lrth
对比加密表和普通表
[mysql@cjc-db-01 cjc]$ strings t3.ibd
[mysql@cjc-db-01 cjc]$ strings t2.ibd
查看tde文件
[mysql@cjc-db-01 3308]$ strings tde
mysqldump导出加密表,无限制
[mysql@cjc-db-01 back]$ mysqldump -uroot -p --databases cjc --tables t2 > t2.sql
无加密
[mysql@cjc-db-01 3308]$ cat /mysqldata/back/t2.sql |grep INSERT
参考:
https://dev.mysql.com/doc/refman/8.0/en/innodb-data-encryption.html
欢迎关注我的公众号"IT小Chen"
###chenjuchao 20240519###
标签:搞定,01,测评,cjc,MySQL,db,mysql,password From: https://blog.csdn.net/chenoracle/article/details/143852800