PostgreSQL: Comment changer le mot de passe utilisateur PostgreSQL?

Réponses:

1406

Pour un mot de passe sans connexion:

sudo -u user_name psql db_name

Pour réinitialiser le mot de passe si vous avez oublié:

ALTER USER user_name WITH PASSWORD 'new_password';
solaimuruganv
la source
126
Cela laisse le mot de passe clair dans l'historique des commandes postgresql de l'utilisateur.
Greg
118
@greg: supprimez-le donc:rm ~/.psql_history
RickyA
43
hors sujet, mais si quelqu'un cherche "comment changer le nom de l'utilisateur", alors ALTER USER myuser RENAME TO newname;... pour une raison quelconque, google me pointait ici quand je cherchais ça :)
equivalent8
10
Pourquoi utilisez-vous à la fois "et" guillemets? Je veux dire, il y a une différence, et dans une requête DML, vous devez utiliser "lorsque vous traitez des chaînes, mais y a-t-il une raison spéciale pour les utiliser ici?
Boyan
7
L'utilisateur est un objet, pas une chaîne. Comparez avec ALTER TABLE "nom_table" ou même SELECT * FROM "nom_table". Vous ne pouvez pas utiliser de guillemets simples dans ces contextes avec des tables, et c'est la même chose avec les utilisateurs / rôles.
P Daddy
630

Tapez ensuite:

$ sudo -u postgres psql

Alors:

\password postgres

Puis pour quitter psql:

\q

Si cela ne fonctionne pas, reconfigurez l'authentification.

Editez /etc/postgresql/9.1/main/pg_hba.conf(le chemin sera différent) et changez:

    local   all             all                                     peer

à:

    local   all             all                                     md5

Redémarrez ensuite le serveur:

$ sudo service postgresql restart
Clint Bugs
la source
3
quel est le mot de passe par défaut pour postgres? changé accidentellement; possible de réinitialiser?
Saad
2
(sur psql 9.2) si je tape \p, cela me donne le mot de passe; si je tape, \password postgresil donne le mot de passe, puis des avertissements\p extra argument "assword" ignored; \p extra argument "postgres" ignored
David LeBauer
1
C'est bien mieux que de laisser le mot de passe dans l'historique des commandes SQL.
otocan
1
@ZacharyScott Que dites-vous?
TheRealChx101
2
Pour changer le mot de passe de l'utilisateur postgres sous Linux:sudo passwd postgres
Punnerud
88

Vous pouvez et devez avoir le mot de passe des utilisateurs crypté:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';
yglodt
la source
45
Ce mot-clé n'a pas d'importance pour la version actuelle. De 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
Il faut se méfier! @ Le commentaire John29 n'est vrai qu'à partir de Postgresql 10 et supérieur. Pour toutes les autres versions, le drapeau CHIFFRE est important.
phep
51

Je crois que la meilleure façon de changer le mot de passe est simplement d'utiliser:

\password

dans la console Postgres.

La source:

Il faut être prudent lors de la spécification d'un mot de passe non chiffré avec cette commande. Le mot de passe sera transmis au serveur en texte clair, et il peut également être enregistré dans l'historique des commandes du client ou le journal du serveur. psql contient une commande \ mot de passe qui peut être utilisée pour changer le mot de passe d'un rôle sans exposer le mot de passe en texte clair.

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

Viktor Nordling
la source
8
Cela peut également être utilisé pour changer les mots de passe des autres utilisateurs:\password username
Martin
34

Pour modifier le mot de passe à l'aide de la ligne de commande Linux, utilisez:

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"
Vajira Lasantha
la source
5
N'oubliez pas que cela enregistrera probablement le mot de passe de l'utilisateur de la base de données dans votre historique de commandes.
Pedro Cordeiro
2
pouvez-vous utiliser des variables d'environnement ici? Je veux automatiser cela dans un script de déploiement
TheRealChx101
26

Pour changer le mot de passe

 sudo -u postgres psql

puis

\password postgres

maintenant entrez un nouveau mot de passe et confirmez

puis \qsortir

Akitha_MJ
la source
1
cette réponse m'aide. merci
mohammad jawad Barati
24

