PostgreSQL: come modificare la password utente di PostgreSQL?


Risposte:


1406

Per l'accesso meno password:

sudo -u user_name psql db_name

Per reimpostare la password se hai dimenticato:

ALTER USER user_name WITH PASSWORD 'new_password';

126
Ciò consente di cancellare la password nella cronologia dei comandi postgresql dell'utente.
Greg

118
@greg: quindi eliminalo:rm ~/.psql_history
RickyA

43
fuori tema ma se qualcuno cerca "come cambiare il nome dell'utente" di quello che fa ALTER USER myuser RENAME TO newname;... per qualche ragione google mi stava indicando qui mentre cercavo su Google :)
equivalente8

10
Perché stai usando entrambi "e" virgolette? Voglio dire, c'è una differenza, e in una query DML devi usare "quando hai a che fare con le stringhe, ma c'è un motivo speciale per usarle entrambe qui?
Boyan

7
L'utente è un oggetto, non una stringa. Confronta con ALTER TABLE "nome_tabella" o addirittura SELEZIONA * DA "nome_tabella". Non è possibile utilizzare virgolette singole in questi contesti con tabelle, ed è lo stesso con utenti / ruoli.
P Daddy,

630

Quindi digitare:

$ sudo -u postgres psql

Poi:

\password postgres

Quindi per uscire psql:

\q

Se ciò non funziona, riconfigurare l'autenticazione.

Modifica /etc/postgresql/9.1/main/pg_hba.conf(il percorso sarà diverso) e cambia:

    local   all             all                                     peer

per:

    local   all             all                                     md5

Quindi riavviare il server:

$ sudo service postgresql restart

3
qual è la password predefinita per Postgres? cambiato accidentalmente; possibile resettare?
Saad,

2
(su psql 9.2) se scrivo \p, mi dà la password; se lo \password postgres\p extra argument "assword" ignored; \p extra argument "postgres" ignored
digito

1
Questo è molto meglio che lasciare la password nella cronologia dei comandi SQL.
otocan,

1
@ZacharyScott Che cosa stai dicendo?
TheRealChx101,

2
Per cambiare la password dell'utente postgres in Linux:sudo passwd postgres
Punnerud,

88

Puoi e dovresti avere la password dell'utente crittografata:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';

45
Questa parola chiave non ha importanza per la versione corrente. Da 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
Attenzione! @ Il commento di John29 è vero solo da Postgresql 10 in poi. Per tutte le altre versioni è importante la bandiera ENCRYPTED.
phep

51

Credo che il modo migliore per cambiare la password sia semplicemente usare:

\password

nella console di Postgres.

Fonte:

Prestare attenzione quando si specifica una password non crittografata con questo comando. La password verrà trasmessa al server in chiaro e potrebbe anche essere registrata nella cronologia dei comandi del client o nel registro del server. psql contiene un comando \ password che può essere utilizzato per modificare la password di un ruolo senza esporre la password in chiaro.

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


8
Questo può essere utilizzato anche per modificare le password per altri utenti:\password username
Martin

34

Per modificare la password utilizzando la riga di comando di Linux, utilizzare:

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

5
Basta ricordare che questo probabilmente salverà la password dell'utente del db nella cronologia dei comandi.
Pedro Cordeiro,

2
puoi usare le variabili d'ambiente qui? Voglio automatizzare questo in uno script deploy
TheRealChx101

26

Per cambiare la password

 sudo -u postgres psql

poi

\password postgres

ora inserisci Nuova password e Conferma

poi \qper uscire


1
questa risposta mi aiuta. grazie
mohammad jawad Barati il

24

Vai al tuo Postgresql Config e modifica pg_hba.conf

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

Quindi cambia questa riga:

Database administrative login by Unix domain socket
local      all              postgres                                md5

per :

Database administrative login by Unix domain socket
local   all             postgres                                peer

quindi riavviare il servizio PostgreSQL tramite il comando SUDO

psql -U postgres

Ora sarai inserito e vedrai il terminale Postgresql

quindi entra

\password

e inserisci la NUOVA password per l'utente predefinito di Postgres, dopo aver modificato nuovamente la password, vai su pg_hba.conf e ripristina la modifica in "md5"

ora sarai loggato come

psql -U postgres

con la tua nuova password.

Fammi sapere se ci sono problemi.


Non funziona:user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
GM

Ok, fai un altro metodo sudo su - postgres psql Entrerai nel terminale e poi cambierai la password, Questo è un modo alternativo per questo. Fammi sapere se questo funziona per te o hai bisogno di una spiegazione completa
Murtaza Kanchwala,

mm ho provato ma ho un altro errore: / usr / bin / psql: linea 19: uso: comando non trovato / usr / bin / psql: linea 21: uso: comando non trovato / usr / bin / psql: linea 23: uso: comando non trovato / usr / bin / psql: linea 24: uso: comando non trovato / usr / bin / psql: psql: linea 26: errore di sintassi vicino token imprevisto $version,' /usr/bin/psql: psql: line 26: my ($ versione, $ cluster, $ db, $ porta , $ host); ' Grazie per l'aiuto!
GM

11

Per richiedere una nuova password per l' utente postgres (senza mostrarla nel comando):

sudo -u postgres psql -c "\password"

9

La configurazione che ho sul mio server è stata personalizzata molto e sono riuscito a cambiare la password solo dopo aver impostato l' autenticazione di fiducia nel pg_hba.conffile :

