如何更改PostgreSQL用户密码?

如何更改PostgreSQL用户的密码?

2006098 次浏览

要更改PostgreSQL用户的密码,请执行以下步骤:

  1. 登录到psql控制台:

    sudo -u postgres psql
  2. 然后在psql控制台中,更改密码并退出:

    postgres=# \password postgresEnter new password: <new-password>postgres=# \q

或者使用查询:

ALTER USER postgres PASSWORD '<new-password>';

或者在一条线上

sudo -u postgres psql -c "ALTER USER postgres PASSWORD '<new-password>';"

备注:

如果这不起作用,请通过编辑/etc/postgresql/9.1/main/pg_hba.conf重新配置身份验证(路径会有所不同)并更改:

local     all         all             peer # change this to md5

local     all         all             md5 # like this

然后重新启动服务器:

sudo service postgresql restart

要在没有密码的情况下登录:

sudo -u user_name psql db_name

如果您忘记了,请重置密码:

ALTER USER user_name WITH PASSWORD 'new_password';

我在服务器上的配置是自定义的,只有在#0文件中设置信任身份验证后,我才设法更改密码:

local   all   all   trust

不要忘记将其更改回密码或md5。

转到您的PostgreSQL配置并编辑文件pg_hba.conf

sudo vim /etc/postgresql/9.3/main/pg_hba.conf

然后更改此行:

Database administrative login by Unix domain socketlocal      all              postgres                                md5

到:

Database administrative login by Unix domain socketlocal   all             postgres                                peer

然后通过“sudo”命令重新启动PostgreSQL服务。然后

psql -U postgres

您现在将进入并将看到PostgreSQL终端。

然后输入

\password

并输入PostgreSQL默认用户的新的密码。再次成功更改密码后,转到pg_hba.conf并将更改恢复为“md5”。

现在您将以

psql -U postgres

你的新密码。

您可以并且应该加密用户的密码:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';

要使用Linux命令行更改密码,请使用:

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"

这是google上的第一个结果,当时我正在寻找如何重命名用户,所以:

ALTER USER <username> WITH PASSWORD '<new_password>';  -- change passwordALTER USER <old_username> RENAME TO <new_username>;    -- rename user

其他几个有助于用户管理的命令:

CREATE USER <username> PASSWORD '<password>' IN GROUP <group>;DROP USER <username>;

将用户移动到另一个组

ALTER GROUP <old_group> DROP USER <username>;ALTER GROUP <new_group> ADD USER <username>;

我认为更改密码的最佳方法是简单地使用:

\password

在Postgres控制台中。

ALTER USER留档

在指定未加密的密码时必须谨慎此命令。密码将在明文,它也可能记录在客户端的命令历史记录中或服务器日志。psql包含一个可以使用的命令\密码在不暴露明文密码的情况下更改角色的密码。

注意:ALTER USERALTER ROLE的别名

使用这个:

\password

输入您想要该用户的新密码,然后确认它。如果您不记得密码并且想要更改它,您可以以"postgres"登录,然后使用以下命令:

ALTER USER 'the username' WITH PASSWORD 'the new password';

要为postgres用户请求新密码(未在命令中显示):

sudo -u postgres psql -c "\password"

