PostgreSQL: Jak zmienić hasło użytkownika PostgreSQL?

Odpowiedzi:

1402

W przypadku logowania bez hasła:

sudo -u user_name psql db_name

Aby zresetować hasło, jeśli zapomniałeś:

ALTER USER user_name WITH PASSWORD 'new_password';
solaimuruganv
źródło
126
Pozwala to wyczyścić hasło w historii poleceń postgresql użytkownika.
greg
118
@greg: więc usuń go:rm ~/.psql_history
RickyA,
43
poza tematem, ale jeśli ktoś, kto szuka „jak zmienić nazwę użytkownika” niż zrobić ALTER USER myuser RENAME TO newname;... z jakiegoś powodu google wskazywał mnie tutaj, kiedy googlowałem :)
odpowiednik8
10
Dlaczego używasz cudzysłowów „i”? Mam na myśli różnicę, a w zapytaniu DML musisz używać „podczas obsługi ciągów znaków, ale czy istnieje jakiś szczególny powód, aby używać ich obu tutaj?
Boyan
7
Użytkownik jest obiektem, a nie ciągiem. Porównaj z ALTER TABLE „nazwa_tabeli” lub nawet WYBIERZ * Z „nazwa_tabeli”. W tabelach nie można używać pojedynczych cudzysłowów, podobnie jest w przypadku użytkowników / ról.
P Daddy,
630

Następnie wpisz:

$ sudo -u postgres psql

Następnie:

\password postgres

Następnie, aby wyjść psql:

\q

Jeśli to nie zadziała, ponownie skonfiguruj uwierzytelnianie.

Edytuj /etc/postgresql/9.1/main/pg_hba.conf(ścieżka będzie się różnić) i zmień:

    local   all             all                                     peer

do:

    local   all             all                                     md5

Następnie uruchom ponownie serwer:

$ sudo service postgresql restart
Błędy Clinta
źródło
3
jakie jest domyślne hasło do postgres? zmieniłem to przypadkowo; można zresetować?
Saad
2
(na psql 9.2) jeśli wpisuję \p, daje mi hasło; jeśli \password postgres\p extra argument "assword" ignored; \p extra argument "postgres" ignored
wpisam, podam
1
Jest to o wiele lepsze niż pozostawienie hasła w historii poleceń SQL.
otocan
1
@ZacharyScott Co mówisz?
TheRealChx101
2
Aby zmienić hasło użytkownika postgres w systemie Linux:sudo passwd postgres
Punnerud
88

Możesz i powinieneś zaszyfrować hasło użytkownika:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';
yglodt
źródło
45
To słowo kluczowe nie ma znaczenia dla bieżącej wersji. From 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
5
Strzec się! @ Komentarz John29 jest prawdziwy tylko z Postgresql 10 i nowszych. We wszystkich innych wersjach flaga ZASZYFROWANA ma znaczenie.
phep,
51

Uważam, że najlepszym sposobem na zmianę hasła jest po prostu użycie:

\password

w konsoli Postgres.

Źródło:

Należy zachować ostrożność przy określaniu niezaszyfrowanego hasła za pomocą tego polecenia. Hasło zostanie przesłane do serwera w postaci czystego tekstu i może być również zarejestrowane w historii poleceń klienta lub w dzienniku serwera. psql zawiera polecenie \ hasło, którego można użyć do zmiany hasła roli bez ujawniania hasła w postaci czystego tekstu.

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

Viktor Nordling
źródło
8
Można to również wykorzystać do zmiany haseł dla innych użytkowników:\password username
Martin
34

Aby zmienić hasło za pomocą wiersza polecenia systemu Linux, użyj:

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"
Vajira Lasantha
źródło
5
Pamiętaj tylko, że to prawdopodobnie zapisze hasło użytkownika bazy danych w historii poleceń.
Pedro Cordeiro
2
czy możesz tutaj użyć zmiennych środowiskowych? Chcę to zautomatyzować za pomocą skryptu wdrażania
TheRealChx101
26

Aby zmienić hasło

 sudo -u postgres psql

następnie

\password postgres

teraz wprowadź Nowe hasło i potwierdź

następnie \qwyjść

Akitha_MJ
źródło
1
ta odpowiedź pomoże mi. dzięki
mohammad jawad Barati
24

Przejdź do konfiguracji Postgresql i edytuj pg_hba.conf

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

Następnie zmień tę linię:

Database administrative login by Unix domain socket
local      all              postgres                                md5

