Autenticación (login) con el DNI electrónico en Debian Etch GNU/Linux
En un artículo anterior explicábamos aproximadamente cómo instalar y configurar el nuevo DNI electrónico (DNIe) en nuestro sistema Debian (o basado en Debian: Ubuntu y derivados).
Aparte del habitual uso para identificarse en sitios web con el navegador, el DNIe puede usarse para más cosas, por ejemplo, firmar ficheros, o autenticarse (hacer "login") en el PC. En este artículo describo cómo implementar esta última aplicación...
Para autenticarnos con el DNIe en Linux utilizaremos un módulo PAM ("Pluggable Authentication Module") desarrollado también por el grupo OpenSC. El proyecto en cuestión al que nos referimos se llama Pam PKCS#11.
Seguidamente explicaré el proceso para utilizar esta herramienta, paso por paso.
1. ¿Qué son los módulos PAM?
En las distribuciones modernas de Linux el mecanismo de autenticación de los usuarios es un servicio modular, proporcionado a las aplicaciones por el propio sistema.
Por ejemplo, cuando una aplicación como "login" requiere la autenticación de un usuario, no la realiza ella misma sino que "solicita" al sistema que autentique al usuario. La parte del sistema que realiza la autenticación es una pila de módulos PAM, que se van ejecutando encadenadamente hasta devolver el resultado del proceso (autenticación OK o incorrecta) a la aplicación. Una vez que la aplicación obtiene este resultado, puede seguir realizando acciones (mostrar un mensaje de rechazo o ejecutar los scripts de arranque del usuario autenticado, por ejemplo).
Cada módulo PAM de la pila puede realizar distintas funciones, como autenticación propiamente dicha, gestión de contraseñas, gestión de la sesión...
Asimismo, cada aplicación que utiliza PAM tiene su configuración personalizada (incluyendo qué modulos y en qué orden se ejecutarán) en el fichero correspondiente del directorio /etc/pam.d/.
Lo interesante de esta arquitectura es que para cambiar el esquema de autenticación de múltiples aplicaciones basta con insertar un módulo adicional, o cambiar un módulo existente por uno nuevo.
Para más información, se puede consultar la página principal de PAM, aquí.
2. ¿Qué hace pam_pkcs11?
Precisamente, lo que permite el módulo pam_pkcs11 es introducir un paso de autenticación adicional (o alternativo), en el que se accede a los certificados de nuestra tarjeta (DNIe) y después de la pertinente verificación devuelve el correspondiente resultado indicando si la autenticación fue correcta o no.
En concreto, este módulo nos pedirá el PIN del DNIe, si es correcto accederá a los certificados del mismo y, comparando los datos que contienen con un "mapeo" configurado previamente en el sistema, determinará quién es el usuario (y la cuenta correspondiente).
El "mapeo" consiste simplemente en un fichero que contiene, para cada usuario, una línea del tipo:
dato del certificado -> usuario
El dato del certificado dependerá del "mapeador" que utilicemos. Para el mapeador más simple, por ejemplo, el dato que se utiliza es el DN del usuario contenido en el certificado.
Para más información, se puede consultar el manual de pam_pkcs11.
3. Instalando pam_pkcs11
(Asumimos que ya tenemos correctamente configurado el
DNI electrónico, de lo contrario ver el artículo citado al principio.)
Este módulo puede descargarse en forma de archivo fuente (.tar.gz) que hay que compilar...
El proceso sería tedioso de explicar aquí, así que un buen amigo mío se ha tomado la molestia de crear un paquete Debian para instalarlo directamente...
Desde aquí podemos descargarnos un comprimido .tar.gz que contiene tanto el paquete fuente Debian, como el paquete binario ya compilado (el que nos interesa): libpam-pkcs11_0.5.3-1_i386.deb
Para instalarlo, escribimos desde una consola:
sudo dpkg -i libpam-pkcs11_0.5.3-1_i386.deb
Esto instalará el paquete y creará un directorio de configuración en /etc/pam_pkcs11. (Si no tenemos instalado algún paquete requerido, dpkg se "quejará": instalaremos el paquete adicional necesario, y volveremos a intentar la instalación anterior).
4. Configurando pam_pkcs11
Podemos dejar la configuración (fichero /etc/pam_pkcs11/pam_pkcs11.conf) por defecto intacta. De esta forma utilizaremos el "subject mapper", que nos mapea el DN de un certificado del DNIe a una cuenta de usuario.
A continuación descargaremos todos los certificados de las Autoridades de Certificación del DNIe, en el directorio /etc/pam_pkcs11/cacerts.
Los certificados pueden obtenerse de los enlaces de esta página (están comprimidos, los guardamos descomprimidos: tienen extensión .crt).
En ese directorio, ejecutamos la herramienta "make_hash_link.sh" que crea unos enlaces (utilizados por nuestro módulo) a dichos certificados:
cd /etc/pam_pkcs11/cacerts
sudo make_hash_link.sh
cd ..
Seguidamente, conectaremos el lector, introduciremos el DNIe, y ejecutaremos el comando siguiente:
pkcs11_inspect
Esta utilidad nos pedirá el PIN del DNIe, y mostrará la información que necesitamos para crear el archivo de mapeo: los DNs de los dos certificados del DNIe (el de autenticación y el de firma).
Creamos el fichero de texto /etc/pam_pkcs11/subject_mapping:
sudo gedit /etc/pam_pkcs11/subject_mapping
(si usamos el editor de texto de gnome.)
Y añadimos una línea con uno de los DNs obtenidos con la utilidad anterior, asociándolo a nuestra cuenta de usuario. Por ejemplo, si nuestra cuenta es "fulanito" escribiremos algo así:
/C=ES/serialNumber=00000019L/SN=PEREZ/GN=FULANITO/CN=PEREZ SANCHEZ, FULANITO (AUTENTICACI\xC3\x93N) -> fulanito
(Es una sola línea, aunque pueda aparecer partida aquí.)
Con todo esto ya estaría configurado el módulo.
5. Cambiando la configuración PAM de la aplicación
El último paso que nos queda es cambiar la configuración PAM de la aplicación de control de acceso. En nuestro caso, cambiaremos la configuración de "gdm" (el gestor de entrada de gnome):
(Para la aplicación "login" propiamente dicha, de la consola, el proceso es equivalente.)
Editamos el archivo /etc/pam.d/gdm, y justo encima de la línea:
@include common-auth
Introducimos esta otra (incluimos un comentario si queremos):
# Autenticación PKCS#11 con DNIe
auth sufficient pam_pkcs11.so
De esta forma, añadimos un mecanismo de autenticación adicional (y opcional) con el DNIe.
Con "sufficient" indicamos que es una autenticación opcional: si la autenticación con DNIe falla, permitimos de momento introducir la contraseña habitual. Si funciona, no se preguntará la contraseña habitual y nos "loguearemos" directamente. También la podemos poner como "required".
6. Probando la autenticación con el DNIe
Si queremos, podemos reiniciar el sistema.
Si utilizamos gnome (con gdm) se presentará la pantalla de bienvenida habitual.
Conectaremos el lector e introduciremos el DNIe.
En el campo de nombre de usuario de gdm pulsaremos ENTER directamente (el módulo pam detectará automáticamente nuestro usuario, como veremos).
A continuación, gdm nos pedirá el PIN del DNI electrónico. Lo introduciremos...
Si el PIN era correcto, y estamos "mapeados", gdm iniciará el login con nuestra cuenta... y fin de la historia: habremos accedido a nuestro entorno de escritorio habitual.
7. Observaciones finales
Aparte del "mapeador" que hemos utilizado, este módulo PAM contiene otros mapeadores más avanzados (incluido uno para acceso a ldap). Es recomendable consultar la documentación.
Hay que hacer notar que la versión actual de esta herramienta tal vez no esté demasiado madura. Asimismo, los mecanismos de comprobación que se utilizan puede que no estén a la altura de unas exigencias de seguridad demasiado altas.
Sin embargo, aun como prueba de concepto únicamente, el proceso mostrado en este artículo resulta interesante. Puede tomarse como referencia para implementar mecanismos de autenticación más avanzados, usando PAM.
Espero que este artículo haya sido de utilidad.




