存储和管理秘密(如API密钥和其他凭证)可能具有挑战性,即使是最谨慎的政策有时也会被规避以换取方便。我们汇编了一些最佳实践的清单,以帮助保护秘密和凭证的安全。秘密管理并没有一个放之四海而皆准的方法,所以这个列表考虑了多个角度,这样你就可以在决定实施或不实施策略时获得信息。
目录
永远不要将未加密的秘密存储在.git仓库中。
- > 避免在git上使用git add *命令
- > 在.gitignore中添加敏感文件
- > 不要依靠代码审查来发现秘密。
- > 在存储库上使用自动秘密扫描。
不要在消息系统中分享你未加密的秘密,如懈怠
安全存储秘密
> 使用加密技术在.git仓库中存储秘密。
> 使用环境变量
> 使用 "秘密服务 "解决方案
限制API访问和权限
> 默认为API的最小权限范围
> 在适当的情况下,将IP地址列入白名单
> 使用短暂的秘密
永远不要将未加密的秘密存储在.git仓库中。
人们通常错误地认为私人储存库是安全的金库,是储存秘密的安全场所。私人储存库不是储存秘密的适当场所。
私有存储库是坏人的高价值目标,因为在其中存储秘密是常见的做法。
此外,.git被设计成可扩展的。仓库会被克隆到新的机器上,分叉到新的项目中,新的开发者会定期进入和退出一个项目,并获得完整的历史记录。任何存在于私有仓库历史中的秘密都会存在于该源诞生的所有新仓库中。
如果一个秘密进入一个版本库,不管是私有的还是公共的,那么它应该被认为是被泄露的。
私人回购中的秘密就像写在20美元钞票上的密码一样,你可能会信任你给它的人,但这张钞票最终可能会落入数百人手中,作为多次交易的一部分,并在多个收银台内。
避免在git上使用git add *命令
使用通配符命令,如git add *或git add .可以很容易地捕获不应该进入git仓库的文件,这包括生成文件、配置文件和临时源代码。
在提交时按名称添加每个文件,并使用git status来列出已跟踪和未跟踪的文件。
根据 git-scm 的说法
"请记住,工作目录中的每个文件都可能处于两种状态之一: 跟踪或未跟踪。
追踪的文件是上一次快照中的文件;它们可以是未修改的,也可以是已修改的,还可以是暂存的。简而言之,跟踪的文件是 Git 知道的文件。
未跟踪的文件是其他所有的文件。"
优点
对提交的文件进行完全控制和可视性
降低不需要的文件进入源控制的风险。
在添加文件时需要深思熟虑
缺点
承诺时需要额外的时间
提交时可能会错误地错过文件
提示:尽早提交和经常提交不仅有助于浏览文件历史记录和分解原本庞大的任务,此外还可以减少使用通配符命令的诱惑。
在.gitignore中添加敏感文件
为了防止敏感文件落入git仓库中,所有仓库都应该包含一个全面的.gitignore文件,并包含。
包含环境变量(如.env)或配置文件(如.zshrc或.config)的文件。
由另一进程生成的文件(如应用程序日志或检查点、单元测试/覆盖率报告)。
包含 "真实 "数据(除测试数据外)的文件,如数据库提取。
GitHub发布了一系列有用的.gitignore模板。请看这些Python或Go的例子。
不要依靠代码审查来发现秘密。
要知道,代码审查并不总是能发现秘密,尤其是当这些秘密隐藏在以前的代码版本中时,这是极其重要的。代码审查不能充分保护的原因是,审查人员只关注代码的当前状态和建议状态之间的差异,他们没有考虑项目的整个历史。
如果秘密被提交到开发分支中,后来又被删除,这些秘密对审查者来说就不可见,也不重要。git的本质意味着,如果一个秘密在历史上被忽略了,它将永远受到影响,因为任何有权限访问版本库的人都可以在代码库的以前版本中找到这个秘密。
提示:作为一项规则,应该在可以建立预定义规则的地方实现自动化,比如秘密检测。应该让人工审查来检查代码中是否有不容易预定义的错误,比如逻辑。
在存储库上使用自动秘密扫描。
即使遵循了所有的最佳做法,错误也是常见的。在处理高度敏感的数据时,不应冒险。GitGuardian为开发者提供了一个免费的秘密扫描解决方案,它应该安装在私有和公共仓库上。
可见性是伟大的秘密管理的关键,如果你不知道你有一个问题,你不能采取行动来解决它。秘密扫描为您的内部系统提供了必要的可见性。
重要的是还要考虑到,即使是最好的秘密管理系统和策略也不能防止新生成的秘密进入代码库或旧的秘密被提取和再次包含。
优点
与需要手动运行的工具相比,难以规避和忽略。
比依靠人工检查更快、更准确。
可以检测到埋藏在日志和历史记录中的秘密,而这些秘密是人工审查和搜索无法发现的。
实时扫描可确保捕获所有活动的数据泄漏。
不要在消息系统中分享你未加密的秘密,如懈怠
一个常见的秘密蔓延的助推器是通过消息服务以纯文本方式发送秘密。虽然这些系统的目的是为了保证消息的安全,但它们并不是为了保存敏感信息,如秘密。
这些系统是攻击者的高价值目标,只需要一个被入侵的电子邮件或Slack账户就可以发现大量的敏感信息。如果秘密是通过内部系统发送的,这也使得坏人有可能通过 "用秘密来寻找秘密 "在服务之间横向移动。
安全存储秘密
秘密管理没有万能的解决方案,必须考虑项目规模、团队地域和项目范围等不同因素。多种解决方案可能需要共存。仔细考虑每一种方案,不仅要满足你当前的需求,还要考虑每种解决方案如何随着项目的发展而扩展。
使用加密技术在.git仓库中存储秘密。
使用常见的工具(如 git secret)加密你的秘密,并将其存储在 git 仓库中,在团队工作时是有益的,因为它可以保持秘密的同步。然而,这确实引入了一个新的问题需要考虑,因为你现在需要处理额外的安全密钥来加密和解密秘密。这些密钥也需要被存储和安全共享,这可能会让它看起来像一个永无止境的问题。
优点
你的秘密是同步的
缺点
你必须安全地处理你的加密密钥。
没有审计日志(谁访问了哪个秘密,何时访问)。
没有基于角色的访问控制(RBAC)
难以旋转访问。旋转访问意味着撤销密钥并重新分发。当处理多个开发者时,git仓库的分发部分并不容易处理。
在可行的情况下,使用本地环境变量
环境变量是一个动态对象,其值在应用程序之外设置。这使得它们更容易旋转,而不必在应用程序本身内部进行更改。它还消除了在源代码中编写这些变量的需要,使它们更适合处理敏感数据。
优点
它们很容易在部署的版本之间改变,而不需要改变任何代码。
它们不太可能被检查到存储库中。
简洁明了
缺点
在团队工作时,这种方法可能在规模上不可行,因为没有办法轻松地让开发人员、应用程序和/或基础设施保持同步。
使用 "秘密服务 "解决方案
Hashicorp Vault或AWS密钥管理服务等秘密管理系统是一种加密系统,可以安全地存储您的秘密并严格控制访问。金库和其他管理式秘密解决方案并不适合所有情况,因为它们的设置很复杂,需要很好的维护。两者都需要大量的资源投入。
优势
它可以防止秘密的蔓延
它提供审计记录
缺点
由于它们引入了单点故障,因此必须托管在一个高度可用的安全基础设施上。
所有的代码库都必须进行修改才能与之整合。
必须小心保护进入系统的钥匙。
限制API访问和权限
当攻击者恶意使用API密钥等秘密时,可能很难检测到,因为通常情况下,他们是在其范围内使用这些秘密。通过限制API密钥的访问和权限,您不仅可以限制损害和限制横向移动,还可以提供更大的可视性,以了解API密钥何时在其范围外使用。
默认为API的最小权限范围
当使用外部服务时,确保该API的权限与它所执行的任务相匹配。这包括确保你有单独的API只读和读/写权限的需要。许多API还允许你对可以访问的数据进行更多的控制,例如Slack API有一个很大的范围,使用这些范围来满足任务的最低要求,这对防止攻击者访问敏感数据或在系统中横向移动非常重要。对于没有经验的开发人员来说,使用主API允许他们在你的所有项目中使用一个密钥是很常见的。但这增加了数据泄露的潜在危害。
在适当的情况下,将IP地址列入白名单
IP白名单提供了一个额外的安全层,以防止不良行为者试图恶意使用API。通过提供来自您的私有网络的IP地址白名单,您的外部服务将只接受来自这些可信来源的请求。通常包括一个可接受的IP地址范围或网络IP地址。
在GitHub的一个例子中,你可以使用IP白名单来防止任何不受信任的来源访问你的GitHub仓库。"IP地址的允许列表将阻止任何不在允许列表上的IP地址通过网络、API和Git的访问。"
优点
限制选择可信来源的请求,即使使用秘钥也能防止外部来源的攻击
缺点
并非总是可行的,这取决于源的预期流量。
可以阻止合法的信息请求
需要不断维护
使用短暂的秘密
常见的是,API通常会提供长期有效的访问令牌。这些令牌可以无限期地持续下去。虽然这对开发者来说很方便,但这意味着一个秘密在其整个生命中都会构成同样的安全风险,并增加了它们被用于攻击的机会。短暂的秘密可以防止未被检测到的历史数据泄漏仍然是一个威胁,并且意味着如果攻击者发现了一个秘密,如果没有发现漏洞,他的访问仍然会被切断。
确保经常撤销和重新分发所有的API也是一个很好的做法,尤其是在无法对API引入有效期的情况下。
想象一下,你拥有一家拥有数百名员工的公司,这些员工都有办公室的钥匙,钥匙不可避免地会丢失,员工会离开公司,新的钥匙会被剪掉,你很快就会失去对每把钥匙在哪里的可见性。不时地更换锁具将被广泛认为是一种良好的做法。
优点
执行良好的秘密卫生
减少长期威胁的风险
缺点
需要一个积极的秘密管理战略
结论
管理秘密和存储秘密是一项挑战,即使是最有经验的开发人员也需要保持警惕,他们需要仔细考虑如何使用、存储、共享和分发秘密。不幸的是,没有一个完美的清单可以供开发人员遵循,政策、工具和策略会因项目而异,但对开发人员来说,了解政策的后果是至关重要的,这样,在整个开发过程中,秘密管理可以成为一个明智的、积极的策略。
最后,别忘了点个在看。
作者:爱业星辰
图片:The Internet
欢迎大家点个在看,分享至朋友圈
看鸡汤不如看干货
爱吃干货的程序员
天才想法?,全在这里
来自【爱吃干货的程序员】的推荐阅读:
改变我生活的 50 个想法 使用工具 vs 了解工具的内部工作原理 这些是时下最火的免费开发者工具,请收好