local   all   all   trust

Non dimenticare di riportarlo a password o md5


1
è inoltre necessario riavviare il servizio sudo systemctl restart postgresql.service
Postgres

dove dovrebbe andare questo file pg_hba.conf?
JMStudios.jrichardson

8

Questo è stato il primo risultato su Google, quando stavo cercando come rinominare un utente, quindi:

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

Un paio di altri comandi utili per la gestione degli utenti:

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

Sposta l'utente in un altro gruppo

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

7

Per il mio caso su Ubuntu 14.04 installato con Postgres 10.3. Devo seguire i seguenti passi

  • su - postgres per passare all'utente postgres
  • psql per inserire la shell postgres
  • \password quindi inserisci la tua password
  • \q per chiudere la sessione della shell
  • Quindi ritorni a root eseguendo exite configurando il tuo pg_hba.conf(il mio è a /etc/postgresql/10/main/pg_hba.conf) assicurandoti di avere la seguente riga

    local all postgres md5

  • Riavvia il servizio postgres di service postgresql restart
  • Ora passa postgresall'utente e inserisci di nuovo la shell Postgres. Ti verrà richiesta la password.

Non penso che sia davvero necessario riavviare il servizio postgresql dopo aver modificato la password. Sono stato in grado di ripristinare la password riavviandola. \ password è il modo più rapido. Altrimenti hai bisogno del comando ALTER USER.
Archit Kapoor,

3

Usa questo:

\password

inserisci la nuova password che desideri per quell'utente e poi confermala. Se non ricordi la password e vuoi cambiarla, puoi accedere come postgres e quindi usare questa:

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

3

Simile ad altre risposte nella sintassi ma dovrebbe essere noto che puoi anche passare un md5 della password in modo da non trasmettere una password in testo semplice.

Ecco alcuni scenari di conseguenze indesiderate dell'alterazione della password di un utente in testo semplice.

  1. Se non si dispone di SSL e si sta modificando in remoto, si sta trasmettendo la password in chiaro attraverso la rete.
  2. Se la configurazione della registrazione è impostata per registrare le istruzioni DDL log_statement = ddlo successive, la password in testo normale verrà visualizzata nei registri degli errori.
    1. Se non si stanno proteggendo questi registri è un problema.
    2. Se raccogli questi registri / ETL e li visualizzi a cui altri hanno accesso, potrebbero finire per vedere questa password, ecc.
    3. Se si consente a un utente di gestire la propria password, sta inconsapevolmente rivelando una password a un amministratore o a un dipendente di basso livello incaricato di rivedere i registri.

Detto questo, ecco come possiamo modificare la password di un utente costruendo un md5 della password.

  • Postgres quando hash una password come md5, salta la password con il nome utente, quindi antepone il testo "md5" all'hash risultante.
  • es: "md5" + md5 (password + nome utente)

  • In bash:

    ~$ echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • In 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
  • Quindi finalmente il nostro ALTER USERcomando sarà simile
    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • Collegamenti pertinenti (Nota che collegherò solo alle ultime versioni dei documenti per i precedenti, ne cambia alcuni ma md5 supporta ancora un modo per tornare indietro.)
  • creare un ruolo
  • La password viene sempre archiviata crittografata nei cataloghi di sistema. La parola chiave ENCRYPTED non ha alcun effetto, ma è accettata per compatibilità con le versioni precedenti. Il metodo di crittografia è determinato dal parametro di configurazione password_encryption. Se la stringa di password presentata è già in formato crittografato MD5 o crittografato SCRAM, viene archiviata così com'è indipendentemente dalla password_encryption (poiché il sistema non è in grado di decrittografare la stringa di password crittografata specificata, per crittografarla in un formato diverso). Ciò consente di ricaricare le password crittografate durante il dump / ripristino.

  • impostazione di configurazione per password_encryption
  • autenticazione password postgres doc
  • costruzione password postgres md5

1

In generale, basta usare l'interfaccia utente dell'amministratore di pg per fare attività relative al db.

Se invece ti stai concentrando maggiormente sull'automazione della configurazione del database per il tuo sviluppo locale, CI, ecc ...

Ad esempio, puoi usare una combo semplice come questa.

(a) Crea un super utente fittizio tramite jenkins con un comando simile al seguente:

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

questo creerà un super utente chiamato experiment001 in postgres db.

(b) Fornire a questo utente una password eseguendo un comando SQL NON interattivo.

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

Postgres è probabilmente il miglior database disponibile per gli strumenti da riga di comando (non interattivi). Creare utenti, eseguire SQL, fare il backup del database ecc ... In generale è tutto abbastanza semplice con Postgres ed è nel complesso abbastanza banale integrarlo negli script di installazione di sviluppo o nella configurazione di CI automatizzata.


1

e il modo completamente automatizzato con bash e prevede ( in questo esempio forniamo a un nuovo amministratore di postgres i postgres appena forniti pw sia a livello di runtime del sistema operativo che di 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:

Su molti sistemi, l'account di un utente contiene spesso un punto o una sorta di punzione (utente: john.smith, horise.johnson). In questi casi sarà necessario apportare una modifica alla risposta accettata sopra. La modifica richiede che il nome utente sia tra virgolette doppie.

Example:

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

Razionale:

Postgres è piuttosto esigente su quando usare una "virgoletta doppia" e quando usare una "virgoletta singola". In genere quando si fornisce una stringa si utilizza una virgoletta singola.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.