使用版本控制系统安全地管理秘密的介绍

介绍

版本控制软件(VCS)是大多数现代软件开发实践的重要组成部分。 除了其他好处,Git,Mercurial,Bazaar,Perforce,CVS和Subversion等软件允许开发人员保存项目历史记录的快照,从而实现更好的协作,恢复到以前的状态,并从无意的代码更改中恢复,并管理多个版本的代码库。 这些工具允许多个开发人员安全地在同一个项目上工作,即使您不打算与他人分享您的工作,也能提供显着的优势。

虽然重要的是将您的代码保存在源代码控制中,但同样重要的是将某些项目资产保留在存储库中。 由于性能和可用性的原因,某些数据(如二进制blob和配置文件)最好不要用于源代码控制。 但更为重要的是,密码,秘密和私钥等敏感数据不应该被安全地检入不受保护的存储库。

在本指南中,我们将首先讨论如何检查已经承诺到您的存储库的敏感数据,并在发现任何材料时引入一些缓解策略。 之后,我们将介绍一些防止向存储库添加秘密的方法和技术,在提交之前加密敏感数据的方法以及安全秘密存储的替代方法。

检查您的Git Repository的敏感数据

在设置系统来管理敏感数据之前,最好先检查项目文件中是否存在任何秘密资料。

扫描您的项目

如果您知道要搜索的确切字符串,则可以尝试使用VCS工具的本地搜索功能来检查提供的值是否存在于任何提交中。 例如,使用git ,这样的命令可以搜索一个特定的密码:

git grep my_secret $(git rev-list --all)

这将搜索整个项目历史记录中指定的字符串。

一些专用工具可以帮助更广泛地表达秘密。 gitrob这样的工具可以扫描GitHub组织中的每个存储库,以便与预定义列表中的文件名匹配。 git-secrets项目可以基于文件路径和内容中的模式在本地扫描存储库以进行定义的秘密。 truffleHog工具使用不同的方法,通过搜索存储库来获取可能代表应用程序使用的生成秘密的高熵串。 要将这些功能结合到一个工具中,将git-all-secrets粘贴在一起,或者在统一的界面中重新实现上述工具。

缓解选项

如果发现不应该提交的文件或数据,那么重要的是要适当地进行响应,以减轻泄露的数据的影响。 正确的行动方向将取决于资源库的共享程度,暴露材料的性质,以及您是否要全面提及泄漏的内容或仅将其废除。

如果凭据提交到您的项目存储库,您的第一步应该是立即更改密码或密码以使之前的值无效。 应该完成此步骤,无论由于几个原因,存储库是否被共享或多么广泛。 合作要求可能会改变项目的使用寿命,导致比以前预期的更大的曝光。 即使您知道您永远不会有意分享您的项目,安全事件也可能将数据泄漏给无意的方面,因此最好是主动改变当前的价值。

在所有情况下,您应该旋转受感化的凭据,您也可能希望从VCS历史记录中完全删除泄露的凭据或文件。 对于无法更改的敏感数据(如无意中提交的任何用户数据)尤其重要。 从存储库中删除数据涉及重写VCS历史记录以从先前的提交中删除该文件。 这可以使用本机git命令或者使用一些专用工具来完成 重要的是要注意,即使删除存储库中的所有数据记录,任何先前复制代码库的人仍然可以访问敏感资料。 在评估影响的程度时记住这一点。

如果您怀疑这些秘密被盗用,最好查看与这些程序或服务相关的日志数据,以确定是否存在异常访问或行为。 这可能采取不寻常的活动或请求的形式,通常来自您的内部网络来自您不能控制的地址。 这项调查将帮助您确定适当的后续步骤,以保护您的基础架构和数据。

使用VCS功能避免提交秘密

在查看外部工具之前,最好先熟悉VCS工具原生的一些功能和功能,以防止将不需要的数据提交到存储库。

忽略敏感文件

