Как изменить пароль для пользователя PostgreSQL?
Как изменить пароль пользователя PostgreSQL?
Ответы (22)
Для входа без пароля:
sudo -u user_name psql db_name
Чтобы сбросить пароль, если вы забыли:
ALTER USER user_name WITH PASSWORD 'new_password';
изменить пароль на postgres для пользователя postgres
# ALTER USER postgres WITH ENCRYPTED PASSWORD '<NEW-PASSWORD>';
Установка пароля для роли postgres
$ sudo -u postgres psql
у вас будет что-то вроде:
postgres=#
изменить пароль на postgres для пользователя postgres
# ALTER USER postgres WITH ENCRYPTED PASSWORD 'postgres';
у вас будет что-то вроде:
ALTER ROLE
postgres=#
Для этого нам нужно отредактировать файл pg_hba.conf.
=====> Не стесняйтесь заменить nano любым редактором по вашему выбору
$ sudo nano /etc/postgresql/9.5/main/pg_hba.conf
Теперь нам нужно перезапустить Postgres, чтобы изменения вступили в силу.
$ sudo service postgresql restart
Большинство ответов были в основном правильными, но вам нужно обратить внимание на мелочи. Моя проблема заключалась в том, что я никогда не устанавливал пароль для postgres, поэтому я не мог войти в командную строку SQL, которая позволяла мне изменять пароли. Вот шаги, которые я успешно выполнил (обратите внимание, что большинству или всем командам нужен пользователь sudo / root):
- Отредактируйте
pg_hba.conf
в каталоге данных кластера БД, к которому вы пытаетесь подключиться.- Папку каталога данных можно найти, проверив командную строку systemd, которую легко получить с помощью
systemctl status postgresql@VERSION-DB_CLUSTER
. Замените VERSION своей версией PSQL, а DB_CLUSTER - именем вашего кластера базы данных. Это может быть основным, если он был создан автоматически, например.postgresql@13-main
. В качестве альтернативы мой bash предоставил автозаполнение после вводаpostgresql@
, поэтому вы можете попробовать это или найти службы postgresql в списке всех служб (systemctl -a
). После того, как у вас есть вывод состояния, найдите вторую командную строку после CGroup, которая должна быть довольно длинной и начинаться с/usr/lib/postgresql/13/bin/postgres
или аналогичного (в зависимости от версии, дистрибутива и метода установки). Вы ищете каталог после-D
, например/var/lib/postgresql/13/main
.
- Папку каталога данных можно найти, проверив командную строку systemd, которую легко получить с помощью
- Добавьте следующую строку:
host all all 127.0.0.1/32 trust
. Это позволяет всем пользователям всех баз данных безоговорочно подключаться к базе данных через IPv4 на локальном компьютере , не запрашивая пароль . Это временное исправление, и не забудьте удалить эту строку позже. Чтобы быть уверенным, я закомментировалhost all all 127.0.0.1/32 md5
(md5 может быть заменен на 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
. - Не забудьте удалить пароль, игнорировать обходной путь и перезапустить сервер, чтобы применить конфигурацию.
Я был в Windows (Server 2019; PG 10), поэтому соединения типа local
(pg_hba.conf
: local all all peer
) не поддерживаются.
Следующее должно работать как в системах Windows, так и в Unix:
- резервное копирование
pg_hba.conf
наpg_hba.orig.conf
например, - создать
pg_hba.conf
только с этим:host all all 127.0.0.1/32 trust
- перезапустить pg (служба)
- выполнить
psql -U postgres -h 127.0.0.1
- введите (в консоли pgctl)
alter user postgres with password 'SomePass';
- восстановить
pg_hba.conf
с 1. выше
проверьте pg_hba.conf
Если используется метод аутентификации «одноранговый», имя / пароль пользователя операционной системы клиента должны совпадать с именем пользователя и паролем базы данных. В этом случае установите одинаковые пароли для пользователя Linux postgres и пользователя БД postgres.
подробности см. В документации: https://www.postgresql.org/docs/9.1/auth-pg-hba-conf.html
Если у вас Windows.
Откройте файл pg_hba.conf
и измените его с md5
на peer
Откройте cmd, введите psql postgres postgres
Затем введите \password
, чтобы получить запрос на ввод нового пароля.
См. Этот средний пост для получения дополнительной информации и подробных шагов.
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из обзора
Спасибо @BrianMinton за внимание.
это сработало для меня, используя trust
вместо peer
TL; DR:
Во многих системах учетная запись пользователя часто содержит точку или какую-то точку (пользователь: john.smith, horise.johnson). В этих случаях необходимо будет внести изменения в принятый выше ответ. Для изменения требуется, чтобы имя пользователя было заключено в двойные кавычки.
Example:
ALTER USER "username.lastname" WITH PASSWORD 'password';
Рациональный:
Postgres довольно разборчив в том, когда использовать «двойные кавычки», а когда «одинарные кавычки». Обычно при вводе строки вы используете одинарные кавычки.
В общем, просто используйте пользовательский интерфейс администратора pg для выполнения действий, связанных с базой данных.
Если вместо этого вы больше сосредотачиваетесь на автоматизации настройки базы данных для вашей локальной разработки или CI и т. Д ...
Например, вы можете использовать такую простую комбинацию.
(a) Создайте фиктивного суперпользователя через jenkins с помощью команды, подобной этой:
docker exec -t postgres11-instance1 createuser --username=postgres --superuser experiment001
в вашей базе данных postgres будет создан суперпользователь с именем эксперимент001.
(б) Дайте этому пользователю пароль, выполнив НЕИнтерактивную команду SQL.
docker exec -t postgres11-instance1 psql -U experiment001 -d postgres -c "ALTER USER experiment001 WITH PASSWORD 'experiment001' "
Postgres, вероятно, лучшая база данных для инструментов командной строки (неинтерактивных). Создание пользователей, запуск SQL, резервное копирование базы данных и т. Д. В общем, с postgres все довольно просто, и в целом довольно тривиально интегрировать это в сценарии установки разработки или в автоматическую конфигурацию CI.
и полностью автоматизированный способ с помощью bash and expect (в этом примере мы предоставляем нового администратора postgres с недавно подготовленным postgres pw как на уровне ОС, так и на уровне времени выполнения postgres)
# the $postgres_usr_pw and the other bash vars 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 different
sudo -u root echo "postgres:$postgres_usr_pw" | sudo chpasswd
expect <<- EOF_EXPECT
set timeout -1
spawn 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 eof
EOF_EXPECT
cd /tmp/
# at this point the postgres uses the new password
sudo -u postgres PGPASSWORD=$postgres_usr_pw psql \
--port $postgres_db_port --host $postgres_db_host -c "
DO \$\$DECLARE r record;
BEGIN
IF NOT EXISTS (
SELECT
FROM pg_catalog.pg_roles
WHERE rolname = '"$postgres_db_useradmin"') THEN
CREATE ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
CREATEDB REPLICATION BYPASSRLS
PASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;
END IF;
END\$\$;
ALTER ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
CREATEDB REPLICATION BYPASSRLS
PASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;
"
Подобно другим ответам по синтаксису, но следует знать, что вы также можете передать md5 пароля, чтобы вы не передавали пароль в виде простого текста.
Вот несколько сценариев непредвиденных последствий изменения пароля пользователя в виде обычного текста.
- Если у вас нет SSL и вы изменяете удаленно, вы передаете пароль в виде обычного текста по сети.
- Если ваша конфигурация ведения журнала настроена на регистрацию операторов DDL
log_statement = ddl
или выше, то ваш простой текстовый пароль будет отображаться в ваших журналах ошибок.- Проблема, если вы не защищаете эти журналы.
- Если вы соберете эти журналы / ETL и отобразите их там, где у других есть доступ, они могут увидеть этот пароль и т. Д.
- Если вы разрешите пользователю управлять своим паролем, он неосознанно раскрывает пароль администратору или сотруднику нижнего уровня, которому поручено просматривать журналы.
С учетом вышесказанного, вот как мы можем изменить пароль пользователя, построив md5 пароля.
- Postgres, когда хеширует пароль как 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();
## OUTPUT
md5d6a35858d61d85e4a82ab1fb044aba9d
- Итак, наконец, наша команда
ALTER USER
будет выглядеть как
ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
- Соответствующие ссылки (обратите внимание, что я буду ссылаться только на последние версии документов, для более старых версий они немного меняются, но md5 по-прежнему поддерживает обратный путь.)
- создать роль
-
Пароль всегда хранится в зашифрованном виде в системных каталогах. Ключевое слово ENCRYPTED не действует, но допускается для обратной совместимости. Метод шифрования определяется параметром конфигурации password_encryption. Если представленная строка пароля уже находится в формате с шифрованием MD5 или SCRAM, то она сохраняется как есть, независимо от password_encryption (поскольку система не может расшифровать указанную зашифрованную строку пароля, чтобы зашифровать ее в другом формате). Это позволяет перезагружать зашифрованные пароли во время дампа / восстановления.
- параметр конфигурации для шифрование пароля
- документ аутентификации пароля postgres
- сборка пароля postgres md5
Чтобы изменить пароль
sudo -u postgres psql
затем
\password postgres
теперь введите новый пароль и подтвердите
затем \q
для выхода из
Если я это сделаю, он запросит пароль
В моем случае на Ubuntu 14.04 с установленной postgres 10.3. Мне нужно выполнить следующие шаги
-
su - postgres
для переключения пользователя наpostgres
-
psql
для входа в оболочку postgres -
\password
затем введите свой пароль -
\q
для выхода из сеанса оболочки -
Затем вы переключаетесь обратно на root, выполнив
exit
и настраивая свойpg_hba.conf
(мой находится на/etc/postgresql/10/main/pg_hba.conf
), убедившись, что у вас есть следующая строкаlocal all postgres md5
- Перезапустите службу postgres, используя
service postgresql restart
- Теперь переключитесь на пользователя
postgres
и снова войдите в оболочку postgres. Вам будет предложено ввести пароль.
Я не думаю, что вам действительно нужно перезапускать службу postgresql после изменения пароля. Мне удалось сбросить пароль, перезапустив его. \ пароль - самый быстрый способ. В противном случае вам понадобится команда ALTER USER.
Чтобы запросить новый пароль для пользователя postgres (без отображения его в команде):
sudo -u postgres psql -c "\password"
используйте это:
\password
введите новый пароль, который вы хотите для этого пользователя, а затем подтвердите его. Если вы не помните пароль и хотите его изменить, вы можете войти в систему как postgres, а затем использовать это:
ALTER USER 'the username' WITH PASSWORD 'the new password';
Я считаю, что лучший способ изменить пароль - это просто использовать:
\password
в консоли Postgres.
Согласно ALTER USER
документации:
Следует проявлять осторожность при указании незашифрованного пароля с помощью эту команду. Пароль будет передан на сервер в открытый текст, и он также может быть зарегистрирован в истории команд клиента или журнал сервера. psql содержит команду \ пароль, которую можно использовать для изменения пароля роли без раскрытия пароля в открытом виде.
Примечание: ALTER USER
- это псевдоним для ALTER ROLE
Это также можно использовать для изменения паролей для других пользователей: \password username
Не находит \ пароль (в Linux)
@Coliban, при запуске вы должны увидеть приглашение psql
.
@Andy: да, но psql по какой-то причине не подключился к БД. Я установил новую версию с новыми паролями, теперь все в порядке. Спасибо
Это был первый результат в Google, когда я искал, как переименовать пользователя, поэтому:
ALTER USER <username> WITH PASSWORD '<new_password>'; -- change password
ALTER 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>;
Чтобы изменить пароль с помощью командной строки Linux, используйте:
sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"
Просто помните, что это, вероятно, сохранит пароль пользователя базы данных в вашей истории команд.
вы можете использовать здесь переменные среды? Я хочу автоматизировать это в сценарии развертывания
Вы можете и должны зашифровать пароль пользователя:
ALTER USER username WITH ENCRYPTED PASSWORD 'password';
Это ключевое слово не имеет значения для текущей версии. Из postgresql.org/docs/current/static/sql-createrole.html The password is always stored encrypted in the system catalogs. The ENCRYPTED keyword has no effect, but is accepted for backwards compatibility.
Остерегаться! Комментарий @ John29 верен только для Postgresql 10 и выше. Для всех остальных версий имеет значение флаг ЗАШИФРОВАНИЕ.
незашифрованный пароль запоминается psql
историей или оболочкой ... Как использовать хешированный (например, SHA1) пароль?
Перейдите в конфигурацию Postgresql и отредактируйте pg_hba.conf
sudo vim /etc/postgresql/9.3/main/pg_hba.conf
Затем измените эту строку:
Database administrative login by Unix domain socket
local all postgres md5
к:
Database administrative login by Unix domain socket
local all postgres peer
затем перезапустите службу PostgreSQL с помощью команды SUDO, затем
psql -U postgres
Вы войдете и увидите терминал Postgresql
затем введите
\password
и введите НОВЫЙ пароль для пользователя Postgres по умолчанию. После успешного изменения пароля снова перейдите в pg_hba.conf и верните изменение на «md5»
теперь вы будете авторизованы как
psql -U postgres
с новым паролем.
Дайте мне знать, если вы все найдете в нем какие-либо проблемы.
Не работает: user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
Хорошо, сделайте другой метод sudo su - postgres psql. Вы войдете в терминал и затем измените там пароль. Это альтернативный способ. Сообщите мне, работает ли это для вас или вам нужно полное объяснение
мм, я пробовал, но у меня другая ошибка: / usr / bin / psql: строка 19: использование: команда не найдена / usr / bin / psql: строка 21: использование: команда не найдена / usr / bin / psql: строка 23: использование: команда не найдена / usr / bin / psql: строка 24: использование: команда не найдена / usr / bin / psql: psql: строка 26: синтаксическая ошибка рядом с неожиданным токеном $version,' /usr/bin/psql: psql: line 26:
my ($ version, $ cluster, $ db , $ port, $ host); ' Спасибо за вашу помощь!
Конфигурация, которая у меня есть на моем сервере, была сильно настроена, и мне удалось изменить пароль только после того, как я установил аутентификацию trust в pg_hba.conf
файле:
local all all trust
Не забудьте снова сменить пароль на пароль или md5
вам также необходимо перезапустить службу postgres, чтобы изменения вступили в силу sudo systemctl restart postgresql.service
куда должен идти этот файл pg_hba.conf?
Чтобы изменить пароль пользователя postgres, выполните следующие действия:
- Войдите в psql:
$ sudo -u postgres psql
- Затем в консоли psql измените пароль и выйдите:
postgres=# \password postgres
Enter 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
## to
local all all md5 # like this
Затем перезапустите сервер:
$ sudo service postgresql restart
какой пароль по умолчанию для postgres? поменял случайно; можно сбросить?
(в psql 9.2) если я наберу \p
, он даст мне пароль; если я наберу \password postgres
, он выдает пароль, а затем выдает предупреждения \p extra argument "assword" ignored; \p extra argument "postgres" ignored
Если вы внесли изменения с помощью \ password и находитесь на том же хосте, что и сервер postgres, попробуйте указать, что вы хотите, чтобы ваше соединение проходило через inet, а не через сокет unix. т.е. используйте параметр -h: psql -h 127.0.0.1. Это спасло меня от редактирования файла конфигурации pg_hba
Если только для справки, local all postgres md5
разрешает локальный вход для postgres с интерактивным вводом пароля, но, что еще лучше, существует host all all 127.0.0.1/32 md5
позволяет sudo psql --host 127.0.0.1 --username postgres --password
входить в систему в интерактивном режиме для входа в postgres без изменений pg_hba.conf.
Это намного лучше, чем оставлять пароль в истории команд SQL.
@ZacharyScott Что ты говоришь?
Чтобы изменить пароль пользователя postgres в Linux: sudo passwd postgres
Если вы хотите изменить пароль для другого пользователя, кроме postgres
, команда \password
принимает имя роли в качестве первого аргумента: \password <role_name>
postgresql.org/docs/9.0/sql-alterrole.html
Это правильный ответ. Большое спасибо, я вижу, что давно проголосовал за него, так рад, что снова нашел его , !
@Punnerud, "Чтобы изменить пароль пользователя postgres в Linux: sudo passwd postgres
" Holy Smokes! Я был так сбит с толку. И у Postgres, и у Linux один и тот же пользователь. Я новичок в postgres и использую его с новым сайтом Django. Мне нужна была резервная копия БД и выбор 5 случайных руководств, это не было хорошо объяснено. LSS это решило проблему с паролем, так что я мог сделать резервную копию.
Это позволяет очистить пароль в истории команд postgresql пользователя.
@greg: удалите его:
rm ~/.psql_history
не по теме, но если кто-то ищет "как изменить имя пользователя", чем
ALTER USER myuser RENAME TO newname;
... по какой-то причине Google указывал мне здесь, когда я искал это :)@RickyA Не забудьте также очистить журналы базы данных, они также могут содержать пароли в виде открытого текста.
Почему вы используете кавычки "и"? Я имею в виду, есть разница, и в запросе DML вы должны использовать "при работе со строками, но есть ли особая причина использовать их оба здесь?
Использование одинарной кавычки для имени роли не работает, но мне все еще интересно, почему?
Пользователь - это объект, а не строка. Сравните с ALTER TABLE "table_name" или даже SELECT * FROM "table_name". Вы не можете использовать одинарные кавычки в этих контекстах с таблицами, и то же самое с пользователями / ролями.
@RickyA удаление файла не означает, что пароль будет удален в системе жестко, его можно найти с помощью криминалистики с такими вещами, как photorec, поэтому вам нужно будет
shred
и т. Д.@DragonRock не поможет вам ни с твердотельными накопителями, ни даже с более новыми версиями ext в целом.
@dualed да, ты прав. Полностью избавиться от файла довольно сложно. Лучше вообще никогда не сохранять его!
Просто любопытно, но почему (теперь неиспользуемый) пароль является проблемой в файлах журнала? Он был изменен и поэтому бесполезен, или я ошибаюсь?
что делает первая строка?
@greg @RickyA вместо удаления всего
.psql_history
достаточно ввести команду с некоторым пробелом передALTER USER
, и она не будет сохранена в.psql_history
. Этот же удобный прием доступен и в стандартной оболочке.используйте
ENCRYPTED PASSWORD
@Alphaaa Я думаю, что это работает, только если у вас установлен
\set HISTCONTROL ignorespace
в файле .psqlrc.Да, @GregoryArenius, ваш файл .psqlrc должен содержать
\set HISTCONTROL ignorespace
или\set HISTCONTROL ignoreboth
, чтобы мое предложение сработало.@Natim Из документов:
The password is always stored encrypted in the system catalogs. The ENCRYPTED keyword has no effect, but is accepted for backwards compatibility.
Но вы можете отправить зашифрованный пароль:If the presented password string is already in MD5-encrypted or SCRAM-encrypted format, then it is stored as-is regardless of password_encryption.
postgresql.org/docs/current/static/sql-createrole.htmlЕсли вы используете команду
\password
вpsql
, то история не будет содержать пароль. (По крайней мере, в версии 9.2.24)### Используйте DOUBLE QUOTE для пользователя, если он содержит точку.
незашифрованный пароль запоминается
psql
историей или оболочкой ... То же самое для команды SQLENCRYPTED PASSWORD
(!). Как использовать зашифрованный / хешированный (например, SHA256) пароль?Этот способ (без кавычек вокруг имени пользователя) будет работать только для определенных имен пользователей.
-bash: -u: команда не найдена