密钥存储
目录:
摘要
问题
我们需要存储密钥(secrets),例如密码、私钥、认证令牌等。
有些密钥面向用户。例如,我们的开发人员希望能够使用手机查找某项服务的密码。
有些密钥面向系统。例如,我们的持续交付流水线需要能够查找我们云托管的凭据。
决策
面向用户的密钥使用 Bitwarden。
面向系统的密钥使用 Vault by HashiCorp。
状态
已决定。对出现的新备选方案持开放态度。
详情
假设
就此目的和我们目前的状态而言,我们看重面向用户的便利性,例如好用的移动应用。
我们希望确保在外出时也能快速轻松地访问,例如对于负责值班的系统可靠性工程开发人员。
我们希望能够在选定的人员(例如团队)之间共享一些密钥。
我们并不打算解决单一提供商的问题,例如把所有密钥专门存储在 Amazon、Azure 或 Google 上。
我们不想要“记在脑子里”、“写在便条上”或“自己想办法存储”这类临时性的做法。
对于这一目的,我们的安全模型可以接受使用受人尊敬的商业现货(COTS)供应商,例如 SaaS 密码管理工具。
约束
目前我们想要简便的东西,也就是说,无需编写代码,无需安装服务器,无需做出重大承诺,无需让所有人统一标准。
立场
我们考虑了:
面向用户的现成密码管理器:LastPass、1Password、Bitwarden、Dashlane、KeePass、pass、GPG 等。
面向系统的 COTS 密码管理器:AWS KMS、Vault by HashiCorp、EnvKey、Secret Server by Thycotic、Devolutions Password Server、Confidant by Lyft。
面向共享的方法:使用共享的 Google 文档、共享的 Slack 频道或共享的网络文件夹等。
低技术含量的临时做法,例如靠记忆、写便条,或依靠每个用户自己想办法。
论证
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 机器来运行它。
便宜。