PostgreSQL: ¿Cómo cambiar la contraseña de usuario de PostgreSQL?

Respuestas:

1406

Para contraseña menos inicio de sesión:

sudo -u user_name psql db_name

Para restablecer la contraseña si ha olvidado:

ALTER USER user_name WITH PASSWORD 'new_password';
solaimuruganv
fuente
126
Esto permitió borrar la contraseña en el historial de comandos postgresql del usuario.
greg
118
@greg: así que rm ~/.psql_history
bórralo
43
fuera de tema pero si alguien busca "cómo cambiar el nombre de usuario" que hacer ALTER USER myuser RENAME TO newname;... por alguna razón google me estaba apuntando aquí cuando yo estaba buscando en Google que :)
equivalent8
10
¿Por qué estás usando "y" comillas? Quiero decir, hay una diferencia, y en una consulta DML tienes que usar 'cuando se trata de cadenas, pero ¿hay alguna razón especial para usar ambas aquí?
Boyan
77
El usuario es un objeto, no una cadena. Compare con ALTER TABLE "table_name" o incluso SELECT * FROM "table_name". No podría usar comillas simples en estos contextos con tablas, y es lo mismo con los usuarios / roles.
P papá el
630

Luego escriba:

$ sudo -u postgres psql

Entonces:

\password postgres

Luego para dejar de fumar psql:

\q

Si eso no funciona, reconfigure la autenticación.

Editar /etc/postgresql/9.1/main/pg_hba.conf(la ruta será diferente) y cambiar:

    local   all             all                                     peer

a:

    local   all             all                                     md5

Luego reinicie el servidor:

$ sudo service postgresql restart
Clint Bugs
fuente
3
¿Cuál es la contraseña predeterminada para postgres? lo cambió accidentalmente; posible restablecer?
Saad
2
(en psql 9.2) si escribo \p, me da la contraseña; si \password postgres\p extra argument "assword" ignored; \p extra argument "postgres" ignored
escribo
1
Esto es mucho mejor que dejar la contraseña en el historial de comandos de SQL.
otocan
1
@ZacharyScott ¿Qué estás diciendo?
TheRealChx101
2
Para cambiar la contraseña del usuario de postgres en Linux:sudo passwd postgres
Punnerud
88

Puede y debe tener la contraseña de los usuarios cifrada:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';
yglodt
fuente
45
Esta palabra clave no importa para la versión actual. 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
55
¡Tener cuidado! El comentario de @ John29 solo es cierto desde Postgresql 10 y superior. Para todas las demás versiones, la bandera ENCRIPTADA es importante.
phep
51

Creo que la mejor manera de cambiar la contraseña es simplemente usar:

\password

en la consola de Postgres.

Fuente:

Se debe tener precaución al especificar una contraseña sin cifrar con este comando. La contraseña se transmitirá al servidor en texto sin cifrar y también puede registrarse en el historial de comandos del cliente o en el registro del servidor. psql contiene un comando \ contraseña que se puede usar para cambiar la contraseña de un rol sin exponer la contraseña de texto sin cifrar.

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

Viktor Nordling
fuente
8
Esto también se puede usar para cambiar las contraseñas de otros usuarios:\password username
Martin
34

Para cambiar la contraseña usando la línea de comando de Linux, use:

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"
Vajira Lasantha
fuente
55
Solo recuerde que esto probablemente guardará la contraseña de usuario de db en su historial de comandos.
Pedro Cordeiro
2
¿Puedes usar variables de entorno aquí? Quiero automatizar esto en un script de implementación
TheRealChx101
26

Para cambiar la contraseña

 sudo -u postgres psql

entonces

\password postgres

ahora ingrese Nueva Contraseña y Confirme

luego \qpara salir

Akitha_MJ
fuente
1
esta respuesta me ayuda. gracias
mohammad jawad Barati
24

Vaya a su configuración de Postgresql y edite pg_hba.conf

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

