PostgreSQL OpenSSL
PostgreSQL OpenSSL
PostgreSQL OpenSSL
con
./configure
puede encontrar en el artculo Instalacin e inicializacin bsica de PostgreSQL desde el cdigo fuente. Los paquetes binarios disponibles para Unix/Linux y Windows suelen ser compilados con soporte SSL.
Para activar el soporte SSL en un sistema que cumple los requerimientos que hemos nombrado hay que hacer tres cosas:
Certificados
Lo primero que necesitamos es el certificado SSL que vamos a usar en nuestro servidor, la correspondiente clave privada, el certificado CA y un fichero crl. Normalmente los certificados digitales se suelen comprar a una entidad emisora y estn vigentes por un determinado periodo de tiempo. Estos certificados estn firmados por unaautoridad de certificacin (CA) la cual es una entidad de confianza, responsable de emitir y revocar certificados digitales. Si las conexiones que van a usar SSL son internas y locales, no hace falta pagar a una autoridad de certificacin para que emita y firme nuestros certificados con su certificado CA. Nosotros mismos podemos generar el certificado y firmarlo como un CA local. Para esto tenemos que hacer lo siguiente: Instalar la infraestructura necesaria para ser una CA local Generar un certificado y llave CA que utilizaremos para firmar los certificados que vayamos a usar en nuestros sistemas Generar el certificado y la llave que el servidor PostgreSQL necesita Firmar nuestro certificado del servidor con el CA que hemos generado
/etc/CA_local
/etc/CA_local/newcerts \ /etc/CA_local/crl
Ahora copiamos el fichero de configuracin global de openssl (/etc/ssl/openssl.cnf en mi sistema) a nuestro directorio CA_local.
# cp /etc/ssl/openssl.cnf /etc/CA_local/openssl.local.cnf # chmod 0600 /etc/CA_local/openssl.local.cnf
/etc/CA_local/openssl.local.cnf.
En la seccin [ CA_default ],
Tambien necesitamos tres ficheros extras que podemos crear de la siguiente manera:
# touch /etc/CA_local/index.txt # echo '01' > /etc/CA_local/serial # echo '01' > /etc/CA_local/crlnumber
Este ltimo comando crear un certificado CA autofirmado con una validez de 5 aos. Tendreis que definir una contrasea para la llave privada CA (no olvidar esta contrasea!! ya que se necesitar cada vez que usemos el certificado local CA) y rellenar algunos parmetros para vuestro sistema. En mi sistema de ejemplo, estos son los datos introducidos.
Generating a 1024 bit RSA private key ...................++++++ writing new private key to 'private/local_ca.key' 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 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]:NO State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:Oslo Organization Name (eg, company) [Internet Widgits Pty Ltd]:PostgreSQL-es.org Organizational Unit Name (eg, section) []:. Common Name (eg, YOUR name) []:postgresql-es.org Email Address []:[email protected]
Una vez realizado estos pasos se habrn creado dos ficheros en vuestro sistema:
El fichero CRL (Certificate Revocation List) con la lista de certificados revocados por este CA lo podeis crear con:
openssl ca -config openssl.local.cnf -keyfile private/local_ca.key \ -cert certs/local_ca.crt -gencrl -out crl/local_ca.crl
Con esto generamos la solicitud de certificado con una validez de 2 aos, despus de rellenar algunos parmetros de nuestro sistema. En nuestro ejemplo, estos son los datos introducidos.
Generating a 1024 bit RSA private key .........++++++ ............................++++++ writing new private key to 'private/server.key' ----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]:NO State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:Oslo Organization Name (eg, company) [Internet Widgits Pty Ltd]:PostgreSQL-es.org Organizational Unit Name (eg, section) []:. Common Name (eg, YOUR name) []:ejemplo.postgresql-es.org Email Address []:[email protected]
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Los parmetros a rellenar ms importantes son "Common Name" y "Email Address". "Common Name" debera de tener el nombre de la mquina que va a estar utilizando el certificado, "Email Address" es la direccin de contacto de vuestro sistema. No teneis que introducir nada en los parametros "challenge password" y "optional company name" del final. Hemos utilizado el parmetro -nodes para no tener que proteger nuestra llave privada con una contrasea y no tener que escribir una contrasea cada vez que arranquemos un servicio que use el certificado. Por ello es muy importante no perder publicar el fichero con la llave privada.
Firmar nuestra solicitud de certificado con nuestro CA para generar el certificado final
Una vez que tenemos la solicitud de certificado (server.csr), vamos a firmarla con nuestro certificado CA. Para ello utilizamos este comando:
# cd /etc/CA_local/ # openssl ca -config openssl.local.cnf -policy policy_anything \ -days 730 -out certs/ejemplo.postgresql-es.org.crt \ -infiles ejemplo.postgresql-es.org.csr
Tendremos que utilizar la contrasea que usamos cuando creamos el certificado CA para terminar de firmar nuestro certificado:
Using configuration from openssl.local.cnf Enter pass phrase for /etc/CA_local/private/local_ca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Nov 30 20:05:18 2009 GMT Not After : Nov 30 20:05:18 2011 GMT Subject: countryName localityName organizationName commonName emailAddress X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 58:40:FC:0A:85:C7:58:9D:9D:66:8A:7F:0A:CB:46:65:CD:A2:92:20 X509v3 Authority Key Identifier: = NO = Oslo = PostgreSQL-es.org = ejemplo.postgresql-es.org = [email protected]
keyid:54:11:C7:CD:1A:1D:54:01:42:D1:FC:1A:1A:DD:ED:B5:5E:E6:89:BF
Certificate is to be certified until Nov 30 20:05:18 2011 GMT (730 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
Vamos a asegurar mejor la clave privada del certificado. Este fichero es privado y no se debe de distribuir:
# chown root:root /etc/CA_local/private/ejemplo.postgresql-es.org.key # chmod 0400 /etc/CA_local/private/ejemplo.postgresql-es.org.key
Esto es todo lo que necesitais saber sobre certificados si quereis hacerlo todo vosotros para uso local/privado. Al final de todo el proceso tendreis los siguientes ficheros en el directorio certificados.
/etc/CA_local
/etc/CA_local/certs/local_ca.crt: Certificado CA local que podeis utilizar para firmar otros /etc/CA_local/certs/ejemplo.postgresql-es.org.crt: Certificado firmado por el CA local que vamos a usar
en ejemplo.postgresql-es.org /etc/CA_local/private/local_ca.key: Llave privada del certificado CA local
y/etc/CA_local/crl/local_ca.crl al
directorio de datos de nuestra instalacin PostgreSQL. En nuestro ejemplo tenemos el directorio de datos en
/var/pgsql-8.4/data
# cp /etc/CA_local/certs/ejemplo.postgresql-es.org.crt \ /var/pgsql-8.4/data/server.crt
# cp /etc/CA_local/private/ejemplo.postgresql-es.org.key \ /var/pgsql-8.4/data/server.key
# chown postgres:postgres /var/pgsql-8.4/data/server.* # chown postgres:postgres /var/pgsql-8.4/data/root.* # chmod 0400 /var/pgsql-8.4/data/server.* # chmod 0400 /var/pgsql-8.4/data/root.*
Despus tenemos que actualizar nuestro fichero el valor del parametro ssl.
ssl = on
/var/pgsql-8.4/data/postgresql.conf.
Y arrancar PostgreSQL de nuevo usando el script det arranque de nuestro sistema. En nuestro servidor ejemplo ejecutamos esto:
/etc/init.d/postgresql stop /etc/init.d/postgresql start
/var/pgsql-8.4/data/pg_hba.conf
md5
127.0.0.1/32
Si hemos hecho las cosas correctamente deberiamos de poder conectar con nuestro servidor PostgreSQL via SSL y cifrando nuestro trfico. La linea que hemos definido en pg_hba.conf define que el usuario postgres puede conectarse desde 127.0.0.1/32 a todas las bases de datos de nuestra instalacion solamente via SSL y escribiendo la clave de acceso (Teneis que haber definido la clave del usuario postgres con antelacin para que esto funcione). Vosotros tendreis que configurar vuestro sistema para dar acceso a los clientes de vuestro sistema.
postgres@core4:~$ psql -h 127.0.0.1 password:
psql (8.4.1) SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help.
postgres=#
La linea
indica que la conexin est cifrada via SSL. Si habeis llegado hasta aqu, ya teneis el servidor PostgreSQL configurado para recibir conexiones via SSL y cifrar el trfico entre los clientes y el servidor de bases de datos.
de nuestro servidor.
Para activar esta posibilidad lo primero que tenemos que hacer es crear un certificado para nuestro cliente y firmarlo con nuestro certificado CA local. A continuacin debemos crear un subdirectorio (~/.postgresql/) en el directorio HOME del usuario que va a ejecutar el programa cliente, y para terminar tenemos que copiar a este subdirectorio cuatro ficheros. En nuestro ejemplo creamos el directorio
/home/postgresql/.postgresql
/home/postgresql/.postgresql/postgresql.key: Llave privada del certificado creado para el cliente /home/postgresql/.postgresql/root.crt: Certificado CA local utilizado para firmar el certificado creado
para el cliente
/var/pgsql-8.4/data/pg_hba.conf
md5 clientcert=1
hostssl
clientcert=1.
definir que la conexin se pueda realizar solamente desde clientes que tengan instalado un certificado que est firmado por una autoridad de certificacin (CA) que reconozcamos. Si no tuviesemos los ficheros necesarios en conectarnos.
# psql -h 127.0.0.1 -U postgres psql: could not open certificate file "/home/postgres/.postgresql/postgresql.crt": No such file or directory
/home/postgresql/.postgresql/,
FATAL: FATAL:
connection requires a valid client certificate no pg_hba.conf entry for host "127.0.0.1", user "postgres", database "postgres", SSL off
Este tipo de autentificacin se activa usando el metodo 'cert' en la opcin mtodo cuando definamos el acceso en
pg_hba.conf.
clave de acceso pero deberemos de proveer un certificado valido. El atributo CN (lo que se define en 'Common Name (eg, YOUR name) []:') del certificado es el atributo que se comprueba para ver si corresponde con el usuario con el que se intenta conectar. Si el CN no es igual al usuario de la base de datos con el que se intenta conectar podemos usar mapas de usuario en el servidor para hacer la conversin. Lo primero que tenemos que hacer es crear un certificado para nuestro usuario ('Common Name (eg, YOUR name) []: postgres') y firmarlo con nuestro certificado CA local. A continuacin copiamos este certificado y la llave privada a/home/postgresql/.postgresql/postgresql.crt y
/home/postgresql/.postgresql/postgresql.key /var/pgsql-8.4/data/pg_hba.conf
cert
en el ordenador cliente.
Si no tuviesemos el certificado correcto instalado, el sistema nos daria un error similar al que se obtiene cuando la autentificacin con certificado del ordenador cliente falla.