Asegurando la cuenta de administrador postgres
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
[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:
- 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
- El acceso mediante sockets será usado solamente por la cuenta de administrador “postgres”. El resto de usuarios utilizarán el protocolo tcp/ip.
- 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:
- Para convertir la cuenta postgres del sistema operativo en una cuenta sin clave definida ejecutar como root:
passwd -d postgres
- 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.
- Cambiar en el fichero de configuración postgresql.conf las siguientes lineas:
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.
listen_addresses = 'localhost' unix_socket_permissions = 0700
- Actualizar el fichero pg_ident.conf con la siguiente linea:
Y comprobar que la única linea en pg_hba.conf con información sobre el usuario “postgres” es la siguiente:
administrador postgres postgres
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.