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:
Para implementar estas medidas tendremos que cambiar la configuración por defecto siguiendo estos pasos:
passwd -d postgres
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.
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
Como copiar con el usuario postgres mediante el comando scp
Vie, 16/07/2010 - 21:26 — lgarciamEstaba 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???
Sirve para Sistemas Operativos Win y Linux
Mar, 15/02/2011 - 01:56 — yair.avilesEsta muy bei el tuto mi querido rafaelm, solamente quisiera saber si esta configuración la puedo realizar tanto en Linux como en Windows?
Re: Sirve para Sistemas Operativos Win y Linux
Mar, 15/02/2011 - 10:13 — rafaelmaSinceramente 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
Mar, 08/03/2011 - 23:39 — AnónimoCORDIAL 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
Sáb, 12/03/2011 - 04:01 — AnónimoYa lo solucione, si alguien tiene el mismo inconveniente con gusto a mi correo jealbave@gmail.com y les escribiré la solución..
Gracias..
Enviar nuevo comentario