mysql等保

背景

根据客户发起的等保要求,我司系统需要进行安全规范整改。

等保要求

测评对象名称 安全层面 安全控制点 测评项 风险值 问题描述 问题分析 危害分析 整改建议
MySQL数据库 安全计算环境 身份鉴别 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 数据库未开启密码复杂性设置,也未设置定期更新口令。 数据库未开启密码复杂性设置,也未定期更新口令,增加了攻击者通过暴力破解的方式获取用户口令的可能。 口令可能被恶意用户猜测获得,合法用户身份被仿冒,导致系统被非授权访问。 建议设置密码复杂性设置,密码长度8为以上,并由数字、字母、特殊字符组成,设置口令定期更换策略。
安全计算环境 身份鉴别 b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施; 1、数据库未开启登录失败处理功能。2、未设置终端登录超时时间。 数据库未设置登录失败处理功能和超时时间过长。 可能存在攻击者通过暴力破解的方式获取用户口令的风险。 建议设置限制用户连续失败登录的最大次数5,超过这个数值,该帐户将被锁定。设置终端登录超时时间,不超过30分钟。
安全计算环境 身份鉴别 d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。 未采用两种或两种以上组合的鉴别技术。 系统只采取用用户名+口令一种验证方式对用户身份进行鉴别,未采取两种或两种以上的用户身份鉴别措施确保系统用户身份不被冒用。 登录口令可能被恶意用户猜测获得,合法用户身份被仿冒,导致系统被非授权访问。 建议对系统采用两种或两种以上组合的鉴别技术实现用户身份鉴别,如:账户密码+数字证书、账户密码+令牌等。
安全计算环境 访问控制 d)应授予管理用户所需的最小权限,实现管理用户的权限分离; 未授予不同帐户为完成各自承担任务所需的最小权限。 数据库帐户未按照三权分立原则进行权限分离,未授予不同帐户为完成各自承担任务所需的最小权限,它们之间未形成相互制约的关系。 可能会导致只具有最小权限的用户可以访问并执行本来并不允许其访问的包。管理员权限过大,可能无法对管理员的行为进行监管、制约。 建议系统授予不同用户为完成各自承担的任务所需的最小权限,将系统管理员和业务操作员权限分离,并设置独立的安全审计员角色,对各类用户的操作行为进行审计监督。
安全计算环境 访问控制 g)应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问。 未对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问。 未对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问。 存在恶意用户通过修改用户权限等方法,非授权访问重要信息资源的可能。 建议对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问。
安全计算环境 安全审计 a)应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计; 数据库未开启审计功能,也未采用第三方审计工具或系统实现审计功能,无法对重要用户行为(如用超级用户命令改变用户身份,删除系统表等)进行审计。 未启用审计功能或审计范围不足,不能记录用户对系统的操作或对文件访问情况,发生安全事件时无法有效确认责任人及造成事件的原因。 未对重要用户、重要事件进行日志记录,不便于安全事件的追溯,不利于系统日常的安全运维。 建议在不影响系统的情况下,启用审计功能或使用第三方审计工具,开启数据库安全审计策略并完善策略,对重要安全事件及用户操作行为进行日志审计,并确保覆盖到所有用户。
安全计算环境 安全审计 b)审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息; 数据库未开启审计功能,也未采用第三方审计工具或系统实现审计功能,无法查看审计记录是否包括事件的时间、主体标识、客体标识和结果等。 未开启审计功能或审计记录内容未包括事件的日期、时间、类型、主体标识、客体标识和结果等。 发生安全事件时,无法通过审计记录有效确定事件发生时间,责任人及造成事件的原因。 在不影响系统的情况下,启用审计功能或使用第三方审计工具或系统,同时审计记录应包括事件发生的日期和时间、触发事件的主体与客体、事件的类型、事件成功或失败、身份鉴别事件中请求的来源、事件的结果等。
安全计算环境 安全审计 c)应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等; 数据库未开启审计功能,未采用第三方审计工具或系统实现审计功能,未采取措施对审计记录进行保护。 未开启审计功能或未对审计数据进行严格保护,审计记录的丢失和不完整。 无法有效的对安全事件进行追踪和分析。 在不影响系统的情况下,启用数据库审计功能或使用第三方审计工具或系统,同时应保护审计记录,避免受到未预期的删除、修改或覆盖等,审计记录保存6个月以上。
安全计算环境 安全审计 d)应对审计进程进行保护,防止未经授权的中断。 数据库未开启审计功能,也未采用第三方审计工具或系统实现审计功能,未对审计进程进行保护。 未开启审计功能,未采取措施对审计记录进行保护,无法对审计进程进行保护,避免受到未预期中断。 可能导致审计日志缺失,不便于安全事件的追溯,不易发现系统安全隐患。 建议开启安全审计功能或安装第三方审计进程保护软件,避免审计进程受到未预期的中断。
安全计算环境 入侵防范 e)应能发现可能存在的已知漏洞,并在经过充分测试评估后,及时修补漏洞; 未有漏洞扫描报告。 系统未及时对可能存在的已知漏洞进行测试评估。 系统漏洞可能被利用进行网络攻击影响正常运行,造成业务中断。 建议加强系统的管理,对漏洞进行充分的测试评估,及时修补相关安全漏洞。
安全计算环境 可信验证 a)可基于可信根对计算设备的系统引导程序、系统程序、重要配置参数和应用程序等进行可信验证,并在应用程序的关键执行环节进行动态可信验证,在检测到其可信性受到破坏后进行报警,并将验证结果形成审计记录送至安全管理中心。 未采取可信验证措施。 未对计算设备的系统引导程序、系统程序、重要配置参数和 应用程序等进行可信验证,并在检测到其可信性受到破坏后进行报警,并将验证结果形成审计记录送至安全管理中心。 未使用可信计算,存在恶意软件非授权安装/运行、设备网络假冒等问题,使计算设备的系统引导程序、系统程序、重要配置参数和应用程序等可能受到破坏。 建议对计算设备的系统引导程序、系统程序、重要配置参数和应用程序等进行可信验证,并在检测到其可信性受到破坏后进行报警,并将验证结果形成审计记录送至安全管理中心。
安全计算环境 数据完整性 a)应采用校验技术或密码技术保证重要数据在传输过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等; 未采取措施保证数据库重要审计数据、重要配置数据等在传输过程中的完整性。 未采用密码技术保证鉴别数据、重要业务数据、重要个人信息等通信过程中数据的完整性。 可能导致重要数据在传输过程中被攻击者劫持、篡改,使传输数据的完整性遭到破坏,可能影响到用户和企业的声誉和经济利益。 建议对重要数据采用经国家密码管理局认可的密码技术保证通信过程中数据的完整性。
安全计算环境 数据完整性 b)应采用校验技术或密码技术保证重要数据在存储过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等。 未采取措施保证数据库重要审计数据、重要配置数据等在存储过程中的完整性。 系统未采用密码技术对系统管理数据、鉴别信息和用户数据在存储过程中的完整性进行验证。 可能导致重要数据在存储过程中被恶意篡改。 建议对重要数据采用经国家密码主管部门认可的密码技术,保证其在存储过程中数据的完整性。
安全计算环境 数据保密性 a)应采用密码技术保证重要数据在传输过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等; 未采取措施保证数据库重要审计数据、重要配置数据在传输过程中的保密性。 系统在数据传输过程中未对敏感信息(如系统管理数据、鉴别信息和重要业务数据等)进行加密处理。 重要数据在传输过程中被攻击者嗅探并盗用成功的可能性增大,使私密信息遭遇泄漏。 建议对系统管理数据、鉴别信息及重要业务数据采用经国家密码主管部门认可的密码技术,保证其在通信过程中数据的私密性。
安全计算环境 数据备份恢复 a)应提供重要数据的本地数据备份与恢复功能; 重要数据未进行本地备份和未提供数据恢复测试记录。 管理员未对系统的数据进行定期备份。 系统如出现故障,可能无法及时恢复,或造成重要数据丢失。 建议对数据进行定期备份,并将备份介质场外存放,此外,还应定期对备份文件进行恢复测试,确保备份文件有效。
安全计算环境 数据备份恢复 b)应提供异地实时备份功能,利用通信网络将重要数据实时备份至备份场地; 未提供异地数据实时备份功能。 已利用通信网络将关键数据实时批量传送至备用场地,但未实现实时备份功能。 如机房遭受严重破坏,可能导致数据完全丢失。 建议利用通信网络将关键数据实时批量传送至备用场地,实现异地数据异地备份。
安全计算环境 数据备份恢复 c)应提供重要数据处理系统的热冗余,保证系统的高可用性。 数据库未采用热冗余的部署方式。 关键服务器未做冗余,当设备出现故障时不能及时替换以恢复系统可用性。 当设备出现故障时不能及时替换以恢复系统可用性。 关键服务系统应有额外的硬件冗余,保证系统可用性。

