1. 等保评测来了,我们该如何应对?

最近我们团队负责的核心业务系统正在接受等保三级评测,评测方在数据库安全这块给我们提了一堆整改项,压力一下子就上来了。说实话,以前做项目,更多是关注功能实现和性能,对数据库层面的安全配置,尤其是像达梦数据库这种国产数据库的深度安全策略,确实研究得不够细。这次评测就像一次“体检”,把平时没注意到的安全隐患都给照出来了。

我们的数据库用的是达梦DM8,承载着公司重要的业务数据。评测方出具的报告中,问题点主要集中在几个方面:用户的密码太简单,像“123456”这种密码依然存在;权限分配太粗放,很多测试账号拥有不该有的高权限;关键的数据库操作没有留下审计痕迹;数据在传输和存储时也没有加密。这些问题,任何一个在等保评测中都是“一票否决”项。

面对这份沉甸甸的整改清单,我们一开始有点无从下手。网上的资料要么太零散,要么就是官方文档的简单罗列,缺少一个从“发现问题”到“验证通过”的完整闭环指南。经过几周的摸索和实践,我们终于把这一套流程给跑通了,不仅顺利通过了复测,还把整个数据库的安全水位提升了一个档次。接下来,我就把我们这次“实战”的全过程,从安全策略到审计日志,一步步拆解给你看。无论你是第一次接触等保的DBA,还是需要加固数据库安全的运维同学,这份指南都能让你少走很多弯路。

2. 第一道防线:身份鉴别与访问控制

身份鉴别是安全的第一道闸门,如果门禁形同虚设,后面再坚固的城墙也没用。评测方首先揪住的就是我们的密码策略和用户管理。

2.1 强化密码策略,告别弱口令

我们检查数据库时发现,PWD_POLICY(密码策略)参数用的还是默认值,强度远远不够。达梦的密码策略是一个位图参数,非常灵活,你需要理解每一位代表的意义。

-- 首先,查看当前的密码策略配置
SELECT * FROM V$DM_INI WHERE PARA_NAME ='PWD_POLICY';

查出来的值如果是个位数,那基本就是不设防的状态。我们需要把它加强。达梦的密码策略由以下几个标志位组成,通过相加来组合使用:

  • 1:禁止密码与用户名相同。
  • 2:密码最小长度大于等于9个字符。
  • 4:密码必须包含大写字母(A-Z)。
  • 8:密码必须包含数字(0-9)。
  • 16:密码必须包含标点符号。

等保三级要求密码必须是大小写字母、数字、特殊符号的组合,并且长度足够。所以,最严格的策略就是把1、2、4、8、16全部加起来,也就是 31。

-- 使用SYSDBA账号执行,将密码策略设置为最严格级别
SP_SET_PARA_VALUE(1,'PWD_POLICY',31);

这里有个大坑需要注意:PWD_POLICY 参数的有效性依赖于 COMPATIBLE_MODE(兼容模式)。如果 COMPATIBLE_MODE 被设置为1(兼容某些旧版本行为),那么 PWD_POLICY 会被强制置为0,所有策略失效!所以设置完后,一定要再次查询确认是否生效。这个策略是对后续新建或修改密码时生效,不会强制已有用户立刻修改,但等保要求必须对所有现有账户进行合规性整改。

2.2 给用户账户加上“紧箍咒”:资源限制

光有复杂密码还不够,如果账号可以无限次尝试登录,或者密码永远不换,风险依然很高。我们需要给每个业务用户和数据库用户加上资源限制,这就像是给账户上了“紧箍咒”。

-- 以一个业务用户‘CCC’为例,设置其资源限制
ALTER USER "CCC" LIMIT
    CONNECT_IDLE_TIME 10,        -- 连接空闲超时(分钟),超过则断开
    FAILED_LOGIN_ATTEMPTS 5,     -- 连续登录失败次数,超过则锁定
    PASSWORD_LIFE_TIME 100,      -- 密码有效期(天),到期必须修改
    PASSWORD_LOCK_TIME 10,       -- 密码锁定时间(分钟),失败超限后锁定多久
    CONNECT_TIME 120;            -- 单次连接最大时长(分钟)

