第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 安全性评估(子步骤)

  1. 密钥资产识别与分类 — 遍历所有业务模块,登记密钥 ID、算法、长度、用途、生命周期状态,形成《密钥资产清单》。
  2. 威胁建模分析 — 采用 STRIDE 方法逐项分析:伪造、篡改、抵赖、信息泄露、拒绝服务、权限提升对密钥存储的潜在影响。
  3. 风险等级判定 — 根据可能性 × 影响程度,将风险划分为 高/中/低 三级;高风险项必须进入“强制加密存储”路径。
  4. 输出评估报告 — 包含资产清单、威胁矩阵、风险等级、建议的存储策略(纯软件加密 / 加密 + 访问控制 / 硬件锚点)。
评估要点:对于高安全等级密钥(如 CA 根密钥、数据库主密钥),即使采用软件存储,也必须启用“加密密钥加密密钥(KEK)”双层保护,且 KEK 必须来源于独立密钥派生函数(KDF)。

3.3.2 实施步骤(子步骤)

  1. 环境依赖准备 — 安装 OpenSSL / libsodium,创建专用用户与组,设置 /etc/keys/ 目录权限 0700。
  2. 密钥生成与导入 — 在安全随机数源(/dev/urandom)下生成密钥,使用 chmod 400 锁定文件权限。
  3. 访问控制配置 — 配置 SELinux 策略或 AppArmor 规则,仅允许目标进程(如 nginx、MySQL)的 systemd unit 读取密钥文件。
  4. 集成与部署验证 — 将密钥路径注入应用环境变量或配置文件,通过冒烟测试确认加解密功能正常。
# 密钥生成与权限设置示例(非主体内容,仅作参考)
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 加密存储(子步骤)

  1. 加密算法选择 — 对称加密优先选用 AES-256-GCM(认证加密,抗篡改);非对称场景使用 RSA-3072 或 ECDSA P-384。
  2. 主密钥保护机制(KEK) — 使用独立的 KEK 对业务密钥加密后再存储;KEK 本身由操作系统密钥环(keyring)或 TPM 保护。
  3. 加密存储实现 — 密钥文件以密文形式落盘,头信息包含算法标识、IV、认证标签;应用启动时在内存中解密为临时句柄。
  4. 备份与恢复机制 — 对加密后的密钥包进行异地备份,备份路径同样实施 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 验收标准

本章节实施完成后,必须逐项确认以下检查点全部通过:

  1. 所有密钥资产已识别、分类并登记在《密钥资产登记表》中,覆盖度 100%。
  2. 安全性评估报告已完成,所有高风险项均已制定明确的加密存储策略。
  3. 密钥文件以 密文形式 存储在受控目录下,文件权限为 0400 或 0700,属主为专用系统用户。
  4. KEK 保护机制已启用,KEK 与业务密钥分离存储,且 KEK 访问路径受 SELinux / AppArmor 约束。
  5. 加密存储配置中算法参数(AES-256-GCM、IV 长度 12、标签长度 16)与文档一致。
  6. 备份恢复机制已完成至少 1 次全流程演练,恢复后的密钥可正常解密业务数据。
  7. 审计日志已开启,记录密钥读取、修改、删除操作,日志保留期 ≥ 180 天。
验收通过标志:以上 7 项检查点全部为“已通过”,且异常处理记录中无未关闭的 P0/P1 工单,即视为本章节交付完成。