PostgreSQL: как изменить пароль пользователя PostgreSQL?

Ответы:

1406

Для пароля меньше логин:

sudo -u user_name psql db_name

Чтобы сбросить пароль, если вы забыли:

ALTER USER user_name WITH PASSWORD 'new_password';
solaimuruganv
источник
126
Это позволило очистить пароль в истории команд пользователя postgresql.
Грег
118
@greg: удалите его:rm ~/.psql_history
RickyA
43
не по теме, но если кто-то ищет "как изменить имя пользователя", чем делать ALTER USER myuser RENAME TO newname;... по какой-то причине Google указал мне здесь, когда я гуглял это :)
эквивалент 8
10
Почему вы используете и "и" кавычки? Я имею в виду, есть разница, и в DML-запросе вы должны использовать "при работе со строками, но есть ли особая причина использовать их оба здесь?
Boyan
7
Пользователь - это объект, а не строка. Сравните с ALTER TABLE "table_name" или даже SELECT * FROM "table_name". Вы не могли использовать одинарные кавычки в этих контекстах с таблицами, и то же самое с пользователями / ролями.
P Daddy
630

Затем введите:

$ sudo -u postgres psql

Затем:

\password postgres

Затем выйти psql:

\q

Если это не работает, перенастройте аутентификацию.

Изменить /etc/postgresql/9.1/main/pg_hba.conf(путь будет отличаться) и изменить:

    local   all             all                                     peer

чтобы:

    local   all             all                                     md5

Затем перезапустите сервер:

$ sudo service postgresql restart
Клинт Багз
источник
3
какой пароль по умолчанию для postgres? изменил это случайно; можно сбросить?
Саад
2
(на psql 9.2), если я наберу \p, он дает мне пароль; если я \password postgres\p extra argument "assword" ignored; \p extra argument "postgres" ignored
наберу
1
Это намного лучше, чем оставить пароль в истории команд SQL.
otocan
1
@ZacharyScott Что ты говоришь?
TheRealChx101
2
Чтобы изменить пароль для пользователя postgres в Linux:sudo passwd postgres
Punnerud
88

Вы можете и должны иметь пароль пользователя в зашифрованном виде:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';
yglodt
источник
45
Это ключевое слово не имеет значения для текущей версии. Из 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.
Джон 29
5
Осторожно! @ John29 комментарий только верно от Postgresql 10 и выше. Для всех других версий имеет значение флаг ENCRYPTED.
Феп
52

Я считаю, что лучший способ изменить пароль - это просто использовать:

\password

в консоли Postgres.

Источник:

При указании незашифрованного пароля с помощью этой команды следует соблюдать осторожность. Пароль будет передан на сервер в виде открытого текста, и он также может быть зарегистрирован в истории команд клиента или в журнале сервера. psql содержит команду \ пароль, которую можно использовать для изменения пароля роли без раскрытия пароля в виде открытого текста.

с https://www.postgresql.org/docs/9.0/static/sql-alterrole.html .

Виктор Нордлинг
источник
8
Это также может быть использовано для изменения паролей для других пользователей:\password username
Мартин
34

Чтобы изменить пароль с помощью командной строки Linux, используйте:

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"
Ваджира Ласантха
источник
5
Просто помните, что это, вероятно, сохранит пароль пользователя базы данных в вашей истории команд.
Педро Кордейру
2
Вы можете использовать переменные среды здесь? Я хочу автоматизировать это в сценарии развертывания
TheRealChx101
26

Сменить пароль

 sudo -u postgres psql

тогда

\password postgres

Теперь введите новый пароль и подтвердите

затем \qвыйти

Akitha_MJ
источник
1
этот ответ поможет мне. спасибо
Мухаммед Джавад Барати
24

Перейдите к вашему Postgresql Config и отредактируйте 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"
GM
Хорошо, выполните другой метод sudo su - postgres psql. Вы войдете в терминал, а затем смените там пароль. Это альтернативный способ. Дайте мне знать, если это работает для вас, или вам нужно полное объяснение
Муртаза Канчвала
мм я пробовал, но у меня есть другая ошибка: / usr / bin / psql: строка 19: использовать: команда не найдена / usr / bin / psql: строка 21: использовать: команда не найдена / usr / bin / psql: строка 23: use: команда не найдена / usr / bin / psql: строка 24: use: команда не найдена / usr / bin / psql: psql: строка 26: синтаксическая ошибка рядом с неожиданным токеном $version,' /usr/bin/psql: psql: line 26: my ($ version, $ cluster, $ db, $ port , $ host); ' Спасибо за вашу помощь!
GM
11