将敏感数据保存在存储库中的最基本方法是从一开始就利用VCS的忽略功能。 VCS“忽略”文件(如.gitignore )定义应该从存储库中排除的模式,目录或文件。 这些是防止意外暴露数据的良好防线。 此策略很有用,因为它不依赖于外部工具,排除的项目列表会自动为协作者配置,而且易于设置。

虽然VCS忽略功能作为基准是有用的,但它依赖于保持忽略定义是最新的。 在更新或实现忽略文件之前,很容易提交敏感数据。 忽略模式只具有文件级粒度,因此如果秘密与应该提交的代码或其他数据混合,您可能必须重构项目的某些部分。

使用VCS Hooks在提交之前检查文件

大多数现代VCS实现包括一个名为“钩子”的系统,用于在存储库内采取某些操作之前或之后执行脚本。 此功能可用于执行脚本以检查敏感材料的未决更改的内容。 前面提到的git-secrets工具有能力安装pre-commit钩子来实现自动检查其评估的内容类型。 您可以添加自己的自定义脚本来检查您想要防范的任何模式。

存储库钩子提供了一种更灵活的机制,用于搜索和防止在提交时添加敏感数据。 这种增加的灵活性来自于必须编写您要实现的所有行为,这可能是一个困难的过程,具体取决于您要检查的数据类型。 另外考虑的是,钩子不像忽略文件那样容易地共享,因为它们不是其他开发人员复制的存储库的一部分。 每个贡献者将需要在自己的机器上设置钩子,这使得执行成为一个更加困难的问题。

明确地将文件添加到分段区域

虽然范围更为本地化,但可以帮助您更加注意提交的一个简单策略是仅通过名称明确地将项目添加到VCS分段区域。 通过通配符或扩展添加文件可能会节省一些时间,故意添加每个文件可以帮助防止意外添加,否则可能包括在内。 这样做的一个有益的副作用是通常允许您创建更集中和一致的提交,这有助于协作工作的许多其他方面。

将加密密码存储在存储库中

虽然在许多情况下,建议您从代码存储库中完全删除敏感数据,但有时候,将某些敏感数据包含在存储库中以供其他特权用户访问是有必要或有用的。 为此,各种工具允许您加密存储库中的敏感文件,同时使大多数文件可供大家访问。

实现

有许多不同的软件可以简化部分存储库加密。 大多数工作来自相同的基本原则,但每个都提供了一个独特的实现,可能会根据您的项目需求提供一些引人注目的优势。

一个名为git-secret的项目(不要与前面提到的git-secrets工具混淆)可以使用可信任协作者的GPG密钥加密秘密文件的内容。 通过利用现有的信任网络, git-secret用户可以通过指定应该能够解密每个项目的用户来管理对文件的访问。 如果用户已将其公钥发布到密钥服务器,则可以向他们提供对加密内容的访问权限,而无需直接询问他们的密钥。

git-crypt工具类似于git-secret ,它允许您加密和提交部分存储库,并使用其GPG密钥来规范对其他贡献者的访问。 如果您的团队不使用GPG,或者该管理模式对于您的用例来说太复杂,那么git-crypt项目也可以使用对称密钥加密。 另外, git-crypt将使用git过滤器和diff属性在克隆时提交和解密时自动加密,从而简化了管理。

BlackBox项目是依靠GPG协同加密内容的另一个解决方案。 与以前的工具不同,BlackBox可与许多不同的版本控制系统配合工作,以便可以跨不同的项目使用。 最初被设计为Puppet生态系统的工具,它被重构为支持更加开放的基于插件的系统。 BlackBox可以随意加密和解密各个文件,而且还提供了一种透明地调用文本编辑器的机制,它解密文件,打开编辑器,然后在保存时重新加密。

在上述一般解决方案之外,还有一些解决方案可用于处理特定类型的存储库。 例如,从版本5.1开始,Ruby on Rails项目可以使用在存储库外设置主密钥的系统在存储库中包含加密的秘密