对于我在PostgreSQL 10.3中安装的ubuntu 14.04(TrustyTahr)的案例:我需要遵循以下步骤

  • su - postgres将用户切换到postgres

  • psql进入PostgreSQL shell

  • \password,然后输入密码

  • Q退出shell会话

  • 然后您通过执行exit切换回root,并通过确保您有以下行来配置您的pg_hba.conf(我的在/etc/postgresql/10/main/pg_hba.conf

    local all postgres md5

  • 通过service postgresql restart重新启动PostgreSQL服务

  • 现在切换到postgres用户并再次输入PostgreSQL shell。它会提示您输入密码。

更改密码:

 sudo -u postgres psql

然后

\password postgres

现在输入新密码并确认。

然后\q退出。

这在语法上类似于其他答案,但应该知道您也可以传递密码的MD5哈希值,因此您不会传输纯文本密码。

以下是以纯文本形式更改用户密码的意外后果的一些场景。

  1. 如果您没有SSL并且正在远程修改,则您正在通过网络传输纯文本密码。
  2. 如果您将日志记录配置设置为logDDL语句log_statement = ddl或更高版本,则您的纯文本密码将显示在错误日志中。
  3. 如果您不保护这些日志,那就是一个问题。
  4. 如果您收集这些日志/ETL它们并将它们显示在其他人可以访问的地方,他们最终可能会看到此密码等。
  5. 如果您允许用户管理他们的密码,他们会在不知不觉中将密码泄露给负责查看日志的管理员或低级员工。

话虽如此,以下是我们如何通过构建密码的MD5哈希值来更改用户的密码。

  • PostgreSQL在将密码哈希为MD5时,将密码与用户名一起加盐,然后将文本“md5”添加到生成的哈希中。

  • 示例:“md5”+md5(密码+用户名)

  • 在Bash中:

    echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'

    输出:

    md5d6a35858d61d85e4a82ab1fb044aba9d
  • 在PowerShell中:

    [PSCredential] $Credential = Get-Credential
    $StringBuilder = New-Object System.Text.StringBuilder
    $null = $StringBuilder.Append('md5');
    [System.Security.Cryptography.HashAlgorithm]::Create('md5').ComputeHash([System.Text.Encoding]::ASCII.GetBytes(((ConvertFrom-SecureStringToPlainText -SecureString $Credential.Password) + $Credential.UserName))) | ForEach-Object {$null = $StringBuilder.Append($_.ToString("x2"))}
    $StringBuilder.ToString();
    ## OUTPUTmd5d6a35858d61d85e4a82ab1fb044aba9d
  • 所以最后我们的ALTER USER命令看起来像

    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • 相关链接(注意我只会链接到最新版本的留档。对于较旧的,它会更改一些,但MD5仍然支持。)

  • 创建角色创建角色

  • 密码始终加密存储在系统目录中。ENCRYPTED关键字无效,但为了向后兼容,可接受。加密方法由配置参数password_encryption确定。如果呈现的密码字符串已经是MD5加密或SCRAM加密格式,则无论password_encryption如何,它都按原样存储(因为系统无法解密指定的加密密码字符串,请以不同的格式加密)。这允许在转储/恢复期间重新加载加密密码。

  • password_encryption的配置设置

  • PostgreSQL密码认证留档

  • 构建PostgreSQL密码MD5哈希值

以及使用Bash的完全自动化方式(在这个例子中我们在操作系统和PostgreSQL运行时级别上使用新预配的PostgreSQL密码预配新的PostgreSQL管理员):

  # The $postgres_usr_pw and the other Bash variables MUST be defined# for reference the manual way of doing things automated with expect bellow#echo "copy-paste: $postgres_usr_pw"#sudo -u postgres psql -c "\password"# The OS password could / should be differentsudo -u root echo "postgres:$postgres_usr_pw" | sudo chpasswd
expect <<- EOF_EXPECTset timeout -1spawn sudo -u postgres psql -c "\\\password"expect "Enter new password: "send -- "$postgres_usr_pw\r"expect "Enter it again: "send -- "$postgres_usr_pw\r"expect eofEOF_EXPECT
cd /tmp/# At this point the 'postgres' executable uses the new passwordsudo -u postgres PGPASSWORD=$postgres_usr_pw psql \--port $postgres_db_port --host $postgres_db_host -c "DO \$\$DECLARE r record;BEGINIF NOT EXISTS (SELECTFROM   pg_catalog.pg_rolesWHERE  rolname = '"$postgres_db_useradmin"') THENCREATE ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLECREATEDB REPLICATION BYPASSRLSPASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;END IF;END\$\$;ALTER ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLECREATEDB REPLICATION BYPASSRLSPASSWORD  '"$postgres_db_useradmin_pw"' LOGIN ;"

一般来说,只需使用pgAdmin UI来执行与数据库相关的活动。

相反,如果您更专注于为本地开发自动化数据库设置,CI等。

例如,您可以使用这样的简单组合。

(a)使用类似于以下的命令通过Jenkins创建一个虚拟超级用户:

docker exec -t postgres11-instance1 createuser --username=postgres --superuser experiment001

这将在PostgreSQL数据库中创建一个名为实验001的超级用户。

(b)通过运行非交互式SQL命令为该用户提供一些密码。

docker exec -t postgres11-instance1 psql -U experiment001 -d postgres -c "ALTER USER experiment001 WITH PASSWORD 'experiment001' "

PostgreSQL可能是用于命令行(非交互式)工具的最佳数据库。创建用户、运行SQL、备份数据库等。

一般来说,PostgreSQL都是非常基本的,并且将其集成到您的开发设置脚本或自动CI配置中总体上非常简单。

TLDR:

在许多系统上,用户的帐户通常包含句点或某种标点符号(user:john.smithhorise.johnson)。在这些情况下,必须对上述已接受的答案进行修改。更改要求用户名双引号。

示例

ALTER USER "username.lastname" WITH PASSWORD 'password';

理由:

PostgreSQL对何时使用“双引号”和何时使用“单引号”非常挑剔。通常,在提供字符串时,您将使用单引号。

如果你在Windows上。

打开pg_hba.conf文件并从md5更改为peer

打开cmd并键入psql postgres postgres

然后键入\password以提示输入新密码。

请参阅此媒体文章了解更多信息和精细步骤。

检查文件pg_hba.conf

如果身份验证方法是“对等”,则客户端的操作系统用户名/密码必须与数据库用户名和密码匹配。在这种情况下,请将Linux用户“postgres”和数据库用户“postgres”的密码设置为相同。

有关详细信息,请参阅留档:19.1.pg_hba.conf文件

我使用的是Windows(Windows Server 2019; PostgreSQL 10),因此不支持local类型连接(pg_hba.conflocal all all peer)。

以下内容应适用于Windows和Unix系统:

  1. 备份pg_hba.confpg_hba.orig.conf例如
  2. 创建pg_hba.conf只有这个:host all all 127.0.0.1/32 trust
  3. 重启pg(服务)
  4. 执行psql -U postgres -h 127.0.0.1
  5. 输入(在pgctl控制台中)alter user postgres with password 'SomePass';
  6. 从1恢复pg_hba.conf以上

大多数答案大多是正确的,但是你需要注意一些次要的事情。我遇到的问题是我从来没有设置过“postgres”的密码,所以我无法登录允许我更改密码的SQL命令行。这些是我成功使用的步骤(请注意,大多数或所有命令都需要sudo或root用户):

  • 编辑要连接的DB集群的数据目录中的pg_hba.conf文件。

    • 可以通过检查系统d命令行找到数据目录的文件夹,使用systemctl status postgresql@VERSION-DB_CLUSTER很容易获得。将VERSION替换为您的psql版本,并DB_CLUSTER数据库集群的名称。如果它是自动创建的,则可能是main,因此,例如,postgresql@13-main。或者,我的Bash shell在输入postgresql@后提供了自动完成,因此您可以尝试或在所有服务列表中查找PostgreSQL服务(systemctl -a)。一旦您有状态输出,请查找CGroup之后的第二个命令行,它应该相当长,并从/usr/lib/postgresql/13/bin/postgres或类似的开始(取决于版本,发行版和安装方法)。您正在查找-D之后的目录,例如/var/lib/postgresql/13/main
  • 添加以下行:host all all 127.0.0.1/32 trust。这允许所有数据库上的所有用户通过本地机器无条件的,不需要密码上的IPv4连接到数据库。

    这是一个临时修复,不要忘记稍后再次删除这一行。为了确定,我注释掉了host all all 127.0.0.1/32 md5md5可能被scram-sha-256替换),它对相同的登录数据有效,只需要密码。

  • 重新启动数据库服务:systemctl restart postgresql@...同样,使用您之前找到的确切服务。

  • 检查服务是否以systemctl status postgresql@...正确启动。

  • 连接psql,非常重要的是,连接强制psql不询问密码。根据我的经验,即使服务器不在乎,它也会问你输入密码,如果你的密码错误,它仍然会拒绝你的登录。这可以通过-w标志来完成。

    完整的命令行看起来像这样:sudo -u postgres psql -w -h 127.0.0.1 -p 5432。在这里,postgres是您的用户,您可能已经更改了它。5432是特定于集群的服务器的端口,如果您运行多个集群(例如我有5434),可能会更高。

  • 使用\password特殊命令更改密码。

  • 请记住删除密码忽略解决方法并重新启动服务器以应用配置。

postgres角色设置密码

sudo -u postgres psql

您将收到如下提示:

postgres=#

将用户postgres的密码更改为PostgreSQL

ALTER USER postgres WITH ENCRYPTED PASSWORD 'postgres';

您将获得如下内容:

ALTER ROLE

为此,我们需要编辑pg_hba.conf文件。

(随意用您选择的编辑器替换纳米。)

sudo nano /etc/postgresql/9.5/main/pg_hba.conf

pg_hba.conf文件中的更新

查找内容如下所示的未注释行(不以#开头的行)。行间距会略有不同,但单词应该相同。

    local   postgres   postgres   peer

    local   postgres   postgres   md5

现在我们需要重新启动PostgreSQL,以便更改生效

sudo service postgresql restart

将用户“postgres”的密码更改为“postgres”:

# ALTER USER postgres WITH ENCRYPTED PASSWORD '<NEW-PASSWORD>';

使用pgAdmin 4:

菜单对象更改密码…