3. 密钥存储安全审计:文件系统、数据库、硬件安全模块

密钥存储是密码体系的地基。地基没打好,上面的加密、签名、认证全是虚的。我这些年做过的审计项目里,密钥存储出问题的比例真不低——有些甚至算不上漏洞,就是赤裸裸的“把钥匙挂在大门上”。

咱们这一节拆成三种典型场景来讲:文件系统、数据库、硬件安全模块(HSM)。每一种的威胁模型和安全要求都不一样,审计手段也必须跟着变。

密钥存储安全审计知识框架 文件系统 数据库 硬件安全模块 权限 644? 明文存储? 备份未加密? 表级权限 列加密? SQL注入 管理口隔离 密钥安全导出 HA配置 审计核心:谁可以读、谁可以改、谁可以删、谁可以导出 🔍 访问控制审计 🔍 加密强度审计 🔍 生命周期审计

3.1 文件系统存储审计

文件系统是最常见也最容易出问题的密钥存放方式。很多开发团队图省事,直接把私钥或对称密钥写在配置文件里,甚至塞到 Git 仓库。

审计要点一:文件权限

我每次拿到一个 Linux 系统,第一件事就是找密钥文件,然后ls -la看权限。如果发现-rw-r--r--甚至-rwxr-xr-x,基本可以判定为高风险。私钥文件应该是600或400,由启动进程的专用用户拥有。

举个例子,我审计过一个支付网关项目。运维人员把 RSA 私钥放在/etc/ssl/private/下,权限设成了644。我问他们为什么这么做?回答是“方便备份脚本读取”。你看,为了方便备份,把整个系统的加密信任根暴露给了所有进程。

# 审计检查命令示例
find / -name "*.key" -o -name "*.pem" -o -name "id_rsa" 2>/dev/null | while read f; do
    ls -la "$f"
    # 检查是否使用了加密的密钥格式(PKCS#8 可加密)
    openssl pkey -in "$f" -check -noout 2>&1 | grep -E "(unable|error)" && echo "⚠ 密钥文件有异常"
done
⚠ 注意:很多人在审计时只关注生产环境,忽略了备份介质和 CI/CD 管道。我曾经发现一个 Jenkins 构建节点上残留着.env文件,里面写了 AWS KMS 主密钥别名和 Access Key——这相当于在公开的构建日志里贴出了保险柜密码。

3.2 数据库存储审计

把密钥存在数据库里,这本身不一定是坏事。关键在于你怎么存、谁可以读、表结构是否做了隔离。

我见过两种典型错误:

  1. 明文存储——直接一个VARCHAR(4096)字段,放的是 PEM 格式私钥。任何能 SELECT 这张表的人就等于拿到了密钥。
  2. 硬编码加密密钥——虽然存的是密文,但解密密钥写在应用程序的配置里或者环境变量里。这种“用一个密钥保护另一个密钥”的做法,如果加密密钥本身保护不好,那层加密就是心理安慰。
审计项目 检查方法 风险级别
是否明文存储 SELECT 查看字段内容,检查是否以 -----BEGIN 开头或 Base64 可见 高危
表级权限 审查 GRANT 语句,是否有 PUBLIC 或角色过度授权 高危
加密算法强度 查看加密函数(AES-256-GCM vs ECB)及密钥派生方式 中危
审计日志 检查数据库是否开启了密钥表的访问审计 低危/建议

我建议的做法是:密钥表单独建一个 schema(比如security.key_store),仅允许一个专用的存储过程 get_key_by_alias 去访问。应用程序只能调用这个函数,不能直接 SELECT 表。这样可以利用数据库的存储过程权限机制再做一层隔离。

💡 我的经验:如果数据库支持列级加密(比如 MySQL 的 AES_ENCRYPT 或 PostgreSQL 的 pgcrypto),一定要确认加密密钥不在数据库本身存储。我习惯用应用层的密钥管理服务(如 Vault)先生成一个数据密钥,再用这个密钥去加密数据库中的密钥字段。这样数据库管理员即使有 root 权限,也看不到明文。

3.3 硬件安全模块(HSM)审计

HSM 是三种方案里最安全的——前提是你配置对了。HSM 最大的坑在于“管理口和安全口没有严格隔离”。说白了,HSM 本身有管理功能(初始化、备份、密钥导入导出),如果这些管理端口暴露在应用网段或者互联网上,攻击者可以直接远程操作 HSM。

我记得有一次审计一家金融公司,他们用了某品牌的 HSM 作为根证书签名密钥的存储。我检查网络拓扑时发现,HSM 的管理网口连接在了一个交换机上,而且该交换机同时接了运维人员的办公网。问他们为什么这样设计?回答是“调试方便”。最后我建议他们至少做 VLAN 隔离,并且给管理端口绑定白名单 IP。

审计 HSM 时我重点看四个点:

  1. 网络隔离:管理口只允许从专用管理终端访问,应用口只允许加密操作(签名、解密),不能同时开放。
  2. 密钥导出策略:确认 HSM 的密钥政策是否允许exportable。如果允许,必须有备份密钥的双重认证流程。
  3. HA 配置:两台 HSM 做集群时,密钥如何同步?是否使用了安全通道?我曾经看到一台主 HSM 挂掉后,备用 HSM 因为同步策略设置不当,竟然用了未加密的网络复制密钥。
  4. 物理安全:HSM 的机柜锁了吗?机柜监控摄像头覆盖了吗?我见过 HSM 直接放在敞开式机架上的——有人插个 USB 就能做本地备份。
避坑指南:我曾经压测一个 HSM 方案,发现当并发请求超过 500 TPS 时,HSM 响应时间从 2ms 飙升到 200ms。问厂商才知道,他们用的低端型号没有硬件加速,纯用 CPU 跑 RSA 签名。审计时别忘了做性能测试——HSM 再安全,如果扛不住业务流量,等于没有。

3.4 三种存储方式的审计优先级

嗯,这里做一个快速对比,方便你在不同场景下分配审计精力。

维度 文件系统 数据库 HSM
使用门槛 低(随手就写) 中(需要表设计) 高(需要部署和培训)
常见风险 权限泄露、明文存储、备份暴露 SQL注入、过度授权、加密密钥硬编码 管理口暴露、密钥可导出、物理安全
审计优先级 ⭐⭐⭐⭐⭐(最容易出问题) ⭐⭐⭐⭐(重要但可补救) ⭐⭐⭐(通常已有一定控制)
修复成本 低(改权限、换存储) 中(需改代码和数据库) 高(硬件替换或网络改造)