设置完成后,怎么检查呢?你可以通过以下查询来验证所有用户的资源限制配置情况,做到心中有数。

-- 查询所有用户的资源限制配置
SELECT D.USERNAME, CONN_IDLE_TIME, FAILED_NUM, LIFE_TIME, LOCK_TIME, ALLOW_ADDR
FROM SYSUSERS S, DBA_USERS D
WHERE S.ID = D.USER_ID;

-- 专门查看哪些用户的密码很久没改了,重点督促修改
SELECT B.USERNAME, A.MODIFIED_TIME
FROM SYS.SYSPWDCHGS A
FULL JOIN DBA_USERS B ON A.LOGINID = B.USER_ID;

在实际操作中,我们根据账号的重要程度设置了不同的策略。例如,核心管理员账号密码有效期设为90天,普通业务账号设为180天。FAILED_LOGIN_ATTEMPTS 统一设为5次,既能防止暴力破解,又避免了因误操作导致的账号锁死影响业务。

2.3 贯彻最小权限原则,收紧访问入口

等保的核心思想之一就是“最小权限”。过去我们为了省事,经常给开发或测试账号授予 DBA 角色,这是非常危险的做法。整改时,我们对每个账号的权限进行了彻底梳理。

-- 查看用户被授予了哪些角色(比如DBA、RESOURCE等)
SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS ORDER BY GRANTEE;

-- 查看用户对具体表对象的权限(SELECT, INSERT, UPDATE, DELETE等)
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE
FROM DBA_TAB_PRIVS
WHERE GRANTEE = '你的用户名';

我们的整改动作是:首先,收回所有非必要账号的 DBA 角色。然后,为每个业务模块创建专属的、权限粒度更细的自定义角色。比如,ORDER_READ_ROLE 只拥有订单相关表的查询权限,ORDER_WRITE_ROLE 拥有增删改权限。最后,将用户与这些自定义角色绑定。这个过程虽然繁琐,但能从根源上减少越权操作和数据泄露的风险。

此外,达梦数据库的“三权分立”或“四权分立”体系本身就是满足等保要求的优秀设计。默认的 SYSDBA(系统管理员)、SYSSSO(安全管理员)、SYSAUDITOR(审计管理员)各司其职。在安全版本中,还有 SYSDBO(数据对象管理员)。务必确保审计管理员 SYSAUDITOR 由独立人员担任,并且不要将 SYSAUDITOR 权限随意授予他人,这是保证审计日志独立性和可信度的基础。

3. 开启全方位的安全审计

安全审计是等保评测中的重中之重,它要求数据库的所有重要安全事件都必须被记录、可追溯。如果说前面的策略是预防,那么审计就是事后追责和调查取证的“黑匣子”。

3.1 启用并配置审计功能

在达梦DM8中,开启审计不再是简单的参数修改,需要使用专门的审计管理员账号 SYSAUDITOR 来执行。

-- 使用SYSAUDITOR账号登录并执行,开启审计功能
SP_SET_ENABLE_AUDIT(1);

这里的参数 1 表示开启普通审计。如果设置为 2,则开启普通审计+实时审计(对性能影响更大,通常按需开启)。开启后,务必验证一下状态。

-- 查询审计功能是否已开启
SELECT * FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT';

审计功能开启后,默认可能不会记录所有我们关心的操作。我们需要进行精细化的配置。例如,等保要求必须审计用户登录、权限变更、数据定义(DDL)和数据操纵(DML)等。

-- 审计所有用户执行的所有SQL语句(范围很广,适用于初期评估)
SP_AUDIT_STMT('ALL', 'NULL', 'ALL');

-- 但更推荐精细化审计,例如,审计所有用户的CREATE, ALTER, DROP操作
SP_AUDIT_STMT('TABLE', 'NULL', 'CREATE,ALTER,DROP');
-- 审计所有用户对特定表(如‘SALARY’表)的INSERT, UPDATE, DELETE操作
SP_AUDIT_STMT('TABLE', 'DMHR.SALARY', 'INSERT,UPDATE,DELETE');
-- 审计用户登录成功和失败事件
SP_AUDIT_STMT('LOGIN', 'NULL', 'ALL');

3.2 审计日志的管理与维护

