Architecture Decision Record

Active theme: Light

← 决策记录示例

密钥存储

目录:

摘要

问题

我们需要存储密钥(secrets),例如密码、私钥、认证令牌等。

有些密钥面向用户。例如,我们的开发人员希望能够使用手机查找某项服务的密码。

有些密钥面向系统。例如,我们的持续交付流水线需要能够查找我们云托管的凭据。

决策

面向用户的密钥使用 Bitwarden。

面向系统的密钥使用 Vault by HashiCorp。

状态

已决定。对出现的新备选方案持开放态度。

详情

假设

就此目的和我们目前的状态而言,我们看重面向用户的便利性,例如好用的移动应用。

  • 我们希望确保在外出时也能快速轻松地访问,例如对于负责值班的系统可靠性工程开发人员。

  • 我们希望能够在选定的人员(例如团队)之间共享一些密钥。

我们并不打算解决单一提供商的问题,例如把所有密钥专门存储在 Amazon、Azure 或 Google 上。

我们不想要“记在脑子里”、“写在便条上”或“自己想办法存储”这类临时性的做法。

对于这一目的,我们的安全模型可以接受使用受人尊敬的商业现货(COTS)供应商,例如 SaaS 密码管理工具。

约束

目前我们想要简便的东西,也就是说,无需编写代码,无需安装服务器,无需做出重大承诺,无需让所有人统一标准。

立场

我们考虑了:

  1. 面向用户的现成密码管理器:LastPass、1Password、Bitwarden、Dashlane、KeePass、pass、GPG 等。

  2. 面向系统的 COTS 密码管理器:AWS KMS、Vault by HashiCorp、EnvKey、Secret Server by Thycotic、Devolutions Password Server、Confidant by Lyft。

  3. 面向共享的方法:使用共享的 Google 文档、共享的 Slack 频道或共享的网络文件夹等。

  4. 低技术含量的临时做法,例如靠记忆、写便条,或依靠每个用户自己想办法。

论证

Bitwarden、LastPass、1Password 和 Dashlane 都是商业现货产品。

  • 对用户、团队、组织等提供类似种类的功能。

  • 具有 Windows 和 Mac 的桌面端能力,以及 Android 和 iOS 的移动端能力。

  • 提供适用于 Chrome 和 Firefox 的浏览器扩展,用于自动填写表单等。

Bitwarden 比其他产品有两个优势:

  • Bitwarden 是开源的,这意味着其安全性可以接受同行评审,而且该公司受到注重安全的开发者的广泛赞赏。

  • 软件从业者的轶事描述显示,他们明显更偏爱 Bitwarden 而非其他产品。

一篇典型的优秀文章:https://jcs.org/2017/11/17/bitwarden

一个典型的并排投票网站:https://stackshare.io/stackups/bitwarden-vs-dashlane

我们暂缓考虑 KeyPass、pass、GPG 等,因为它们带来额外的复杂性。所有这些对技术用户来说都是不错的解决方案。对于希望获得跨系统命令行能力的技术用户,GPG 看起来尤其出色。

我们暂缓考虑 KMS,因为它存在单一提供商锁定。

对于面向系统的需求,我们选择 Vault,因为评价极为正面,而且 HashiCorp 在高质量软件和支持方面有着出色的业绩记录。

我们否决通过共享文档、共享频道、共享网络文件夹等进行共享的做法。它们不具备我们想要的安全品质。

我们否决临时性的低技术做法,因为大家一致认为这不是长远之路。

影响

开发人员可能需要在两个地方跟踪密钥:面向用户访问的 Bitwarden,以及面向系统访问的 Vault。

相关内容

相关决策

关于选择哪种 CI/CD 服务器的决策,必须包含其访问密钥的能力证明。

我们将需要决定如何管理密钥,包括策略、轮换、组织等方面。

相关需求

密钥将带有与合规、审计以及人力资源入职/离职相关的需求。

相关制品

我们预计可能会将一些密钥导出到环境变量中。

相关原则

易于撤销。

