用户 postgres 的 Psycopg2 对等身份验证

Posted

技术标签:

【中文标题】用户 postgres 的 Psycopg2 对等身份验证【英文标题】:Psycopg2 peer authentication for user postgres 【发布时间】:2017-03-25 01:05:19 【问题描述】:

我似乎已经正确安装了 PostgreSQL 9.5.5。和 Psycopg2 在 Ubuntu 16.04 上,并且可以通过以下方式登录:

sudo -u postgres psql

如果我随后发出\conninfo,我会得到以下信息:

You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".

当然,我应该能够通过 psycopg2 以与 here 相同的方式连接,但是脚本:

#!/usr/bin/python
import psycopg2
conn = psycopg2.connect("dbname=postgres user=postgres") 
conn.close()

给我:

psycopg2.OperationalError: FATAL:  Peer authentication failed for user "postgres"

我只希望 PostgreSQL 供个人使用,所以我不想启用 TCP 身份验证。

如何在 Psycopg2 中对用户“postgres”正确使用对等身份验证?

【问题讨论】:

您是否使用sudo -u postgres 来运行您的Python 脚本? 谢谢,以sudo -u postgres 运行可以解决所有问题。您可以将此作为答案发布,以便我接受吗? 【参考方案1】:

您需要提供主机

conn = psycopg2.connect("dbname='template1' user='dbuser' host='localhost' password='dbpass'")

【讨论】:

问题指定PEER身份验证。 这不是用户“postgres”的正确答案,但在 django 的 settings.py 中明确添加“localhost”(而不是空字符串)作为主机对我来说有所不同。 对我来说,添加host='localhost' 也有所不同,现在它正在工作。另一个答案是“使用sudo -u postgres 运行您的python 脚本”不是我的首选解决方案,因为我希望在python 脚本中进行此身份验证,甚至能够在jupyter notebook 或iPython 中以交互方式运行它。【参考方案2】:

对等身份验证通过将连接字符串中的 Postgres 用户名与运行脚本的 Linux 用户名进行比较来工作。

尝试使用sudo -u postgres 运行您的 Python 脚本。

【讨论】:

如果您的脚本也需要将一些文件(例如日志文件)写入到 $USER(已登录用户,而非 postgres 用户)拥有的目录中怎么办?因为使用sudo -u postgres 运行脚本时,您会遇到以下错误:PermissionError: [Errno 13] Permission denied: /home/$USER/.../my_log_file @s.k:如果您创建了一个名为$USER 的数据库用户,那么您可以在没有sudo 的情况下使用对等身份验证。您还可以将文件写入和数据库访问分开(例如,编写一个记录到stdout 的子脚本,使用sudo 调用脚本并重定向输出)。如果您确实需要以postgres 身份连接,但不能以postgres 身份运行脚本的其余部分,那么您将需要启用不同的身份验证方法(尽管这涉及的安全问题有点多)厘米)。【参考方案3】:

这就是你打电话的样子。

!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database="postgres", user="postgres", password="postgres", port=5432)

conn.close()

【讨论】:

这给了我FATAL: password authentication failed for user "postgres",我认为密码意味着 TCP 身份验证。如何设置本地主机? 现在我回到psycopg2.OperationalError: FATAL: Peer authentication failed for user "postgres" 您可以启用无密码登录并从连接中删除 pw 字段吗? sudo -u postgres psql postgres 查看这里更改 postgres pw - ***.com/questions/12720967/… 我已经读到在默认 postgres 用户上设置密码会更改身份验证,我想避免这种情况。谢谢【参考方案4】:

这些是postgresql的一些认证方法

peer 表示它将信任 UNIX 用户的身份(真实性)。所以不要求输入密码。

md5 表示它总是会要求输入密码,并在使用 MD5 散列后进行验证。

信任意味着它永远不会要求输入密码,并且始终信任任何连接。

你的情况你必须像这样改变:

托管所有 127.0.0.1/32 ident

托管所有 127.0.0.1/32 md5

托管所有所有 ::1/128 ident

全部托管 ::1/128 md5

【讨论】:

以上是关于用户 postgres 的 Psycopg2 对等身份验证的主要内容,如果未能解决你的问题,请参考以下文章

遇到致命问题:使用 ruby​​ on rails 对用户“postgres”进行对等身份验证失败

Python/postgres/psycopg2:获取刚刚插入的行的 ID

Psycopg2 在 postgres 数据库中插入 python 字典

Postgres:使用psycopg2或附近未终止的引用字符串

使用 psycopg2 调用 postgres 存储过程 - 无效的事务终止

带有“%%”参数的 Postgres 查询未通过 psycopg2 返回结果