Repositorios
¿Por qué no usar directamente el módulo que aparece en el repositorio de debian-Etch : libpam-p11? ¿No implementa todo lo necesario para llevar a cabo la tarea?
Lo intenté...
Es lo primero que intenté, sobre todo porque no me gusta instalar paquetes no oficiales.
Sin embargo, libpam-p11 sólo proporciona 2 mecanismos de "mapeo":
- El primero requiere descargarse los certificados que vamos a utilizar, desde la tarjeta (en nuestro caso el DNIe). Sin embargo, con las herramientas disponibles en Debian - concretamente "pkcs15-tool" - yo no he podido. El problema es que los certificados están protegidos, y esa utilidad además parece que no te pide el PIN.
- El segundo requiere generar una clave con la utilidad ssh-keygen, pero lamentablemente parece que la versión de openssh en Debian no está compilada con soporte para tarjetas inteligentes.
En cualquier caso, estos modos de operación también están incluidos en el libpam_pkcs11.
Aunque también puede ocurrir que yo sea un poco inútil y existan otras maneras de hacer las cosas...
Saludos.
Agradecido...
Agradecido una vez más por simplificarnos el trabajo a la hora de hacer uso de nuestros gnu/linux...
Un articulo im-pre-sio-nante!!
Autenticación (login) con el DNI electrónico en Windows
La empresa SmartAccess (www.smartaccess.es) comercializa un producto que permite utilizar de forma parecedia el DNIe como mecanismo de autenticación en Windows (incluido Vista).
También funciona en Ubuntu Feisty Fawn.
He seguido tus instrucciones y todo va de maravilla en Ubuntu 7.04. Sólo un par de actualizaciones en librerías. Ningún problema.
Gracias, Nigromante.
Es cierto.
SmartAccess (y posiblemente otros) comercializan algo 'parecido'. Sólo una 'pequeña' diferencia. Necesitas un Active Directory (R) corriendo sobre alguna de las versiones "server" de Windows... y prepara la cartera...
SmartID Card&Go
SmartAccess comercializa un producto para servidores que es el SmartID Corporate que funciona como tu bien dices, hace falta AD, pero tiene otro que es SmartID Card&Go con el que no hace falta ningun tipo de directorio para funcionar. Puede funcionar bien en maquinas Stand Alone o en AD.
DNIe, Citrix y Openldap
Hola,
Tengo una red con Citrix y para autentificar a los usuarios lo hace contra un linux (Fedora) con openldap, sería posible activar la autentificacion con el DNIe?, como se vincularia al directorio ldap?
Un saludo
login con DNIe
Hola, muchas gracias por el tutorial.
Tengo una duda, el nombre del usuario (login) debería ser el mismo nombre que tenga el certificado, ¿correcto?, en el ejemplo hulanito debe ser el nombre que viene en el certificado como el usuario del sistema.
Mi duda/problema es que mi nombre es compuesto y no puedo crear un login con un espacio en medio. ¿Cómo puedo hacerlo?. Un Saludo y muchas gracias
No hace falta
Puedes mapear el nombre que aparece en el certificado de tu DNIe al login que tú quieras:
- En el ejemplo del artículo, si yo realmente me llamo Fulanito, podría mapear mi certificado para entrar con la cuenta de linux "supermegayomismo", en lugar de usar la cuenta "fulanito".
Saludos.
Aplicación JAVA DNIe
Quiero crear una aplicación que autentique con el dnie.
alguien puede ayudarme?
Pistas...
Antes de nada, no soy un experto en programación de módulos criptográficos, pero puedo darte unas pistas:
Para acceder desde Java a diversos repositorios criptográficos debes usar el JCE: http://java.sun.com/products/jce/
Si por ejemplo deseas acceder a través de firefox (mediante un applet) puedes echarle un vistazo a: http://finger-in-the-eye.blogspot.com/2007/03/cmo-acceder-al-keystore-de-firefox-con.html
También puedes echarle un vistazo a este proyecto: http://www.opensc-project.org/opensc-java/
Y cómo no, google...
Depende de lo que quieras
Depende de lo que quieras hacer. Si lo que quieres es autenticar al usuario con el DNIe cuando entra en la aplicación, entonces necesitas trabajar con el PAM de Java que es JAAS (http://java.sun.com/products/jaas/).
Si por el contrario lo que necesitas en autenticar las comunicaciones con el uso del DNIe para SSL entonces necesitas utilizar JSSE (http://java.sun.com/products/jsse/).
En cualquier caso necesitaras el soporte para PKCS11 para Java. Está disponible a partir de la versión 1.5, aunque la 1.6 de Sun permite el acceso a la CryptoAPI de Windows (certificados de tarjeta o software en el equipo de Windows), por lo que no hace falta siquiera que utilices PKCS11 siempre que la aplicación sea para Windows.
Para operaciones de firma digital, etc. como bien apuntaban antes debes utilizar el JCE (http://java.sun.com/products/jce/) que te permite el acceso a los proveedores criptográficos (incluido el de Windows en la versión 1.6 como he dicho)
pkcs11_inspect no funciona
Hola.
Primero que nada gracias por el artículo.
Al ejecutar el comando pkcs11_inspect no devuelve ningún resultado. Si lo ejecuto con la opción de debug muestra lo siguiente:
DEBUG:pam_config.c:157: Using config file /etc/pam_pkcs11/pam_pkcs11.conf
DEBUG:pkcs11_inspect.c:61: loading pkcs #11 module...
DEBUG:pkcs11.c:37: PKCS #11 module = [/usr/lib/opensc-pkcs11.so]
DEBUG:pkcs11.c:47: module permissions: uid = 0, gid = 0, mode = 644
DEBUG:pkcs11.c:55: loading module /usr/lib/opensc-pkcs11.so
DEBUG:pkcs11.c:62: getting function list
DEBUG:pkcs11_inspect.c:69: initialising pkcs #11 module...
... y ahí se queda.
¿A qué puede ser debido?. El edni si me funciona para acceder a los servicios web que hay disponibles.
Saludos.
A mi también me pasa eso.
A mi también me pasa eso. Estoy en una Ubuntu Gutsy 7.10 y he compilado manualmente el programa pam_pkcs11 con las opciones por defecto según el README. Alguno ha encontrado una solución a este punto?
# pkcs11_inspect debug
DEBUG:pam_config.c:208: Using config file /etc/pam_pkcs11/pam_pkcs11.conf
DEBUG:pam_config.c:298: argument pkcs11_inspect is not supported by this module
DEBUG:pkcs11_inspect.c:64: loading pkcs #11 module...
DEBUG:pkcs11_lib.c:742: PKCS #11 module = [/usr/lib/opensc-pkcs11.so]
DEBUG:pkcs11_lib.c:759: module permissions: uid = 0, gid = 0, mode = 644
DEBUG:pkcs11_lib.c:768: loading module /usr/lib/opensc-pkcs11.so
DEBUG:pkcs11_lib.c:776: getting function list
DEBUG:pkcs11_inspect.c:73: initialising pkcs #11 module...
y no avanza de ahí (si está la tarjeta metida)
Si la tarjeta no está metida el debug me devuelve lo siguiente:
# pkcs11_inspect debug
DEBUG:pam_config.c:208: Using config file /etc/pam_pkcs11/pam_pkcs11.conf
DEBUG:pam_config.c:298: argument pkcs11_inspect is not supported by this module
DEBUG:pkcs11_inspect.c:64: loading pkcs #11 module...
DEBUG:pkcs11_lib.c:742: PKCS #11 module = [/usr/lib/opensc-pkcs11.so]
DEBUG:pkcs11_lib.c:759: module permissions: uid = 0, gid = 0, mode = 644
DEBUG:pkcs11_lib.c:768: loading module /usr/lib/opensc-pkcs11.so
DEBUG:pkcs11_lib.c:776: getting function list
DEBUG:pkcs11_inspect.c:73: initialising pkcs #11 module...
DEBUG:pkcs11_lib.c:868: module information:
DEBUG:pkcs11_lib.c:869: - version: 2.11
DEBUG:pkcs11_lib.c:870: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:871: - flags: 0000
DEBUG:pkcs11_lib.c:872: - library description: smart card PKCS#11 API
DEBUG:pkcs11_lib.c:873: - library version: 1.0
DEBUG:pkcs11_lib.c:880: number of slots (a): 8
DEBUG:pkcs11_lib.c:903: number of slots (b): 8
DEBUG:pkcs11_lib.c:804: slot 1:
DEBUG:pkcs11_lib.c:810: - description: Gemplus GemPC Twin 00 00
DEBUG:pkcs11_lib.c:811: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:812: - flags: 0006
DEBUG:pkcs11_lib.c:804: slot 2:
DEBUG:pkcs11_lib.c:810: - description: Gemplus GemPC Twin 00 00
DEBUG:pkcs11_lib.c:811: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:812: - flags: 0006
DEBUG:pkcs11_lib.c:804: slot 3:
DEBUG:pkcs11_lib.c:810: - description: Gemplus GemPC Twin 00 00
DEBUG:pkcs11_lib.c:811: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:812: - flags: 0006
DEBUG:pkcs11_lib.c:804: slot 4:
DEBUG:pkcs11_lib.c:810: - description: Gemplus GemPC Twin 00 00
DEBUG:pkcs11_lib.c:811: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:812: - flags: 0006
DEBUG:pkcs11_lib.c:804: slot 5:
DEBUG:pkcs11_lib.c:810: - description: C3PO KBR36 (20000008) 01 00
DEBUG:pkcs11_lib.c:811: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:812: - flags: 0006
DEBUG:pkcs11_lib.c:804: slot 6:
DEBUG:pkcs11_lib.c:810: - description: C3PO KBR36 (20000008) 01 00
DEBUG:pkcs11_lib.c:811: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:812: - flags: 0006
DEBUG:pkcs11_lib.c:804: slot 7:
DEBUG:pkcs11_lib.c:810: - description: C3PO KBR36 (20000008) 01 00
DEBUG:pkcs11_lib.c:811: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:812: - flags: 0006
DEBUG:pkcs11_lib.c:804: slot 8:
DEBUG:pkcs11_lib.c:810: - description: C3PO KBR36 (20000008) 01 00
DEBUG:pkcs11_lib.c:811: - manufacturer: OpenSC (www.opensc-project.org)
DEBUG:pkcs11_lib.c:812: - flags: 0006
DEBUG:pkcs11_inspect.c:85: no token available
Gracias
Problemas con PIN
Entendemos que se realiza una comprobación del PIN desde el sistema PAM antes de acceder al certificado, un usuario puede fallar en su introducción perfectamente, sobrepasando las 3 veces... ¿ Tema de bloqueo ?
gracias,
Opinar