Mysql数据库的安全策略

目录

一、身份鉴别

1.设置密码复杂度策略

1).指标描述

数据库口令应有复杂度要求并定期更换,要求管理员账户口令长度至少为8位,口令必须从字符(a-z,A-Z,)、数字(0-9)、符号(~!@#¥%^&*()_<>)中至少选择两种进行组合。普通账户口令至少为8位,由非纯数字或字母组成。

2).整改建议

设置密码复杂度策略。(建议:密码长度应至少8位,密码必须从字符(a-z,A-Z)、数字(0-9)、符号(~!@#¥%^&*()_<>)中至少选择两种进行组合)

3).解决方案

MySQL5.6.6版本之后增加了密码强度验证插件validate_password,相关参数设置的较为严格。使用了该插件会检查设置的密码是否符合当前设置的强度规则,若不满足则拒绝设置。
本文使用的MySQL版本为 5.7.24

select  version() ;

在这里插入图片描述

插件库的文件名是validate_password.文件名后缀根据平台的不同而不同(例如,linux是.so 对于Windows是.dll)

1).查看validate_password 插件是否安装

show plugins;

在这里插入图片描述

2).安装validate_password 插件

插件库的文件名是validate_password.文件名后缀根据平台的不同而不同(例如,linux是.so 对于Windows是.dll)

安装命令:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
卸载命令:
 UNINSTALL PLUGIN  validate_password;

在这里插入图片描述

3).设置策略,以下设置策略脚本

set global validate_password_policy=0;          # 这个参数用于控制validate_password的验证策略 0-->low  1-->MEDIUM  2-->strong
set global validate_password_length=8;          # 设置密码复杂性要求密码最低长度为8
set global validate_password_mixed_case_count=1 # 大小写字符长度,至少1个
set global validate_password_number_count=1     # 设置至少含一个数字
set global validate_password_special_char_count=1 # 特殊字符至少1个
select @@validate_password_policy;          # 查看密码复杂性策略
select @@validate_password_length;          # 查看密码复杂性要求密码最低长度大小

4).查看策略及策略参数说明

# 查看默认策略配置 
show variables like 'validate_password%';

在这里插入图片描述
参数说明:
validate_password_check_user_name :默认关闭,设置为ON时可以将密码设置成当前用户名
validate_password_dictionary_file :检查密码的字典文件的路径名
validate_password_length:密码最小长度
validate_password_mixed_case_count:最少需要拥有的大小写字母数(同时拥有大写和小写字母)
validate_password_number_count:最少需要拥有的数字个数
validate_password_special_char_count:最少需要拥有的特殊字符数
validate_password_policy:表示密码策略,默认为MEDIUM,有三个取值范围:

取值范围 含义
0 or LOW 表示只需要符合密码长度即可
1 or MEDIUM 表示在满足LOW策略的同时,还需要满足至少有一个数字,一个大小写字母和特殊字符
2 or STRONG 表示满足MEDIUM策略的同时,密码不能存放在字典文件中

5).查看策略是否配置生效

新增用户km拥有所以权限密码km:
GRANT ALL PRIVILEGES ON *.* TO 'km'@'%' IDENTIFIED BY 'km'

失败验证图:
在这里插入图片描述
成功验证图:
在这里插入图片描述

2.设置用户登录失败处理策略

1).前⾔

在MySQL 5.6.35以后提供了Connection-Control插件用来控制客户端在登录操作连续失败一定次数后的响应延迟。该插件可有效的防止客户端暴力登录的风险(攻击)。该插件包含以下2个组件:
· CONNECTION_CONTROL:用来控制登录失败的次数及延迟响应时间
· CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:该表将登录失败的操作记录至IS库中

具体查看:https://dev.mysql.com/doc/refman/5.6/en/validate-password-installation.html

2).指标描述

应设置登录失败处理功能,可采取结束会话、限制非法次数和自动退出措施

3).整改建议

建议设置未登录失败5次后,账户锁定30分钟

4).解决方案

1).查看是否安装插件

select PLUGIN_NAME, PLUGIN_STATUS from INFORMATION_SCHEMA.PLUGINS where PLUGIN_NAME like 'connection%';

2).安装mysql插件

install plugin  CONNECTION_CONTROL soname 'connection_control.so';
install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';

修改配置文件(/etc/my.cnf)

vim  /etc/my.cnf
在[mysqld]下增加
[mysqld]
connection-control-failed-connections-threshold=5   #登陆失败次数限制
connection-control-min-connection-delay=108000    #限制重试时间,此处为毫秒,注意按需求换算

