在Linux上运行程序化Postgres数据库迁移的最佳实践

时间:2017-01-01 21:02:01

标签: linux postgresql

在许多种类的Linux PostgreSQL上运行在一个单独的用户帐户下,所以你必须这样做:

sudo su - postgres

完成任何工作。如果您只想手动输入SQL,这一切都很好,但是如果您使用编程语言(在我的例子中是Node / Knex)编写了一个迁移怎么办?

通常的做法是以某种方式使代码知道用户情况(即在我的代码中写入等同于sudo su - postgres的东西)?

或者,是否以DB用户身份运行我的所有代码(即使这意味着我的数据库用户对我的非DB用户的主文件夹具有权限)?

或者,是否让我的普通用户拥有Postgres访问权限(在这种情况下,为什么Linux甚至会打扰将Postgres设置为单独的用户)?

或者,我还缺少其他方法吗?

P.S。我意识到这有点是一个系统管理问题,但我在这里发布而不是超级用户,因为它特别关于运行程序员编写的代码(恰好改变了数据库)。

1 个答案:

答案 0 :(得分:1)

您正在混淆三个单独的用户帐户。

首先是运行postgresql守护程序的操作系统帐户。正如您在大多数Linux发行版中所说的那样,这将是一个仅用于此目的的单独用户,通常名为postgres。这是为了防止系统上的其他用户访问postgresql数据文件和其他资源,并限制攻击数据库的人可能造成的损害。

然后是客户端程序(例如psql或您的迁移工具)可能在其下运行的用户帐户。

最后是postgresql用户帐户。 Postgresql拥有自己的用户帐户系统,用于管理其管理的数据库中用户的权限,与OS用户帐户系统无关。

操作系统帐户和postgresql数据库帐户之间的重叠是psql命令行工具将使用与运行该工具的操作系统用户相同的用户名连接到数据库,如果不这样做在命令行上指定用户。例如,如果我连接到这个:

psql mydatabase

然后它将尝试连接我的Linux用户帐户用户harmic,但是如果我使用它:

psql -U postgres mydatabase

然后它将与用户postgres连接,这是默认的管理员帐户。

另一个相关方面是认证方法。最有可能的是,如果您在计算机上尝试上述命令,则会出现错误。这是由于允许的身份验证方法,这些方法在文件pg_hba.conf中配置。此文件配置特定用户在连接到特定主机的特定数据库时可以使用的允许的身份验证方法。 postgres用户通常只允许使用ident作为身份验证方法在同一主机内进行连接,这意味着根据运行该命令的操作系统用户识别用户。

这解释了您使用sudo su - postgres切换到postgres用户的原因:您当前配置中最有可能是访问此帐户的唯一方式。

好的,这可能听起来很复杂。为简化起见,以下是我对该领域最佳实践的建议:

  1. 不要弄乱用于运行数据库后端的操作系统帐户。它不是必需的,会削弱安全性。

  2. 创建一个单独的数据库帐户,用于管理应用程序的数据库。使用此帐户而不是postgres帐户进行迁移脚本等。原因是postgres帐户对服务器上的所有数据库都具有完全权限,而您可以仅向管理员用户授予其所需的权限,并且仅向应用程序控制的数据库授予权限(而不是任何其他可能的数据库)在那里)。请参阅:CREATE USER SQL命令。

  3. 更新pg_hba.conf文件以指定将用于对此用户进行身份验证的身份验证模式。请参阅手册中的Client Authentication。具有适当强密码的md5可能是一个不错的选择。

  4. 更新您的迁移工具以使用此新用户。用户(和密码,如果使用密码)将通过连接字符串或连接到数据库时提供的连接参数提供。同样,当与psql连接时,请使用-U选项指定用户名。

    请注意,无需使用sudo su -,甚至不需要拥有与管理员用户同名的操作系统帐户。