优点

将秘密数据加密并提交到您的存储库可以帮助保持您的凭据最新,并与代码使用的方式同步。 这可以避免机密数据格式或标签的变化与代码使用或访问方式之间的漂移。 可以在不引用外部资源的情况下对代码库进行更改。

另外,用你的代码保持你的秘密可以大大简化部署。 而不是从多个位置下拉信息以获得功能完备的系统,所有信息都被打包在一个单元中,一些组件需要解密。 如果您没有设置基础设施来支持外部秘密商店,或者希望最大程度地减少部署项目所需的协调量,这将非常有用。

使用工具加密存储库中的敏感信息的整体优势在于,无需额外的基础架构或规划,加密便于实现。 用户可以在几分钟内从作为纯文本数据的秘密存储过渡到安全的加密系统。 对于具有单个开发人员或小型静态团队的项目,这些工具可能会填补所有秘密管理需求,而不会增加广泛的复杂性。

缺点

与任何解决方案一样,这种秘密管理风格有一些取舍。

从根本上说,秘密是配置数据,而不是代码。 虽然部署在各种环境中的代码可能相同,但配置可能会有很大的不同。 通过使用存储库中的代码保留秘密,在不同环境中维护配置变得更加困难,并鼓励以不利于安全性的方式重新使用凭据。

类似地,在存储库中配置对加密秘密的细粒度多级访问通常是困难的。 所需的访问控制级别通常比用于加密VCS中的秘密加密的工具容易地建模的特别复杂,特别是对于大型团队和项目。 引入协作者或从项目中删除贡献者涉及使用存储库中的敏感数据对所有文件进行重新加密。 虽然这些实用程序通常可以方便地更改用于保护文件的加密,但是在这些情况下,这些文件中的秘密应该进行旋转,这可能是一个困难的手动过程。

经常被忽视的重要一点是用于解密数据的密钥通常与加密内容一起存储。 在开发人员的笔记本电脑上,可以解密敏感数据的GPG密钥通常存在和可用,无需任何进一步的输入。 您可以通过使用GPG密码来减轻这一点,但是对于一个大型团队来说这是很难执行的。 如果一个团队成员的笔记本电脑受到威胁,则可以访问项目中最敏感的数据,就像它是纯文本一样。

一般来说,长期保护仓库内的秘密可能是困难的。 回滚代码更改的简单操作可能会意外重新引入以前删除的访问。 如果私钥被暴露,历史值可能会从存储库历史记录中恢复和解密。 虽然VCS历史记录提供了加密更改的日志,但是没有任何方式来审核秘密访问以帮助确定异常访问。

使用配置管理系统进行秘密管理

许多用户第一次使用更集中的秘密管理的经验就是配置管理工具。 因为这些工具负责从集中的位置协调许多不同机器的配置,所以需要一定程度的秘密管理来确保节点只能访问所需的值。

实现

Chef加密的数据包Chef保险箱为Chef管理的基础设施提供了一些集成的秘密管理功能。 加密数据袋用于保护敏感值不会在修订历史记录中显示,或者使用共享秘密保护其他机器。 Chef-vault允许使用目标机器的公钥加密秘密,提供进一步的安全性,将解密功能与预期收件人隔离。

同样, Puppet的Hiera键值存储系统可以与Hiera eyaml一起使用,以便为特定的基础架构组件安全地管理机密。 与其他一些系统不同,Hiera eyaml知道Hiera使用的数据串行化格式的YAML的语法和结构,允许它只对敏感值而不是整个文件进行加密。 这使得可以使用包含加密数据的文件来处理大多数任务的常规工具。 由于后端是可插拔的,所以团队可以实施GPG加密以轻松管理访问。

