• 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() ;
    
    • 1

    在这里插入图片描述

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

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

    show plugins;
    
    • 1

    在这里插入图片描述

    2).安装validate_password 插件

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

    安装命令:
    INSTALL PLUGIN validate_password SONAME 'validate_password.so';
    卸载命令:
     UNINSTALL PLUGIN  validate_password;
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    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;          # 查看密码复杂性要求密码最低长度大小
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

    在这里插入图片描述
    参数说明:
    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'
    
    • 1
    • 2

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

    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%';
    
    • 1

    2).安装mysql插件

    install plugin  CONNECTION_CONTROL soname 'connection_control.so';
    install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';
    
    • 1
    • 2

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

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

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

    service mysqld start
    
    • 1

    3).查看是否安装成功

    show variables like 'connection_control%';
    
    • 1

    在这里插入图片描述

    4).参数说明

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

    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%';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    -- 该表记录登录失败的用户及失败次数,当用户登录成功后,登录失败的记录则会被删除。
    -- 重新配置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     |
    +------------------------------------+-------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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%';
    
    • 1

    在这里插入图片描述

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    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
    
    • 1

    在这里插入图片描述

    (2).验证
    status;
    
    • 1

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    (5).dbeaver连接测试:

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

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

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

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

    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
    
    • 1
    • 2

    #####(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
    • 2
    • 3

    在这里插入图片描述

    二、入侵防范

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

    1).指标描述

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

    2).整改建议

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

    3).解决方案

    1).查看空闲

    SHOW GLOBAL VARIABLES LIKE '%timeout%'
    
    • 1

    在这里插入图片描述

    2).修改参数

    SET GLOBAL wait_timeout=1800
    
    • 1

    在这里插入图片描述

    三、安全审计

    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';
    
    • 1

    在这里插入图片描述

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

    在这里插入图片描述

    4).授予执行权限

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

    在这里插入图片描述

    5).安装插件

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

    其他说明

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

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

    在这里插入图片描述

    6).查看参数

    show variables like '%audit%'
    
    • 1

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    重点说明 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变量,以便能够设置日志记录的长度。以前,由于查询字符串较长,日志条目将被截断。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    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'; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    (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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    在这里插入图片描述

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

    在这里插入图片描述

    (5).日志格式

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

    [timestamp],[serverhost],[username],[host],[connectionid],[queryid],[operation],[database],[object],[retcode]
    
    • 1
    20220728 21:09:51,localhost.localdomain,root,localhost,4,55,QUERY,mysql,'show tables',0
    
    • 1
    (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 {} \;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    2).创建路径并上传脚本文件
    创建备份文件路径:
    mkdir -p /apps/server_audit_bak
    创建备份文件sh存放路径:
    mkdir -p /apps/mysqlBackSh/
    
    • 1
    • 2
    • 3
    • 4

    上传备份文件到指定路径

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    定时任务有两种配置方式:
    方法1:
    crontab -r
    crontab -e
    crontab -l
    方法2:
    vim /etc/crontab
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
     48 22 * * *   root  /apps/mysqlBackSh/serverAuditLogBack.sh
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    VUE3照本宣科——eslint与prettier
    【监督学习】套索回归与岭回归(含代码)
    Linux 安装Mysql 详细教程
    初学ABB机器人与库卡机器人时,常常碰到的问答集锦
    树-层序遍历序列构造二叉树
    批量处理图片:轻松转换JPG到TIFF,优化你的图片管理“
    【MATLAB】BiGRU神经网络回归预测算法
    Spring-Cloud-Alibaba-SEATA源码解析(二)(客户端)
    中英双语多语言外贸企业网站源码系统 - HanCMS - 安装部署教程
    建立复数类
  • 原文地址:https://blog.csdn.net/q908544703/article/details/126034119