获取 PostgreSQL 登录角色的加密密码

jox*_*oxl 5 postgresql ansible

有没有办法从 PostgreSQL 服务器获取登录卷的加密密码?

为了深入了解我的问题,我正在尝试postgres通过 Ansible管理用户的密码。为此,我想检查加密密码的当前值(例如'md5...')以查看它是否为当前值。如果不是,我会执行适当的ALTER ROLL命令来更新它。

我知道我可以pg_dumpall用来查看密码,例如:

$ pg_dumpall --roles-only
<snip>
CREATE ROLE postgres;
ALTER ROLE postgres WITH ... PASSWORD 'md5...';
Run Code Online (Sandbox Code Playgroud)

但这似乎不是一种非常可靠的方法。

Ars*_*sen 8

尝试读取 rolpassword 字段。

SELECT rolpassword FROM pg_authid
Run Code Online (Sandbox Code Playgroud)

pg_authid

目录 pg_authid 包含有关数据库授权标识符(角色)的信息。角色包含“用户”和“组”的概念。用户本质上只是一个设置了 rolcanlogin 标志的角色。任何角色(有或没有 rolcanlogin)都可以有其他角色作为成员;见 pg_auth_members。

由于此目录包含密码,因此不得公开读取。pg_roles 是 pg_authid 上的一个公开可读视图,它会清除密码字段。

第 19 章包含有关用户和权限管理的详细信息。

因为用户身份是集群范围的,所以 pg_authid 在集群的所有数据库之间共享:每个集群只有一个 pg_authid 副本,而不是每个数据库一个。

  • `pg_authid` 中的密码,当 md5 时,在加密之前与用户名连接,因此将其与裸密码的 md5 进行比较将没有用。(https://www.postgresql.org/docs/current/static/catalog-pg-authid.html) (2认同)
  • 对于“postgres”用户:`SELECT rolpassword FROM pg_authid WHERE rolname='postgres';` 或者对于所有用户,使用用户名:`SELECT rolname, rolpassword FROM pg_authid;` (2认同)