ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

24
AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE 2012 Javier García Cambronel SEGUNDO DE ASIR 14/02/2012

description

2012AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIEJavier García Cambronel SEGUNDO DE ASIR 14/02/2012[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012PREPARAMOS APACHE CON PHP Y MYSQL ¿CREAMOS O IMPORTAMOS LA BASE DE DATOS?OPCION 1 CREAMOS LA BASE DE DATOS DE CERO OPCION 2 IMPORTAMOS LA BASE DE DATOSAUTENTICACION DNI ELECTRONICO VENTAJAS DE LA VALIDACIÓN MEDIANTE DNI ELECTRONICO OCSP Y CLRSEGUNDO DE ASIRPágina 1[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de feb

Transcript of ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

Page 1: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE

2012

Javier García Cambronel SEGUNDO DE ASIR

14/02/2012

Page 2: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 1

PREPARAMOS APACHE CON PHP Y MYSQL

¿CREAMOS O IMPORTAMOS LA BASE DE DATOS?

OPCION 1 CREAMOS LA BASE DE DATOS DE CERO

OPCION 2 IMPORTAMOS LA BASE DE DATOS

AUTENTICACION DNI ELECTRONICO

VENTAJAS DE LA VALIDACIÓN MEDIANTE DNI ELECTRONICO

OCSP Y CLR

Page 3: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 2

PREPARAMOS APACHE CON PHP Y MYSQL

Lo primero que tendríamos que hacer si no lo hemos hecho ya, seria instalar tanto PHP con

dependencias para trabajar con mysql, como php.

Lo dicho anteriormente, si no lo hemos hecho, seguimos estos pasos.

Introducir el siguiente comando para instalar PHP en apache con dependencias MYSQL

sudo apt-get install php5 php5-mysql

Y este último para instalar MYSQL, en el que recomiendo encarecidamente que pongamos

una contraseña

sudo apt-get install mysql-server

Una vez hecho esto, nuestro Apache será capaz de interpretar PHP y trabajar con MYSQL.

Page 4: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 3

¿CREAMOS O IMPORTAMOS LA BASE DE DATOS?

OPCION 1 CREAMOS LA BASE DE DATOS DE CERO

INTRODUCCION CREANDO NUESTRA BASE DE DATOS

Lo primero que hacemos es entrar como usuario en mysql, es decir nos identificamos.

Creamos nuestra base de datos con el nombre que queramos como vamos a trabajar sobre

un foro, lo más lógico será llamarla así

Y con la siguiente orden empezamos a trabajar sobre ella

VENTAJAS:

1. ningún problema de incompatibilidad con nuevas versiones motores de bases de datos.

INCONVENIENTES:

1. tener a manos los códigos de creación o volver a crearlos con el mismo nombre para tablas

y demás que los archivos en php o cambiar estos con todo el trabajo que conlleva sobretodo

en bases de datos complejas.

2. la base de datos, estaría virgen, sin ningún dato y también tendríamos que empezar de

nuevo recuperando los que tuviéramos

Page 5: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 4

CREANDO LAS TABLAS DE NUESTRO FORO

Lo siguiente que debemos hacer es crear las tablas sobre las que vamos a trabajar, aquí

tenemos los códigos que tenemos que introducir, para que cada una de ellas tenga efecto,

recordemos que si cambiamos el nombre a alguna tabla, ese cambio también tendrá que ser

realizado debidamente en los códigos php correspondientes, para que los datos se inserten

correctamente y no tengamos ningún tipo de fallo

CODIGO TABLA USUARIOS

CREATE TABLE usuarios(

email VARCHAR(150) NOT NULL PRIMARY KEY,

password VARCHAR(150));

CODIGO TABLA TEMAS

CREATE TABLE temas_foro(

id_tema INT NOT NULL PRIMARY KEY AUTO_INCREMENT,

titulo_tema VARCHAR(150),

fecha_creacion DATETIME,

email VARCHAR(150) NOT NULL,

FOREIGN KEY (email) REFERENCES usuarios(email));

Page 6: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 5

CODIGO TABLA POSTS

CREATE TABLE posts_foro(

id_post INT NOT NULL PRIMARY KEY AUTO_INCREMENT,

id_tema INT NOT NULL,

texto_post TEXT,

fecha_creacion DATETIME,

email VARCHAR(150) NOT NULL,

creacion VARCHAR(10),

FOREIGN KEY (id_tema) REFERENCES temas_foro(id_tema) ON

DELETE CASCADE,

FOREIGN KEY (email) REFERENCES usuarios(email));

OPCION PARA AÑADIR ARCHIVOS AL CONTESTAR A UN TEMA

Alter table posts_foro add (file varchar(150));

TABLA SESIONES

CREATE TABLE sesiones(

id_sesion VARCHAR(500) NOT NULL PRIMARY KEY,

email VARCHAR(150) NOT NULL,

FOREIGN KEY (email) REFERENCES usuarios(email) ON DELETE

CASCADE);

Page 7: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 6

OPCION 2 IMPORTAMOS LA BASE DE DATOS

PRIMERO: EXPORTAMOS

Lo primero que hacemos es ir donde tenemos nuestra base de datos creada, la escogemos y

pulsamos el botón de exportar.

Tenemos muchas opciones para exportar, desde formato (pdf,Excel…)como tipo de

codificación….

A nosotros nos interesa exportarlo a una base de datos, asique el formato va a ser SQL, es lo

único que nos interesa. Una vez hecho esto guardamos el archivo donde queramos.

VENTAJAS:

1. No necesitamos saber como construimos las tablas, pues la estructura completa se clona.

2. Todos los datos que tuviéramos anteriormente, los seguiremos teniendo., sin necesidad de

volver a introducirlos nuevamente.

INCONVENIENTES:

1. Posibles problemas en la configuración a la hora de importar datos sobre versiones

anteriores de mysql que la original.

Page 8: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 7

INSTALAMOS PHPMYADMIN DONDE IMPORTAREMOS LOS DATOS

Para tener phpMyAdmin, podemos instalar el paquete phpmyadmin de los repositorios

oficiales de Ubuntu.

sudo apt-get install phpmyadmin

Nos saldrá la siguiente ventana y elegiremos apache2

Introducimos la contraseña de la cuenta de Administración (la que hubiéramos dado en root)

Introducimos una contraseña para que phpmyadmin se registre con el servidor, puede ser la

misma que habíamos dado antes.

Page 9: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 8

Después de esto veríamos como todo el proceso se ha llevado a cabo perfectamente

Después de instalarlo hay que hacer un enlace simbólico desde /usr/share/phpmyadmin

hacia /var/www/phpmyadmin para que podamos acceder desde el navegador, sin ningún

problema, lo hacemos con el siguiente comando:

sudo ln -s /usr/share/phpmyadmin /var/www/

Una vez hecho esto, como podemos ver ya podríamos acceder perfectamente desde el

navegador a nuestro phpmyadmin recién instalado.

Page 10: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 9

IMPORTAMOS LOS DATOS

Una vez hemos entrado en phpmyadmin, seleccionamos la pestaña de importar y el botón

examinar, seleccionando el archivo que habíamos guardado.

Puede que nos de un error como el siguiente

Page 11: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 10

La solución a este error, es añadir las siguientes líneas al archivo, desde el cual importamos

los datos, la primera para crear nuestra base de datos y la segunda para seleccionarla.

Una vez hemos hecho estos cambios, volvemos a intentar importar la base de datos y vemos

que ahora el resultado es satisfactorio.

Y como vemos si miramos el contenido de nuestra base de datos podemos ver como los

datos que tuviéramos guardados se han importado correctamente.

Page 12: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 11

AUTENTICACION DNI ELECTRONICO

ACTIVAR MODULO SSL

Para poder realizar conexiones mediante sockets de tipo SSL es necesario tener instalado y

activo el módulo SSL del servidor. En servidores de tipo Debian como nuestro Ubuntu, se

puede activar el módulo utilizando el comando:

sudo a2enmod mod_ssl

Nosotros ya lo habíamos hecho anteriormente, al igual que el crear nuestro certificado, en la

anterior práctica.

DESACTIVAMOS SITIO POR DEFECTO SSL

Lo que tenemos que hacer, es desactivar el sitio por defecto SSL que habíamos creado en la

anterior práctica.

Aunque también podríamos modificarlo para adaptarlo. Pero es mejor crear un host virtual

de cero para no liarnos con las directivas.

sudo a2dissite default-ssl

Page 13: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 12

CÓDIGO HOST VIRTUAL COMENTADO

Para crear este host virtual vamos a modificar el archivo httpd.conf el cual, trabajamos en él,

para crear el host virtual he creado el siguiente código el cual está comentado, para mayor

aclaración.

#se especifica que va a tener efecto en todas las direcciones que utilicen el puerto 443

<VirtualHost *:443>

#se indica el nombre del servidor y el puerto

ServerAdmin webmaster@localhost

# La ruta hasta la carpeta raíz del entorno web en este caso donde esta nuestro foro

DocumentRoot /var/www/foro

# Indicamos donde se guardaran todos los logs de acceso y de errores

ErrorLog /var/log/apache2/site2-error_log

TransferLog /var/log/apache2/site2-access_log

#Se activa el protocolo SSL

SSLEngine on

#se indica la configuración de seguridad, y desactivamos sslv2 debido a sus vulnerabilidades

SSLCipherSuite HIGH:MEDIUM:-SSLv2

#se suministra la ruta al certificado y la llave (el que creamos en la práctica anterior

#certificado autofirmado)

SSLCertificateFile "/etc/apache2/ssl/apache.pem"

SSLCertificateKeyFile "/etc/apache2/ssl/apache.pem"

#especificamos los derechos y opciones en el directorio

<Directory />

Options Indexes FollowSymLinks MultiViews

AllowOverride All

Order allow,deny

#por defecto se permite que todos los usuarios accedan

allow from all

</Directory>

Page 14: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 13

<Directory /var/www/foro>

# la ruta y el nombre del certificado raiz DNIe

SSLCACertificateFile "/etc/ssl/certs/ac_raiz_dnie.crt"

# El cliente debe autenticarse obligatoriamente con el certificado sino no se podrá acceder

SSLVerifyClient require

# Nivel máximo de profundidad (según infraestructura actual, 2)

SSLVerifyDepth 2

AllowOverride None

Order allow,deny

allow from all

</Directory>

#Indicamos al servidor que exporte los datos

SSLOptions +StdEnvVars +ExportCertData

</VirtualHost>

Page 15: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 14

COMPROBAMOS LAS FUENTES

El certificado de la CA del DNIe (ac_raiz_dnie.crt) se puede obtener desde del Portal del DNI

electrónico en la siguiente dirección.

http://www.dnielectronico.es/seccion_integradores/autoridades_cert.html

Como vemos se nos informa de cuales son las funciones hash sha1 y md5 del archivo, lo

subimos como ya viene siendo habitual a virustotal y asi comprobar las fuentes del archivo

que descargamos.

Vemos que el archivo ya ha sido analizado, pues si vamos a implementar un sistema tan

seguro, tendremos que comprobar que realmente es, lo que queremos instalar.

Comprobamos que el archivo está limpio y que tanto el hash MD5 como SHA1 coinciden con

los valores que nos tiene que dar, en la imagen de arriba

Page 16: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 15

INSTALAMOS Y CONFIGURAMOS EL CERTIFICADO RAIZ PARA EL SERVIDOR

Este certificado que hemos descargado esta en formato DER y el servidor web Apache espera

un certificado en formato PEM.

Para convertirlo de formato DER a PEM se puede utilizar la herramienta openssl tal y como

se muestra a continuación:

openssl x509 -in ACRAIZ-SHA1.crt -inform DER -out ac_raiz_dnie.crt -outform PEM

Como vemos una vez realizada la operación tendremos el archivo que queremos y lo

ponemos en la ruta donde guardamos los certificados que es la que hemos indicado en el

archivo de configuración en nuestro caso /etc/ssl/certs

INSTALAMOS EL MODULO CRIPTOGRÁFICO DEL DNIE EN LOS CLIENTES

Una vez hecho esto, nos descargamos desde la página Web el modulo criptográfico de el DNI

electrónico.

http://www.dnielectronico.es/descargas/index.html

Seleccionamos la versión para nuestro sistema operativo.

En cualquiera de los dos casos la instalación se hace con doble click y siguiendo las

instrucciones, las cuales son muy sencillas.

Page 17: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 16

EN WINDOWS:

Necesitaremos reiniciar después de la instalación para que los cambios se lleven a cabo.

Si usamos Firefox nos dara error al implementarlo y tendremos que hacerlo a mano

Desde Opciones->Avanzado->Cifrado->Ver cifrado->importar y seleccionaremos la ruta

La ruta por defecto del certificado es la siguiente:

C:/Program Files (x86)/DNIe/ACRAIZ_CERTIFICATE_AND_CRL_SIGNING_SHA1.crt

EN LINUX (UBUNTU-KOALA)

No es necesario reiniciar después de la instalación

Si tendremos que registrar el modulo desde Aplicaciones->Oficina

Page 18: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 17

ACCEDEMOS MEDIANTE EXPLORER 9

Al intentar entrar en nuestro foro necesitaremos tener el DNI electrónico en nuestro lector, e

introducimos el PIN.

Nos dira, si queremos acceder al sitio WEB, ay que nuestro certificado no esta emitido por

una entidad nos saldrá el siguiente aviso y pulsamos en el botón de ir a este sitio web.

Como vemos accederíamos a nuestro foro mediante certificación con DNI electrónico

Page 19: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 18

ACCEDEMOS MEDIANTE CHROME 17

Intentamos acceder a nuestro foro y pulsamos en continuar de todos modos

Introducimos nuestro Pin con el DNI metido en la lectora

Nos muestra información del Certificado del Usuario

Y podremos acceder sin ningún problema

Page 20: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 19

ACCEDEMOS MEDIANTE FIREFOX 10.1

Nos aparece la siguiente ventana en la que pulsaremos en entiendo los riesgos y en añadir

excepción al ser un certificado autofirmado.

Introduciríamos nuestro PIN Veríamos información de nuestro certificado

Accederíamos a nuestro foro

Page 21: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 20

COMPORTAMIENTO DE EXPLORADORES SI NO INSERTAMOS EL DNI ELECTRONICO

En el caso de no tener nuestro DNI electrónico introducido los errores variarían dependiendo

del navegador

EXPLORER

CHROME

FIREFOX

Page 22: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 21

VENTAJAS DE LA VALIDACIÓN MEDIANTE DNI

ELECTRONICO

Solo podrán acceder usuarios con DNI electrónico con toda la seguridad que su

infraestructura conlleva.

Gracias a esta autenticación evitaremos los programas de análisis de vulnerabilidades Web,

pues no podrán acceder a nuestro servidor.

En el caso de que hicieran estos análisis configurando nuevos programas sabremos quienes

se autentican en nuestra WEB y que operaciones han realizado, pues su actividad estará

vinculada al certificado y a si DNI.

Un atacante para acceder como otro usuario no solo necesitaría el DNI físico de esa persona

sino también su PIN.

Page 23: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 22

OCSP Y CLR

Si quisiéramos poner todo esto en marcha en una situación real habrá que tener en cuenta

los métodos de validación ocsp o clr para myor seguridad ¿todavía más? Si, es lo suyo. Pero

no solo seguridad sino para la propia integridad

Por ejemplo, si nosotros perdemos nuestro DNI, lo tendríamos que dar de baja, para que

dicho certificado dejara de ser valido. Pese a que el que lo tuviera necesitara nuestro pin, si

por algún caso lo consiguiera, con una aplicación como la que tenemos podría acceder. O

mismamente si decimos que lo hemos perdido y nos lo quedamos podríamos autenticarnos

en esta aplicación con el DNI antiguo y el antiguo PIN y con el DNI nuevo y el nuevo PIN.

CLR

Para evitar esto hay dos métodos el clr hasta ahora el más implementado, que consiste en

bajarse la parte pública de los certificados, de los DNI´S que se han dado de baja.

1-Esto hace que el mantenimiento y la actualización en el servidor tenga que ser constante.

2-Mucho espacio en Disco.

OCSP

Sin embargo la validación OCSP se conecta a la base de datos del DNI electrónico y se hace la

verificación Online, de si ese DNI ha sido dado de baja o no y si no esta dado de baja

procederíamos a hacer la autenticación como la hemos hecho en estos ejemplos.

¿CÓMO SE ACTIVA?

Validación OCSP nativa de Apache

Si utilizas una versión de Apache mayor o igual que 2.3.x no es necesario que hagas

la Validación OCSP del DNIe en PHP y Apache, ya que se puede hacer desde el fichero de

configuración. Para ello primero activamos la configuración OCSP con la directiva:

SSLOCSPEnable on

Después indicamos la URL

SSLOCSPDefaultResponder http://ocsp.dnielectronico.es/

Page 24: ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico

[AUTENTICACIÓN SEGURA EN FORO MEDIANTE DNIE] 14 de febrero de 2012

SEGUNDO DE ASIR Página 23

NUESTRO CASO: VERSIONES DE APACHE MÁS ANTIGUAS

Como nuestra versión de Apache es la 2.2.17 podríamos crear un index.php con el siguiente

contenido, en el que nos diría el estado del DNI introducido.

<html>

<head>

<meta http-equip="content-type" content="text/html; charset=UTF-8" />

<title>Página de validación mediante HTTPS</title>

</head>

<body>

<?php

$a = rand(1000, 99999);

$dir = "/var/www/foro/";

file_put_contents($dir.$a.'cert_c.pem', $_SERVER['SSL_CLIENT_CERT']);

$cert_ca = "/etc/ssl/certs/ac_raiz_dnie.crt";

$output = shell_exec('openssl x509 -in '.$dir.$a.'cert_c.pem'.' -issuer -noout');

if(strpos($output, "CN=AC DNIE 001"))

$issuer_cert = "/etc/ssl/certs/ACDNIE001-SHA1.crt";

else if(strpos($output, "CN=AC DNIE 002"))

$issuer_cert = "/etc/ssl/certs/ACDNIE002-SHA1.crt";

else if(strpos($output, "CN=AC DNIE 003"))

$issuer_cert = "/etc/ssl/certs/ACDNIE003-SHA1.crt";

echo "<h1>Validación del certificado de Autenticación DNIe</h1>";

echo '<p>Issuer cert: '.$issuer_cert.'</p>';

$output = shell_exec('openssl ocsp -CAfile '.$cert_ca.' -issuer '.$issuer_cert.' -cert

'.$dir.$a.'cert_c.pem -url http://ocsp.dnie.es');

print_r('<p>'.$output.'</p>');

$output_parsed = preg_split('/[\r\n]/', $output);

$output_parsed2 = preg_split('/: /', $output_parsed[0]);

$ocsp = $output_parsed2[1];

echo "<p>El servidor OCSP del DNIe devuelve: ".$ocsp."</p>";

?>

</body>

</html>

Como podemos ver el estado del certificado al ejecutar el autentificador OCSP es válido