do :

Database administrative login by Unix domain socket
local   all             postgres                                peer

następnie ponownie uruchom usługę PostgreSQL za pomocą komendy SUDO

psql -U postgres

Zostaniesz teraz wpisany i zobaczysz terminal Postgresql

następnie wprowadź

\password

i wprowadź NOWE hasło dla domyślnego użytkownika Postgres. Po pomyślnej zmianie hasła ponownie przejdź do strony pg_hba.conf i przywróć zmianę na „md5”

teraz będziesz zalogowany jako

psql -U postgres

z nowym hasłem.

Daj mi znać, jeśli znajdziesz w tym jakiś problem.

Murtaza Kanchwala
źródło
To nie działa:user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
GM
Ok, zrób inną metodę sudo su - postgres psql Wejdziesz do terminala, a następnie zmienisz tam hasło. Jest to alternatywny sposób. Daj mi znać, jeśli to
zadziała
mm próbowałem, ale mam inny błąd: / usr / bin / psql: wiersz 19: użyj: nie znaleziono polecenia / usr / bin / psql: wiersz 21: użyj: nie znaleziono polecenia / usr / bin / psql: wiersz 23: użyj: nie znaleziono polecenia / usr / bin / psql: linia 24: użyj: nie znaleziono polecenia / usr / bin / psql: psql: linia 26: błąd składni w pobliżu nieoczekiwanego tokena $version,' /usr/bin/psql: psql: line 26: my ($ wersja, $ klaster, $ db, $ port , $ host); ' dzięki za pomoc!
GM,
11

Aby zażądać nowego hasła dla użytkownika postgres (bez pokazywania go w poleceniu):

sudo -u postgres psql -c "\password"
lcnicolau
źródło
9

Konfiguracja, którą mam na moim serwerze, była bardzo spersonalizowana i udało mi się zmienić hasło dopiero po ustawieniu uwierzytelnienia zaufania w pg_hba.confpliku :

local   all   all   trust

Nie zapomnij zmienić tego z powrotem na hasło lub md5

ruruskyi
źródło
1
musisz również zrestartować usługę postgres, aby zmiany zaczęły obowiązywaćsudo systemctl restart postgresql.service
Sampath Surineni
gdzie powinien iść ten plik pg_hba.conf?
JMStudios.jrichardson
8

To był pierwszy wynik w Google, kiedy szukałem sposobu na zmianę nazwy użytkownika, więc:

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

Kilka innych poleceń pomocnych w zarządzaniu użytkownikami:

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

Przenieś użytkownika do innej grupy

ALTER GROUP <old_group> DROP USER <username>;
ALTER GROUP <new_group> ADD USER <username>;
Salvador Dali
źródło
7

W moim przypadku na Ubuntu 14.04 zainstalowany z postgres 10.3. Muszę wykonać następujące kroki

  • su - postgres zmienić użytkownika na postgres
  • psql aby wprowadzić powłokę postgres
  • \password następnie wprowadź swoje hasło
  • \q wyjść z sesji powłoki
  • Następnie przełączasz się z powrotem na root, wykonując exiti konfigurując swój pg_hba.conf(mój jest w /etc/postgresql/10/main/pg_hba.conf), upewniając się, że masz następujący wiersz

    local all postgres md5

  • Uruchom ponownie usługę postgres przez service postgresql restart
  • Teraz przełącz się na postgresużytkownika i ponownie wprowadź powłokę postgres. Poprosi Cię o hasło.
haxpor
źródło
Nie sądzę, aby po zmianie hasła naprawdę trzeba było ponownie uruchomić usługę postgresql. Mogłem zresetować hasło przy ponownym uruchomieniu. \ hasło to najszybszy sposób. W przeciwnym razie potrzebujesz polecenia ALTER USER.
Archit Kapoor
3

Użyj tego:

\password

wprowadź nowe hasło dla tego użytkownika, a następnie je potwierdź. Jeśli nie pamiętasz hasła i chcesz je zmienić, możesz zalogować się jako postgres, a następnie użyć tego:

ALTER USER 'the username' WITH PASSWORD 'the new password';
Chris Dare
źródło
3

Podobne do innych odpowiedzi w składni, ale należy wiedzieć, że można również przekazać hasło md5, aby nie przesyłać hasła w postaci zwykłego tekstu.