Saltstack使用支柱存储为某些机器指定的数据。 为了保护这些项目,用户可以使用GPG加密YAML值,然后配置GPG渲染器,以允许Salt在运行时对值进行解密。 像Hiera eyaml一样,该系统仅涉及加密敏感数据而不是完整文件,允许正常的文件编辑和差异工具正常运行。

可选的包括可执行文件保险库 ,加密系统和命令行工具,用于加密一个playbook结构中的敏感YAML文件。 然后,可以在运行时透明地解密秘密文件,以组合执行给定任务所需的秘密和非秘密数据。 可选保管库加密整个文件而不是值,因此编辑需要解密,差异工具无法显示准确的更改信息。 然而,从Ansible 2.3开始, 单个变量可以在变量文件中进行加密 ,从而使用户可以选择如何加密敏感值。

优点

这些解决方案非常适合管理配置管理环境中的秘密的一些挑战。 他们能够通过利用现有的基础架构库存系统和角色指定来协调对秘密的访问,从而定义每台机器所需的访问类型。 确保每个机器获得正确配置的相同机制可以确保秘密只能传递到需要它们的主机。

使用现有基础架构管理和部署系统的原生工具可最大限度地降低实施加密的运营成本。 使用本机对您的环境进行加密,将密码迁移到加密变得更加容易,无需额外的步骤就可以将秘密运行时解密更简单。 如果您已经在使用配置管理系统,则使用其附带的秘密管理机制可能是保护敏感数据的最简单的第一步。

缺点

紧密集成意味着用户可以使用其现有的系统来管理其秘密,但这意味着这些解决方案被锁定到各自的配置管理工具中。 在其他上下文中使用大多数这些策略将是困难或不可能的,这意味着您在配置管理工具本身中添加依赖关系。 与单一平台的紧密集成也可能会对需要访问数据的外部系统产生问题。 在某些情况下,没有外部API或可调用命令,除非通过配置管理系统进行访问,否则这些秘密可能被有效地“捕获”,这可能是限制性的。

在您的应用程序存储库中存储加密秘密的许多缺点也适用于在与配置管理系统一起存储密码时。 任何具有配置管理存储库的笔记本电脑或计算机也不会将您的应用程序存储库的笔记本电脑作为妥协的向量,而不会受到影响。 从根本上说,具有加密值和解密密钥的任何系统将容易受到这种类型的折中。

相关的问题是,虽然配置管理系统能够确保秘密只能由正确的机器访问,但定义细粒度访问控制来限制团队成员往往更加困难。 某些系统只能使用单一密码或密钥进行加密,从而限制了分队团队成员访问秘密的能力。

使用外部秘密管理服务

将加密秘密与代码或配置管理系统一起存储的替代方法是使用专用服务来管理基础架构的敏感数据。 这些服务加密和存储敏感数据,并用解密的值对授权的请求进行响应。 这允许开发人员将其敏感材料从存储库中移出,并将其设计成为人类用户和应用程序设计用于协调加密,授权和身份验证的系统。

实现

专门的秘密管理服务,如HashiCorp的Vault提供了极大的灵活性和强大的功能来保护敏感材料,而不会牺牲可用性。 保险箱保护休息和传输中的数据,并设计为使用各种“后端”来显示不同的功能并管理加密,存储和身份验证的复杂性。 几个关键功能包括配置动态秘密(即时连接服务的短期凭证,即时创建的连接服务的短信凭证),数据加密作为服务(加密和存储来自外部服务的数据,并在被请求时再次提供解密的内容)授权方)和基于租赁的秘密管理(在给定的时间内提供访问,之后访问被自动撤销)。 Vault的可插拔架构意味着随着业务需求的变化,存储后端,认证机制等都可以交换。

Square的Keywhiz秘密管理系统是用于为敏感数据提供一般安全性的另一种专用服务。 像Vault一样,Keywhiz公开了客户端和用户可以用来存储和访问秘密的API。 Keywhiz提供的一个独特功能是使用FUSE文件系统(客户端可以挂载的虚拟文件系统)来访问敏感数据作为伪文件的能力。 此机制允许许多不同类型的程序访问他们需要的数据,而无需代理或包装器的帮助,并允许管理员使用正常的Unix文件系统权限来锁定访问。