Чтобы запросить новый пароль для пользователя postgres (не показывая его в команде):

sudo -u postgres psql -c "\password"
lcnicolau
источник
9

Конфигурация, которую я получил на своем сервере, была сильно изменена, и мне удалось изменить пароль только после того, как я установил доверительную аутентификацию в pg_hba.confфайле :

local   all   all   trust

Не забудьте изменить это обратно на пароль или md5

ruruskyi
источник
1
вам также нужно перезапустить службу postgres, чтобы изменения вступили в силуsudo systemctl restart postgresql.service
Sampath Surineni
куда должен идти этот файл pg_hba.conf?
JMStudios.jrichardson
8

Это был первый результат в 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>;
Сальвадор Дали
источник
7

Для моего случая на 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. Он подскажет вам пароль.
haxpor
источник
Я не думаю, что вам действительно нужно перезапустить сервис postgresql после смены пароля. Я смог сбросить пароль и перезапустить его. \ пароль - самый быстрый способ. Или же вам нужна команда ALTER USER.
Archit Kapoor
3

использовать этот:

\password

введите новый пароль, который вы хотите для этого пользователя, а затем подтвердите его. Если вы не помните пароль и хотите изменить его, вы можете войти в систему как postgres, а затем использовать это:

ALTER USER 'the username' WITH PASSWORD 'the new password';
Крис Дар
источник
3

Подобно другим ответам в синтаксисе, но следует знать, что вы также можете передать md5 пароля, чтобы не передавать простой текстовый пароль.

Вот несколько сценариев непреднамеренных последствий изменения пароля пользователя в виде обычного текста.

  1. Если у вас нет SSL и вы изменяете удаленно, вы передаете простой текстовый пароль по сети.
  2. Если у вас настроена конфигурация ведения журнала, чтобы записывать DDL-операторы log_statement = ddl записей или выше, то ваш простой текстовый пароль будет отображаться в журналах ошибок.
    1. Если вы не защищаете эти журналы, это проблема.
    2. Если вы соберете эти журналы / ETL и покажете их там, где другие имеют доступ, они могут в конечном итоге увидеть этот пароль и т. Д.
    3. Если вы позволяете пользователю управлять своим паролем, он неосознанно раскрывает пароль администратору или сотруднику низкого уровня, которому поручено просматривать журналы.

С учетом сказанного, вот как мы можем изменить пароль пользователя, создав md5-пароль.

  • Postgres, когда хеширует пароль как md5, солит пароль с именем пользователя, затем добавляет текст «md5» к полученному хешу.
  • например: "md5" + md5 (пароль + имя пользователя)

  • В Баш:

    ~$ 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 (поскольку система не может расшифровать указанную зашифрованную строку пароля, чтобы зашифровать ее в другом формате). Это позволяет перезагрузить зашифрованные пароли во время дампа / восстановления.

  • настройка конфигурации для password_encryption
  • документация по аутентификации пароля postgres
  • Пост Postgres пароль Md5
jkdba
источник
1

В общем, просто используйте pg admin UI для выполнения действий, связанных с БД.

Если вместо этого вы больше сосредоточены на автоматизации настройки базы данных для вашей локальной разработки, или CI и т.д ...

Например, вы можете использовать простой комбо, как это.

(a) Создайте фиктивного суперпользователя с помощью jenkins с помощью команды, подобной этой:

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

это создаст супер пользователя с именем Exper001 в вашем postgres db.

(b) Дайте этому пользователю какой-нибудь пароль, выполнив НЕИнтерактивную команду SQL.

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

Postgres, вероятно, лучшая база данных для инструментов командной строки (неинтерактивная). Создание пользователей, запуск SQL, создание резервных копий базы данных и т. Д. В целом все это довольно просто для postgres, и в целом довольно просто интегрировать это в сценарии установки разработки или в автоматическую настройку CI.

99Sono
источник
1

и полностью автоматизированный способ с bash и ожидаем ( в этом примере мы предоставляем нового администратора postgres с недавно предоставленным pg postgres как для ОС, так и для уровня времени выполнения 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 ;
 "
Йордан Георгиев
источник
0

TLDR:

Во многих системах учетная запись пользователя часто содержит точку или какую-то функцию (пользователь: john.smith, horise.johnson). В этих случаях необходимо внести изменения в принятый ответ выше. Изменение требует, чтобы имя пользователя было заключено в двойные кавычки.

Example:

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

Rational:

Postgres довольно требователен к тому, когда использовать «двойную кавычку» и когда использовать «одинарную кавычку». Обычно при предоставлении строки вы используете одинарную кавычку.

FlyingV
источник