
简介这是一份面向等保测评人员、数据库管理员及安全运维人员的实操型作业指导书覆盖 MYSQL、ORACLE、SQLSERVER、Postgres、Redis 五类主流数据库适用于等级保护测评现场核查、数据库安全自查及日常运维排查等场景。编写目的很明确把测评中最常问到的核查项提前整理成可执行的查询命令避免现场边查边翻手册。文档从实际作业角度出发给出 CMD、SQLPLUS、MySQL Workbench 等连接登录方法并按测评项列出密码复杂度与有效期、登录失败处理、超时退出、用户与来源IP限制、审计开关、远程管理加密、终端访问限制等 SQL 查询语句可直接复制、修改后执行。压缩包内为 1 个 docx 文档大小 1.83MB按五类数据库分 PART 组织目录层级清晰可快速定位到对应库的核查命令。已有 784 人学习下载既适合等保测评现场快速查阅也适合初次接触数据库测评的工程师作为入门参考。1. 等保测评进场后最难的不是画拓扑是五套数据库的核查命令每次等保测评进场最耗时间的不是画网络拓扑而是面对 MySQL、Oracle、SQL Server、Postgres、Redis 五套数据库每套都要在半天内给出认证、审计、超时、权限的核查结论。很多测评师手里只有等保标准条文没有能直接落地的查询语句到了现场一边百度一边写效率低不说还容易漏项。这份数据库等保测评作业指导书 V1.1 解决的就是这个问题。它把五类数据库的常用核查点整理成了可直接执行的命令和判定口径覆盖密码复杂度、密码有效期、登录失败处理、超时时间、用户权限、审计开关、远程管理加密这些等保要求里的高频检查项。适合三类人做等保测评的工程师、被抽检的 DBA、想自查的运维。下面的拆解我把每条命令的参数含义和判定口径都过一遍特别是那些查不到结果时的处理方式。2. MySQL 核查命令实战五个查询看清密码、审计与连接控制2.1 连接方式与信息收集节奏MySQL 的连接方式有两种CMD 命令和 Workbench 图形化。命令行连接是测评进场最常用的方式mysql -u root -p-u指定用户名-p表示接下来输入密码。很多生产环境不允许直接给 root测评时常见的做法是申请一个只读账号。注意show variables这类命令需要 PROCESS 权限纯 SELECT 权限查不了实际中不少测评师还是要了 root 或管理员账号。Workbench 连接就是图形化操作打开软件后选 Database → Connect to Database填 IP、端口、用户名和密码。默认端口 3306连接前先确认对方开了远程访问权限否则会报 Host 不允许连接。进场后我习惯先把所有变量查询跑一遍结果存成文本后面写报告时直接引用省得反复连库。2.2 密码复杂度与密码长度validate_password 插件的三种返回情况密码复杂度核查是等保测评里的必查项命令只有一条show variables like validate_password%;这条命令在不同环境下返回三种情况判定逻辑完全不同。第一种直接报错ERROR 1193 (HY000): Unknown system variable validate_password_length。这说明 validate_password 插件没有安装数据库确实没有限制密码复杂度和长度测评结论记为不符合。第二种返回validate_passwordOFF说明插件装了但没启用效果等同于没有限制。第三种返回完整参数列表validate_password_dictionary_file validate_password_length validate_password_mixed_case_count validate_password_number_count validate_password_special_char_countvalidate_password_length是密码最小长度validate_password_mixed_case_count是大小写字母数量要求validate_password_number_count是数字数量validate_password_special_char_count是特殊字符数量。等保参考要求是密码长度不小于 6 位复杂度至少包含数字、大小写字母、特殊字符中的两种以上。如果插件缺失可以用下面的语句装上INSTALL PLUGIN validate_password SONAME validate_password.so;提示插件装好后只对之后新设置的密码生效存量弱密码不会被强制失效需要配合ALTER USER ... PASSWORD EXPIRE让旧密码过期。2.3 密码有效期与登录失败处理两个层面的参数别混用密码有效期核查涉及两个参数。查看当前值用show global variables like default_password_lifetime;这个参数单位是天默认值可能是 0永不过期等保要求是不大于 90 天。临时整改可以执行SET GLOBAL default_password_lifetime 90;注意SET GLOBAL只对重启前生效要固化得写进 my.cnf 配置文件。登录失败处理要分两个层面看。第一个是主机维度show variables like %max_connect_errors%;max_connect_errors表示同一主机连接请求失败超过设定次数后MySQL 会拒绝该主机后续的连接请求。第二个是用户维度靠 connection_control 插件show variables like %connection_control%;如果返回空说明 connection_control 插件没装。装了之后能看到三个参数connection_control_failed_connections_threshold是单个用户因密码错误失败的次数上限默认 3connection_control_max_connection_delay是失败上限之后再次尝试登录前的最大等待时间connection_control_min_connection_delay是最小等待时间默认 1000 毫秒。等保参考要求是登录失败次数不大于 5 次锁定时间不小于 1 分钟。想要达到这个标准可以这样设置INSTALL PLUGIN connection_control SONAME connection_control.so; SET GLOBAL connection_control_failed_connections_threshold 5; SET GLOBAL connection_control_min_connection_delay 60000;min_connection_delay单位是毫秒60000 就是 60 秒。2.4 超时时间与用户权限边界wait_timeout 默认 8 小时连接空闲超时是数据库测评里容易忽略的一项。查看命令show variables like wait_timeout; show variables like %timeout;wait_timeout默认 28800 秒也就是 8 小时。这个值对等保要求来说偏大了一般建议不大于 30 分钟。interactive_timeout针对的是交互式连接mysql 工具、mysqldumpwait_timeout针对非交互式连接。修改方式SET GLOBAL wait_timeout 1800; SET GLOBAL interactive_timeout 1800;提示修改只对之后新建的连接生效已建立的连接还是沿用旧值测评时不要改完立刻复查容易误判。用户和权限核查用两条语句select user, host from mysql.user; select user();host列是重点。host192.168.1.1表示只允许该 IP 连接host192.168.1.%表示 IP 前缀为 192.168.1 的都能连host%表示所有 IP 都可以连接。测评报告里要特别标注有没有高权限账号配了%。查看单个用户的具体权限show grants for rootlocalhost;2.5 审计功能核查三个开关别混为一谈MySQL 的审计核查有三个开关很多人容易搞混show variables like general_log%; show variables like log_bin; show variables like %audit%;general_log记录所有到达 MySQL Server 的 SQL 语句值 ON 表示开启这是最直接的审计依据。log_bin记录的是 DDL 和 DML 的二进制日志主要服务于主从复制和时间点恢复它不等于审计日志测评时不能拿 log_bin 当审计已开启的证据。%audit%是审计插件比如 MariaDB 的 server_audit的相关参数查到server_audit_loggingON才算部署了专业审计。等保判定口径general_logON或server_audit_loggingON都能满足审计要求log_bin不算。远程管理加密看 SSLshow variables like %have_ssl%;have_sslYES表示数据库支持 SSL 加密连接NO就是不支持。还想确认是否强制远程走加密看require_secure_transport参数5.7.5 以上版本才有show variables like %require_secure_transport%;值为 ON 时所有连接必须走 SSL/TLS这是比较严格的合规配置。3. Oracle 测评深挖dba_profiles 参数状态与审计开关判定3.1 一条 SQL 看遍口令策略dba_profiles 的正确读法Oracle 的口令策略集中在 profile 里DBA 用户执行select * from dba_profiles where profileDEFAULT;超时相关的 KERNEL 参数单独查SELECT * FROM dba_profiles where resource_typeKERNEL;返回结果里每个资源项对应一个 LIMIT 值重点关注这几个参数参数含义等保参考FAILED_LOGIN_ATTEMPTS账户锁定前允许登录失败次数3~5 次不能 UNLIMITEDPASSWORD_LIFE_TIME同一密码允许使用天数不大于 90 天PASSWORD_REUSE_TIME密码可重用的间隔天数与 REUSE_MAX 配合设置PASSWORD_REUSE_MAX密码重用前必须改变的次数与 REUSE_TIME 配合设置PASSWORD_LOCK_TIME失败次数达到后账户锁定天数5 分钟以上PASSWORD_GRACE_TIME密码过期后的宽限天数建议明确设置PASSWORD_VERIFY_FUNCTION密码复杂度验证函数名不能为 NULLIDLE_TIME会话空闲超时时间不大于 30 分钟很多生产库的DEFAULTprofile 从来没动过查出来全是UNLIMITED这就是典型的查到了但等于没设置。整改时可以用ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 90 PASSWORD_LOCK_TIME 1 PASSWORD_VERIFY_FUNCTION verify_function_11G IDLE_TIME 30;verify_function_11G是 Oracle 自带的密码复杂度脚本需要先以 DBA 身份执行?/rdbms/admin/utlpwdmg.sql创建然后才能引用到 profile 里。3.2 用户状态机account_status 里藏着整改线索用户及状态核查命令select username, account_status from dba_users;Oracle 的用户状态比 MySQL 复杂得多常见的几种OPEN是正常可用状态。LOCKED表示被 DBA 手工锁定。EXPIRED表示口令被设置为到期用户下次登录时必须修改密码。EXPIRED(GRACE)表示处于宽限期还能正常登录但系统会提示改密码。LOCKED(TIMED)是登录失败次数超过FAILED_LOGIN_ATTEMPTS被系统自动锁定。还有EXPIRED LOCKED(TIMED)这种组合状态是口令到期后用户又连续登录失败被锁。测评时要重点查有没有scott、outln这类示例账户处于 OPEN 状态以及是否存在大量EXPIRED账户长期不处理。如果示例账户被锁定了可以在报告里记为符合但建议 DBA 直接 drop 掉更干净。3.3 远程管理与审计开关show parameter 三连查远程管理核查看密码文件的使用方式show parameter remote_login_passwordfile;EXCLUSIVE是独占模式允许客户端以 SYSDBA/SYSOPER 权限远程登录也允许授予和回收这两个权限这是默认值。NONE表示禁用口令文件验证禁止远程 SYSDBA 登录。SHARED允许远程登录但不能修改权限。审计核查show parameter audit; show parameter audit_sys_operations;audit_trail的值决定了审计开没开db或true表示启用并把审计结果写到 sys.aud$ 表os表示启用并写入操作系统文件db_extended和xml是增强模式none或false是禁用。等保要求audit_trail不为 none/false且audit_sys_operations审计 SYSDBA 活动为 TRUE。audit_traildb时要注意 sys.aud$ 表会持续膨胀生产环境建议配合定期清理策略。3.4 sqlnet.ora 限制终端接入黑白名单配置与生效条件Oracle 限制终端 IP 访问靠的是 sqlnet.ora 文件里的三个参数TCP.VALIDNODE_CHECKINGyes TCP.EXCLUDED_NODES(192.168.56.101) TCP.INVITED_NODES(127.0.0.1,192.168.190.60,192.168.190.61)TCP.VALIDNODE_CHECKINGyes是启用检查的总开关必须为 yes 才生效。TCP.EXCLUDED_NODES是黑名单TCP.INVITED_NODES是白名单同时配置时白名单优先。文件位置Windows 在ORACLE_HOME\network\admin目录下Linux 同样在$ORACLE_HOME/network/admin。改完之后需要重启监听才生效很多人配置完不重启监听测试半天发现还是老样子。核查的时候如果发现配置已改但连接还是能进来先怀疑监听没重载。4. SQL Server、Postgres 与 Redis三种不同形态的核查方式4.1 SQL Server从 SSMS 图形化到系统视图的核查SQL Server 的密码策略核查在图形化界面里是右键用户 → 属性 → 勾选强制实施密码策略和强制密码过期。但写报告不能只截界面图要用系统视图确认SELECT name, is_policy_checked, is_expiration_checked FROM sys.sql_logins;is_policy_checked1对应强制实施密码策略is_expiration_checked1对应强制密码过期。这两个字段只对 SQL 登录账号生效Windows 登录账号查出来没有参考意义。SQL Server 没有 MySQL connection_control 那种用户级登录失败锁定机制它依赖 Windows 的帐户锁定策略。核查时要先确认CHECK_POLICY已开启再配合 Windows 安全选项里的帐户锁定阈值一般建议不超过 5 次锁定时间不低于 30 分钟。超时退出方面SQL Server 没有 wait_timeout 的等价参数常见做法是查远程超时相关配置SELECT * FROM sys.configurations WHERE name LIKE %remote%timeout%;remote login timeout默认 10 秒remote query timeout默认 600 秒。如果要实现空闲会话自动断开SQL Server 原生没有这个参数一般靠登录触发器或定时任务杀会话测评时如实记录。用户权限列表SELECT name, type_desc FROM sys.server_principals WHERE type IN (S,U);审计核查查两个视图SELECT name, is_enabled FROM sys.server_audits; SELECT name, is_disabled FROM sys.server_audit_specifications;返回空说明没配正规审计。如果要整改可以创建审计对象CREATE SERVER AUDIT Audit_Login TO FILE (FILEPATH D:\SQLAudit\) ON FAILURE CONTINUE; CREATE SERVER AUDIT SPECIFICATION Audit_Spec_Login FOR SERVER AUDIT Audit_Login ADD (FAILED_LOGIN_GROUP); ALTER SERVER AUDIT Audit_Login WITH (STATE ON);远程访问核查EXEC sp_configure remote access;SQL Server 对终端 IP 限制没有 sqlnet.ora 那样的原生配置文件常见做法是登录触发器判断来源 IP或者靠防火墙。触发器核查用SELECT name, is_disabled FROM sys.server_triggers;触发器里通常用EVENTDATA()提取ClientHost字段做判断is_disabled0表示触发器处于启用状态。4.2 Postgres配置文件驱动的核查项Postgres 核查先看版本和用户select version(); select usename, rolvaliduntil from pg_authid;rolvaliduntil是密码过期时间infinity表示永不过期这对应等保里的密码有效期核查项。只要看到 infinity 就得记不符合整改方法是给用户设定具体过期时间ALTER ROLE test_user VALID UNTIL 2026-01-01;密码复杂度方面Postgres 默认不自带校验逻辑需要预加载 passwordcheck 扩展show shared_preload_libraries;如果返回结果里看不到 passwordcheck说明数据库没有密码复杂度校验测评结论只能是不符合。这个扩展要写进shared_preload_libraries并重启数据库才能生效。登录失败次数限制Postgres 同样没有内置参数常见做法是用 fail2ban 监控日志并对来源 IP 做锁定。核查时看 postgresql.conf 里有没有相关配置没有就记录为依赖外部控制手段。审计核查看三个参数show logging_collector; show log_statement; show log_directory;logging_collectoron是日志收集的总开关log_statement可选none/ddl/mod/all测评要求至少达到ddl以上。超时相关参数show statement_timeout; show idle_in_transaction_session_timeout; show tcp_keepalives_idle;statement_timeout单位是毫秒0 表示不限制idle_in_transaction_session_timeout是空闲事务超时默认 0tcp_keepalives_idle是 TCP 心跳间隔默认 0 表示走系统默认值。4.3 Redis一条 CONFIG 命令背后的九个测评点Redis 的命令核查比较特殊因为它返回的是运行时配置很多参数跟 MySQL、Oracle 不是一个套路。连接方式redis-cli -h 127.0.0.1 -p 6379 -a 密码-a后面直接跟密码会留在 shell history 里核查时更推荐先连上再执行AUTH 密码。密码复杂度核查CONFIG GET requirepass返回空字符串表示免密访问这在高风险环境里属于重大不符合。Redis 本身不强制密码强度所以长度和复杂度要靠人工判断等保要求远程连接必须设置高强度密码。登录失败与超时CONFIG GET timeout CONFIG GET tcp-keepalivetimeout是空闲 N 秒后关闭连接0 表示不关闭等保建议不大于 1800 秒。登录失败锁定 Redis 没有内置参数生产环境靠 fail2ban 或类似机制实现这条要在报告里写清楚是外部补偿措施。鉴别信息传输核查CONFIG GET tls-port CONFIG GET portport6379且tls-port0表示走的是明文 TCP密码在传输过程中可被嗅探。整改可以开 TLS 端口或者在前面加一层加密隧道。保护模式和访问控制CONFIG GET protected-mode CONFIG GET bindprotected-modeyes且没有设置密码时Redis 只允许本机回环地址连接。bind配置决定监听哪些网卡如果bind 0.0.0.0加上requirepass为空属于高危配置必须记为不符合。权限最小化核查CONFIG GET rename-command ACL LISTRedis 6 引入了 ACL可以用ACL SETUSER给不同用户分配不同命令权限。rename-command可以把高危命令改名或禁用rename-command FLUSHALL rename-command CONFIG 这里有个典型的自锁坑CONFIG 命令被改名后想通过CONFIG GET查看配置就做不到了。改之前务必先把该查的都查完或者直接改 redis.conf 后重启生效。审计核查CONFIG GET logfile CONFIG GET loglevelRedis 没有传统数据库的审计日志只能靠运行日志和 slowlog 做补偿。logfile返回空字符串表示输出到标准输出建议指向固定文件loglevel建议在 notice 以上。数据完整性和保密性CONFIG GET save CONFIG GET appendonlyappendonlyyes表示 AOF 持久化开启配合 RDB 快照可以满足数据完整性要求。数据保密性方面 Redis 本身不做字段级加密库文件加密要靠磁盘级方案核查时如实记录即可。4.4 三个库的核查差异小结核查维度SQL ServerPostgresRedis密码策略sys.sql_logins 系统视图shared_preload_libraries 加载 passwordcheckCONFIG GET requirepass登录失败依赖 Windows 帐户锁定策略无内置靠外部 fail2ban无内置靠外部机制审计server_audits 审计对象logging_collector log_statementlogfile loglevel超时控制remote timeout 配置statement_timeout / idle_in_transactionCONFIG GET timeoutIP 限制登录触发器或防火墙pg_hba.confbind protected-mode5. 避坑记录五种数据库核查时的典型翻车现场5.1 MySQL 查 validate_password 报错直接下无策略结论现象执行show variables like validate_password%直接报ERROR 1193于是测评结论写成未限制密码复杂度和长度。原因validate_password 插件没有加载。5.7 默认不装8.0 社区版是内置但可能没启用查询报错只能说明插件不存在不能说明策略没配。解决先执行show plugins确认插件状态。缺失就INSTALL PLUGIN validate_password SONAME validate_password.so装上再重新查询。如果插件存在但参数为 OFF要在配置文件中启用而不是口头跟客户说查不到。5.2 Oracle dba_profiles 全是 UNLIMITED结果被漏报现象select * from dba_profiles where profileDEFAULT返回几十行LIMIT 列全是 UNLIMITEDPASSWORD_VERIFY_FUNCTION 是 NULL报告里这句就跳过了。原因生产库从没人动过 DEFAULT profileOracle 原生的默认值就是 UNLIMITED这是常态而不是异常。解决UNLIMITED 就是不符合逐项记入整改建议并给出 ALTER PROFILE 语句。补 verify_function 要先执行?/rdbms/admin/utlpwdmg.sql脚本否则 ALTER PROFILE 会报函数不存在。5.3 拿 log_binON 当 MySQL 审计已开启现象报告里写MySQL 已开启审计依据是log_binON。原因把二进制日志和审计日志混为一谈。log_bin 的目的是主从复制和基于时间点恢复它不记录查询语句也不是为了追溯用户行为设计的。解决审计判定只看general_logON或server_audit_loggingON。如果只有 log_bin记为不符合整改建议是开启 general_log 或部署审计插件并说明 log_bin 可以保留但不算审计证据。5.4 SQL Server 勾选强制实施密码策略后查出来还是 0现象SSMS 界面勾选了强制实施密码策略客户也说配了但sys.sql_logins查出来is_policy_checked0。原因这个字段只对 SQL Server 登录账号有意义如果是 Windows 登录账号勾选不生效还有一种可能是当时走了界面但脚本没执行成功。解决用显式语句整改并复查ALTER LOGIN test_user WITH CHECK_POLICY ON, CHECK_EXPIRATION ON;另外 SQL Server 的登录失败锁定不是勾选策略就完事还要去 Windows 安全策略里配置帐户锁定阈值两个配合才算是完整的失败处理措施。5.5 Redis 执行 rename-command 后把自己锁在门外现象按整改要求执行CONFIG SET rename-command CONFIG 想再查配置时提示命令不存在管理端直接失联。原因CONFIG 命令被禁用后运行时已经无法再通过 CONFIG 查看和修改任何配置这是设计内的自杀式操作。解决改之前先把所有要查的配置项跑完留存输出生产环境不要用运行时CONFIG SET改 rename-command直接编辑 redis.conf 后重启并预留一个不受限制的管理通道。Redis 6 之后如果混用CONFIG SET requirepass和 ACL容易误以为所有用户都设了密码检查时ACL LIST要逐个用户确认权限范围。6. 把查询结果变成测评记录归档与判定口径统一的落地习惯测评报告最怕的不是结论严苛而是同一个核查项在不同数据库里用了两套判定标准。我的做法是进场后先跑一遍汇总脚本把每个库的原始输出一次性导出来存档。#!/bin/bash # mysql 等保核查信息汇总 mysql -u root -p -e show variables like validate_password%; show variables like default_password_lifetime; show variables like %max_connect_errors%; show variables like %connection_control%; show variables like wait_timeout; show variables like general_log%; show variables like log_bin; show variables like %audit%; show variables like %have_ssl%; select user, host from mysql.user;这段脚本把 MySQL 的核心核查项一次跑完输出保存为文本文件直接作为报告附件。Oracle、PostgreSQL、Redis 同理先汇总再逐项判定。最后是统一判定口径。比如审计开启这一项MySQL 认general_log或 audit 插件Oracle 认audit_trail不为 none/falseSQL Server 认存在启用的 server_auditPostgres 认logging_collectoron且log_statement至少为 ddlRedis 认 logfile 指向固定文件且 loglevel 不低于 notice。口径不一致的话报告前后会自相矛盾客户一问就露馅。从那以后我每次进场第一件事就是把这套汇总查询完整跑一遍原始输出统一命名存档然后再开始逐项判定和截图。这个习惯帮我省掉了大量和客户扯皮的时间——所有结论都有命令和输出兜底而不是现场手敲临时拼凑。希望帮到你。本文还有配套的精品资源点击获取