等保2.0数据库测评通关指南:MySQL/Oracle/SQL Server/PostgreSQL/Redis五类数据库加固与自查

发布时间:2026/10/9 11:09:44
等保2.0数据库测评通关指南:MySQL/Oracle/SQL Server/PostgreSQL/Redis五类数据库加固与自查
简介这份作业指导书面向数据库安全测评人员、等保合规工程师及运维人员系统梳理了MySQL、Oracle、SQL Server、Postgres、Redis五类主流数据库在等保测评中的实操要点帮助读者快速定位各数据库的测评项与查询方法。资源包内含1个docx文档大小约1.83MB按数据库类型分PART编排涵盖连接登录方式与测评基本查询语句两大模块。其中MySQL部分涉及密码复杂度与有效期、登录失败处理、超时时间、用户及允许登录IP、审计功能、加密远程管理等查询Oracle、SQL Server、Postgres、Redis则分别给出对应的连接方法与密码策略、权限列表、审计开启、终端IP限制等核查语句。目录结构清晰便于按数据库类型逐项查阅适合作为等保测评现场作业的速查手册与自查清单。目前已有785人学习下载可供需要开展数据库合规检查、撰写测评报告或搭建测评环境的技术人员参考使用。1. 等保测评里数据库这一关为什么总在最后卡住做过等保测评的人大概都有体会网络、主机、应用层都过了最后卡在数据库上。MySQL、Oracle、SQL Server、PostgreSQL、Redis 这五类数据库几乎覆盖了国内绝大多数业务系统但它们的等保测评作业方式差异极大——Oracle 有独立的审计策略和 profile 机制MySQL 5.7 和 8.0 的权限模型完全不同Redis 默认无认证直接裸奔SQL Server 的混合认证模式经常被忽略PostgreSQL 的 pg_hba.conf 一行配置就能决定测评结论。等保 2.0 三级要求里安全计算环境部分涉及数据库的条款大约有十几项涵盖身份鉴别、访问控制、安全审计、入侵防范、数据完整性和保密性。很多人以为等保测评就是填表格、截图、交文档实际上测评机构会实际连上数据库执行命令验证配置不对当场就开不符合项。这篇作业指导书面向的是需要自己动手做数据库等保加固和自查的工程师不是写给测评机构看的是写给你自己干活用的。2. 五类数据库的身份鉴别与访问控制从口令策略到最小权限2.1 MySQL 8.0 的口令策略与账户锁定配置MySQL 5.7 之后引入了validate_password组件8.0 默认使用caching_sha2_password认证插件。等保要求口令长度不少于 8 位、包含大小写字母数字特殊字符、定期更换同时要求登录失败处理功能。先确认组件是否安装-- 查看密码验证组件状态 SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE validate_password%; -- 如果未安装安装组件 INSTALL COMPONENT file://component_validate_password; -- 设置口令策略MEDIUM 要求长度8位以上、含数字字母特殊字符 SET GLOBAL validate_password.policy MEDIUM; SET GLOBAL validate_password.length 8; SET GLOBAL validate_password.mixed_case_count 1; SET GLOBAL validate_password.number_count 1; SET GLOBAL validate_password.special_char_count 1;逻辑说明validate_password.policy设为 MEDIUM 时MySQL 会强制校验口令的组成复杂度。length控制最小长度等保三级通常要求 8 位以上如果行业有更严格要求可以设到 12。这些参数写入my.cnf的[mysqld]段才能持久化SET GLOBAL重启后失效。登录失败锁定需要安装connection_control插件INSTALL PLUGIN connection_control SONAME connection_control.so; INSTALL PLUGIN connection_control_failed_login_attempts SONAME connection_control.so; -- 设置连续失败3次后锁定锁定时间60秒 SET GLOBAL connection_control_failed_connections_threshold 3; SET GLOBAL connection_control_min_connection_delay 60000; SET GLOBAL connection_control_max_connection_delay 180000;参数说明threshold是允许的连续失败次数超过后触发延迟min_connection_delay是最小延迟毫秒数60000 即 60 秒。注意这个插件是按账户维度计数的不是全局计数。访问控制方面等保要求数据库账户按最小权限分配。常见做法是-- 创建只读账户仅允许从应用服务器网段连接 CREATE USER app_readonly192.168.1.% IDENTIFIED BY R3ad0nly2024; GRANT SELECT ON biz_db.* TO app_readonly192.168.1.%; -- 创建应用读写账户禁止 DDL 和 DROP CREATE USER app_rw192.168.1.% IDENTIFIED BY AppRw2024#Sec; GRANT SELECT, INSERT, UPDATE, DELETE ON biz_db.* TO app_rw192.168.1.%; -- 回收默认的 test 库权限和匿名账户 DROP DATABASE IF EXISTS test; DELETE FROM mysql.user WHERE User; FLUSH PRIVILEGES;2.2 Oracle 的 Profile 与审计策略配置Oracle 的等保加固核心在 Profile 和统一审计。先创建符合等保要求的口令策略 Profile-- 创建等保合规的 Profile CREATE PROFILE sec_profile LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1 PASSWORD_LIFE_TIME 90 PASSWORD_GRACE_TIME 7 PASSWORD_REUSE_MAX 5 PASSWORD_REUSE_TIME 365 PASSWORD_VERIFY_FUNCTION ora12c_verify_function SESSIONS_PER_USER 10 IDLE_TIME 30 CONNECT_TIME 480; -- 将 Profile 应用到用户 ALTER USER app_user PROFILE sec_profile;参数说明FAILED_LOGIN_ATTEMPTS 5表示连续失败 5 次锁定PASSWORD_LOCK_TIME 1锁定 1 天PASSWORD_LIFE_TIME 90口令 90 天过期IDLE_TIME 30空闲 30 分钟断开。PASSWORD_VERIFY_FUNCTION指定口令复杂度校验函数Oracle 12c 以上自带ora12c_verify_function。Oracle 统一审计从 12c 开始推荐使用-- 创建统一审计策略审计所有登录失败和权限变更 CREATE AUDIT POLICY sec_audit_policy ACTIONS LOGON, ALTER USER, DROP USER, GRANT, REVOKE WHENEVER NOT SUCCESSFUL; -- 启用审计策略 AUDIT POLICY sec_audit_policy; -- 确认审计策略状态 SELECT POLICY_NAME, ENABLED_OPT, SUCCESS, FAILURE FROM AUDIT_UNIFIED_POLICIES WHERE POLICY_NAME SEC_AUDIT_POLICY;逻辑说明WHENEVER NOT SUCCESSFUL表示只记录失败操作减少审计日志量。如果等保要求记录所有操作改为WHENEVER SUCCESSFUL或去掉该子句。审计记录默认写入UNIFIED_AUDIT_TRAIL视图需要确认AUDIT_TRAIL参数设为DB或XML。2.3 SQL Server 的混合认证与登录审计SQL Server 等保测评最常见的坑是混合认证模式。Windows 认证模式下数据库层面无法独立控制口令策略测评时会被质疑。建议启用混合模式并配置 SQL Server 登录的密码策略-- 查看当前认证模式1Windows, 0混合 SELECT SERVERPROPERTY(IsIntegratedSecurityOnly) AS IsWindowsOnly; -- 创建 SQL 登录并强制密码策略 CREATE LOGIN app_login WITH PASSWORD Str0ngPass2024!, CHECK_POLICY ON, CHECK_EXPIRATION ON, DEFAULT_DATABASE biz_db; -- 创建数据库用户并授予最小权限 USE biz_db; CREATE USER app_user FOR LOGIN app_login; ALTER ROLE db_datareader ADD MEMBER app_user; ALTER ROLE db_datawriter ADD MEMBER app_user; -- 明确拒绝 DDL 权限 DENY CREATE TABLE, ALTER ANY SCHEMA TO app_user;参数说明CHECK_POLICY ON让 SQL Server 继承 Windows 密码策略长度、复杂度、锁定阈值CHECK_EXPIRATION ON启用密码过期。如果操作系统层面没有配置密码策略CHECK_POLICY的效果会打折扣需要先在本地安全策略里配好。登录审计通过 SQL Server Audit 实现-- 创建服务器级审计 CREATE SERVER AUDIT sec_audit TO FILE (FILEPATH D:\AuditLogs\, MAXSIZE 500 MB, MAX_ROLLOVER_FILES 10) WITH (ON_FAILURE CONTINUE); ALTER SERVER AUDIT sec_audit WITH (STATE ON); -- 创建审计规范记录登录失败和权限变更 CREATE SERVER AUDIT SPECIFICATION sec_audit_spec FOR SERVER AUDIT sec_audit ADD (FAILED_LOGIN_GROUP), ADD (SUCCESSFUL_LOGIN_GROUP), ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP), ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP) WITH (STATE ON);2.4 PostgreSQL 的 pg_hba.conf 与角色权限PostgreSQL 的访问控制核心在pg_hba.conf这个文件决定了谁能从哪个 IP 以什么认证方式连接哪个库。等保测评会重点检查这个文件。# pg_hba.conf 典型等保合规配置 # TYPE DATABASE USER ADDRESS METHOD local all all peer host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256 host biz_db app_user 192.168.1.0/24 scram-sha-256 host all all 0.0.0.0/0 reject逻辑说明最后一行reject是兜底规则拒绝所有未明确允许的连接。scram-sha-256是 PostgreSQL 10 之后推荐的认证方式比 md5 更安全。peer用于本地 Unix socket 连接按操作系统用户映射。口令策略通过passwordcheck扩展或ALTER SYSTEM配置-- 安装 passwordcheck 扩展需在 shared_preload_libraries 中加载 ALTER SYSTEM SET shared_preload_libraries passwordcheck; -- 重启后生效 -- 创建角色时设置有效期和连接限制 CREATE ROLE app_user WITH LOGIN PASSWORD PgStr0ng2024 VALID UNTIL 2025-12-31 CONNECTION LIMIT 20; -- 授予最小权限 GRANT CONNECT ON DATABASE biz_db TO app_user; GRANT USAGE ON SCHEMA public TO app_user; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user; -- 禁止创建新表 REVOKE CREATE ON SCHEMA public FROM app_user;2.5 Redis 的认证与命令重命名Redis 默认无认证这是等保测评中最容易被开不符合项的地方。Redis 6.0 之后支持 ACL但大多数生产环境还在用 5.x 或更早版本只能用requirepass。# redis.conf 等保合规配置 requirepass R3disStr0ng2024! bind 192.168.1.100 127.0.0.1 protected-mode yes port 6379 maxclients 100 timeout 300 tcp-keepalive 60 # 重命名危险命令 rename-command FLUSHALL rename-command FLUSHDB rename-command CONFIG CONFIG_a1b2c3 rename-command KEYS rename-command SHUTDOWN 参数说明bind限制监听地址不要绑0.0.0.0protected-mode yes在没有 bind 和密码时拒绝外部连接rename-command把危险命令重命名为空字符串即禁用。注意CONFIG命令重命名后运维需要用新名字别把自己锁在外面。Redis 6.0 以上建议用 ACL# 创建只读用户 ACL SETUSER app_readonly on Read0nly2024 ~cache:* get mget hget hgetall -all # 创建应用用户允许读写但不允许管理命令 ACL SETUSER app_rw on AppRw2024 ~app:* read write -admin -dangerous # 查看用户列表 ACL LIST3. 安全审计与日志留存五类数据库的审计配置对照3.1 审计功能开启与日志格式要求等保要求审计记录包含事件日期时间、用户、事件类型、事件结果等字段日志留存不少于 6 个月。五类数据库的审计开启方式差异很大下面用表格对照。数据库审计开启方式日志位置留存配置MySQL安装 audit_log 插件或 general_logaudit_log 表或文件配置 logrotate 或 audit_log_rotateOracle统一审计 AUDIT POLICYUNIFIED_AUDIT_TRAIL设置表空间配额和清理策略SQL ServerCREATE SERVER AUDIT文件或 Windows 事件日志MAX_ROLLOVER_FILES 控制PostgreSQLpgaudit 扩展CSV 日志文件log_rotation_age 和 log_rotation_sizeRedis无内置审计需代理层或命令监控慢日志或 MONITOR 输出外部日志系统采集MySQL 的 audit_log 插件配置-- 安装审计插件企业版自带社区版需第三方 INSTALL PLUGIN audit_log SONAME audit_log.so; -- 配置审计策略 SET GLOBAL audit_log_policy ALL; SET GLOBAL audit_log_format JSON; SET GLOBAL audit_log_rotate_on_size 104857600; -- 100MB 轮转 SET GLOBAL audit_log_rotations 10; -- 保留10个文件PostgreSQL 的 pgaudit 配置# postgresql.conf shared_preload_libraries pgaudit pgaudit.log ddl, role, write pgaudit.log_catalog off pgaudit.log_parameter on pgaudit.log_relation on # 日志轮转 logging_collector on log_directory pg_log log_filename postgresql-%Y-%m-%d.log log_rotation_age 1d log_rotation_size 100MB log_retention_days 1803.2 日志留存 6 个月的落地方法等保要求日志留存 6 个月实际落地时数据库本地磁盘往往撑不住。常见做法是本地保留 7-30 天然后通过日志采集工具推送到集中日志平台。# 以 MySQL general_log 为例用 logrotate 管理 # /etc/logrotate.d/mysql-audit /var/log/mysql/audit.log { daily rotate 180 missingok notifempty compress delaycompress create 640 mysql mysql postrotate mysqladmin -u root -pxxx flush-logs endscript }逻辑说明rotate 180配合daily实现 180 天留存compress压缩旧日志节省空间postrotate通知 MySQL 重新打开日志文件。注意mysqladmin flush-logs需要认证信息建议用--defaults-file指定配置文件避免密码出现在命令行。注意日志留存不只是数据库层面的事等保测评会检查操作系统层面的日志轮转配置和集中日志平台的留存策略两边都要对得上。4. 数据完整性与保密性传输加密和存储加密的实操4.1 传输层 TLS 配置等保三级要求数据库管理终端和数据库之间的通信加密。五类数据库都支持 TLS但配置方式不同。MySQL 8.0 默认启用 TLS确认证书状态-- 查看 SSL 状态 SHOW VARIABLES LIKE %ssl%; -- 强制所有连接使用 SSL SET GLOBAL require_secure_transport ON; -- 写入 my.cnf: require_secure_transport ONPostgreSQL 的 SSL 配置# postgresql.conf ssl on ssl_cert_file /etc/ssl/certs/server.crt ssl_key_file /etc/ssl/private/server.key ssl_min_protocol_version TLSv1.2 ssl_ciphers HIGH:!aNULL:!MD5 # pg_hba.conf 中强制 SSL hostssl biz_db app_user 192.168.1.0/24 scram-sha-256Redis 6.0 以上支持 TLS# redis.conf tls-port 6380 port 0 # 禁用非 TLS 端口 tls-cert-file /etc/ssl/certs/redis.crt tls-key-file /etc/ssl/private/redis.key tls-ca-cert-file /etc/ssl/certs/ca.crt tls-auth-clients yes4.2 存储加密与敏感数据脱敏存储加密分两个层面透明数据加密TDE和应用层加密。Oracle 和 SQL Server 有原生 TDEMySQL 和 PostgreSQL 需要依赖文件系统加密或应用层处理。Oracle TDE 配置-- 创建密钥库需先配置 wallet 目录 ADMINISTER KEY MANAGEMENT CREATE KEYSTORE /u01/app/oracle/wallet IDENTIFIED BY Wllet2024; -- 打开密钥库 ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY Wllet2024; -- 设置主密钥 ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY Wllet2024 WITH BACKUP; -- 加密表空间 ALTER TABLESPACE users ENCRYPTION ONLINE USING AES256 ENCRYPT;SQL Server TDE 配置-- 创建主密钥 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD Mster2024!; -- 创建证书 CREATE CERTIFICATE TDE_Cert WITH SUBJECT TDE Certificate; -- 创建数据库加密密钥 USE biz_db; CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM AES_256 ENCRYPTION BY SERVER CERTIFICATE TDE_Cert; -- 启用加密 ALTER DATABASE biz_db SET ENCRYPTION ON;注意TDE 加密后备份文件也是加密的恢复时需要对应的证书和密钥。证书丢失等于数据丢失务必做好证书备份。5. 等保测评自查避坑五类数据库最常见的翻车点5.1 口令策略配了但没生效现象明明在 MySQL 里设了validate_password.policy MEDIUM测评时用弱口令创建用户却成功了。原因SET GLOBAL只对当前会话之后的新连接生效而且如果my.cnf里没有对应配置重启后策略丢失。更隐蔽的情况是validate_password组件没装SET GLOBAL不报错但也不生效。解决先查INFORMATION_SCHEMA.PLUGINS确认组件状态再把参数写入my.cnf的[mysqld]段重启后验证。Oracle 的 Profile 要确认已ALTER USER应用SQL Server 的CHECK_POLICY依赖操作系统密码策略。5.2 审计日志把磁盘写满导致数据库宕机现象开启全量审计后数据库运行几天突然不可用检查发现磁盘 100%。原因MySQL 的general_log或 Oracle 的统一审计没有配置轮转和清理策略日志无限增长。Redis 的MONITOR命令输出如果被重定向到文件也会撑爆磁盘。解决MySQL 用audit_log_rotate_on_size控制轮转Oracle 设置审计表空间配额和定期清理任务PostgreSQL 用log_rotation_age和log_rotation_size所有数据库的日志目录都要配监控告警。5.3 Redis 绑定了 127.0.0.1 但测评还是不过现象redis.conf里bind 127.0.0.1已经配了测评机构还是开了不符合项。原因等保要求的是「仅允许通过特定管理终端连接」bind 127.0.0.1只允许本机连接如果应用服务器和 Redis 不在同一台机器上实际生产环境肯定改了配置。测评时看的是实际运行配置不是配置文件。解决用CONFIG GET bind和CONFIG GET requirepass确认运行时配置。如果必须远程连接绑定具体的内网 IP 并配置密码同时用防火墙限制源 IP。5.4 PostgreSQL 的 pg_hba.conf 改了没 reload现象修改pg_hba.conf后测试连接发现新规则没生效。原因pg_hba.conf修改后需要pg_ctl reload或SELECT pg_reload_conf()才生效直接改文件不 reload 等于没改。解决养成改完就 reload 的习惯用SELECT pg_reload_conf()确认返回t。另外注意pg_hba.conf的规则是从上到下匹配第一条匹配的规则生效后面的不再检查。5.5 SQL Server 的 sa 账户没禁用或没改名现象测评扫描发现 sa 账户启用且口令强度不够。原因安装时选了混合模式sa 账户默认启用很多运维忘了处理。解决如果业务不需要 sa直接ALTER LOGIN sa DISABLE如果需要保留改名并设置强口令。同时检查BUILTIN\Administrators登录是否存在等保要求移除不必要的登录。-- 禁用 sa ALTER LOGIN sa DISABLE; -- 或者改名并设强口令 ALTER LOGIN sa WITH NAME sys_admin; ALTER LOGIN sys_admin WITH PASSWORD N3wSAdmin2024!; -- 移除不必要的 Windows 登录 DROP LOGIN [BUILTIN\Administrators];6. 从自查到测评通过一套可复用的检查脚本思路等保测评不是一次性的活每年都要做。与其每次手工敲命令不如写一套自查脚本把五类数据库的检查项固化下来。我自己的习惯是按数据库类型分目录每个目录下放一个检查脚本输出统一格式的报告。以 MySQL 为例核心检查项用一条 SQL 汇总-- MySQL 等保自查汇总查询 SELECT 口令策略 AS check_item, VARIABLE_VALUE AS current_value, length8, policyMEDIUM AS requirement FROM performance_schema.global_variables WHERE VARIABLE_NAME IN (validate_password.length, validate_password.policy) UNION ALL SELECT SSL状态, VARIABLE_VALUE, require_secure_transportON FROM performance_schema.global_variables WHERE VARIABLE_NAME require_secure_transport UNION ALL SELECT 匿名账户, COUNT(*), 0 FROM mysql.user WHERE User UNION ALL SELECT 空口令账户, COUNT(*), 0 FROM mysql.user WHERE authentication_string ;逻辑说明performance_schema.global_variables在 MySQL 8.0 中替代了SHOW VARIABLES可以直接用 SQL 查询。UNION ALL把多个检查项合并成一个结果集方便导出成报告。注意validate_password相关变量只有在组件安装后才存在脚本里要做异常处理。Oracle 的自查可以用一个 PL/SQL 块-- Oracle 等保自查 SET SERVEROUTPUT ON DECLARE v_count NUMBER; BEGIN -- 检查默认账户状态 FOR rec IN (SELECT username, account_status, profile FROM dba_users WHERE username IN (SCOTT,HR,OE,PM,IX,SH) AND account_status OPEN) LOOP DBMS_OUTPUT.PUT_LINE(警告: 默认账户 || rec.username || 处于开启状态); END LOOP; -- 检查 Profile 口令策略 FOR rec IN (SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name IN (FAILED_LOGIN_ATTEMPTS,PASSWORD_LIFE_TIME) AND limit UNLIMITED) LOOP DBMS_OUTPUT.PUT_LINE(警告: Profile || rec.profile || 的 || rec.resource_name || 未限制); END LOOP; -- 检查审计是否开启 SELECT COUNT(*) INTO v_count FROM audit_unified_enabled_policies; IF v_count 0 THEN DBMS_OUTPUT.PUT_LINE(警告: 未启用统一审计策略); END IF; END; /这套脚本的思路是把等保条款翻译成可查询的 SQL 条件输出「当前值 vs 要求值」的对照。每次测评前跑一遍不符合的项直接改比对着测评表逐条翻要快得多。Redis 的自查用redis-cli脚本#!/bin/bash # Redis 等保自查脚本 REDIS_CLIredis-cli -h 192.168.1.100 -p 6379 -a R3disStr0ng2024! echo Redis 等保自查 # 检查密码 PASS$($REDIS_CLI CONFIG GET requirepass | tail -1) if [ -z $PASS ]; then echo [不符合] 未设置密码 else echo [符合] 已设置密码 fi # 检查绑定地址 BIND$($REDIS_CLI CONFIG GET bind | tail -1) echo 绑定地址: $BIND # 检查危险命令 for cmd in FLUSHALL FLUSHDB KEYS CONFIG; do RESULT$($REDIS_CLI COMMAND INFO $cmd | head -1) if [ -n $RESULT ]; then echo [警告] 危险命令 $cmd 未禁用或重命名 fi done # 检查保护模式 PROTECTED$($REDIS_CLI CONFIG GET protected-mode | tail -1) echo 保护模式: $PROTECTED参数说明-a指定密码生产环境建议用REDISCLI_AUTH环境变量避免密码出现在进程列表。COMMAND INFO返回空表示命令已被重命名或禁用。最后说一个我自己的教训第一次做等保的时候我把所有配置都改好了截图也交了结果测评机构现场验证时发现 MySQL 的validate_password组件在重启后没加载因为my.cnf里写的是plugin_load_add但路径不对。从那以后我养成了一个习惯——所有配置改完必须重启一次再验证不重启不算完。希望帮到你。本文还有配套的精品资源点击获取