安全审计基础:审计的定义、密码模块要求与日志标准
各位同学,咱们今天聊安全审计。说实话,很多人一听到「审计」两个字,就觉得是合规部门的事,跟自己写代码没关系。我以前也这么想,直到有一次在项目中出了个安全事件,翻日志发现啥都没记——那叫一个抓瞎。从那以后,我彻底改观了。
安全审计,说白了就是「谁在什么时候、通过什么方式、对什么资源、做了什么操作、结果如何」——把这五要素记清楚,出了问题能追溯。你想想看,没有审计的系统就像没有监控的银行金库,出了事只能靠猜。
2.1 安全审计的定义与目标
安全审计不是简单的日志记录。它有三个核心目标:
- 可追溯性:每个关键操作都能找到责任人
- 完整性保护:审计记录不能被篡改或删除
- 异常检测:通过审计数据发现攻击或误操作
我在做金融系统审计方案时,遇到过客户要求「审计日志必须保留至少五年,且每秒写入不低于一万条」。嗯,这个性能要求其实挺苛刻的,后面咱们讲工具选型时会专门聊。
核心观点:安全审计不是事后追责的「马后炮」,而是事中监控和事后分析的「眼睛」。没有审计的系统,等于在黑暗中裸奔。
2.2 密码模块安全要求(GM/T 0028)
GM/T 0028 是国密标准里关于密码模块安全要求的规范。我建议所有做密码相关开发的同学,至少把它的安全等级划分部分读一遍。为什么?因为很多厂商说自己的产品「符合国密标准」,但到底符合哪个等级,差别很大。
GM/T 0028 把密码模块分为四个安全等级:
| 安全等级 | 核心要求 | 典型应用场景 |
|---|---|---|
| 一级 | 基本安全功能,无物理防护 | 软件密码模块、个人电脑 |
| 二级 | 防篡改封条或涂层,角色认证 | 金融终端、POS机 |
| 三级 | 主动防篡改,关键参数零化 | 服务器密码机、HSM |
| 四级 | 环境异常检测,全生命周期保护 | 军用、高安全等级系统 |
这里有个坑,我提醒一下:SM2 密钥的生成和存储,在三级以上模块中必须使用硬件真随机数发生器。我曾经见过一个项目,号称「三级安全」,结果密钥生成用的是软件伪随机数——这其实连二级都够呛。
注意:GM/T 0028 对审计日志有明确要求——三级及以上模块必须记录所有安全相关事件,且日志本身要受完整性保护。也就是说,你不能只记日志,还得保证日志没人改过。
2.3 审计日志标准格式
说到日志格式,很多团队都是「各写各的」。有的用 JSON,有的用 XML,有的干脆纯文本拼一行。这其实给后续的审计分析带来了很大麻烦。
我个人习惯参考 RFC 5424(Syslog 协议)和 GM/T 0028 的推荐格式,设计一个统一的审计日志结构。下面是我在项目中常用的字段定义:
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| timestamp | ISO 8601 | 事件发生时间 | 2025-03-15T14:23:10+08:00 |
| event_type | string | 事件类型编码 | SM2_SIGN_INIT |
| subject | string | 操作主体标识 | user:zhangsan |
| object | string | 操作对象标识 | key:0x7A3F |
| result | enum | 操作结果 | SUCCESS / FAILURE |
| detail | string | 补充信息 | 签名算法:SM2withSM3 |
| hash | hex | 日志行完整性校验 | a1b2c3d4... |
你可能会问:为什么要有 hash 字段?嗯,这是为了防止日志被篡改。每写入一条日志,就计算前一条日志的哈希值拼进去,形成哈希链。如果有人偷偷改了中间某条日志,后面的哈希就对不上了。
实用技巧:审计日志的 event_type 建议用「模块_动作」的命名方式,比如 SM2_KEYGEN、SM2_SIGN、SM2_VERIFY。这样在后续用 grep 或日志分析工具时,筛选效率会高很多。
下面是一个实际的审计日志示例(JSON 格式):
{
"timestamp": "2025-03-15T14:23:10.123+08:00",
"event_type": "SM2_SIGN_INIT",
"subject": "user:zhangsan",
"object": "key:0x7A3F",
"result": "SUCCESS",
"detail": "algorithm:SM2withSM3, key_type:private",
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
这个格式看起来简单,但实际落地时有很多细节。比如时间戳的时区问题——我见过有系统用本地时间,结果跨时区部署时日志时间全乱套了。所以我建议一律用 UTC+8 或 UTC,并在字段里明确标注时区偏移。
2.4 本章知识体系总览
为了让你更直观地理解这三块内容的关系,我画了一张结构图:
从这张图你可以看到,安全审计不是孤立的知识点。审计目标决定了你要记什么,密码模块要求决定了你怎么记,而日志格式则是最终的落地产物。这三者环环相扣,缺一不可。
我的建议:在开始做 SM2 安全审计工具选型之前,先把这三块基础打牢。尤其是 GM/T 0028 的等级划分,直接决定了你选什么级别的工具。后面咱们讲具体工具时,我会反复引用今天的内容。