易于并行,即很容易同时使用多种密码管理器。

试用成本低,即有免费试用且无需承诺。

备注

评估备注见下文。这些备注都是在各个 DevOps 讨论板上的公开评论。

Vault by HashiCorp

Vault 正是你在这里想要的。

不过不要直接把 Vault 投入生产环境,先在测试环境中搭建起来,因为即使 HashiCorp 的产品很出色,他们的文档也可能相当欠缺。

学习曲线非常陡峭,搭建起来并不简单。

初始设置有点痛苦。但这非常值得,而且社区对它的支持足够你应付过去。

文档糟糕透顶,但网上有很多人搭建它的指南,把其中几篇组合起来你就能得到一套可用的配置。

初始设置需要折腾他们的 helm chart(vault 和 consul)。虽然从技术上讲你可以使用许多其他后端,但我真的非常不推荐。如果你没有大量数据要存储,后端/consul 可以非常小。

一定要熟悉并习惯使用命令行,因为图形界面更像是他们企业版的概念验证/广告入口。

你不能直接“批量填充”这一点很痛苦。例如,如果你有 5 个字段,就需要为每个条目手动添加每个字段。所以并不是为特定类别预先定义字段,然后为该类别中的所有条目填写这些字段,而更像是“每次都要生成所有内容”,在我看来这很麻烦。

你可能还想看看 goldfish,它是 vault 之上的 UI。它让你的团队更容易接受 vault。他们也有演示。1. 搭建 consul。2. 搭建指向 consul 的 vault。3. 搭建指向 vault 的 goldfish。3. 设置某个 cron 任务来运行 consul 快照以进行备份。

LastPass

LastPass Teams。我们在用,有自定义模板、ACL,依我看没有缺什么。

我在我的组织里实施了 LastPass,给它打 C+/B-。最近最大的问题是缺乏可靠性。在过去 90 天里,有好几次长达数小时保险库被强制进入离线模式。这对我的组织并不理想,因为我们在 20 多个共享文件夹中存储了 4,000 多个密码。可以想象,有这么多密码,每天至少会有几个被更新或新增。如果问题持续超过一两个小时,我们有灾难恢复计划:一个脚本每晚对保险库的 CSV 导出进行签名和加密,可以导入到 keepass 中。

LastPass 出现过未经报告的服务降级:登录“能用”但不拉取站点、管理面板中的某些功能随机出错,以及未能为新的顶层共享文件夹正确共享密钥。我有一个专门的“密钥推送”/备份用户,它在每个组里。通常以该用户身份登录就能修复任何密钥共享问题,但在服务降级时则不行,不管状态页面怎么说……

关于集成,如果你有采用最小权限模型的合理 ACL,集成可以很容易,例如,如果某个用户对某个条目或文件夹既有读写权限又有只读权限,他们只会获得只读权限。不幸的是,我所在组织的 ACL 并不是最好的,所以由于我们数百条 ACL 之间的依赖关系与最小权限模型不太匹配,我最终使用了 JSON 配置 API 和约 500 行 Python。我最后获取了用户所在的所有 ACL,并做了某种依赖遍历。

如果你的 ACL 或组结构本来就是按最小权限来构建的,那么适用于 Windows 的 AD/LDAP 同步工具会运作良好。

联系他们的销售团队,他们可以为你提供更长时间的企业版试用。在决定购买之前,务必充分了解它的局限性。我们经历了不少成长的阵痛,但除了服务器端的中断或受损之外,它一直非常顺畅。

Bitwarden

Bitwarden 周边有不错的工具(Web 界面、命令行、移动端、桌面端)。可自托管,且相当容易搭建。文档相当不错,并且是 PrivacyTools 推荐的工具。

EnvKey

https://www.envkey.com/ 是一项 SaaS。非常容易实施、集成和管理。

功能:

  • 保护 API 密钥和凭据。

  • 让配置在各处保持同步。

  • 智能的、端到端加密的配置和密钥管理。

  • 防止不安全的共享和配置蔓延。

  • 几分钟内即可集成。

