使用版本控制系统安全管理机密入门

简介

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

虽然将代码保存在源代码管理中很重要,但将某些项目资产保留在存储库之外也同样重要。出于性能和可用性的原因,最好将某些数据(如二进制BLOB和配置文件)排除在源代码控制之外。但更重要的是,出于安全原因,永远不应将密码、机密和私钥等敏感数据签入无保护的存储库。

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

检查您的Git存储库中的敏感数据

在设置系统来管理您的敏感数据之前,最好检查一下您的项目文件中是否已经存在任何机密材料。

扫描您的项目

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

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

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

一些专门的工具可以帮助更广泛地揭露秘密。像gitrob这样的工具可以扫描GitHub组织中的每个存储库,以查找与预定义列表中的文件名匹配的文件名。git-secrets项目可以基于文件路径和内容中的模式,在本地扫描存储库以查找已定义的机密。truffleHog工具使用了一种不同的方法,它在存储库中搜索可能表示应用程序使用的生成机密的高熵字符串。为了将其中一些功能合并到单个工具中,git-all-secrets将上述工具粘合在一起或在统一界面中重新实现。

缓解方案

如果您发现了不应该提交的文件或数据,重要的是要做出适当的响应,以减轻泄漏数据的影响。正确的行动将取决于存储库被共享的范围有多广,暴露材料的性质,以及您是希望删除所有提到的泄露内容,还是只是使其无效。

如果将凭据提交到您的项目存储库,您的第一步应该是立即更改密码或密码以使先前的值无效。无论出于几个原因,存储库是否被广泛共享,或者共享的范围有多广,都应该完成这一步骤。在项目的整个生命周期中,协作需求可能会发生变化,从而导致比之前预期的更大的风险。即使您知道您永远不会故意共享您的项目,安全事件也可能会将数据泄露给非预期的各方,因此最好主动更改当前值。

虽然您应该在所有情况下轮换您的受损凭据,但您可能希望从您的安全历史记录中完全删除泄露的凭据或文件。 这对于无法更改的敏感数据尤其重要,例如无意提交的任何用户数据。 从存储库中删除数据涉及重写提交历史以从以前的提交中删除文件。 这可以通过使用原生的git命令或一些专用工具的帮助来完成。 重要的是要注意,即使您删除了存储库中的所有数据记录,以前复制过代码库的任何人仍然可以访问敏感材料。 在评估影响程度时请记住这一点。

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

使用VCS功能避免提交机密

在研究外部工具之前,最好先熟悉VCS工具的一些特性和功能,以帮助防止将不需要的数据提交到存储库。

忽略敏感文件

将包含敏感数据的文件排除在存储库之外的最基本方法是从一开始就利用VCS的忽略功能。VC)定义了应该从存储库中排除的模式、目录或文件。这些是防止意外暴露数据的良好第一道防线。此策略非常有用,因为它不依赖外部工具,排除的项目列表是为协作者自动配置的,并且很容易设置。

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

提交前使用VCS钩子检查文件