重新启动MySQL(根据版本选择重启命令)

service mysqld start

3).查看是否安装成功

show variables like 'connection_control%';

在这里插入图片描述

4).参数说明

connection_control_failed_connections_threshold:单个用户登录失败(由于密码错误引起)次数上限,默认3次
connection_control_max_connection_delay:失败上限之后再次尝试登录前最小等待时间,单位ms
connection_control_min_connection_delay:失败上限之后再次尝试登录前最小等待时间,默认1秒(1000ms)

5).插件配置

-- 查看默认相关变量
show variables like 'connection_control%';
-- 定制化配置
SET GLOBAL connection_control_failed_connections_threshold = 3;
SET GLOBAL connection_control_min_connection_delay = 1000;
SET GLOBAL connection_control_max_connection_delay = 86400;
-- 查看修改后的配置
show variables like 'connection_control%';
-- 该表记录登录失败的用户及失败次数,当用户登录成功后,登录失败的记录则会被删除。
-- 重新配置connection_control_failed_connections_threshold变量,该表记录会被删除(重置)
-- 如果使用不存在的用户登录,则该表记录用户名为空,但会记录具体登录的IP
use information_schema;
select * from connection_control_failed_login_attempts;

-- 连接控制的使用次数(可用户判断是否存在暴力登录尝试)
-- 重新配置connection_control_failed_connections_threshold变量,该表记录会被删除(重置)
mysql> show global status like 'Connection_control_delay_generated';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| Connection_control_delay_generated | 5     |
+------------------------------------+-------+

6).自行验证

3.启用SSL协议

1).前言

注意:
只有在MySQL5.6.46之前,才可以使用yaSSL作为OpenSSL的替代品来编译MySQL。从MySQL5.6.46开始,不再支持yaSSL,所有MySQL构建都使用OpenSSL。
mysql5.7默认安装都已经安装好了ssl的,证书在数据目录下。

2).指标描述

当对服务器进行远程管理时,应采取必要措施,防止鉴别信息在网络传输过程中被窃听

3).整改建议

启用SSL协议

4).解决方案

1).前言

mysql5.7默认安装都已经安装好了ssl的,证书在数据目录下。

(1).查看mysql数据目录

在这里插入图片描述

(2).查看目录下的数据

在这里插入图片描述

2).在配置文件中[mysqld]栏目加入如下证书配置

在这里插入图片描述

3).验证mysql是否开启ssl

show global variables like '%ssl%';

在这里插入图片描述

4).创建开启ssl用户并赋予权限

mysql -u root -p
use mysql;
#新建用户强制使用SSL
grant all privileges on *.* to 'admin'@'%' identified by 'pa44w0rd@aaAA11--' require ssl;
grant all privileges on *.* to 'admin'@'localhost' identified by 'pa44w0rd@aaAA11--' require ssl;
grant all privileges on *.* to 'admin'@'127.0.0.1' identified by 'pa44w0rd@aaAA11--' require ssl;
FLUSH PRIVILEGES;

在这里插入图片描述

5).基于mysql登录并验证用户是否开启ssl

(1).登录
mysql -h ip -u root -p --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem
或者:
mysql  -u admin -p --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem
mysql -uadmin -ppa44w0rd@aaAA11-- -P53310 -h 127.0.0.1  --ssl-cert=/var/lib/mysql/client-cert.pem  --ssl-key=/var/lib/mysql/client-key.pem

在这里插入图片描述

(2).验证
status;

在这里插入图片描述

(3).查看加密方式
show status like 'ssl_cipher';

在这里插入图片描述

(4).查看SSL版本:
show session status like 'ssl_version';

在这里插入图片描述

(5).dbeaver连接测试:

在这里插入图片描述
在这里插入图片描述

6).基于 ca.pem证书生成java客户端可识别的证书密码

进入证书路径:
cd /var/lib/mysql
书生成java客户端可识别的证书密码:truststore 
keytool -importcert -alias tmsMySQLCACert -file ca.pem -keystore truststore -storepass 123456

在这里插入图片描述
在这里插入图片描述

7).java客户端设置

#####(1).JDBC格式

jdbcurl:
jdbc:mysql://ip:3306/data?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=true&verifyServerCertificate=true&requireSSL=true&sslMode=verify_ca&trustCertificateKeyStoreUrl=file:C:/Users/Administrator/Desktop/truststore&trustCertificateKeyStorePassword=123456

#####(2).java测试

