Otro punto de vista sobre la Administración de Bases de Datos


miércoles, 10 de febrero de 2010

Configurar Autentificación SSL

He comprobado que hay bastante información sobre este tipo de configuraciones sin embargo he visto que esta algo confusa y a veces hay demasiada información. Para configurar una autentificación SSL de forma sencilla y rápida es necesario seguir los siguientes pasos. En primer lugar hay que distinguir la configuracion necesaria en el servidor y en el cliente.


1.- Creación de un wallet.

1.1.- Creación del wallet en el servidor.

Hay dos herramientas para crear un wallet, la herramienta gráfica es Oracle Wallet Manager (owm) y en modo línea de comando (orapki).

Para crear el wallet lo vamos a hacer con la herramienta orapki.

a) Creación del wallet en el servidor.

orapki wallet create -wallet . -auto_login -pwd password

b) Generar un certificado para el servidor.

orapki wallet add -wallet . -dn "CN=serverdb" -keysize1024 -self_signed -validity 3650 -pwd password

NOTA: ORACLE recomienda el uso de certificados auto firmados solo para pruebas, nunca para entornos de producción.

c) Exportar el certificado del servidor a un fichero.

orapki wallet export -wallet . -dn "CN=serverdb" -cert serverdb.cer

Una vez creado el wallet debemos comprobar que en el directorio donde vamos a ubicar los wallets se han creado los siguientes ficheros:

ewallet.p12 : Fichero de wallet
cwallet.sso : Fichero de wallet para permitir la auto conexión
serverdb.cer : Fichero del certificado auto firmado para el servidor

1.2.- Creación de un wallet para el cliente.

Es necesario seguir los mismos pasos que para el servidor. Hay que situarse en el directorio donde se van a ubicar los wallets, en este ejemplo C:\Documents and settings\usuario1\ORACLE\WALLETS

a) Creación del wallet en el cliente.

orapki wallet create -wallet . -auto_login -pwd password

b) Generar un certificado auto firmado para el cliente.

orapki wallet add -wallet . -dn "CN=usuario1" -keysize 1024 -self_signed -validity 3650 -pwd password

NOTA: Se debe crear el certificado para el usuario con el que nos conectamos en el cliente, es decir el usuario de Unix o el usuario Windows en cada caso.

c) Exportar el certificado a un fichero.

orapki wallet export -wallet . -dn "CN=usuario1" -cert usuario1.cer

Tendremos los siguientes ficheros en la carpeta de wallets:

ewallet.p12 : Fichero de wallet
cwallet.sso : Fichero de wallet para permitir la auto conexión
usuario1.cer : Fichero del certificado auto firmado para el usuario1 en el cliente

2.- Copiar los certificados.

El siguiente paso es copiar el certificado generado para el cliente al servidor y viceversa. La copia se puede hacer con scp o con copiar y pegar para cada uno de los ficheros.

3.- Importar los certificados en cada uno de los wallets.

Ahora es necesario importar el certificado generado en el cliente en el wallet del servidor, para esto vamos a usar la herramienta gráfica Oracle Wallet Manager.

Arrancamos el owm en el servidor, abrimos el wallet, es necesario introducir la password que dimos en el punto 1 al crear el wallet.

En la pestaña "Operaciones" pinchamos en "Importar Certificado Protegido". Marcamos la opción "Seleccionar un archivo que contenga el certificado", pinchamos en Aceptar, nos muestra una ventana de busqueda para localizar el certificado generado para el cliente y poder seleccionarlo. En este ejemplo es el fichero usuario1.cer, una vez seleccionado aparece en la lista de certificados protegidos.

A continuación repetimos el proceso para importar en el cliente el certificado generado en el servidor. Se debe ejecutar el owm en el cliente e importar el fichero serverdb.cer.

4.- Crear un usuario de base de datos.

En el servidor de base de datos se crea un usuario de la siguiente forma:

SQL> create user usuario1 identified externally as 'CN=usuario1';

SQL> grant create session to usuario1;

NOTA: Para versiones 10.1 o anteriores el usuario se crea con :

SQL> create user usuario1 identified globally as 'CN=usuario1';

en caso contrario nos puede dar el error ORA-01017: invalid username/password; logon denied.

5.- Configuración de ficheros de Oracle.

5.1.- Configuración de ficheros del servidor.

a) Fichero LISTENER.ora

Se añade un nuevo servicio de Listener con protocolo TCPS y puerto 2484.

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = Servidor)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCPS)(HOST = Servidor)(PORT = 2484))
)
)

#listener uses the same wallet that database uses

wallet_location =
(SOURCE=
(METHOD=File)
(METHOD_DATA= (DIRECTORY="C:\Documents and Settings\Servidor\ORACLE\WALLETS") )
)

#This parameter should be false as listener is not going to authenticate the clients.
# It is the server process that authenticates the clients.

SSL_CLIENT_AUTHENTICATION = FALSE

b) Fichero SQLNET.ora

SQLNET.AUTHENTICATION_SERVICES= (NTS,BEQ,TCPS)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

# Specify the server wallet location

WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = "C:\Documents and Settings\Servidor\ORACLE\WALLETS")
)
)

SSL_CLIENT_AUTHENTICATION=TRUE

5.2.- Ficheros de configuración en el cliente.

a) Fichero TNSNAMES.ora

Se añade un nuevo servicio en el fichero TNSNAMES.ora

serverdbSSL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCPS)(HOST = Servidor)(PORT = 2484))
)
(CONNECT_DATA =
(SERVICE_NAME = serverdb)
)
(SECURITY=
(SSL_SERVER_CERT_DN="CN=serverdb")
)

b) Fichero SQLNET.ora

SQLNET.AUTHENTICATION_SERVICES= (TCPS,NTS,BEQ)

NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, EZCONNECT, ONAMES, HOSTNAME)

#Specify the client wallet location

WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = "C:\Documents and ettings\usuario1\ORACLE\WALLETS")
)
)

#Set this parameter ON so that SSL_SERVER_CERT_DN in tnsnames.ora is effective

SSL_SERVER_DN_MATCH=TRUE

SSL_CLIENT_AUTHENTICATION=FALSE

6.- Pruebas de funcionamiento.

Por último, vamos a comprobar que la configuración funciona correctamente.

Desde el cliente nos conectamos al servidor.

SQL> connect system/password@serverdbSSL
Connected

SQL> show user
USER es "SYSTEM"

Para comprobar el protocolo que estamos usando:

SQL> select sys_context('USERENV','NETWORK_PROTOCOL') protocol from dual;

PROTOCOL
-------------

tcps

Para conectarse con el usuario que ha creado el certificado no es necesario usar password.

SQL> connect /@serverdbSSL
Connected

SQL> show user
USER es "usuario1"


LINKS

Step by Step Guide To Configure SSL Authentication [ID 736510.1]

Oracle Authentication with Certificates. Gracias a Fabrizio Magni