En el articulo anterior se hablo de ¿Cómo instalar PostgreSQL en Centos?, pero no se menciono en ningún momento los aspectos relacionados con la seguridad y como poder configurarlo. En este post se trata todo el tema de configuración en una situación ideal, claro está, que se explican algunas ideas que se pueden adaptar a las necesidades de cada implementación.

Vamos a explicar varios niveles de configuración, estos serán en el; Sistema Operativo y Manejador de Base de Datos. En el caso del SO hacemos referencia unicamente al Firewall, luego en el manejador configuramos una lista de acceso.

Empecemos con la configuración de algunas cosas en el SO, primero debemos asignarle una contraseña al usuario de postgres:

passwd postgres

Luego habilitamos el acceso externo agregando un permiso al puerto número 5432 con la aplicación que administra el Firewall:

system-config-securitylevel-tui -q --port=5432:tcp

Ahora vamos con la parte del Manejador, por defecto la configuración del control de acceso viene restringida a conexiones locales y niega cualquier conexión remota, por lo que debemos ir habilitando una serie de permisos para conceder dicho acceso, recuerde lo siguiente al configurar los parámetros: “si existen parámetros definidos más de una ves, se utilizaran siempre los últimos”.

Editamos el archivo de configuración:

vim /var/lib/pgsql/9.0/data/postgresql.conf

Buscamos los siguientes parámetros, los descomentamos (#) si es necesario y le asignamos los siguientes valores, quedando como se muestran en las siguientes líneas:

listen_addresses = '*'
port = 5432
password_encryption = on

El siguiente archivo de configuración define la lista de control de acceso y las reglas de autentificación del cliente al manejador:

vim /var/lib/pgsql/9.0/data/pg_hba.conf

Puede agregar varias reglas de acceso remoto, voy a mostrar tres ejemplos básicos que se puede presentar, en la documentación que se encuentra incorporada dentro del archivo ayuda bastante para un mejor entendimiento:

  • Esta línea permite que cualquier cliente pueda conectarse a cualquier Base de Datos, por lo que es muy peligroso, pero en ciertos ambientes es muy útil, mas por comodidad:

    host all all 0.0.0.0/0 md5
    
  • La siguiente línea permite la conexión de cualquier usuario de forma local, no es necesario acceder por el usuario postgres, puede hacerlo desde root u otros.

    local all all  password
    
  • La siguiente línea permite la conexión de un usuario, base de datos y dirección IP en especifico, por lo que mejora aún mas la seguridad, esta línea se repite con los ajustes necesarios por cada usuario o DB que se le conceda acceso:

    host DB UserDB 192.168.1.10/24 md5
    

NOTA: Recuerde que no debe permitir acceso remoto al usuario postgres, y cada base de datos debe tener su propio usuario, el dueño no puede ser de dicho usuario, por lo que la DB no estaría aislada de las demás, hay que evitar que exista acceso total con otros usuarios excepto postgres. Recuerde que cuando modifica el archivo “pg_hba.conf” debe reiniciar el servicio para que los cambios surjan efecto.

service postgresql-9.0 restart

Asignamos una contraseña al usuario postgres dentro del manejador, esta puede ser la misma que le definimos al usuario del SO, primero debemos accedemos a la consola del manejador:

su - postgres -c 'psql'

Escribimos el siguiente sentencia en SQL para cambiar la contraseña:

ALTER USER postgres WITH PASSWORD 'new_password';

Para verificar todo, solo nos queda conectarnos desde otro equipo para probar si esta funcionando correctamente.

psql -h 192.168.1.2 -U postgres -W