出于某些原因,不应将加密密钥和凭据之类的机密检查到源代码管理中。首先显然是加密密钥和凭据应始终基于需要了解,并且源代码管理不是防止信息泄露的可靠方法。您不希望在源代码管理中获得此类机密的另一个原因通常是因为机密通常(但并非总是)特定于您的应用程序将在其中运行的环境的特定属性。(例如,获取私钥以创建数字Web服务授权所需的签名),该Web服务的特定端点可能正在需要QA签名的QA环境中运行。
处理环境(或全球机密)的正确方法是像对待其他任何环境配置属性一样对待它,并带有附加的安全控制措施。一个设计良好,独立且可版本控制的代码模块在所有环境中都应该相同,从而可以部署它们的环境来通知应用程序其属性(例如,数据库连接详细信息,凭据,Web服务端点,文件路径等)。对应用程序至关重要的配置详细信息已被外部化,并成为环境的配置参数。
现在来解决您的一些争论:
总的来说,我们不只是解决问题吗?
没有完美的安全性,但是将问题“转移”到可以放置其他措施和控制措施的区域将提高难度,并减少意外或恶意泄露机密的可能性。在设计必须保护机密数据的系统时,要遵循的一个好的经验法则是,始终将控件置于一体。我的意思是,要确保发生机密信息或安全事件的意外或恶意泄露,那么必须有故障或两个或多个控制措施。
一个很好的例子是将加密文件存储在服务器上。我还有一个秘密解密密钥,必须将其保密在另一个文件中。
- 将密钥和加密文件存储在同一服务器上(0控制,任何有权访问该服务器的人都可以轻松获取机密信息)
- 执行上述步骤并保护文件对两个文件的访问,以使其只能由OS的应用程序运行时用户读取(1控件,损害root用户或应用程序运行时用户的密码将使攻击者获得机密信息)
- 将密钥存储在外部密钥库中,并通过多种安全措施来获取密钥,例如IP地址白名单,证书身份验证以及其他可以访问其文件系统上加密文件的应用程序的措施。(多个控件,安全控件的多个故障必须发生,才能破坏机密数据)
再次,没有完美的安全性,但是拥有多个控件的目标确保了发生多个错误才能进行公开。
在我看来,Azure KeyVault之类的产品并没有更好,更复杂的东西,
复杂的是,毫无意义是完全主观的。在没有现实地考虑到暴露机密数据的严重性的情况下,我们无法就附加安全性的无意义进行讨论。如果人们可以使用机密数据将非法电汇转出您的金融机构,那么像金库这样的东西就是毫无意义的。
而不是将机密信息保存在单独的配置文件中,并确保其位于您的.gitignore或等效文件中。
直到有人不小心将其检查到源代码管理中,现在机密永远被嵌入到源代码管理历史记录中。
当然,人们可能会不安全地将其通过电子邮件相互发送给对方...
安全不仅是技术问题,还是人的问题。那将是无关紧要的,但是我觉得此时您正试图说服自己摆脱需要做的事情。
有没有一种方法可以管理秘密,而不仅仅是解决问题?我相信这个问题有一个明确定义的答案。以此类推,如果我要问HTTPS不仅能解决问题,答案是CA密钥随您的OS一起分发,而我们信任它们是因为我们信任OS的分发方法。
安全性并不能总是使问题消失,而是在很多时候将控制权置于问题周围。您的类推是简洁的,因为实际上这正是公私钥加密的作用。我们通过向我们的CA赋予未减轻的,完全的信任来保证CA拥有公共证书的实体的身份,从而将问题“移交给CA”。基本上,只要发生灾难性的一系列失败(例如,失去对CA的信任)就不会导致安全问题。
与很多事情一样,安全性是您必须基于主观标准,数据的性质,披露的后果,风险偏好,预算等来划分的界线。