Pinterest的诺克斯是管理秘密的另一项服务。 它提供了许多与Vault和Keywhiz相同的功能。 在其他系统中没有找到的一个功能是通过提供关键版本的显式状态,随着时间的推移来转动键的功能。 一个关键版本可以标记为主要的,以表明它是当前的首选秘密,活动以指示它仍然是可以使用的版本,或者是无效的禁用该版本。 该系统允许管理员随着时间的推移在一组机器上滚动密钥,而不会中断服务。

优点

专用的秘密管理服务比其他系统有很多优势。 将敏感数据保护和管理的复杂性卸载到独立系统中,无需解决应用程序和配置管理存储库中的这些问题。 这种职责分离通过集中管理秘密存储并通过严格控制的接口来管理访问来简化操作安全模型。 通过提供用于与系统进行交互的通用接口,授权用户或客户端可以访问其秘密,而不管配置管理系统或VCS使用什么。

从管理的角度来看,秘密管理系统提供了许多其他工具不可用的独特功能。 加密密钥的轻松转换以及其保护的基本秘密对于需要协调许多不同敏感值的大型部署和复杂系统来说非常有用。 无需部署代码或进行任何车队范围的更改即可轻松管理和撤销访问。 诸如动​​态秘密等功能使秘密管理服务器能够访问外部服务(如数据库),以按需创建每个用户的凭据。 短期基于租赁的秘密访问功能作为限制或到期访问而不需要明确撤销的自动机制。

中央秘密管理提供的最重要的改进之一是可审计性。 上述每个系统都保留了何时添加,请求,访问或修改秘密的记录。 这可能有助于发现异常并发现可疑行为,并且还可以帮助评估在遇到妥协的情况下进入任何访问的程度。 对组织的敏感数据进行全面的了解,设置用于控制访问的策略以及有关每次成功和尝试的更改或检索的信息使团队能够对基础设施安全性做出明智的决策。

缺点

中央秘密管理系统的主要缺点是在基础设施和管理方面需要额外的开销。

在部署到生产环境之前,建立集中式系统需要进行大量的规划,测试和协调。 一旦基础架构启动并运行,必须更新客户机以查询密钥管理服务器的API,或者代理进程必须配置为代表需要进程的秘密。 必须建立政策来规定哪些应用程序,基础结构和团队成员应该访问每个受保护的值。

由于其保护的数据的价值,秘密管理服务器成为最重要的安全环境之一。 虽然集中化使您需要保护的表面积最小化,但它使系统本身成为恶意行为者的高价值目标。 虽然许多解决方案包括诸如锁定模式,基于键盘的重新启动和审核日志等功能,但未经授权的访问活动的解密密钥库将需要大量修复。

除了配置和安全元素的初始成本之外,从单一服务提供所有敏感数据,还会为您的基础设施带来额外的任务关键组件。 由于通常需要秘密来引导新的应用程序和日常操作,秘密管理停机可能会导致重大的中断,直到恢复服务才能解决。 可用性对于负责协调这么多不同组件的系统至关重要。

包起来

当您评估不同的保护敏感数据的方法并在部署过程中协调必要的访问时,考虑项目的安全性,可用性和需求之间的平衡很重要。 上述解决方案涵盖广泛的用例,并提供不同程度的可扩展性和保护。

您的项目或组织的最佳选择可能取决于您需要保护的敏感数据量,团队规模以及可用于管理不同解决方案的资源。 在大多数情况下,根据您的情况发生变化,开始小型化并重新评估您的秘密管理需求是有意义的。 虽然您可能只需要保护几个秘密,并与现在的一个小团队进行合作,但是今后专门解决方案的权衡可能会变得更加引人注目。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