密钥库 (.jks) 应该存储在存储库中的什么位置

信息安全 密钥管理 爪哇 钥匙 山姆 混帐
2021-09-04 18:10:39

我有一个关于.jks在源代码管理中存储密钥库文件 ( ) 的最佳做法的问题。此 Keystore 由独立 Java 组件调用,该组件检索私钥以签署 SAML 断言。

出于安全目的,我想避免将此密钥库包含在与我们的 Java 代码相同的 git 项目中。此源代码被推送到许多不同的位置以供使用的各种工具。(代码审查工具、源代码扫描器)而且我认为将我们的 Keystore 文件放在所有这些位置不会有什么好处。

这给我留下了一个问题,将这个文件包含在源代码控制中的最佳位置在哪里?我已经在互联网上进行了一些挖掘,但尚未找到一个好的答案,所以这是我的想法。

A计划

我计划将 Keystore 文件放在一个被锁定的私人仓库中。这只能由非常有限的观众访问。密钥库将作为部署过程的依赖项添加到构建时的独立组件中。

- 优点

  • Keystore 不会与我们的源代码一起分发
  • 可以锁定并仔细监控源代码控制中密钥库的更新

- 缺点

  • 证书管理的复杂性增加
  • 无论如何,密钥库都会在部署过程中添加到模块中,因此安全优势是有限的

B计划

每次启动构建过程时,都会使用伪随机密钥构建一个新的密钥库,而不是保留静态密钥库。然后将密钥作为 zip 的一部分添加到我们的构建过程中。然后需要将证书添加到密钥库中。这个 Java 模块的大多数实例都有唯一的证书,所以不保留静态引用不会引入大量的繁忙工作。

- 优点

  • 没有可供攻击者利用的静态密钥库

  • 密钥库的每个实例都有自己的密码

- 缺点

  • 增加构建过程的复杂性

  • 如果在此模块的多个实例中使用相同的证书,则必须将证书添加到每个实例中。

哪个是我更好的选择?我也走在正确的道路上吗?

2个回答

我工作的所有组织都将凭据或同样敏感的信息存储在应用程序部署目录之外的知名位置,并且每个环境都受到保护。开发人员使用开发凭据自己创建文件,而生产文件由操作人员创建并受到保护,因此只有应用程序可以访问。

如果您希望应用程序在结帐后无需配置即可运行,您可以嵌入一些仅在无法在众所周知的位置找到文件时使用的虚拟副本。

哪个是我更好的选择?我也走在正确的道路上吗?

这取决于.

您的应用程序类型、应用程序威胁模型和您的业务攻击配置文件决定了正确的选择。如果您询问最佳实践,我可以建议使用HSM 设备,一个用于开发环境,一个用于生产这些设备是专门为安全密钥管理而构建的。任何其他自定义选项都有一个或多个安全漏洞、不必要的复杂性或未知的攻击向量。

显然,HSM 设备提供的安全性是有代价的。另一个实用的选择是实施基于软件的内部 PKI 基础设施取决于您的服务器堆栈(MS、Unix 等),有不同的方法来实现它。例如pki.io,一个开源的 X.509 证书管理项目,虽然是一个年轻的项目,但可以简化内部的密钥管理。