密码复杂度+防爆破+开审计

linux整改配置

[mysqld]
#密码复杂度
plugin-load-add=validate_password.so
validate-password=FORCE_PLUS_PERMANENT
validate_password_policy=1
validate_password_length=8
#防爆破
plugin-load-add=connection_control.so
connection-control=FORCE
connection-control-failed-login-attempts=FORCE
connection_control_min_connection_delay=60000
connection_control_max_connection_delay=86400
connection_control_failed_connections_threshold=3
#开审计
server_audit_logging=on
server_audit_events='CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML,QUERY_DCL'
server_audit_file_path = /app/mysql-3309/auditlogs/
server_audit_file_rotate_size=200000000
server_audit_file_rotations=200
server_audit_file_rotate_now=ON

windows整改配置

[mysqld]
#密码复杂度
plugin-load-add=validate_password.dll
validate-password=FORCE_PLUS_PERMANENT
validate_password_policy=1
validate_password_length=8
#防爆破
plugin-load-add=connection_control.dll
connection-control=FORCE
connection-control-failed-login-attempts=FORCE
connection_control_min_connection_delay=60000
connection_control_max_connection_delay=86400
connection_control_failed_connections_threshold=5
wait_timeout=1800
interactive_timeout=1800
#开审计
plugin-load-add = server_audit.dll
server_audit_logging=ON
server_audit_events='CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML,QUERY_DCL'
server_audit_file_path = E:\\mysql-5.7.35-winx64\\audit\\audit.log
server_audit_file_rotate_size=1G
server_audit_file_rotations=20
server_audit_file_rotate_now=ON

