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

Postgres database security: what to store in environment variables?

我使用 SQLAlchemy 连接了一个 Postgres 数据库。

我目前将数据库的连接参数(数据库名称、主机、端口、用户名、密码)全部硬编码在 Python 文件中。我想改变它。

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

显然我会存储密码,但我是否应该另外存储用户名和主机?这里的约定是什么?

为什么要对任何内容进行硬编码?只需将所有这些参数移动到环境变量即可。

将设置放在环境变量中不仅仅是为了安全。它还与 灵活性 有关。 Anything that's likely to change between environments 是放置在环境变量中的一个很好的候选者。

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

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

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

例如,您可以使用

postgres://db_user:password@localhost/app_db

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


¹这是 regular URL syntax 的专业化。

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

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

2) 更改 salt.bin 文件的权限,使其只有操作系统用户可读,这将 运行 您的程序。

3) 安全 personal/entrusted 个人向加密程序输入密码并将加密值保存到文件中。让我们称之为 db_config.bin.

4) 更改 db_config.bin 文件的权限,使其只能由将 运行 您的程序的操作系统用户读取。

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

以上都可以用python.See here.

完成