能力:

  • 在一个地方管理所有应用、环境和团队的配置与访问级别。

  • 仅用一个环境变量即可配置任何开发或服务器环境。

优点:

  • 首页不错。

  • 价值主张清晰。

  • Web 应用视觉效果出色。

  • 示例数据出色,例如 Algolia、AWS、Datadog、GitHub、Stripe 等。

  • 与创始人就公司、界面等聊了 30 分钟。Dane 听起来见多识广,对优缺点很坦诚,是可行的合作伙伴。

  • 这家公司基本上是一家典型的 Y Combinator 公司,只有 1 位创始人。2018 年 1 月融资 12 万美元。

  • 重点是迈向企业级功能,尤其是从 EnvKey 云托管转向本地部署或自带云(BYOC)。

  • 一条潜在的前进路径是先从易用的 EnvKey 开始,然后(稍后或并行)再加入 Vault。

Confidant by Lyft

https://lyft.github.io/confidant/

Confidant 是 Lyft 开发者开发的一项开源密钥管理服务,以安全的方式提供对密钥的用户友好存储和访问。

KMS 认证:Confidant 通过使用 AWS KMS 和 IAM,解决了认证中的“先有鸡还是先有蛋”问题,允许 IAM 角色生成可由 Confidant 验证的安全认证令牌。Confidant 还为你的 IAM 角色管理 KMS 授权,使 IAM 角色能够生成可用于服务间认证的令牌,或在服务之间传递加密消息。

版本化密钥的静态加密:Confidant 以仅追加的方式将密钥存储在 DynamoDB 中,使用 Fernet 对称认证加密,为每个密钥的每个修订版本生成唯一的 KMS 数据密钥。

用于管理密钥的用户友好 Web 界面:Confidant 提供一个 AngularJS Web 界面,使最终用户能够轻松管理密钥、密钥到服务的映射以及变更历史。

Devolutions Password Server

https://server.devolutions.net/

保护、管理和监控对特权账户和会话的访问。

一个全面、高度安全的密码保管库,让你控制对特权账户的访问,同时也提升系统管理员对整体网络的可见性,并为最终用户提供无缝体验。

功能:集中式组织密码保管库、用户专属私有保管库、密码管理器、凭据注入、Active Directory 集成、基于角色的访问控制、双因素认证、企业就绪、IP 限制、管理能力、自动密码生成器、移动应用访问、密码历史、访问报告、电子邮件告警。

  • 支持数据加密

  • 支持多种认证方案,包括 LDAP、O365 和本地用户,并支持来自多个来源的 MFA

  • 多个仓库/保管库,可为多个团队提供细粒度的访问控制

  • 现代 Web 界面

  • 用于个人凭据/连接的私有凭据和连接保管库

  • 适用于 iOS/Android 的移动应用

  • 每个条目的审计日志,记录谁/什么/何时,并可选择提示访问原因

  • 可自定义的模板(尽管它们原生支持数百种连接类型)

  • 还有更多功能,以及可同步的 Windows/Mac 胖客户端(Remote Desktop Manager),极大地扩展了选项……一键连接

  • 价格也不算太糟——密码服务器最多 15 个用户,每年 500 美元

Secret Server by Thycotic

https://thycotic.com/products/secret-server/

本地部署版本功能:

  • 完全掌控你的端到端安全系统和基础设施

  • 在你的本地数据中心或你自己的虚拟私有云实例中部署软件

  • 满足要求所有数据和系统驻留在本地的法律和监管义务

云版本功能:

  • 软件即服务模式,让你注册后立即开始使用

  • 随着你的成长而具备弹性可扩展性

  • 由 Azure 提供控制和冗余,具有 99.9% 的正常运行时间 SLA

用户反馈:

  • 我们过去用过这个产品。它太容易被绕过了,规则只对聪明人有效。懒惰或愚蠢的用户很容易在团队区域把它搞砸。与他们交谈时价格是可以协商的。

  • 你可以用 SQL express 和一台 Win 7 机器来运行它。

  • 便宜。