数据库口令应有复杂度要求并定期更换,要求管理员账户口令长度至少为8位,口令必须从字符(a-z,A-Z,)、数字(0-9)、符号(~!@#¥%^&*()_<>)中至少选择两种进行组合。普通账户口令至少为8位,由非纯数字或字母组成。
设置密码复杂度策略。(建议:密码长度应至少8位,密码必须从字符(a-z,A-Z)、数字(0-9)、符号(~!@#¥%^&*()_<>)中至少选择两种进行组合)
MySQL5.6.6版本之后增加了密码强度验证插件validate_password,相关参数设置的较为严格。使用了该插件会检查设置的密码是否符合当前设置的强度规则,若不满足则拒绝设置。
本文使用的MySQL版本为 5.7.24
select version() ;
插件库的文件名是validate_password.文件名后缀根据平台的不同而不同(例如,linux是.so 对于Windows是.dll)
show plugins;
插件库的文件名是validate_password.文件名后缀根据平台的不同而不同(例如,linux是.so 对于Windows是.dll)
安装命令:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
卸载命令:
UNINSTALL PLUGIN validate_password;
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; # 查看密码复杂性要求密码最低长度大小
# 查看默认策略配置
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策略的同时,密码不能存放在字典文件中 |
新增用户km拥有所以权限密码km:
GRANT ALL PRIVILEGES ON *.* TO 'km'@'%' IDENTIFIED BY 'km'
在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
应设置登录失败处理功能,可采取结束会话、限制非法次数和自动退出措施
建议设置未登录失败5次后,账户锁定30分钟
select PLUGIN_NAME, PLUGIN_STATUS from INFORMATION_SCHEMA.PLUGINS where PLUGIN_NAME like 'connection%';
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
show variables like 'connection_control%';
connection_control_failed_connections_threshold:单个用户登录失败(由于密码错误引起)次数上限,默认3次
connection_control_max_connection_delay:失败上限之后再次尝试登录前最小等待时间,单位ms
connection_control_min_connection_delay:失败上限之后再次尝试登录前最小等待时间,默认1秒(1000ms)
-- 查看默认相关变量
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 |
+------------------------------------+-------+
注意:
只有在MySQL5.6.46之前,才可以使用yaSSL作为OpenSSL的替代品来编译MySQL。从MySQL5.6.46开始,不再支持yaSSL,所有MySQL构建都使用OpenSSL。
mysql5.7默认安装都已经安装好了ssl的,证书在数据目录下。
当对服务器进行远程管理时,应采取必要措施,防止鉴别信息在网络传输过程中被窃听
启用SSL协议
mysql5.7默认安装都已经安装好了ssl的,证书在数据目录下。
show global variables like '%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;
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
status;
show status like 'ssl_cipher';
show session status like 'ssl_version';
进入证书路径:
cd /var/lib/mysql
书生成java客户端可识别的证书密码:truststore
keytool -importcert -alias tmsMySQLCACert -file ca.pem -keystore truststore -storepass 123456
#####(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)数据库应设置数据库监听口令(注:集群部署不做要求),并设置监听服务空闲连接超时时间。
建设将空闲连接超时时间设置为30分钟
SHOW GLOBAL VARIABLES LIKE '%timeout%'
SET GLOBAL wait_timeout=1800
1)应开启数据库审计功能或通过审计系统对数据库进行审计,审计范围应覆盖到数据库所有账户
2)审计内容应包括用户行为、系统资源的异常使用和系统命令的使用等系统内的安全相关事件。
3)审计记录应该包括事件的日期、时间、类型、主体标识、客体标识和结果等。
4)应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等。
1)开启日志审计功能,审计内容需包括所用用户
2)开启日志审计功能,审计内容需包括用户行为、系统资源的异常使用和重要系统命令
3)开启日志审计功能,审计记录需包括事件的日期、时间、类型、主体标识、客体标识和结果等
4)数据库开启日志审计功能,对审计记录进行定期备份
为了安全和操作的可追溯性考虑,越来越多的公司加⼊了审计功能。mysql5.5推出了相关的审计功能,到5.6.20功能进⼀步完善,企业版自带审计功能,社区版本要去自己下载。我们可以安装MariaDB的插件。
下载地址
https://mariadb.com/kb/en/mariadb-audit-plugin-versions/
解压下载包lib\plugin
show variables like 'plugin_dir';
chmod +x /usr/local/mysql/lib/plugin/server_audit.so
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’;
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变量,以便能够设置日志记录的长度。以前,由于查询字符串较长,日志条目将被截断。
开启审计日志:
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';
# 随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/*
service mysql restart
可以看到所有扣分都会在审计日志中记录,记录的信息包括有时间,服务器主机,用户,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
#!/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 {} \;
创建备份文件路径:
mkdir -p /apps/server_audit_bak
创建备份文件sh存放路径:
mkdir -p /apps/mysqlBackSh/
上传备份文件到指定路径
如果报如下错误参考
https://blog.csdn.net/q908544703/article/details/90666167
正常备份成功执行第五步
通过查看系统日志目录下的定时任务日志
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