Accédez à votre configuration Postgresql et modifiez pg_hba.conf

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

Puis changez cette ligne:

Database administrative login by Unix domain socket
local      all              postgres                                md5

à :

Database administrative login by Unix domain socket
local   all             postgres                                peer

puis redémarrez le service PostgreSQL via la commande SUDO puis

psql -U postgres

Vous serez maintenant inscrit et verrez le terminal Postgresql

puis entrez

\password

et entrez le NOUVEAU mot de passe pour l'utilisateur par défaut de Postgres.

maintenant vous serez connecté en tant que

psql -U postgres

avec votre nouveau mot de passe.

Faites-moi savoir si vous y trouvez tous des problèmes.

Murtaza Kanchwala
la source
Cela ne fonctionne pas:user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
GM
Ok, faites une autre méthode sudo su - postgres psql Vous allez entrer dans le terminal puis changer le mot de passe là, c'est une autre façon de procéder. Faites-moi savoir si cela fonctionne pour vous ou si vous avez besoin d'une explication complète
Murtaza Kanchwala
mm j'ai essayé mais j'ai une autre erreur: / usr / bin / psql: ligne 19: use: commande introuvable / usr / bin / psql: ligne 21: use: commande introuvable / usr / bin / psql: ligne 23: use: command not found / usr / bin / psql: line 24: use: command not found / usr / bin / psql: psql: line 26: erreur de syntaxe près du jeton inattendu $version,' /usr/bin/psql: psql: line 26: my ($ version, $ cluster, $ db, $ port , $ host); ' Merci de votre aide!
GM
11

Pour demander un nouveau mot de passe pour l' utilisateur postgres (sans l'afficher dans la commande):

sudo -u postgres psql -c "\password"
lcnicolau
la source
9

La configuration que j'ai sur mon serveur a été beaucoup personnalisée et j'ai réussi à changer de mot de passe uniquement après avoir défini l' authentification de confiance dans le pg_hba.conffichier :

local   all   all   trust

N'oubliez pas de le changer en mot de passe ou md5

ruruskyi
la source
1
vous devez également redémarrer votre service postgres pour que les modifications prennent effetsudo systemctl restart postgresql.service
Sampath Surineni
où doit aller ce fichier pg_hba.conf?
JMStudios.jrichardson
8

Ce fut le premier résultat sur google, quand je cherchais comment renommer un utilisateur, donc:

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

Quelques autres commandes utiles pour la gestion des utilisateurs:

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

Déplacer l'utilisateur vers un autre groupe

ALTER GROUP <old_group> DROP USER <username>;
ALTER GROUP <new_group> ADD USER <username>;
Salvador Dali
la source
7

Pour mon cas sur Ubuntu 14.04 installé avec postgres 10.3. Je dois suivre les étapes suivantes

  • su - postgres pour basculer l'utilisateur vers postgres
  • psql entrer dans le shell postgres
  • \password puis entrez votre mot de passe
  • \q pour quitter la session shell
  • Ensuite, vous revenez à root en exécutant exitet en configurant votre pg_hba.conf(le mien est à /etc/postgresql/10/main/pg_hba.conf) en vous assurant d'avoir la ligne suivante

    local all postgres md5

  • Redémarrez votre service postgres en service postgresql restart
  • Passez maintenant à l' postgresutilisateur et entrez à nouveau le shell postgres. Il vous demandera un mot de passe.
haxpor
la source
Je ne pense pas que vous ayez vraiment besoin de redémarrer le service postgresql après avoir changé le mot de passe. J'ai pu réinitialiser le mot de passe en le redémarrant. \ mot de passe est le moyen le plus rapide. Sinon, vous avez besoin de la commande ALTER USER.
Archit Kapoor
3

utilisez ceci:

\password

entrez le nouveau mot de passe que vous souhaitez pour cet utilisateur, puis confirmez-le. Si vous ne vous souvenez pas du mot de passe et que vous souhaitez le modifier, vous pouvez vous connecter en tant que postgres, puis utiliser ceci:

ALTER USER 'the username' WITH PASSWORD 'the new password';
Chris Dare
la source
3

Semblable à d'autres réponses en syntaxe, mais il faut savoir que vous pouvez également transmettre un md5 du mot de passe afin de ne pas transmettre de mot de passe en texte brut.