审计日志会不断增长,如果不加管理,很快就会撑满磁盘。我们需要像管理业务日志一样管理审计日志。

首先,设置单个审计日志文件的最大大小,避免产生过大的单个文件。

-- 设置单个审计日志文件最大为200MB
SP_SET_PARA_VALUE(1,'AUDIT_MAX_FILE_SIZE',200);

其次,定期清理过期的审计日志。达梦提供了存储过程来删除指定时间之前的审计文件。

-- 删除‘2023-10-01 00:00:00’之前产生的审计日志文件
-- 第二个参数为0表示删除文件,为1表示将文件备份到指定目录
SP_DROP_AUDIT_FILE('2023-10-01 00:00:00', 0);

最重要的,是如何查看和分析审计记录。 当发生安全事件或需要合规检查时,你需要从海量日志中快速定位信息。

-- 查看最近的审计记录,可以按时间、用户、操作类型进行筛选
SELECT
    USERNAME,
    OPERATION,
    SCHNAME,
    TABNAME,
    SQL_TEXT,
    SUCC_FLAG, -- 执行成功标志
    START_TIME,
    IP
FROM V$AUDITRECORDS
WHERE START_TIME > SYSDATE - 1 -- 查询最近一天的记录
ORDER BY START_TIME DESC;

我们团队为此专门写了一个定期巡检脚本,每天自动检查前一天的审计日志,重点关注 SUCC_FLAG 为 ‘N’(失败)的登录尝试、权限变更操作和高危的DDL语句,并生成报告。这套机制在后续的一次异常登录排查中发挥了关键作用,让我们迅速锁定了可疑的IP地址。

4. 构筑纵深防御:入侵防范与数据安全

完成了身份、权限和审计的整改,我们来到了更深层的防御层面:防止外部入侵和保护数据本身的安全。

4.1 设置客户端IP白名单

这是非常有效的一层网络访问控制。我们可以为关键数据库用户(特别是管理员账号)设置允许连接的数据信IP地址范围,直接将非授信IP的访问请求拒之门外。

-- 限制用户‘DMHR’只能从指定的IP地址或网段连接数据库
ALTER USER "DMHR" ALLOW_IP "10.10.1.100", "192.168.1.50", "172.16.10.*";

-- 查询所有用户设置的IP白名单
SELECT DU.USERNAME, SU.ALLOW_ADDR
FROM DBA_USERS DU, SYSUSERS SU
WHERE DU.USER_ID=SU.ID AND SU.ALLOW_ADDR IS NOT NULL;

在实施时,我们梳理了所有需要直连数据库的应用服务器地址,为对应的数据库用户设置了精确的IP白名单。对于运维人员的个人账号,则结合堡垒机的出口IP进行配置。这一步做完,从网络层面拦截了大量的扫描和试探行为。

4.2 为数据通信和存储加上“锁”

等保要求,对于三级及以上系统,通信数据和敏感存储数据应采取加密等保护措施。达梦在这两方面都提供了支持。

通信加密:确保客户端与数据库服务器之间传输的数据是密文,防止网络窃听。

-- 首先查看数据库支持的加密算法
SELECT * FROM V$CIPHERS;

-- 设置服务器端使用指定的加密算法(例如AES256)
SP_SET_PARA_STRING_VALUE(2, 'COMM_ENCRYPT_NAME', 'AES256_ECB');

需要注意的是,通信加密需要客户端驱动也支持并配置相应的加密算法。这通常需要在连接字符串或客户端配置文件中指定。开启后,使用网络抓包工具看到的将是加密后的乱码。

存储加密:这是保护数据“静止”时安全的最后一道屏障。达梦支持表空间级加密,甚至可以在初始化数据库时就进行全库加密。

  • 表空间加密:对于存放敏感数据(如用户身份证、手机号)的表,可以创建加密的表空间。
CREATE TABLESPACE encrypt_ts DATAFILE 'encrypt_data.dbf' SIZE 100
ENCRYPT WITH AES256_ECB
ENCRYPT WITH SALT; -- 使用SALT可以增强加密强度

创建表时指定到这个加密表空间即可。这样,即使数据库文件被非法拷贝,在没有密钥的情况下也无法解密其中数据。

  • 全库加密:这是在数据库初始化时通过 dminit 工具指定的,一旦创建无法更改。适用于安全要求极高的场景。