db.url=jdbc:mysql://192.168.153.162:53310/dev_data?useUnicode=true&&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=true&verifyServerCertificate=true&requireSSL=true&sslMode=verify_ca&trustCertificateKeyStoreUrl=file:C:/Users/Administrator/Desktop/truststore&trustCertificateKeyStorePassword=123456
db.username=admin
db.password=pa44w0rd@aaAA11--

在这里插入图片描述

二、入侵防范

1.MYSQL的数据连接超时时间设置

1).指标描述

1)数据库应设置数据库监听口令(注:集群部署不做要求),并设置监听服务空闲连接超时时间。

2).整改建议

建设将空闲连接超时时间设置为30分钟

3).解决方案

1).查看空闲

SHOW GLOBAL VARIABLES LIKE '%timeout%'

在这里插入图片描述

2).修改参数

SET GLOBAL wait_timeout=1800

在这里插入图片描述

三、安全审计

1.开启日志审计功能

1).指标描述

1)应开启数据库审计功能或通过审计系统对数据库进行审计,审计范围应覆盖到数据库所有账户
2)审计内容应包括用户行为、系统资源的异常使用和系统命令的使用等系统内的安全相关事件。
3)审计记录应该包括事件的日期、时间、类型、主体标识、客体标识和结果等。
4)应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等。

2).整改建议

1)开启日志审计功能,审计内容需包括所用用户
2)开启日志审计功能,审计内容需包括用户行为、系统资源的异常使用和重要系统命令
3)开启日志审计功能,审计记录需包括事件的日期、时间、类型、主体标识、客体标识和结果等
4)数据库开启日志审计功能,对审计记录进行定期备份

3).解决方案

1).前⾔

为了安全和操作的可追溯性考虑,越来越多的公司加⼊了审计功能。mysql5.5推出了相关的审计功能,到5.6.20功能进⼀步完善,企业版自带审计功能,社区版本要去自己下载。我们可以安装MariaDB的插件。
在这里插入图片描述

下载地址
https://mariadb.com/kb/en/mariadb-audit-plugin-versions/

解压下载包lib\plugin

2).查看插件路径

show variables like 'plugin_dir';

在这里插入图片描述

3).解压下载包上传lib\plugin\server_audit.so 并上传到插件路径下/usr/local/mysql/lib/plugin/

在这里插入图片描述

4).授予执行权限

chmod +x   /usr/local/mysql/lib/plugin/server_audit.so 

在这里插入图片描述

5).安装插件

install plugin server_audit SONAME 'server_audit.so';
卸载审计插件:
UNINSTALL PLUGIN server_audit;

其他说明

在my.cnf 设置 plugin_load = server_audit=server_audit.so #载入审计插件,

这可以代替在mysql> install plugin server_audit soname ‘server_audit.so’;

在这里插入图片描述

6).查看参数

show variables like '%audit%'

在这里插入图片描述

server_audit_events :指定记录事件的类型,可以用逗号分隔的多个值   
server_audit_excl_users : 该列表的用户[行为]将不记录,connect信息将不受该设置影响
server_audit_file_path :使用该变量设置存储日志的文件,可以指定目录,默认存放在数据目录的server_audit.log文件中
server_audit_file_rotate_now :知否立即切割日志
server_audit_file_rotate_size :限制日志文件的大小
server_audit_file_rotations :指定日志文件的数量,如果为0日志将从不轮转
server_audit_incl_users : 指定哪些用户的活动将记录,connect将不受此变量影响,该变量比server_audit_excl_users优先级高
server_audit_loc_info :
server_audit_logging :启动或关闭审计ON/OFF
server_audit_mode :标识版本,用于开发测试
server_audit_output_type :指定日志输出类型,可为SYSLOG或FILE,当为syslog时记录到/var/log/messages
server_audit_query_log_limit :1024
server_audit_syslog_facility :LOG_USER
server_audit_syslog_ident :mysql-server_auditing
server_audit_syslog_info :
server_audit_syslog_priority :LOG_INFO
重点说明 server_audit_events

省略值全部事件类型都会记录到审计日志中,可选择事件类型才记录。

如 server_audit_events = query,table,query_ddl,query_dml

事件类型

CONNECT:连接、断开连接和失败的连接,包括错误代码

QUERY:以纯文本形式执行的查询及其结果,包括由于语法或权限错误而失败的查询

TABLE:受查询执行影响的表

