PostgreSQL - 外部数据包装器用户映射密码

4

我正在使用PostgreSQL数据库和postgres_fdw扩展来查询外部数据。

CREATE EXTENSION postgres_fdw;

CREATE SERVER foreign_fake_database
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host '....', port '5432', dbname 'fake_database');

当我创建用户映射以查询外部数据库时,必须清楚地写出用户名和密码:

CREATE USER MAPPING FOR fake_user SERVER foreign_fake_database
    OPTIONS ("user" 'fake_user', password 'fake_password');

这种方法在安全方面看起来很脆弱,因此我正在寻求用户反馈。 如何保持良好的安全水平而不将密码以明文形式存储?我可以加密这个密码吗?对于多个用户,使用相同的用户进行连接是否可以?这会不会过载系统或创建冲突?

2
如果您将密码存储在创建用户映射的服务器上的 .pgpass 文件中,则可以在用户映射中省略密码。 - user330315
“明显的安全原因”并不那么明显。你是否担心有人会捕获硬盘或备份?在肩膀冲浪时,您的“创建用户映射”命令是否会被发现并记录在某个日志文件中?运行\deu吗? - jjanes
永远不要在任何地方以明文形式存储或编写密码,这对我来说是如此基本的安全规则,以至于它是“显而易见的”。 - GeoGyro
2个回答

2

从性能角度来看,无论将不同的用户映射到远程服务器上的同一个用户还是不同的用户,这纯粹是出于安全考虑。

无法隐藏或加密密码,但您可以使用密码文件在服务器上存储密码,或者使用根本不需要密码的身份验证方法,例如证书身份验证(然后您可以在用户映射中使用sslkeysslcert)。

请注意,您必须将用户映射中的password_required设置为false,以允许非超级用户在用户映射中没有显式密码的情况下连接。此选项在PostgreSQL v13中引入。


1
当我尝试按照文档所述使用ALTER USER MAPPING FOR fake_user SERVER foreign_fake_database OPTIONS (ADD password_required 'false');password_required设置为false时,出现错误invalid option "password_required" Valid options in this context are: user, password。在此上下文中,有效选项为"user"和"password",而USER MAPPING没有任何选项。 - GeoGyro
1
这个选项是在PostgreSQL v13中引入的。在此之前,只有超级用户才能使用无密码的用户映射。 - Laurenz Albe
好的,谢谢。我需要更加仔细地阅读文档。 - GeoGyro

0
如何保持良好的安全水平并避免密码以明文形式存储?我可以加密这个密码吗?对于多个用户,使用相同的用户连接是否可以?这不会过载系统或创建冲突吗?
“良好的安全水平”当然取决于您的约束条件,但是就价值而言,外部用户映射中的密码已经默认隐藏,您无需采取任何措施。只有超级用户才能看到它(用户甚至不能看到自己用户映射的密码)。
在磁盘上,我认为它没有加密。如果您可以读取服务器,则始终可以复制数据,启动指向此数据的群集,作为超级用户连接并阅读它。
除了保护服务器之外,如果您想加密存储本身,则可能需要查看官方文档,尽管我不确定他们的建议是否适用于系统表。
还有pgsodium,但同样,我不确定您是否可以使用它来加密系统列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接