在容器中的脚本中验证 Vault
Authenticating Vault inside a script in your container
这显然是一个愚蠢的问题,因为我找不到答案,但我对 Hashicorp Vault 和你获取秘密的方式感到困惑。
Vault 的部分想法是您可以将您的秘密存储在那里,并且您不需要在可检查的环境变量中粘贴一堆敏感的东西。
假设你有一个 Vault 服务 运行 某处有一些秘密,你需要使用令牌对 Vault 进行身份验证,以便在你的 docker 容器内的脚本中获取你的秘密,如何令牌进入那里了吗?当然,如果您使用环境变量,那将失去意义,因为有人可以拿走令牌。你用它安装一个卷吗?或者更有创意的东西?
一些需要考虑的事项,排名不分先后:
- 是的,如果攻击者可以检查 运行 应用程序的属性,他们很可能可以读取其中的任何秘密。面对具有足够访问权限以能够在应用程序本身中四处探索的攻击者,创建一个安全的应用程序是相当困难的
- 如果 env var 持有令牌,则该令牌不是直接可用的秘密 - 攻击者随后需要使用它从 Vault 中检索实际秘密。虽然这是可以实现的,但它确实带来了额外的困难
- 可以创建具有有限生命周期的令牌,因此在一段时间后,不再可能使用它从 Vault 中检索秘密
- 也可以创建具有有限使用次数(例如一次)的令牌。这意味着一旦应用程序使用它来检索秘密,令牌就不再可用
- Vault 支持原始令牌以外的其他身份验证机制。例如,正如@davidmaze 在评论中提到的,如果应用程序在 Kubernetes 下 运行,那么您可以将 Vault 设置为使用 k8s ServiceAccount 进行身份验证(不需要直接令牌)
- 在容器中具有 shell 访问权限的攻击者并不是唯一需要防范的媒介。只是对源代码(尤其是源代码控制)保密是一件非常重要的事情
- 简单 key/values 并不是 Vault 可以管理的唯一一种秘密。它还可以自动生成 AWS 的访问令牌和 Postgres 的凭证,以及许多其他功能
关于您的直接问题
how does the token get in there?
可以通过多种方式完成。简单地替换环境变量是一种选择,但它也可以安装在卷中,作为参数传递,提供 API 调用,从数据库中提取,或您可以想到的任何其他方式。这完全取决于您的部署过程、威胁模型、风险评估、应用程序详细信息、您是否可以使用其他身份验证机制之一等。
这显然是一个愚蠢的问题,因为我找不到答案,但我对 Hashicorp Vault 和你获取秘密的方式感到困惑。
Vault 的部分想法是您可以将您的秘密存储在那里,并且您不需要在可检查的环境变量中粘贴一堆敏感的东西。
假设你有一个 Vault 服务 运行 某处有一些秘密,你需要使用令牌对 Vault 进行身份验证,以便在你的 docker 容器内的脚本中获取你的秘密,如何令牌进入那里了吗?当然,如果您使用环境变量,那将失去意义,因为有人可以拿走令牌。你用它安装一个卷吗?或者更有创意的东西?
一些需要考虑的事项,排名不分先后:
- 是的,如果攻击者可以检查 运行 应用程序的属性,他们很可能可以读取其中的任何秘密。面对具有足够访问权限以能够在应用程序本身中四处探索的攻击者,创建一个安全的应用程序是相当困难的
- 如果 env var 持有令牌,则该令牌不是直接可用的秘密 - 攻击者随后需要使用它从 Vault 中检索实际秘密。虽然这是可以实现的,但它确实带来了额外的困难
- 可以创建具有有限生命周期的令牌,因此在一段时间后,不再可能使用它从 Vault 中检索秘密
- 也可以创建具有有限使用次数(例如一次)的令牌。这意味着一旦应用程序使用它来检索秘密,令牌就不再可用
- Vault 支持原始令牌以外的其他身份验证机制。例如,正如@davidmaze 在评论中提到的,如果应用程序在 Kubernetes 下 运行,那么您可以将 Vault 设置为使用 k8s ServiceAccount 进行身份验证(不需要直接令牌)
- 在容器中具有 shell 访问权限的攻击者并不是唯一需要防范的媒介。只是对源代码(尤其是源代码控制)保密是一件非常重要的事情
- 简单 key/values 并不是 Vault 可以管理的唯一一种秘密。它还可以自动生成 AWS 的访问令牌和 Postgres 的凭证,以及许多其他功能
关于您的直接问题
how does the token get in there?
可以通过多种方式完成。简单地替换环境变量是一种选择,但它也可以安装在卷中,作为参数传递,提供 API 调用,从数据库中提取,或您可以想到的任何其他方式。这完全取决于您的部署过程、威胁模型、风险评估、应用程序详细信息、您是否可以使用其他身份验证机制之一等。