Postgres数据库安全性:在环境变量中存储什么?

时间:2019-04-09 17:13:31

标签: python database postgresql database-design database-connection

有一个与SQLAlchemy连接的Postgres数据库。

我目前拥有数据库的连接参数(数据库名称,主机,端口,用户名,密码),所有这些参数都硬编码在Python文件中。我要更改它。

我读到here,应该将这些参数存储在环境变量中。在这五个连接参数中,我应该在环境变量中存储什么?

很明显,我将存储密码,但是我还应该存储用户名和主机吗?这里的惯例是什么?

3 个答案:

答案 0 :(得分:2)

为什么要硬编码任何东西?只需将所有这些参数移至环境变量即可。

答案 1 :(得分:2)

将设置放入环境变量中不仅涉及安全性。这也与灵活性有关。 Anything that's likely to change between environments是放置环境变量的不错选择。

考虑您的数据库。在不同的环境中,主机名,用户名和数据库名是否可能不同?我怀疑是这样。许多项目可能在开发中的localhost上或db中的docker-compose.yml的Docker镜像上使用数据库,并在生产中使用专用的数据库服务器或托管数据库。

一个常见的模式是在单个环境变量DATABASE_URL中对整个数据库连接字符串进行编码。格式¹类似于

<engine>://<user>:<password>@<host>:<port>/<database>

例如,您可以使用类似

postgres://db_user:password@localhost/app_db

许多数据库库,including SQLAlchemy可以使用此单个字符串直接连接到数据库。


¹这是regular URL syntax的专长。

答案 2 :(得分:1)

从安全的角度来看,执行此操作的方法之一如下。 假设我们将密码归类为敏感数据,并且只想加密密码。其余信息可以在环境变量中,也可以在配置文件中。

1)具有基于随机值的盐,该盐特定于加密程序调用时生成的服务器。此值保存到文件中。我们称它为salt.bin

2)更改salt.bin文件的权限,使其只有运行该程序的操作系统用户才能读取。

3)让安全个人/受委托个人输入加密程序的密码,并将加密后的值保存到文件中。让我们称之为db_config.bin。

4)更改db_config.bin文件的许可权,以便只有运行该程序的操作系统用户才能读取它。

现在在程序执行期间,让程序读取salt.bin文件和db_config.bin文件。通过使用salt.bin解密db_config.bin。程序使用此密码以及主机,端口和其他详细信息的配置文件值连接到数据库。

以上所有内容都可以使用python完成。See here