Luego cambie esta línea:

Database administrative login by Unix domain socket
local      all              postgres                                md5

a :

Database administrative login by Unix domain socket
local   all             postgres                                peer

luego reinicie el servicio PostgreSQL a través del comando SUDO luego

psql -U postgres

Ahora entrará y verá el terminal Postgresql

luego ingrese

\password

e ingrese la NUEVA contraseña para el usuario predeterminado de Postgres. Después de cambiar con éxito la contraseña nuevamente, vaya a pg_hba.conf y revierta el cambio a "md5"

ahora iniciarás sesión como

psql -U postgres

con tu nueva contraseña.

Avíseme si todos encuentran algún problema en él.

Murtaza Kanchwala
fuente
No funciona:user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
GM
Ok, haga otro método sudo su - postgres psql Ingresará al terminal y luego cambiará la contraseña allí. Esta es una forma alternativa de hacerlo. Avíseme si esto funciona para usted o si necesita una explicación completa
Murtaza Kanchwala
mm He intentado pero tengo otro error: / usr / bin / psql: línea 19: use: comando no encontrado / usr / bin / psql: línea 21: use: comando no encontrado / usr / bin / psql: línea 23: use: comando no encontrado / usr / bin / psql: línea 24: use: comando no encontrado / usr / bin / psql: psql: línea 26: error de sintaxis cerca de token inesperado $version,' /usr/bin/psql: psql: line 26: my ($ version, $ cluster, $ db, $ port , $ host); ' ¡gracias por tu ayuda!
GM
11

Para solicitar una nueva contraseña para el usuario de postgres (sin mostrarla en el comando):

sudo -u postgres psql -c "\password"
lcnicolau
fuente
9

La configuración que tengo en mi servidor se personalizó mucho y logré cambiar la contraseña solo después de configurar la autenticación de confianza en el pg_hba.confarchivo :

local   all   all   trust

No olvides cambiar esto de nuevo a contraseña o md5

ruruskyi
fuente
1
también debe reiniciar su servicio postgres para que los cambios surtan efectosudo systemctl restart postgresql.service
Sampath Surineni
¿Dónde debe ir este archivo pg_hba.conf?
JMStudios.jrichardson
8

Este fue el primer resultado en google, cuando estaba buscando cómo cambiar el nombre de un usuario, entonces:

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

Un par de otros comandos útiles para la gestión de usuarios:

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

Mover usuario a otro grupo

ALTER GROUP <old_group> DROP USER <username>;
ALTER GROUP <new_group> ADD USER <username>;
Salvador Dalí
fuente
7

Para mi caso en Ubuntu 14.04 instalado con postgres 10.3. Necesito seguir los siguientes pasos.

  • su - postgres para cambiar de usuario a postgres
  • psql para ingresar al shell de postgres
  • \password luego ingrese su contraseña
  • \q salir de la sesión de shell
  • Luego vuelve a la raíz ejecutando exity configurando su pg_hba.conf(el mío está en /etc/postgresql/10/main/pg_hba.conf) asegurándose de tener la siguiente línea

    local all postgres md5

  • Reinicie su servicio postgres por service postgresql restart
  • Ahora cambie a postgresusuario e ingrese el shell postgres nuevamente. Te pedirá una contraseña.
haxpor
fuente
No creo que realmente necesite reiniciar el servicio postgresql después de cambiar la contraseña. He podido restablecer la contraseña al reiniciarla. \ contraseña es la forma más rápida. O bien, necesita el comando ALTER USER.
Archit Kapoor
3

utilizar este:

\password

ingrese la nueva contraseña que desea para ese usuario y luego confírmela. Si no recuerda la contraseña y desea cambiarla, puede iniciar sesión como postgres y luego usar esto:

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

Similar a otras respuestas en sintaxis, pero se debe saber que también puede pasar un md5 de la contraseña para que no esté transmitiendo una contraseña de texto sin formato.

