2012-08-14 18 views
13

Después de instalar PostgreSQL 9.1 en Ubuntu 12.04, establecí la contraseña para la cuenta de superusuario "postgres". Quiero que todos los usuarios tengan que introducir su contraseña cuando loging en Es por esto que he configurado pg_hba.conf este modo:.Sin solicitud de contraseña para superusuario postgresql

#Database administrative login by Unix domain socket 
local all    postgres        md5 

# TYPE DATABASE  USER   ADDRESS     METHOD 

# "local" is for Unix domain socket connections only 
local all    all          md5 

Recomencé PostgreSQL después de hacer esos cambios. Cuando hago esto psql -U testuser me piden una contraseña, pero cuando inicio sesión con la cuenta "postgres" como psql -U postgres obtengo un mensaje de contraseña y estoy conectado. Si forzo la solicitud de contraseña con psql -U postgres -W puedo iniciar sesión por escribiendo la contraseña correcta o escribiendo nada en absoluto. Escribir una contraseña incorrecta es rechazada.

¿Alguien puede explicarme por qué sucede esto?

En una nota relacionada: Veo un montón de ejemplos donde las personas usan ident como método de autenticación para el usuario "postgres", argumentando que para convertirse en el usuario "postgres" se necesita la contraseña de root de la máquina. Supongo que el razonamiento es que si un atacante obtiene acceso a la raíz, de todos modos lo haga. Preferiría iniciar sesión con una contraseña, una que no es la misma que la contraseña de root. Prefiero tener contraseñas diferentes para diferentes cosas. Es esto razonable?

salida de grep '^[^#]' pg_hba.conf

local all    postgres        md5 
local all    all          md5 
host all    all    127.0.0.1/32   md5 

Respuesta

13

Su pg_hba.conf de hecho debería requerir una contraseña para las conexiones de socket UNIX, pero todavía hay maneras alrededor de él que se debe verificar:

  1. un archivo .pgpass en el directorio principal de Postgres que contiene la contraseña (consultar también la PGPASSFILE variable de entorno para una ruta no estándar).

  2. se pudo establecer la variable de entorno PGPASSWORD.

Y también existe la posibilidad de que esté editando el archivo pg_hba.conf equivocado. Cuando se conecta como postgres, se puede obtener la ruta correcta para la verificación con el comando SQL SHOW hba_file.

Además, es posible que desee comprobar el archivo de registro, /var/log/postgresql/postgresql-9.1-main.log para confirmar que los archivos de configuración se vuelven a cargar cuando lo solicite y buscar cualquier mensaje sospechoso durante la autenticación.

En cuanto a la razón por la cual las conexiones sin contraseña con el usuario postgres son comunes, el debian PG-9.1 pg_hba.conf tiene este comentario acerca de no permitir ellas:

# DO NOT DISABLE! 
# If you change this first entry you will need to make sure that the 
# database superuser can access the database using some other method. 
# Noninteractive access to all databases is required during automatic 
# maintenance (custom daily cronjobs, replication, and similar tasks). 
# 
# Database administrative login by Unix domain socket 
local all    postgres        peer 

Desde Debian y Ubuntu utilizan los mismos paquetes de postgres, esto se aplica a Ubuntu también.

+0

Estaba en el archivo .pgpass, gracias! La parte del archivo pg_hba.conf que citó me confunde un poco. ¿Qué puedo hacer para otorgar acceso no interactivo sin permitir que los postgres inicien sesión sin una contraseña? – Basil

+0

la autenticación de pares debe buscarse para esto, suponiendo que no permita que las personas inicien sesión en el servidor bajo la cuenta de Postgres. – Andrew

+1

Noté el mismo comportamiento en Windows. Después de agregar nuevas conexiones en PgAdminIII, psql ya no me solicitó una contraseña cuando me conecté con postgres. El culpable fue pgpass.conf, creado automáticamente por PgAdminIII en la carpeta% APPDATA% \ postgresql. Gracias Daniel. –

5

Re su comportamiento extraño, creo que te has perdido una línea de pg_hba.conf que es específico para el usuario postgres. Por favor, muestre la salida de:

grep '^[^#]' pg_hba.conf 

En cuanto a ident vs md5; Personalmente prefiero ident para uso interactivo en desarrollo, y está bien para usuarios normales, pero no creo que dar acceso al usuario postgres a través de sudo es una gran idea. Tanto sudo -u postgres psql como psql -U postgres -W otorgan acceso al rol de superusuario de postgres y, por lo tanto, acceso al sistema de archivos como el usuario de la base de datos. Tampoco se necesita una contraseña de root, y sudo se puede restringir fácilmente a través de sudoers para limitar al usuario que invoca a simplemente ejecutar psql. Sin embargo, con sudo -u postgres psql el cliente código también se ejecuta como postgres, por lo que es una superficie de ataque más grande, y siempre existe la posibilidad de que el usuario encuentre una forma de eludir sus límites sudoer.

Yo uso ident en dev, md5 en producción.

+0

Gracias por la aclaración sobre los métodos de autenticación. Agregué el resultado a la pregunta. – Basil

Cuestiones relacionadas