在 App Engine 上的 Django 应用上存储客户端机密

Posted

技术标签:

【中文标题】在 App Engine 上的 Django 应用上存储客户端机密【英文标题】:Storing client secrets on Django app on App Engine 【发布时间】:2015-01-28 14:45:38 【问题描述】:

我有一个 Django 应用程序,它使用一些密钥(例如用于 OAuth2 / JWT 身份验证)。我想知道存放这些密钥的正确位置在哪里。

以下是我目前找到的方法:

    硬编码:不是一个选项,我不希望我的秘密在源代码管理中。 硬编码 + 混淆:与 #1 相同 - 攻击者只需运行我的代码即可获取机密。 存储在环境变量中:我的app.yaml 也是源代码控制的。 存储在数据库中:不确定。 DB 在可用性和安全性方面不够可靠。 存储在非源代码控制的文件中:到目前为止我最喜欢的方法。问题是我需要对文件进行一些备份,而手动备份听起来不对。

我错过了什么吗?是否有存储 Django 应用或 App Engine 应用的密钥的最佳做法?

【问题讨论】:

您说数据存储不够可靠是什么意思?它有 99.999% 的可用性。 @DanielRoseman 我没有使用数据存储。我正在使用 Cloud Sql。 不确定 App Engine 是如何工作的,但是存储密码等可以很容易地存储在不受源代码控制的环境变量中。至少它在任何普通的 Linux 环境中都是这样工作的。 GAE: best practices for storing secret keys?的可能重复 【参考方案1】:

我见过的一个解决方案是使用 gpg 在您的存储库中存储秘密配置的加密副本。根据您团队的结构,您可以对其进行对称加密并共享密码以对其进行解密或使用核心成员/维护者的公钥对其进行加密。

这样,您的秘密就会以与您的代码相同的方式备份,而不会使其可见。

【讨论】:

【参考方案2】:

您几乎无法对可以访问您服务器的攻击者隐藏密钥,因为服务器需要知道密钥。但是你可以让低权限的攻击者很难。

混淆通常不被认为是一种好的做法。

您的选项 5 似乎是合理的。将密钥存储在非源代码控制文件中允许将密钥保存在一个明确定义的位置。您可以对该文件设置适当的权限,以便攻击者需要高权限才能打开它。还要确保编辑项目的其余部分需要高权限,否则攻击者可以修改项目的随机文件以访问密钥。

我自己在我的项目中使用您的选项 5。

【讨论】:

托尼,你如何备份文件? @Tzach 就我而言,我不需要备份机密文件:如果服务器崩溃,我只需生成新密钥。如果您需要备份密钥,我想您需要手动将它们保存在安全的地方。

以上是关于在 App Engine 上的 Django 应用上存储客户端机密的主要内容,如果未能解决你的问题,请参考以下文章

Django - App Engine 上的独角兽。错误:“没有名为 my_project 的模块”

App Engine上的Django vs webapp2 [关闭]

如何在 Google App Engine Python 上的 Django nonrel 中使用查询游标?

python app-engine django 1.2上的TemplateDoesNotExist,同时模板呈现绝对路径

Google App Engine 上的 Django TemplateDoesNotExist

谷歌地图在 App Engine 开发服务器上的 Django 模板中不起作用