Asegurando la cuenta de administrador "postgres"

seguridad

La cuenta de administrator es la cuenta más importante de nuestro sistema y se merece una atención especial por nuestra parte para evitarnos problemas de seguridad. Un fallo en la configuración de la misma puede poner la integridad de nuestro sistema en peligro.

Por defecto PostgreSQL instala una cuenta de administrador llamada 'postgres'. La información de esta cuenta y lo que puede hacer se puede acceder en los catálogos de sistema, pg_authid, pg_roles, pg_shadow y pg_users. Más información sobre estos catalogos se encuentra disponible en el Capítulo 44. System Catalogs de la documentación oficial.

Por defecto despues de instalar postgreSQL, la cuenta "postgres" no tiene definida ninguna clave de acceso y cualquier usuario que tenga acceso a la maquina que este ejecutando PostgreSQL, podrá acceder a todas nuestras bases de datos como usuario "postgres" via sockets.

Esto lo podemos comprobar viendo la información definida, por ejemplo en pg_shadow y en pg_hba.conf (Más información sobre pg_hba.conf y postgresql.conf en Configuración básica de PostgreSQL)

[postgres@server]~$ psql 

Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

postgres=# SELECT * from pg_shadow;

   usename   | usesysid | usecreatedb | usesuper | usecatupd |     passwd    | valuntil | useconfig 
-------------+----------+-------------+----------+-----------+---------------+----------+-----------
 postgres    |       10 | t           | t        | t         |               |          |
 
(1 rows)

postgres=# \q

[postgres@server]~$ grep postgres /var/pgsql/data/pg_hba.conf
local   all         postgres                               trust

Esta configuración por defecto puede ser un gran problema de seguridad en una máquina en la que muchos usuarios tengan acceso y tengamos bases de datos en producción ó con datos confidenciales.

Cualquier usuario con acceso a la máquina en cuestion podria acceder a PostgreSQL como usuario "postgres" y tener privilegios de administrador para hacer lo que quiera con nuestras bases de datos:

usuario@server:~$ psql -U postgres
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

Existen diferentes maneras de asegurar nuestra cuenta de administrador en PostgreSQL y nuestras bases de datos. A continuación teneis una manera de hacerlo que según nuestra experiencia es una de las mejores y más seguras. Implementaremos las siguientes medidas:

  1. Tener una cuenta de sistema (postgres) en el sistema operativo sin clave definida. Habrá que ser root y utilizar su - postgres para convertirse en el usuario "postgres". No será posible acceder directamente al sistema como "postgres" via tcp/ip
  2. El acceso mediante sockets será usado solamente por la cuenta de administrador "postgres". El resto de usuarios utilizarán el protocolo tcp/ip.
  3. Cambiar los permisos del socket utilizado por PostgreSQL
  4. Utilizar el metodo de autentificación 'ident' para la cuenta "postgres" en nuestro gestor de base de datos. De esta manera solamente el usuario postgres del sistema operativo podrá acceder a PostgreSQL como el usuario "postgres" de la base de datos

Para implementar estas medidas tendremos que cambiar la configuración por defecto siguiendo estos pasos:

  1. Para convertir la cuenta postgres del sistema operativo en una cuenta sin clave definida ejecutar como root:
    passwd -d postgres
    
  2. Comprobar que no teneis ninguna definición en pg_hba.conf para usuarios normales usando sockets (local) en el tipo de conexión. Si teneis usuarios usando sockets, cambiar el tipo de conexión a host y usar 127.0.0.1/255.255.255.255 (localhost) como IP de acceso. Con psql tendreis que utilizar psql -h localhost -U usuario para acceder al sistema.
  3. Cambiar en el fichero de configuración postgresql.conf las siguientes lineas:
    listen_addresses = 'localhost' 
    unix_socket_permissions = 0700
    

    Si las bases de datos van a ser accedidas desde otras maquinas externas, tendreis que definir tambien en listen_addresses la IP del servidor postgreSQL.

  4. Actualizar el fichero pg_ident.conf con la siguiente linea:
    administrador         postgres          postgres
    

    Y comprobar que la única linea en pg_hba.conf con información sobre el usuario "postgres" es la siguiente:

    local   all         postgres        ident   administrador
    

No olvidar ejecutar un restart de PostgreSQL para que los cambios se instalen.

Como podeis ver en el siguiente ejemplo, ni siendo administrador root en nuestro sistema operativo podremos acceder como usuario "postgres" a nuestro sistema de bases de datos PostgreSQL. Primero tendremos que convertirnos en usuario postgres en nuestro sistema operativo.


[usuario@server:~] $ psql -U postgres
psql: could not connect to server: Permission denied
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

[usuario@server:~] $ psql -h localhost -U postgres
psql: FATAL:  no pg_hba.conf entry for host "127.0.0.1", user "postgres", database "postgres", SSL off

[root@server:~] # psql
psql: FATAL:  no pg_hba.conf entry for host "[local]", user "root", database "root", SSL off

[root@server:~] # psql -U postgres
psql: FATAL:  Ident authentication failed for user "postgres"

[root@server:~] # su - postgres
[postgres@server:~] $ psql

Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

postgres=# 

Y por último solo nos queda comentar que en sistemas que estén en producción y con datos importantes, debeis restringir a un mínimo el numero de personas con acceso a la cuenta "postgres" del sistema. Solamente administradores de confianza y que sepan que es lo que están haciendo deberian de obtener este acceso para evitar problemas mayores.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Como copiar con el usuario postgres mediante el comando scp

Estaba muy bueno el tutorial, pero tengo algunas dudas,
1- Seria recomendable crear otro usuario para tareas administrativas???
1- Si el usuario postgres no aparece registrado en el sistema con contraseña entonces porque cuando intento relaizar una copia utilizando el comando scp este me pide contraseña para el usuario postgres???

Imagen de yair.aviles

Sirve para Sistemas Operativos Win y Linux

Esta muy bei el tuto mi querido rafaelm, solamente quisiera saber si esta configuración la puedo realizar tanto en Linux como en Windows?

Imagen de rafaelma

Re: Sirve para Sistemas Operativos Win y Linux

Sinceramente no se como funciona ident en Windows. Si windows tiene un servicio ident instalado deberia de funcionar sin problemas.

--
Rafael Martinez
PostgreSQL-es

ERROR EN CONEXION

CORDIAL SALUDO:

Tengo el siguiente problema , mi base de datos en postgres, no me permite hacer dblink, cuando realizo el siguiente sql

select *
from dblink('dbname=Clinica user=postgres password=postgres','select * from repexc')
as t1(empcod character(2), mcdpto character(9),repclctv smallint, repcldsc character(60),repulctv smallint)

Me genera el siguiente error

ERROR: could not establish connection
DETAIL: no se pudo conectar con el servidor: Permiso denegado
¿Está el servidor en ejecución localmente y aceptando
conexiones en el socket de dominio Unix «/tmp/.s.PGSQL.5432»?

desde un pgadmin si me deja conectar bien a la base de datos.

Quisiera saber que es porque el problema, no entiendo, ya he intentado de todo, busque en los foros, mire el pg_hba.conf y nada, que puede ser.

Gracias

Solucion

Ya lo solucione, si alguien tiene el mismo inconveniente con gusto a mi correo jealbave@gmail.com y les escribiré la solución..

Gracias..