ProyectoF3-Autenticacion Proyecto Foro en PHP mediante DNI Electrónico
-
Upload
javierasir2012 -
Category
Documents
-
view
524 -
download
9
description
Transcript of 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
[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
[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.
[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
[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));
[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);
[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.
[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.
[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.
[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
[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.
[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
[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>
[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>
[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
[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.
[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
[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
[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
[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
[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
[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.
[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/
[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