首页 > 数据库 >5分钟,轻松搞定MySQL数据库等保测评

5分钟,轻松搞定MySQL数据库等保测评

时间:2024-11-19 21:14:35浏览次数:3  
标签:搞定 01 测评 cjc MySQL db mysql password

前言

作为数据库运维人员,需要理性看待数据库等保测评相关工作,完全按照测评结果对数据库进行整改,或完全忽略测评结果都是不可取的,过犹不及,物极必反。

比如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

相关文章

  • 【MySQL】约束
    【MySQL】约束文章目录【MySQL】约束前言一、概述二、约束演示三、外键约束总结前言本篇文章就MySQL约束,讲到约束的概述,约束演示以及外键约束。一、概述概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据库中数据的正确、有效性和完整......
  • MySQL常用命令
    MySQL#用户管理及授权CREATEUSERluke@localhostIDENTIFIEDBY'linuxprobe';grantallon*.*toluke@localhost;grantselect,update,delete,insertonmysql.usertoluke@localhost;#查询用户权限showgrantsforluke@localhost;#创建DBcreatedatabaselinu......
  • MySQL 逻辑备份与恢复指南
    MySQL逻辑备份与恢复指南引言逻辑备份将数据库数据和结构导出为SQL文件,用于数据迁移或恢复。本文提供常用备份和恢复命令,适用于单表、单数据库、多数据库及所有数据库场景。命令行参数说明<参数>:尖括号内的内容为用户需替换的实际值(例如:主机、端口、用户名等)。>:表示输出重......
  • Chainlit快速实现AI对话应用将聊天记录的持久化到MySql关系数据库中
    概述默认情况下,Chainlit应用不会保留其生成的聊天和元素。即网页一刷新,所有的聊天记录,页面上的所有聊天记录都会消失。但是,存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。之前写过一篇文章《Chainlit快速实现AI对话应用并将聊天数据的持久化到sqllite本......
  • OpenCompass使用LawBench数据测评本地Qwen大模型
    一、思维导图展示 二、OpenCompass简介OpenCompass是一个大模型测评体系,开源、高效。同时集成CompassKit测评工具、CompassHub测评集社区,CompassRank测评榜单。官网地址:https://opencompass.org.cn/home三、OpenCompass安装3.1创建虚拟环境condacreat......
  • MySQL查询慢的根本原因
    这里的表空间呢,指的是独立表空间,在MySQL中,表空间分为2种,分别是共享表空间和独立表空间,不过在MySQL5.6.6及后续版本默认使用的是独立表空间,说白了就是一个独立表空间在磁盘中会单独对应一个表空间文件,而一个表空间文件存放着MYSQL数据库中一张表的数据。在表空间中有很多数......
  • MySQL 性能定位
    一、SQL性能分析   1.SQL执行频率    MySQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:      --session是查看当前会话; ......
  • SeaCMS(海洋CMS)存在MySQL慢查询漏洞(CNVD-2024-39253、CVE-2024-46640)
    SeaCMS(海洋CMS)是一款开源免费PHP影视系统,因其功能强大,操作使用简单,拥有大量用户。 国家信息安全漏洞共享平台于2024-09-26公布其存在MySQL慢查询漏洞。漏洞编号:CNVD-2024-39253、CVE-2024-46640影响产品:SeaCMS(海洋CMS) 13.2漏洞级别:高公布时间:2024-09-26漏洞描述:攻击者可......
  • 安装MySQL
    前提:安装docker服务并配置私有库,镜像加速地址云服务器或者本地服务器开放MySQL端口3306登录私有库,参考登录私有库步骤拉取MySQL镜像#拉取私有库MySQL镜像dockerpull8.134.59.62:8083/mysql●8.134.59.62:8083/mysql为私有库镜像地址:私有库IP:端口号/镜像名#查看已拉......
  • QNAP QuMagie相册元数据导出,一键搞定!
    在某些情况下,例如硬盘故障,多媒体数据库损坏导致辛辛苦苦做了几天的人脸命名识别和相册都被重置了,迫切的需要将QuMagie中的元数据导出进行备份,随着新版本qumagie的更新,该功能也是支持了。本教程将详细介绍在QuMagie2.4.0及更高版本中如何进行文件的导入和导出操作。从QuM......