./dminit path=/dm8/data ENCRYPT_NAME=AES256_CBC

关于密钥管理:加密的核心在于密钥。达梦的存储加密密钥由数据库内部管理,但务必按照手册安全地备份 dm.ini 配置文件和相关的密钥文件。丢失密钥意味着数据永久无法恢复。

5. 完善数据生命周期管理:备份与剩余信息保护

安全是一个完整的闭环,不仅要在数据“活着”的时候保护它,还要为它的“意外死亡”(故障)做好准备,并确保它“死后”(空间被回收)不会泄露秘密。

5.1 制定可靠的备份恢复策略

等保明确要求定期进行数据备份和恢复演练。达梦的物理备份(基于页)效率很高,是我们的首选。

-- 以SYSDBA执行,进行数据库全量备份
BACKUP DATABASE FULL BACKUPSET '/dm8/backup/full_bak_20240515';

这条命令会在指定目录生成一个备份集。我们制定的策略是:每周日凌晨进行一次全量备份,每天凌晨进行增量备份。备份命令可以写入脚本,由操作系统的定时任务(如crontab)或达梦作业调度器自动执行。

备份是为了恢复,定期演练恢复流程至关重要。我们每季度会在测试环境进行一次恢复演练。

-- 在测试环境,使用备份集进行还原和恢复
RESTORE DATABASE '/dm8/test_data/dm.ini' FROM BACKUPSET '/dm8/backup/full_bak_20240515';
RECOVER DATABASE '/dm8/test_data/dm.ini' FROM BACKUPSET '/dm8/backup/full_bak_20240515';

演练过程要记录时间点、验证数据完整性和业务可用性。只有经过验证的备份才是有效的备份。

5.2 启用剩余信息保护

这是一个容易被忽略但非常重要的安全项。它指的是,当数据库的一个存储空间(比如一个数据页、一个簇)被释放并重新分配给新的对象使用时,必须确保之前存储的旧数据内容被彻底清除,防止敏感信息残留。达梦通过 ENABLE_OBJ_REUSE 参数来控制。

-- 启用客体重用功能(需重启数据库生效)
SP_SET_PARA_VALUE(2,'ENABLE_OBJ_REUSE',1);

-- 查询当前状态
SELECT * FROM V$DM_INI WHERE PARA_NAME='ENABLE_OBJ_REUSE';

启用此功能后,数据库在分配新的存储空间给表或索引时,会先将其清零。这符合等保对于“剩余信息保护”的要求。请注意,这个参数是静态参数,修改后需要重启数据库才能生效。

6. 整改效果验证与持续运维

所有配置项改完,并不意味着工作结束。我们需要系统性地验证整改效果,并建立持续的监控机制。

我们制作了一个《达梦数据库等保合规自查清单》,在每次重要变更或定期巡检时执行:

  1. 身份鉴别:用测试账号尝试设置弱密码、过期密码登录,验证策略是否生效。
  2. 访问控制:用非授权账号尝试访问敏感表或执行DDL操作,确认是否被拒绝。
  3. 安全审计:执行几条增删改查和DDL语句,然后去 V$AUDITRECORDS 里检查是否能准确查到记录。
  4. 入侵防范:从不在白名单的IP尝试连接数据库,确认连接失败。
  5. 数据安全:通过抓包工具简单查看客户端通信数据(需在测试环境进行),确认是否为密文。
  6. 备份恢复:检查备份日志和备份文件是否按时生成,磁盘空间是否充足。
  7. 参数复核:定期执行 SELECT * FROM V$DM_INI WHERE PARA_NAME IN ('PWD_POLICY', 'ENABLE_AUDIT', 'ENABLE_OBJ_REUSE'); 等语句,确保关键安全参数未被意外修改。

最后想说的是,等保整改不是一次性的项目,而是一个将安全理念融入日常运维工作的开始。通过这次完整的实战,我们最大的收获不是那一纸测评报告,而是建立起了一套适合自身业务的数据信安全配置基线和管理流程。安全没有终点,保持对风险的警惕,定期回顾和更新你的安全策略,才能真正做到防患于未然。

更多推荐