大多数现代的VCS实现都包括一个称为)工具能够安装`Pre-Commit‘挂钩,实现对它评估的内容类型的自动检查。您可以添加自己的自定义scripts]来检查您想要防范的任何模式。

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

将文件添加到暂存区解释

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

在存储库中存储加密的秘密

虽然在许多情况下,建议从代码存储库中完全删除敏感数据,但有时在存储库中包含一些敏感数据以供其他特权用户访问是必要或有用的。要做到这一点,各种工具允许您对存储库中的敏感文件进行加密,同时让所有人都可以访问大多数文件。

实现

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

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

git-crypt工具的工作原理类似于git-秘,因为它允许您加密和提交部分存储库,并使用其他贡献者的gpg密钥来控制对他们的访问。如果您团队不使用GPG,或者如果管理模式对于您的用例来说太复杂,则git-crypt项目也可以使用对称密钥加密。此外,git-crypt会在提交时使用git过滤器和diff属性在克隆时自动加密和解密,简化了管理。

黑盒project](https://github.com/StackExchange/blackbox)是另一个依靠gpg对内容进行协作加密的解决方案。与以前的工具不同,BlackBox可以与许多不同的版本控制系统一起工作,因此它可以跨不同的项目使用。它最初被设计为木偶生态系统的一个工具,后来进行了重构,以支持更开放的基于插件的系统。Blackbox可以随意对单个文件进行加密和解密,但也提供了一种透明调用文本编辑器的机制,该机制对文件进行解密,打开一个编辑器,然后在保存时重新加密。

除了上面的一般解决方案之外,还有一些为使用特定类型的存储库而构建的解决方案。例如,从5.1版开始,Ruby on rails项目可以在repository](http://edgeguides.rubyonrails.org/5_1_release_notes.html# encrypted-secrets)中包含[使用在存储库外设置主密钥的系统进行加密的秘密。

优势

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

此外,对代码保密可以极大地简化部署。不是从多个位置下载信息来获得一个功能齐全的系统,而是将所有信息打包在一个单元中,其中一些组件需要解密。如果您没有设置支持外部秘密存储的基础结构,或者如果您希望最大限度地减少部署项目所需的协作量,这将非常有用。

使用工具对存储库中的敏感信息进行加密的总体优势在于,无需额外的基础设施或规划即可轻松实施加密。用户可以在几分钟内从以纯文本数据形式存储机密过渡到安全的加密系统。对于只有一个开发人员或一个小型静态团队的项目,这些工具可能会满足所有秘密管理需求,而不会增加太大的复杂性。

不足之处

与任何解决方案一样,这种秘密管理风格也存在一些权衡。

从根本上说,机密是配置数据,而不是代码。虽然在不同环境中部署的代码可能是相同的,但配置可能会有很大差异。通过对存储库中的代码保密,跨不同环境维护配置变得更加困难,并鼓励以对安全性产生负面影响的方式重复使用凭据。

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

经常被忽视的重要一点是,用于解密数据的密钥通常与加密的内容一起存储。在开发人员的笔记本电脑上,可以解密敏感数据的GPG密钥通常存在,并且无需任何进一步输入即可使用。您可以通过使用GPG密码短语在一定程度上缓解这一问题,但对于大型团队来说,这很难强制执行。如果团队成员的笔记本电脑遭到破坏,则可以访问项目中最敏感的数据,就像访问纯文本数据一样。

一般来说,在很长一段时间内保护存储库中的机密可能很困难。像回滚代码更改这样的简单操作可能会意外地重新引入以前删除的访问。如果私钥被暴露,则可以从储存库历史中恢复和解密历史值。尽管VCS历史记录提供了加密更改的日志,但没有审核秘密访问的方法来帮助确定异常访问。

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

许多用户第一次体验更集中的秘密管理是使用配置管理工具。 由于这些工具负责从集中位置协调许多不同机器的配置,因此需要某种级别的秘密管理来确保节点只能访问它们所需的值。

实现

Chef Encrypted Data bagschef-vault为Chef管理的基础设施提供了一些集成的秘密管理功能。加密的数据包用于保护敏感值不会出现在修订历史记录中,也不会出现在使用共享机密的其他计算机上。Chef-vault允许使用目标机器的公钥加密机密,提供进一步的安全性,将解密能力隔离给预期的接收者。

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

SaltStack使用Pillars存储为某些机器指定的数据。为了保护这些项目,用户可以使用GPG加密YAML值,然后配置GPG renderer]以允许Salt在运行时解密这些值。像Hiera eyaml一样,该系统只对敏感数据进行加密,而不是对整个文件进行加密,从而允许正常的文件编辑和比较工具正确运行。

Ansible包括Ansible Vault,],这是一个加密系统和命令行工具,用于在剧本结构中加密敏感的yaml文件。然后,Ansible可以在运行时透明地解密秘密文件,以组合执行给定任务所需的秘密和非秘密数据。任何可用电子仓库加密的是整个文件,而不是值,因此编辑需要解密,比较工具无法显示准确的更改信息。然而,从Ansipe2.3开始,单变量可以在Variable files,中加密,让用户可以选择如何加密敏感的值。

优势

这些解决方案非常适合在配置管理上下文中管理机密所涉及的一些挑战。 他们能够通过利用现有的基础设施库存系统和角色指定(定义每台机器所需的访问类型)来协调对机密的访问。 确保每台机器都获得正确配置的相同机制可以确保机密只传递给需要它们的主机。

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

不足之处

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

在应用程序存储库中存储加密机密的许多缺点也适用于使用配置管理系统存储机密。与将应用程序存储库作为危害媒介的笔记本电脑不同,任何具有配置管理存储库的笔记本电脑或计算机都同样容易受到攻击。从根本上说,任何同时具有加密值和解密密钥的系统都容易受到这种类型的危害。

一个相关的问题是,尽管配置管理系统能够确保只有正确的计算机才能访问机密,但定义细粒度的访问控制以限制团队成员通常更加困难。一些系统只能使用单个密码或密钥进行加密,从而限制了对团队成员访问机密进行分区的能力。

使用外部密钥管理服务

除了在代码旁边或在配置管理系统中存储加密的机密之外,还有一种替代方法是使用专用服务来管理基础设施的敏感数据。这些服务加密和存储敏感数据,并使用解密的值响应授权请求。这允许开发人员将他们的敏感材料从他们的存储库中移到一个旨在为人类用户和应用程序协调加密、授权和身份验证的系统中。

实现

HashiCorp的保险库)这样的专用秘密管理服务提供了极大的灵活性和强大的功能,以保护敏感材料,同时不牺牲可用性。Vault保护静态和传输中的数据,旨在使用各种)、作为服务的数据加密(加密和存储来自外部服务的数据,并在授权方请求时再次提供解密内容)以及基于租赁的秘密管理(提供给定时间量的访问,之后访问将自动撤销)。Vault的可插拔架构意味着存储后端、身份验证机制等都可以随着业务需求的变化而进行交换。

Square的Keywhiz秘密管理系统是用于为敏感数据提供一般安全的另一项专用服务。与Vault一样,Keywhiz也公开了客户端和用户可以用来存储和访问机密的API。Keywhiz提供的一个独特功能是使用FUSE文件系统暴露机密的能力,FUSE文件系统是一种虚拟文件系统,客户端可以装载该文件系统以伪文件的形式访问敏感数据。这种机制允许许多不同类型的程序在不需要代理或包装程序的帮助下访问所需的数据,并允许管理员使用正常的Unix文件系统权限锁定访问。

Pinterest的诺克斯是另一项管理机密的服务。它提供了许多与Vault和Keywhiz相同的功能。其他系统没有的一个功能是,通过为密钥版本提供显式状态,能够随时间轮换密钥。可以将密钥版本标记为主要,以指示它是当前的首选机密,标记为活动,以指示它是仍可使用的版本,或标记为非活动,以禁用该版本。该系统允许管理员在不中断服务的情况下,随着时间的推移在一组机器上滚动密钥。

优势

与其他系统相比,专门的秘密管理服务具有许多令人信服的优势。将保护和管理敏感数据的复杂性转移到独立系统,消除了在应用程序和配置管理存储库中解决这些问题的需要。这种职责分离通过集中秘密存储和通过严格受控的界面管理访问,简化了运营安全模型。通过提供与系统交互的通用接口,授权用户或客户端可以访问他们的机密,而无需考虑所使用的配置管理系统或VCS。

从管理的角度来看,秘密管理系统提供了许多其他工具所没有的独特功能。轻松轮换加密密钥及其保护的基本机密对于需要协调许多不同敏感值的大型部署和复杂系统非常有用。无需部署代码或在整个机队范围内进行任何更改,即可轻松管理和撤销访问权限。动态秘密等功能使秘密管理服务器可以访问数据库等外部服务,以按需创建每次使用的凭据。基于短期租赁的机密访问用作一种自动机制,用于限制访问或使访问过期,而无需显式撤销。

集中式秘密管理提供的最重要改进之一是可审核性。上述每个系统都维护关于何时添加、请求、访问或修改机密的大量记录。这有助于发现异常和检测可疑行为,还有助于评估在发生危害时任何访问权限的程度。全面了解您组织的敏感数据、为控制访问而设置的策略以及有关每个成功和尝试的更改或检索的信息,将使团队处于有利地位,能够做出有关基础设施安全的明智决策。

不足之处

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

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

由于其保护的数据的价值,秘密管理服务器成为需要管理的最重要的安全环境之一。虽然集中化可以最大限度地减少您需要保护的外围应用,但它会使系统本身成为恶意攻击者的高价值目标。虽然许多解决方案包括锁定模式、基于密钥的重新启动和审计日志等功能,但未经授权访问活动的、解密的秘密存储将需要广泛的补救措施。

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

总结

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

对于您的项目或组织来说,最佳选择可能取决于您必须保护的敏感数据量、团队的规模以及可用于管理不同解决方案的资源。在大多数情况下,从小处着手,随着环境的变化重新评估您的秘密管理需求是有意义的。虽然您现在可能只需要保护几个秘密并与一个小团队协作,但在未来,专用解决方案的权衡可能会变得更加引人注目。

Published At
Categories with 技术
comments powered by Disqus