ps:审计插件要用命令行方式实现加载插件。
linux的server_audit.so插件是通过mariadb-10.2.44编译得来的,具体参考:
https://zhuanlan.zhihu.com/p/646087133
本文mysql版本是mysql5.7.44(Server version: 5.7.44-log MySQL Community Server (GPL))
画个重点:

yum install -y openssl libssl-dev build-essential bison libncurses-dev cmake gcc-gcc+ git ncurses-devel
yum install libcurl-devel lz4-devel bzip2-devel zstd-devel snappy-devel libxml2-devel
yum install epel-release -y
yum update -y
yum install zstd-devel -y
yum install zstd -y
cd /app/mariadb-10.2.44
cmake . -DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/app/mysql/data  \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system -DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

make

加入插件

#linux
install plugin server_audit SONAME 'server_audit.so';
#windows
install plugin server_audit SONAME 'server_audit.dll';

报错处理

ssl加密连接

制作证书

不管是linux还是windows,bin目录下都有mysql_ssl_rsa_setup程序,执行它,默认生成证书到data目录下,如果有指定路径,可以通过-d或者--datadir来指定,–uid还可以指定所属用户
例如

mysql_ssl_rsa_setup.exe -d D:/mysql/ssl

linux配置

[mysqld]
ssl=ON
require_secure_transport=ON
ssl-ca=/app/mysql-3309/ssl/ca.pem
ssl-cert=/app/mysql-3309/ssl/server-cert.pem
ssl-key=/app/mysql-3309/ssl/server-key.pem
[client]
ssl-ca=/app/mysql-3309/ssl/ca.pem
ssl-cert=/app/mysql-3309/ssl/client-cert.pem
ssl-key=/app/mysql-3309/ssl/client-key.pem

windows配置

同上,就路径不一样而已

ssl验证

配置完证书连接验证有两种,一种可以通过命令行验证,一种是通过navicat验证

创建测试用户

可以选择强制root使用ssl加密连接
ALTER USER 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
也可以创建个test01用户必须使用ssl连接
GRANT ALL PRIVILEGES ON *.* TO 'test01'@'%' IDENTIFIED BY 'xxxS66xs..343' REQUIRE SSL;
FLUSH PRIVILEGES;

-----取消强制root使用ssl加密连接
ALTER USER 'root'@'%' REQUIRE NONE;
FLUSH PRIVILEGES;

重启后查看配置

SHOW VARIABLES LIKE 'validate_password%';
show variables like 'connection_control%';
SHOW variables LIKE '%timeout';
show variables like '%audit%';
SHOW VARIABLES LIKE '%ssl%';
SHOW variables LIKE 'require_secure_transport';



测试连接

测试1:

测试2:

mysql --ssl-ca=/app/mysql-3309/ssl/ca.pem --ssl-cert=/app/mysql-3309/ssl/client-cert.pem --ssl-key=/app/mysql-3309/ssl/client-key.pem -uroot -p

测试3:
Java连接参考:
https://blog.csdn.net/xuhanbing/article/details/126758569

java连接拓展

根证书转换

openssl pkcs12 -export -in ca.pem -inkey ca-key.pem -out ca.p12 -passout pass:123456

keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore ca.jks -deststoretype PKCS12  -srckeystore ca.p12 -srcstoretype PKCS12 -srcstorepass 123456

client证书转换

openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client.p12 -passout pass:123456
 
keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore client.jks -deststoretype PKCS12  -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass 123456

springboot添加ssl配置

ssl:
  path: D:/Database/mysql
  trustCertificateKeyStoreUrl: file:${ssl.path}/ca.jks
  trustCertificateKeyStorePassword: 123456
  clientCertificateKeyStoreUrl: file:${ssl.path}/client.jks
  clientCertificateKeyStorePassword: 123456
  #      config: false
  config: "true&verifyServerCertificate=true&requireSSL=true\
  &trustCertificateKeyStoreUrl=${ssl.trustCertificateKeyStoreUrl}\
  &trustCertificateKeyStorePassword=${ssl.trustCertificateKeyStorePassword}\
  &clientCertificateKeyStoreUrl=${ssl.clientCertificateKeyStoreUrl}\
  &clientCertificateKeyStorePassword=${ssl.clientCertificateKeyStorePassword}"

再将整个配置到useSSL

参考:

https://blog.csdn.net/qq_39572257/article/details/116227265
https://blog.csdn.net/xuhanbing/article/details/126758569
https://www.cnblogs.com/blackCoder/p/16624788.html
https://opensource.actionsky.com/技术分享-mysql5-7-与-mariadb10-1-审计插件兼容性验证/
https://mariadb.org/download/
https://blog.51cto.com/u_16099236/7143117

posted @ 2024-01-17 16:14  海yo  阅读(257)  评论(0编辑  收藏  举报