Aquí hay algunos escenarios de consecuencias no deseadas de alterar la contraseña de un usuario en texto plano.

  1. Si no tiene SSL y está modificando de forma remota, está transmitiendo la contraseña de texto sin formato a través de la red.
  2. Si tiene su configuración de registro configurada para registrar declaraciones DDL log_statement = ddlo superior, su contraseña de texto sin formato aparecerá en sus registros de errores.
    1. Si no está protegiendo estos registros, es un problema.
    2. Si recopila estos registros / ETL y los muestra donde otros tienen acceso, podrían terminar viendo esta contraseña, etc.
    3. Si permite que un usuario administre su contraseña, sin saberlo, está revelando una contraseña a un administrador o empleado de bajo nivel encargado de revisar los registros.

Dicho esto, aquí es cómo podemos alterar la contraseña de un usuario construyendo un md5 de la contraseña.

  • Postgres cuando usa una contraseña como md5, agrega la contraseña con el nombre de usuario y luego antepone el texto "md5" al hash resultante.
  • Ej: "md5" + md5 (contraseña + nombre de usuario)

  • En bash:

    ~$ echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • En 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
  • Así que finalmente nuestro ALTER USERcomando se verá así
    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • Enlaces relevantes (Tenga en cuenta que solo vincularé a las últimas versiones de los documentos para versiones anteriores, cambia algunos, pero md5 todavía es compatible con versiones anteriores).
  • crear rol
  • La contraseña siempre se almacena cifrada en los catálogos del sistema. La palabra clave ENCRYPTED no tiene ningún efecto, pero se acepta por compatibilidad con versiones anteriores. El método de encriptación está determinado por el parámetro de configuración contraseña_encriptación. Si la cadena de contraseña presentada ya está en formato MD5 o SCRAM, entonces se almacena tal cual, independientemente de la contraseña_encriptación (ya que el sistema no puede descifrar la cadena de contraseña cifrada especificada, para cifrarla en un formato diferente). Esto permite la recarga de contraseñas cifradas durante el volcado / restauración.

  • ajuste de configuración para encriptación de contraseña
  • documento de autenticación de contraseña de postgres
  • construyendo contraseña de postgres md5
jkdba
fuente
1

En general, solo use pg admin UI para hacer actividad relacionada con db.

Si, por el contrario, se centra más en automatizar la configuración de la base de datos para su desarrollo local, o CI, etc.

Por ejemplo, puede usar un combo simple como este.

(a) Cree un superusuario ficticio a través de jenkins con un comando similar a este:

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

esto creará un superusuario llamado experiment001 en tu postgres db.

(b) Dele a este usuario alguna contraseña ejecutando un comando SQL NO interactivo.

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

Postgres es probablemente la mejor base de datos para herramientas de línea de comandos (no interactivas). Crear usuarios, ejecutar SQL, hacer copias de seguridad de la base de datos, etc. En general, todo es bastante básico con postgres y, en general, es bastante trivial integrar esto en sus scripts de configuración de desarrollo o en la configuración automatizada de CI.

99Sono
fuente
1

y la forma totalmente automatizada con bash y esperar ( en este ejemplo , aprovisionamos un nuevo administrador de postgres con el postgres pw recién aprovisionado tanto en el sistema operativo como en el nivel de tiempo de ejecución 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
fuente
0

TLDR:

En muchos sistemas, la cuenta de un usuario a menudo contiene un punto o algún tipo de punción (usuario: john.smith, horise.johnson). En estos casos, se deberá realizar una modificación a la respuesta aceptada anteriormente. El cambio requiere que el nombre de usuario sea entre comillas dobles.

Example:

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

Racional:

Postgres es bastante exigente con respecto a cuándo usar una "cita doble" y cuándo usar una "cita simple". Por lo general, al proporcionar una cadena, usaría una comilla simple.

FlyingV
fuente