sábado, 17 de septiembre de 2016

PostgreSQL y el Soporte de Conexiones Seguras mediante SSL



En esta entrada vamos a configurar el gestor de bases de datos PostgreSQL en su versión 9.5 para que trabaje utilizando conexiones seguras. El servidor está preparado para aceptar sesiones de clientes remotos mediante conexiones TCP estándar y cifradas con Secure Sockets Layer, y lo más importante es que ambas utilizarán el mismo puerto.


El uso de conexiones seguras permite, mediante una clave, cifrar el tráfico entre los clientes y el servidor, evitando que alguien pueda interceptarlo y obtener los datos que viajan por ésta. Para habilitar este tipo de conexiones se necesita que durante la compilación se utilice el parámetro --with-ssl como se detalla en la entrada Instalación Básica del Servidor PostgreSQL usando el Código Fuente y activar el soporte SSL en la base de datos mediante el ajuste del parámetro de configuración ssl en el archivo postgresql.conf.

Sin embargo, una vez que se habilita las conexiones SSL, el servidor de PostgreSQL se asegurará que las claves de cifrado y/o los archivos de certificados estén disponibles en el directorio de datos, de lo contrario, no se iniciará hasta que los encuentre.

Ahora que hemos habilitado el soporte SSL, el servidor PostgreSQL debe tener acceso tanto a una clave de cifrado como a un certificado. El protocolo SSL utiliza la clave para cifrar los datos de la red, mientras que el cliente remoto utiliza el certificado suministrado por el servidor para validar que la clave de cifrado vino de una fuente de confianza.

Estas claves de cifrado se generan a partir de un certificado firmado por una organización de confianza del cliente y podemos obtenerlo de dos formas:
  • Adquiriéndolo de una autoridad de certificación como Verisign o Thawte.
  • Creando un certificado autofirmado.

Creación de un Certificado Autofirmado

Vamos a crear un certificado autofirmado y una clave de cifrado utilizando la herramienta de código abierto de openssl. Para ello necesitamos realizar los siguientes pasos:
  1. Crear una clave de cifrado protegida por una contraseña.
  2. Eliminar la contraseña de la clave.
  3. Crear el certificado autofirmado.
El primer paso es crear la clave que será usada por PostgreSQL para el cifrado de sesiones SSL y la protegeremos con una contraseña. Para ello emplearemos el comando openssl con la opción req y le suministraremos la información que nos solicite.
$ openssl req -new -text -out server.req
Generating a 2048 bit RSA private key
..........................................................................................+++
................+++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:VE
State or Province Name (full name) [Some-State]:Miranda
Locality Name (eg, city) []:Caracas
Organization Name (eg, company) [Internet Widgits Pty Ltd]:BitacoraTL
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:pgserv
Email Address []:admin@pgserv.com.ve

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

En el paso anterior creamos dos archivos, el primero es el privkey.pem, que contiene la clave de cifrado de archivos y el segundo es server.req que contiene un certificado básico. Nuestro primer archivo que contiene la clave cifrada se encuentra protegido por una contraseña y debemos eliminarla.

Para completar el segundo paso y poder eliminar la contraseña del archivo, utilizaremos la instrucción openssl con la opción rsa como se indica a continuación:
$ openssl  rsa  -in  privkey.pem  -out  server.key
Al ejecutar la instrucción anterior nos pedirá la contraseña introducida en el paso número uno (1). Con esto creamos un archivo con una nueva clave de cifrado llamado server.key que no requiere ingresar una clave de acceso.

Por último, el tercer paso consiste en crear un certificado en un formato estándar X.509 llamado server.crt partiendo de la clave de cifrado sin contraseña y del certificado base.
$ openssl  req  -x509  -in  server.req  -text  -key  server.key  -out  server.crt
Ahora vamos a cambiarle los permisos al archivo server.key porque el servidor lo rechazará si posee permisos amplios.
$ chmod  og-rwx  server.key  server.crt
Un certificado autofirmado se puede utilizar para realizar una prueba, pero un certificado firmado por una autoridad de certificación (CA) global o local se debe utilizar en un ambiente de producción de manera que los clientes pueden verificar la identidad del servidor.


Configuración

Para tener la característica de sesiones seguras en el servidor debemos realizar dos acciones:
  • Primero, editar el archivo $PGHOME/data/postgresql.conf para colocar la variable ssl = on.
  • Luego copiar los archivos server.crt y server.key en $PGHOME/data.

Después de reiniciar el servidor de PostgreSQL, el siguiente paso es usar la aplicación psql con el fin de probar la conexión SSL.
$ psql -h 192.168.1.30 -U postgres -W
Contraseña para usuario postgres:
conexión SSL (protocolo: TLSv1.2, cifrado: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compresión: desactivado)
Digite «help» para obtener ayuda.

postgres=#



No hay comentarios.:

Publicar un comentario