Voici quelques scénarios de conséquences imprévues de la modification du mot de passe d'un utilisateur en texte brut.

  1. Si vous n'avez pas SSL et que vous modifiez à distance, vous transmettez le mot de passe en texte brut sur le réseau.
  2. Si votre configuration de journalisation est définie pour consigner les instructions DDL log_statement = ddl ou une version ultérieure, votre mot de passe en texte brut apparaîtra dans vos journaux d'erreurs.
    1. Si vous ne protégez pas ces journaux, c'est un problème.
    2. Si vous collectez ces journaux / ETL et les affichez là où d'autres ont accès, ils pourraient voir ce mot de passe, etc.
    3. Si vous autorisez un utilisateur à gérer son mot de passe, il révèle sans le savoir un mot de passe à un administrateur ou à un employé de bas niveau chargé de consulter les journaux.

Cela dit, voici comment modifier le mot de passe d'un utilisateur en créant un md5 du mot de passe.

  • Postgres lors du hachage d'un mot de passe en md5, associe le mot de passe avec le nom d'utilisateur puis ajoute le texte "md5" au hachage résultant.
  • ex: "md5" + md5 (mot de passe + nom d'utilisateur)

  • En bash:

    ~$ echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • Dans 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
  • Donc, finalement, notre ALTER USERcommande ressemblera
    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • Liens pertinents (Remarque: je ne lierai qu'aux dernières versions des documents pour les anciens, il en change certains, mais md5 prend toujours en charge les chemins du retour.)
  • créer un rôle
  • Le mot de passe est toujours stocké crypté dans les catalogues système. Le mot clé ENCRYPTED n'a aucun effet, mais est accepté pour des raisons de compatibilité descendante. La méthode de cryptage est déterminée par le paramètre de configuration password_encryption. Si la chaîne de mot de passe présentée est déjà au format chiffré MD5 ou chiffré SCRAM, elle est stockée telle quelle, quel que soit le mot de passe_cryptage (car le système ne peut pas déchiffrer la chaîne de mot de passe chiffrée spécifiée, pour la chiffrer dans un format différent). Cela permet de recharger les mots de passe chiffrés pendant le vidage / restauration.

  • paramètre de configuration pour password_encryption
  • doc d'authentification par mot de passe postgres
  • construction mot de passe postgres md5
jkdba
la source
1

En général, utilisez simplement l'interface d'administration pg pour effectuer des activités liées à db.

Si, au contraire, vous vous concentrez davantage sur l'automatisation de la configuration de la base de données pour votre développement local, ou CI, etc.

Par exemple, vous pouvez utiliser un combo simple comme celui-ci.

(a) Créez un super utilisateur factice via jenkins avec une commande similaire à celle-ci:

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

cela créera un super utilisateur appelé experiment001 dans votre postgres db.

(b) Donnez à cet utilisateur un mot de passe en exécutant une commande NON-Interactive SQL.

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

Postgres est probablement la meilleure base de données disponible pour les outils de ligne de commande (non interactifs). Création d'utilisateurs, exécution de SQL, sauvegarde de la base de données, etc. En général, tout cela est assez basique avec postgres et il est globalement assez trivial de l'intégrer dans vos scripts de configuration de développement ou dans la configuration CI automatisée.

99Sono
la source
1

et la manière entièrement automatisée avec bash et expect ( dans cet exemple, nous provisionnons un nouvel administrateur postgres avec le postgres pw nouvellement provisionné à la fois sur le système d'exploitation et le niveau d'exécution de 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
la source
0

TLDR:

Sur de nombreux systèmes, le compte d'un utilisateur contient souvent un point ou une sorte de fonction (utilisateur: john.smith, horise.johnson). Dans ces cas, une modification devra être apportée à la réponse acceptée ci-dessus. Le changement nécessite que le nom d'utilisateur soit entre guillemets.

Example:

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

Rationnel:

Postgres est assez pointilleux sur le moment d'utiliser un «guillemet double» et quand utiliser un «guillemet simple». En règle générale, lorsque vous fournissez une chaîne, vous utilisez un guillemet simple.

FlyingV
la source