QUERY_DDL:与QUERY相同,但只筛选DDL类型的查询(create、alter、drop、rename和truncate语句,create/drop[procedure/function/user]和rename user除外(它们不是DDL)

QUERY_DML:与QUERY相同,但只筛选DML类型的查询(do、call、load data/xml、delete、insert、select、update、handler和replace语句)

QUERY_DCL:与QUERY相同,但只筛选DCL类型的查询(create user、drop user、rename user、grant、revoke和set password语句)

QUERY_DML_NO_SELECT:与QUERY_DML相同,但不记录SELECT查询。(从1.4.4版开始)(do、call、load data/xml、delete、insert、update、handler和replace语句)

注意:
1. 如果开启了查询缓存(query cache),查询直接从查询缓存返回数据,将没有table记录

2. 由于除了DDL和DML之外还有其他类型的查询,因此将查询DDL和查询DML选项一起使用并不等同于使用查询。从Audit插件的1.3.0版开始,有用于记录查询的DCL类型(例如GRANT和REVOKE语句)的QUERY_DCL选项。在同一版本中,添加了server_audit_query_log_limit变量,以便能够设置日志记录的长度。以前,由于查询字符串较长,日志条目将被截断。

7).修改参数

(1).暂时修改
开启审计日志:
set global server_audit_logging=ON;
set global  server_audit_file_rotate_now=ON;
日志路径要规范:
set global server_audit_file_path='/apps/mysql-5.6.31-linux-glibc2.5-x86_64/logs/';
通常查询不需要审计(mysql 测试过滤不掉,mariadb 可以):
set global server_audit_events='query_ddl,query_dml'; 
(2).配置audit永久有效
# 随MySQL启动自动加载
server_audit_logging=ON   
# 指定要记录SQL语句,除查询语句外
#server_audit_events=connect,table,query_ddl,query_dcl,query_dml_no_select    
#server_audit_events=connect,query,table,query_ddl,query_dml,query_dcl,query_dml_no_select
# 开启日志轮转
server_audit_file_rotate_now=ON    
# 日志文件达到100M就轮转
server_audit_file_rotate_size=100000000     
# 审计日志文件存储路径
server_audit_file_path=/apps/mysql-5.6.31-linux-glibc2.5-x86_64/logs/server_audit.log

注意:
server_audit_file_path=配置的路径权限
无权限会报如下错误:
在这里插入图片描述

chown -R mysql:mysql /apps/mysql-5.6.31-linux-glibc2.5-x86_64/*

在这里插入图片描述

(3).重启
service mysql restart
(4).查看最终生效的配置

在这里插入图片描述

(5).日志格式

可以看到所有扣分都会在审计日志中记录,记录的信息包括有时间,服务器主机,用户,ip,对应数据库名及query语句,还有连接的情况

[timestamp],[serverhost],[username],[host],[connectionid],[queryid],[operation],[database],[object],[retcode]
20220728 21:09:51,localhost.localdomain,root,localhost,4,55,QUERY,mysql,'show tables',0
(6).定时备份文件
1).备份文件脚本
#!/bin/bash
#/apps/mysql-5.6.31-linux-glibc2.5-x86_64/logs/server_audit.log
#源文件路径
server_audit_file_path=/apps/mysql-5.6.31-linux-glibc2.5-x86_64/logs
#备份文件路径
backup_path="/apps/server_audit_bak"
# 复制日志文件内容到新的文件中
cp $server_audit_file_path/server_audit.log $backup_path/server_audit_`date -d '-1 days' +%Y%m%d`.log
# 清空tomcat默认日志输出文件
echo "" > $server_audit_file_path/server_audit.log
# 删除7天之前的就备份文件
  find $backup_path/* -mtime +7 -exec rm {} \;

2).创建路径并上传脚本文件
创建备份文件路径:
mkdir -p /apps/server_audit_bak
创建备份文件sh存放路径:
mkdir -p /apps/mysqlBackSh/

上传备份文件到指定路径

3).授权脚本文件权限

在这里插入图片描述

4).执行脚本文件

如果报如下错误参考

https://blog.csdn.net/q908544703/article/details/90666167
在这里插入图片描述
正常备份成功执行第五步

5).定时备份
通过查看系统日志目录下的定时任务日志
tail -100f /var/log/cron
通过查看当前用户mail
tail -100f  /var/spool/mail/root
查看定时任务状态:
service crond status
重启启动定时任务:
service crond restart
定时任务有两种配置方式:
方法1:
crontab -r
crontab -e
crontab -l
方法2:
vim /etc/crontab
 48 22 * * *   root  /apps/mysqlBackSh/serverAuditLogBack.sh

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/q908544703/article/details/126034119