第3章 软件密钥存储方案:安全性评估、实施步骤、加密存储
3.1 适用场景
软件密钥存储方案适用于以下典型环境:
- 应用级密钥管理——Web 服务、微服务、移动 App 在运行时需要使用数据库加密密钥、API 、JWT 签名密钥等场景。
- 开发/测试/预发布环境——尚未部署硬件安全模块(HSM)或专业 KMS 时,需以低成本实现密钥安全落地。
- CI/CD 流水线——构建与部署过程中需要临时存储签名密钥、证书私钥或镜像加密密钥。
- 边缘计算/嵌入式设备——受硬件限制无法搭载专用安全芯片,依靠软件加密与操作系统权限隔离保护密钥。
- 混合云/多云架构——在无法统一使用云厂商 KMS 的情况下,通过软件方案实现跨平台密钥存储一致性。
适用性提示:软件方案的核心假设是“操作系统与运行时环境可信”。若攻击者已取得 root 权限或物理接触设备,软件层保护能力将大幅下降,此时应优先考虑硬件锚点方案。
3.2 前置条件
实施软件密钥存储方案前,必须满足以下条件:
| 类别 | 具体要求 | 验证方式 |
|---|---|---|
| 运行环境 | Linux / 类 Unix 系统(建议内核 ≥ 4.15)或 Windows Server 2016+ | uname -r 或 ver |
| 依赖库 | OpenSSL ≥ 1.1.1、libsodium ≥ 1.0.18 或 BoringSSL | openssl version |
| 权限模型 | 已规划独立的运行用户(非 root),具备最小文件访问权限 | 检查 /etc/passwd 及用户组配置 |
| 安全基线 | 系统已关闭不必要的网络服务、启用审计日志(auditd)、配置 SELinux / AppArmor | auditctl -s 及 getenforce |
| 密钥物料 | 已获取或生成待管理的密钥材料(长度、算法、有效期已明确) | 核对密钥清单与分类表 |
强制要求:绝不允许在 root 用户下直接管理应用密钥。必须创建专用系统用户(如
keyuser),其主目录与 umask 严格限制为 0700 / 027。
3.3 操作步骤
软件密钥存储方案采用 评估 → 部署 → 加密 三阶段流程。下图为完整实施路径:
3.3.1 安全性评估(子步骤)
- 密钥资产识别与分类 — 遍历所有业务模块,登记密钥 ID、算法、长度、用途、生命周期状态,形成《密钥资产清单》。
- 威胁建模分析 — 采用 STRIDE 方法逐项分析:伪造、篡改、抵赖、信息泄露、拒绝服务、权限提升对密钥存储的潜在影响。
- 风险等级判定 — 根据可能性 × 影响程度,将风险划分为 高/中/低 三级;高风险项必须进入“强制加密存储”路径。
- 输出评估报告 — 包含资产清单、威胁矩阵、风险等级、建议的存储策略(纯软件加密 / 加密 + 访问控制 / 硬件锚点)。
评估要点:对于高安全等级密钥(如 CA 根密钥、数据库主密钥),即使采用软件存储,也必须启用“加密密钥加密密钥(KEK)”双层保护,且 KEK 必须来源于独立密钥派生函数(KDF)。
3.3.2 实施步骤(子步骤)
- 环境依赖准备 — 安装 OpenSSL / libsodium,创建专用用户与组,设置
/etc/keys/目录权限 0700。 - 密钥生成与导入 — 在安全随机数源(
/dev/urandom)下生成密钥,使用chmod 400锁定文件权限。 - 访问控制配置 — 配置 SELinux 策略或 AppArmor 规则,仅允许目标进程(如 nginx、MySQL)的 systemd unit 读取密钥文件。
- 集成与部署验证 — 将密钥路径注入应用环境变量或配置文件,通过冒烟测试确认加解密功能正常。
# 密钥生成与权限设置示例(非主体内容,仅作参考)
openssl rand -hex 32 > /etc/keys/app_master.key
chmod 400 /etc/keys/app_master.key
chown keyuser:keygroup /etc/keys/app_master.key
restorecon -v /etc/keys/app_master.key # SELinux 上下文恢复
3.3.3 加密存储(子步骤)
- 加密算法选择 — 对称加密优先选用 AES-256-GCM(认证加密,抗篡改);非对称场景使用 RSA-3072 或 ECDSA P-384。
- 主密钥保护机制(KEK) — 使用独立的 KEK 对业务密钥加密后再存储;KEK 本身由操作系统密钥环(keyring)或 TPM 保护。
- 加密存储实现 — 密钥文件以密文形式落盘,头信息包含算法标识、IV、认证标签;应用启动时在内存中解密为临时句柄。
- 备份与恢复机制 — 对加密后的密钥包进行异地备份,备份路径同样实施 0700 权限;恢复时校验 HMAC 完整性。
# 加密存储配置模板(YAML 结构,非主体内容)
key_store:
algorithm: aes-256-gcm
key_encryption_key: /etc/keys/kek.der
ciphertext_path: /var/lib/keys/encrypted/
iv_length: 12
tag_length: 16
backup: true
backup_path: /backup/keys_encrypted/
3.4 输入输出物
| 阶段 | 输入物 | 输出物 |
|---|---|---|
| 安全性评估 | 业务密钥清单、系统架构图、安全需求文档 | 安全评估报告(含威胁矩阵与风险等级) |
| 实施部署 | 安全评估报告、密钥材料、操作系统基线 | 密钥存储架构文档、部署记录、权限配置表 |
| 加密存储 | 密钥存储架构文档、加密算法参数 | 加密配置文件、KEK 保护策略、备份恢复 SOP |
3.5 责任边界
| 角色 | 职责范围 | 交付物 |
|---|---|---|
| 安全架构师 | 主导安全性评估、选择加密策略、审核最终方案 | 安全评估报告、加密策略决策记录 |
| 开发工程师 | 实施密钥生成、导入与应用集成 | 密钥生成脚本、集成测试报告 |
| 安全运维工程师 | 配置访问控制、加密存储、备份与恢复机制 | 权限配置表、加密存储配置、恢复演练报告 |
| 审计人员 | 验收审计、合规检查、日志审查 | 审计报告、合规检查清单 |
3.6 记录材料
- 密钥资产登记表 — 记录密钥 ID、算法、长度、用途、创建日期、负责人。
- 风险评估记录 — 包含威胁建模会议纪要、风险等级判定依据、处置措施。
- 实施变更记录 — 环境配置变更、密钥导入操作、权限修改的时间戳与操作人。
- 加密配置清单 — 算法参数、KEK 保护方式、备份策略、恢复测试结果。
- 备份与恢复测试报告 — 每季度至少 1 次恢复演练,记录成功/失败详情。
记录保存建议:所有记录材料统一存储在版本控制仓库(Git)的
/docs/security/ 目录下,除审计日志外均需加密提交。
3.7 异常处理
| 异常场景 | 触发条件 | 处置措施 |
|---|---|---|
| 密钥生成失败 | 随机数源不可用、磁盘空间不足 | 检查 /dev/urandom 状态,释放磁盘空间后重试;若持续失败则切换备用服务器 |
| 存储介质故障 | 磁盘 I/O 错误、文件系统损坏 | 立即切换到备用存储路径,从加密备份恢复密钥包,修复原介质后同步最新数据 |
| 访问权限异常 | 进程无法读取密钥文件、SELinux 拒绝 | 审查 audit.log,修正文件权限或 SELinux 策略,执行 restorecon 后重启服务 |
| 加密算法兼容性问题 | 应用依赖库不支持所选算法(如 GCM 模式) | 回退到 AES-256-CBC + HMAC 组合,更新依赖库版本,重新测试后上线 |
| 备份数据完整性校验失败 | HMAC 标签不匹配、文件被篡改 | 标记该备份为“不可用”,追溯篡改来源;从上一轮可用备份恢复并更新防护策略 |
紧急联络:发生“存储介质故障”或“备份完整性校验失败”时,必须在 15 分钟内通知安全架构师与运维负责人,启动应急恢复流程。
3.8 验收标准
本章节实施完成后,必须逐项确认以下检查点全部通过:
- 所有密钥资产已识别、分类并登记在《密钥资产登记表》中,覆盖度 100%。
- 安全性评估报告已完成,所有高风险项均已制定明确的加密存储策略。
- 密钥文件以 密文形式 存储在受控目录下,文件权限为 0400 或 0700,属主为专用系统用户。
- KEK 保护机制已启用,KEK 与业务密钥分离存储,且 KEK 访问路径受 SELinux / AppArmor 约束。
- 加密存储配置中算法参数(AES-256-GCM、IV 长度 12、标签长度 16)与文档一致。
- 备份恢复机制已完成至少 1 次全流程演练,恢复后的密钥可正常解密业务数据。
- 审计日志已开启,记录密钥读取、修改、删除操作,日志保留期 ≥ 180 天。
验收通过标志:以上 7 项检查点全部为“已通过”,且异常处理记录中无未关闭的 P0/P1 工单,即视为本章节交付完成。