在 Rails 应用程序中安全地提供数据库密码

Posted

技术标签:

【中文标题】在 Rails 应用程序中安全地提供数据库密码【英文标题】:Securely providing the database password in a Rails app 【发布时间】:2013-06-13 15:09:20 【问题描述】:

如您所知,您必须在 config/database.yml 文件中为数据库提供正确的数据库名称、用户名和密码,否则您的 Rails 应用程序将无法运行。

在默认设置中,您的密码在 config/database.yml 文件中以纯文本形式显示。如果您的应用位于免费的 GitHub 存储库中,那么您的密码就是公共信息。对于严肃的应用程序来说,这不是一个可行的选择。 (如果您不将此密码用于其他任何用途,则可以进行教程练习。)

到目前为止,我有一个对我有用的解决方案,但我想知道是否有更好的解决方案。您可以在 https://github.com/jhsu802701/bsf 看到我部署的示例。

我所做的是设置 config/database.yml 文件以编程方式为开发环境提供用户名和密码。对于开发环境,我将命令添加到 config/database.yml 脚本以获取开发环境用户名(这是我使用的 Debian Linux 设置的常规用户名)和空白密码。 (我给我的用户名 Postgres 超级用户权限。)对于生产环境,我在部署脚本中添加了一个命令,该命令从我帐户其他位置的文件中获取用户名和密码,并将此信息写入 config/database.yml 文件。

有没有更好的解决方案?

是否有涵盖此内容的 Ruby gem?如果没有,我正在考虑创建一个。

【问题讨论】:

【参考方案1】:

heroku 的做法,以及绝大多数其他 rails 商店都使用 ENV 变量

将两个变量导出到您的环境中,

export POSTGRES_USERNAME='username'
export POSTGRES_PASSWORD='password'

然后在你的 database.yml 文件中你可以做

username: <%= ENV['POSTGRES_USERNAME'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>

【讨论】:

【参考方案2】:

这就是我的工作方式:

在终端/cmd:

heroku config:set YOUR_DATABASE_PASSWORD=passywordy

然后,在 /config/database.yml 文件中;

production:
<<: *default
password: <%= ENV['YOUR_DATABASE_PASSWORD'] %>

(这个密码区是我使用rails new my_app -d postgresql时自动生成的)

【讨论】:

【参考方案3】:

在 Heroku 以外,通过输入 bash 将变量导出到系统环境 (linux) export KEY=value 然后你可以在 Rails 中通过ENV['KEY']调用它

例如 在 bash 中:export CMS_DATABASE_PASSWORD=MySecurePassword 在 secrets.yml:password: &lt;%= ENV['CMS_DATABASE_PASSWORD'] %&gt;

【讨论】:

【参考方案4】:

按照上面现有帖子中的描述设置环境变量,只会在当前 shell 会话期间保留环境变量。

要永久设置环境变量,应将export 指令添加到您的shell 配置文件中。 (然后运行 ​​source ~/.bashrc 将更改应用到当前会话)

TL;DR:如果您使用 BASH,请将 export 指令添加到 ~/.bashrc.

虽然以上内容就足够了(如果在最流行的 Linux 发行版上使用 BASH),但自信地确定要为您的 shell 更新哪个配置文件可能会非常棘手。以下帖子解释了原因并提供了有关编辑哪个配置文件的指导。

https://unix.stackexchange.com/questions/117467/how-to-permanently-set-environmental-variables

【讨论】:

以上是关于在 Rails 应用程序中安全地提供数据库密码的主要内容,如果未能解决你的问题,请参考以下文章

从终端安全地向 R 应用程序提供密码的方法?

如何安全地更新 Rails 应用程序中的所有 gem

如何在 Android 应用程序中安全地存储凭据(密码)?

如何在 Angular 7 Web 应用程序中安全地进行无密码(重要)Windows 身份验证

将 1 个密码安全地存储在数据库中

如何在 Strapi 中安全地设置数据库密码?