管理密钥

Managing secret keys

我有一个应用程序将 AWS 密钥存储在 Github 上的私有存储库中。

之所以推荐,是因为如果我们的其中一台计算机 "blows up",我们将无法访问密钥。

不用存储在 Github 中,我们可以让我们的计算机到处共享密钥,或者通过私人公司 slack 发送它们。

这些似乎都是管理密钥的糟糕方法。

是否有更好的repository/vault或方法更适合密钥存储和与团队成员共享?

您可以使用 1Password for Teams,它允许您在加密的 password-protected 保险库中共享秘密。

作为 side-note,如果计算机崩溃,将 AWS 用户锁定在其帐户之外的风险非常低。在任何情况下,账户所有者都可以为账户中的任何 IAM 用户重新生成一组新的 AWS 密钥。只要账户所有者可以连接到 AWS 账户,您就是安全的。

与许多秘密一样,密钥不应尽可能共享。

AWS 用户情况:

  1. 每个用户(员工、队友等)都应该为他们创建自己的 IAM 用户。
  2. 每个 IAM 用户都会生成自己的一组访问权限 keys/secrets,并且仅供该用户使用。

这个系统有很多好处:

  1. 由于密钥不共享,因此它们更难意外泄露,
  2. 由于密钥不共享,如果它们被泄露,那么只有一个用户受到影响;没有其他队友受到影响。
  3. 每个IAM用户都可以根据自己的需求被赋予不同的权限。
  4. 使用 CloudTrail,您可以审计每个用户在 AWS 账户中所做的事情。

并避免在源代码管理(git 或任何其他)中保存此类内容。

避免使用代码存储凭据,它们非常容易受到攻击,后果可能是不可逆转的。使用 IAM 角色授予访问权限并仅将密钥用于开发会更好,最好每个开发人员使用不同的密钥,以便可以根据需要轮换。

查看 AWS Security Best Practices 白皮书了解更多详情。

密钥管理的首要规则是尽量减少密钥存储位置的数量。因此,对于 AWS 密钥之类的东西,开发人员应该将自己的密钥存储在他们的机器上。对于应用服务器所需的密钥,这些密钥应仅存储在应用服务器上。

It was recommended because if one of our computers "blows up", we will not have access to the keys.

解决这个问题最好的方法就是旋转按键。理想情况下,您应该始终处于可以 quickly/easily 在需要时生成新密钥的地方,例如在发生安全事件的情况下。如果有一些万能钥匙,如果你丢失了它,你就会完全搞砸了,把它存储在一个安全的存储应用程序中,比如 1Password,你的保险库用一个额外的密码加密。

Instead of storing in Github, we could just pass our computers around to share the secret key, or send them through private company slack.

These all seem like bad ways to manage keys.

作为一般规则,切勿将 AWS 密钥(或任何其他敏感密钥或密码)存储在 Github 或公司 Slack 中。您在 slack 中共享的任何内容都将永远存在于日志中,因此,如果您的公司 slack 遭到破坏——或者如果 Slack 遭到破坏(这种情况已发生多次)——潜在攻击者可以获取日志中的任何内容。

Is there a good repository/vault or method that is better for secret key storage and sharing with team members?

要存储密钥(长期存储),请使用 1 个密码之类的东西。对于共享密钥(短期存储),使用类似 ShareSecret 的东西(免责声明,我是 ShareSecret 的创始人)。

您可以使用仅存储密钥并仅允许特定用户通过 IAM 组和用户访问该存储桶的 S3 存储桶。这在项目开始时似乎是合理的。

如果您需要更硬核的东西,我知道一些较大的科技公司使用:

https://github.com/hashicorp/vault