使用Github和Heroku时如何处理敏感数据?


49

我还不熟悉Git的工作方式(想知道Linus之外是否还有人;)。

如果使用Heroku托管应用程序,则需要在Git存储库中检查代码。如果您从事开源项目,则更有可能在Github或其他Git主机上共享此存储库。

有些事情不应该在公共仓库中检查;数据库密码,API密钥,证书等...但是这些东西仍需要作为Git存储库的一部分,因为您使用它将代码推送到Heroku。

如何使用该用例?

注意:我知道Heroku或PHPFog可以使用服务器变量来规避此问题。我的问题更多是关于如何“隐藏”部分代码。


3
我将从使用私人仓库开始。然后,根据我的信任程度,我可以.gitignore删除包含敏感数据的配置文件,并仅在本地对其进行版本控制。(本地是一个非外部中央位置,可能是内部服务器或知道的服务器)
钻机2012年

Answers:


30

在heroku上将密码/ api密钥保密的首选方法是通过heroku命令行应用程序设置配置值。以下示例摘自heroku开发中心文章

(下面的示例,我的整个答案都与Rails应用有关)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

然后使用ENV []变量在代码中引用这些配置值

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

这样,您的敏感密码就不会存储在git存储库中。(注意:在本地运行应用程序时,请在.bashrc文件中设置这些值

另外,我不确定您正在运行哪种类型的应用程序,但是在Rails中,heroku并不使用您的database.yml文件,它只是根据您的应用程序设置来设置数据库用户名/密码。因此您可以避免将这些凭据保存在git中

另外,如果您正在运行自己的应用程序并希望将其保持私有状态,则github的一个很好的替代选择是bitbucket,它提供了免费的私有存储库。


17

几个想法...公钥密码术是最灵活的答案。

混淆(仅用于代码)

对于要隐藏的部分代码,是否可以将它们放在其他项目中,进行编译,然后仅检入已编译的代码,而不检入源代码?这不是加密,适合加密密码或密钥。人们仍然可以对已编译的代码进行逆向工程,但他们无法获得源代码。

私人GIT储存库

它必须是公共 git存储库吗?

服务器存储

您可以将此信息存储在运行该应用程序的用户帐户的主目录中的受保护文件中吗?我将使用〜/ .ssh / id_rsa和chmod 600复制ssh的方式。否则,可以使用环境变量。您需要在服务器上的某个位置存储某种密钥,否则就无法保护任何东西。

对称密码术(只适合您)

如果您是唯一的开发人员,则可以在服务器上放置一个密钥,并在计算机上使用相同的密钥,并使用对称加密方案来保护某些数据,例如密码或证书。与朋友共享对称密钥会变得混乱。

非对称密码术(适用于多个开发人员)

如果其他开发人员需要将机密内容检入公共git存储库中,则针对此类内容进行了公钥/私钥(非对称)加密。在您的服务器上安装私钥(不要将其签入源代码管理!),并从中生成公钥。使用服务器的公钥加密您的秘密数据。只有服务器可以使用其私钥解密该数据。您甚至可以将公用密钥签入源代码管理,以便其他人可以使用相同的公用密钥加密数据,只有服务器可以解密它。

工具

Openssl可能是您唯一需要的加密工具。不要编写自己的加密算法或自己的已发布算法的实现。

总结思想

如果“服务器”是使用https的Web服务器,那么您应该已经在服务器上具有某种安全密钥库来存储私钥。这个。也许他们对其他人如何解决您面临的挑战有一些提示?


要添加WRT到服务器端存储-我不知道是否可以使用Heroku做到这一点,但是我已经看到了一些设置,这些脚本从接收后钩子和/或部署服务器上的Capistrano等触发脚本将部署数据库文件复制到正确的位置。这使您可以将数据库文件完全保留在存储库之外,并具有自动机制来确保此类信息仍然存在。
Shauna 2013年

甚至私人GIT仓库也应保护敏感数据。以防万一它偶然偶然上市。另外,我认为应该始终使用非对称加密,而不是对称。我没有任何不利之处,只有这样的不利之处:您甚至可以将API留在某处,以便更轻松地加密新的敏感硬编码数据。
Tiberiu-Ionuț Stan,

7

如果要在Heroku上运行代码,则必须将其提供给他们-您不能将其从托管服务提供商处“秘密”保存。

就公共git存储库而言,如果您的项目是开源的,但您不想共享托管详细信息,则出于部署目的,您需要维护项目的私有分支。


1
谢谢,但是这样做的工作流程是什么?
乔纳斯(Jonas)2012年

6

您不应该隐藏部分代码。您系统的安全性不应依赖于代码的保密性。这就是所谓的“模糊不清的安全性”,安全专家对此不以为然,因为它的效果非常差。

相反,密码,加密密钥等应与代码分开存放。将它们存储在代码读取的单独的配置文件或配置值中。您不需要将它们存储在git中。

重要:切勿在源代码中对加密密钥,密码或其他机密进行硬编码! 那是非常不好的做法。

也可以看看:

插件:IT安全性。SE是询问安全性的好地方!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.