Las siguientes instrucciones son muy simples y son necesarias para mejorar aún más la seguridad del Manejador de Base de Datos, lo que buscamos es aislar cada una de las Bases de Datos, para evitar acceso no deseado y que pueda ser comprometido. Es muy importante destacar que este post esta echo para las versiones de PostgreSQL 8.2 en adelante.

Este es un descuido un poco común y debemos cuidar constantemente, debido a que una incorrecta  manipulación de las políticas o posible ausencia de las mismas, puedan alterar la configuración haciendo del sistema mas vulnerable. En el proceso de configuración vamos a implementar los siguientes consejos de seguridad:

Nunca debemos conceder acceso al usuario postgres de forma remota.

  • Nunca debemos asignar como dueño de cualquier objeto al usuario postgres; estos pueden ser base de datos, esquemas, tablas, vistas, funciones, etc…
  • Nunca debemos crear un usuario con privilegios de super usuario.
  • Definir una lista de acceso por cada Usuario a una Base de Datos en especifico, si es posible inclusive por direcciones IP para restringir aún mas el acceso.

En el siguiente tutorial explicamos paso a paso un escenario con dos Base de Datos; una llamada Alpha y la otra Beta. Donde en cada una de las Base de Datos le creamos su respectivo usuario, definimos las políticas de seguridad y luego hacemos una simple prueba dentro de la herramienta de la línea de comandos psql, que es muy versátil para esto. Los pasos a seguir son los siguientes:

  • Crear un usuario restringido para cada Base de Datos, es aconsejable darles un nombre semejante:
CREATE USER us_alpha WITH NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE PASSWORD 'alpha';
CREATE USER us_beta WITH NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE PASSWORD 'beta';
  • Creamos la Base de Datos y les asignamos como dueño a los usuarios creados anteriormente, adicionalmente por recomendación le asignamos la codificación UTF8.
CREATE DATABASE alpha OWNER = us_alpha ENCODING = 'UTF8';
CREATE DATABASE beta  OWNER = us_beta  ENCODING = 'UTF8';
  • Por ultimo definimos una serie de reglas que indicamos a cada Base de Datos que usuario será negado a conectarse:
REVOKE CONNECT ON DATABASE postgres  FROM PUBLIC;
REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;
REVOKE CONNECT ON DATABASE alpha     FROM us_beta;
REVOKE CONNECT ON DATABASE beta      FROM us_alpha;

Por ende, si queremos que solo un usuario tenga acceso a su Base de Datos y el resto no, debemos remover el permiso por cada usuario que exista. Es muy importante resaltar, que las dos primeras líneas niegan cualquier acceso creado en el sistema a las bases de datos postgres y a template1, solo sera concedido al super usuario.

Ahora ponemos a prueba la configuración, conectándonos a una Base de Datos y luego tratarnos de cambiar a otra Base de Datos, si todo esta bien nos debe mostrarnos un mensaje que nos niega el cambio. 

NOTA: Para poder apreciar el cambio de política de seguridad sobre el usuario, debemos conectarnos con dicho usuario, al hacerlo con el usuario postgres no podremos ver aplicadas las políticas ya que este es el super usuario y se salta dichas políticas.

  • Accedemos a la base de datos llamada beta con su respectiva autentificación.
psql -h localhost -U us_beta beta
  • Al hacer el intento de cambiarnos de base de datos nos niega con el siguiente mensaje:
\c alpha
Password for user us_beta:
FATAL:  permission denied for database "alpha"
DETAIL:  User does not have CONNECT privilege.
Previous connection kept

Aquí les dejo las siguientes líneas que son para borrar las base de datos que se han creado de prueba:

DROP DATABASE alpha;
DROP DATABASE beta;
DROP USER us_alpha;
DROP USER us_beta;