Oto kilka scenariuszy niezamierzonych konsekwencji zmiany hasła użytkownika zwykłym tekstem.

  1. Jeśli nie masz protokołu SSL i modyfikujesz zdalnie, przesyłasz hasło w postaci zwykłego tekstu przez sieć.
  2. Jeśli konfiguracja rejestrowania jest ustawiona na rejestrowanie instrukcji DDL log_statement = ddllub nowszych, hasło w postaci zwykłego tekstu pojawi się w dziennikach błędów.
    1. Jeśli nie chronisz tych dzienników, jest to problem.
    2. Jeśli zbierzesz te dzienniki / ETL i wyświetlisz je tam, gdzie inni mają dostęp, mogą zobaczyć to hasło itp.
    3. Jeśli zezwolisz użytkownikowi na zarządzanie hasłem, nieświadomie ujawnia hasło administratorowi lub pracownikowi niskiego poziomu, któremu powierzono przeglądanie dzienników.

To powiedziawszy tutaj, w jaki sposób możemy zmienić hasło użytkownika, budując md5 hasła.

  • Postgres, gdy hash ma hasło jako md5, soluje hasło z nazwą użytkownika, a następnie dołącza tekst „md5” do wynikowego skrótu.
  • np .: „md5” + md5 (hasło + nazwa użytkownika)

  • W bash:

    ~$ echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • W 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
  • W końcu nasze ALTER USERpolecenie będzie wyglądać
    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • Istotne linki (uwaga: będę linkować do najnowszych wersji dokumentów dla starszych, to zmienia niektóre, ale md5 nadal obsługuje cofanie się).
  • stworzyć rolę
  • Hasło jest zawsze przechowywane w postaci zaszyfrowanej w katalogach systemowych. Słowo kluczowe ZASZYFROWANE nie ma żadnego efektu, ale jest akceptowane dla kompatybilności wstecznej. Metodę szyfrowania określa parametr konfiguracyjny hasło_szyfrowanie. Jeśli prezentowany ciąg hasła jest już w formacie zaszyfrowanym MD5 lub SCRAM, jest on przechowywany w niezmienionej postaci niezależnie od hasła_szyfrowania (ponieważ system nie może odszyfrować określonego zaszyfrowanego ciągu hasła, aby zaszyfrować go w innym formacie). Umożliwia to ponowne załadowanie zaszyfrowanych haseł podczas zrzutu / przywracania.

  • ustawienie konfiguracji dla szyfrowania hasła
  • uwierzytelnianie hasła postgres doc
  • budowanie hasła postgres md5
jkdba
źródło
1

Zasadniczo wystarczy użyć interfejsu administratora pg do wykonywania czynności związanych z db.

Jeśli zamiast tego skupiasz się bardziej na automatyzacji konfiguracji bazy danych na potrzeby rozwoju lokalnego, CI itp.

Na przykład możesz użyć prostej kombinacji takiej jak ta.

(a) Utwórz manekina superużytkownika za pomocą Jenkinsa za pomocą polecenia podobnego do tego:

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

spowoduje to utworzenie superużytkownika o nazwie eksperyment001 w tobie postgres db.

(b) Podaj temu użytkownikowi hasło, uruchamiając NON-Interactive SQL polecenie.

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

Postgres jest prawdopodobnie najlepszą dostępną bazą danych dla narzędzi wiersza poleceń (nieinteraktywnych). Tworzenie użytkowników, uruchamianie SQL, tworzenie kopii zapasowych baz danych itp. Ogólnie rzecz biorąc, jest to dość proste w postgresie i ogólnie dość trywialne jest zintegrowanie tego ze skryptami instalacyjnymi lub automatyczną konfiguracją CI.

99Sono
źródło
1

oraz w pełni zautomatyzowany sposób z bash'iem i spodziewaj się ( w tym przykładzie zapewniamy nowego administratora postgres z nowo udostępnionym postgres pw zarówno na poziomie systemu operacyjnego, jak i 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 ;
 "
Yordan Georgiev
źródło
0

TLDR:

W wielu systemach konto użytkownika często zawiera kropkę lub jakąś funkcję (użytkownik: john.smith, horise.johnson). W takich przypadkach konieczne będzie dokonanie modyfikacji powyższej akceptowanej odpowiedzi. Zmiana wymaga podania podwójnego cudzysłowu.

Example:

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

Racjonalny:

Postgres jest dość wybredny, kiedy stosować „podwójny cytat”, a kiedy „pojedynczy cytat”. Zazwyczaj przy podawaniu łańcucha użyłbyś pojedynczego cudzysłowu.

FlyingV
źródło