domingo, 23 de junio de 2013

DNIe en DMDc. O cómo pasar de ser un geek a un friki.... (Parte II)

En este segundo post, vamos a realizar el proceso de logon usando el DNIe o cualquier otra tarjeta criptográfica (en adelante, smartcard). El proceso el algo complicado, pero siguiendo los pasos detallados, posible. La paquetería a instalar es muy básica, pero hay que modificar y crear varios archivos, así que no os asustéis. A mí me ha costado un poco entender todo el proceso, pero voy a intentar que vosotros lo tengáis más fácil.

Antes de continuar quiero destacar que el proceso de logon es más lento con este sistema. Tampoco creáis que se tira 10 minutos pensando, pero sí es cierto que el proceso de solicitar el PIN, leer el certificado y compararlo, hace que el logon se retrase en unos 3~4 segundos. Queda dicho para que luego nadie se queje.

Como os dije anteriormente, podemos utilizar cualquier otra smartcard. Eso es la teoría, porque en la práctica, al no disponer de otra smartcard con certificados, no puedo reproducirlo. Pero la teoría y el proceso, insisto, es el mismo. Por cierto, para que quede claro de lo que hablamos, cito de la Wiki:

"Criptográficas: tarjetas microprocesadas avanzadas en las que hay módulos hardware para la ejecución de algoritmos usados en cifrados y firmas digitales. En estas tarjetas se puede almacenar de forma segura un certificado digital (y su clave privada) y firmar documentos o autenticarse con la tarjeta sin que el certificado salga de la tarjeta (sin que se instale en el almacén de certificados de un navegador web, por ejemplo) ya que es el procesador de la propia tarjeta el que realiza la firma. Un ejemplo de estas tarjetas son las emitidas por la Fábrica Nacional de Moneda y Timbre (FNMT) española para la firma digital"


Para autenticarnos con una smartcard en Linux utilizaremos un módulo PAM ("Plugable Authentication Module"). En concreto, el PAM PKCS#11. ¿Que qué es eso de PAM? Veréis, el mecanismo de autenticación de los usuarios en la mayoría de las distros Linux es un módulo que facilita el S.O. a las aplicaciones que así lo requieran. Así, cuando nuestro gestor de inicio de sesión (GDM, MDM, Lightdm, etc...) nos solicita el usuario y contraseña para hacer logon, no es la aplicación en sí misma la que realiza la autenticación. En realidad, dicha aplicación le "pide" al sistema que la realice por ella. Y aquí entra en juego PAM. PAM son una serie de módulos que van ejecutándose ordenadamente hasta devolver el resultado de la autenticación (Ok ó no OK) a la aplicación. Con la respuesta recibida, la aplicación (por ejemplo, MDM), nos mostrará un mensaje de error si la repuesta es no Ok, o se dedicará a realizar la ejecución de los scripts de arranque de nuestra sesión, si el resultado es Ok

Para los más antiguos: Cuando nuestros padres llamaban al sereno para que les abriese el portal de casa, el sereno sería el PAM.

Cada aplicación que requiere de este sistema, establece qué módulos PAM y en qué orden se ejecuta, pudiéndose incluso cambiar o sustituir alguno de los módulos si dicho aplicativo lo necesita. Basándonos en esta característica, lo que vamos a hacer para realizar el logon con nuestra smartcard es insertar en el proceso de autenticación del sistema el módulo PKCS#11, que accederá a los certificados de nuestra smartcard, y, después de validarlos, devolverá la instrucción de que la autenticación fue correcta. Explicado así parece sencillo, ¿verdad?

Este módulo accederá a nuestra smartcard. Lógicamente, nos pedirá el PIN para poder acceder a los certificados de la misma. Si el PIN es correcto, accederá a los certificados y los comparará con un fichero que habremos creado a tal efecto, y que contendrá una relación de usuarios relacionados con sus certificados. En concreto, del certificado, utilizaremos el campo DN ("Distinguised Name"). Los campos más frecuentes de un DN son CN ("Common Name"), OU ("Organization Unit"), O ("Organization") y C ("Country"). Estos datos los podéis visualizar al explorar los certificados de vuestra smartcard.

Empezamos todo el proceso instalando el software necesario, de la siguiente manera:  apt-get install libpam-pkcs11.


Los ficheros de configuración de PAM se encuentran en la ruta /etc/pam.d. Si echamos un vistazo, vemos que hay varios archivos. Encontramos, entre otros, common-auth, login, mate-screensaver, mdm, su, ... etc,



Estos archivos indican la forma de ejecución de los módulos PAM en cada una de las aplicaciones. Si modificamos el archivo common-auth, incluyéndole el módulo que acabamos de instalar (PKCS#11), todas las aplicaciones que requieran autenticación pasarán obligatoriamente por él, que es lo que estamos buscando, ¿no?. Pues... NO.

Nos encontramos un problema irresoluble: gksu/gksudo. Esta aplicación deja de funcionar al modificar el common-auth para incluir otro módulo. Nos muestra un bonito error de "failed to communicate with gksu-run-helper" y se queda tan pancho....sin ejecutarse la aplicación.

Al encontrarme este error, se me ocurrieron varias chapuzas... digoooo... soluciones:

  1. Desinstalar gksu/gksudo y ejecutar desde consola todo aquello que fuera necesario hacerlo con privilegios de root..... Como os podéis imaginar, inaceptable desde cualquier punto de vista.
  2. Bajarme el código de gksu, para ver cómo realiza la autenticación. Resolver el error, compilarlo de nuevo y subirlo a los repos...... Ya, si yo fuera capaz de eso, Linux se llamaría Josex.....
  3. Formatear el portátil, instalar W7 y olvidarme de quebraderos de cabeza, que allí sí que funciona sin problemas..... Me sonrojo al pensar en ello.....
Así que me decidí por la opción más lógica, por lo menos para mi punto de vista: modificar los archivos de configuración de PAM sólo para MDM y mate-screensaver. Así consigo lo que se pretende en el post: Abrir sesión con mi smartcard, y, al retirarla, ejecutar el protector de pantalla, bloqueando la sesión. Al insertar la smartcard de nuevo, mate-screensaver me pedirá el PIN para desbloquear la sesión. Una vez desbloqueada, no es útil andar accediendo al certificado para cualquier acceso como su o sudo, así que no modificaré ningún otro archivo. Continuamos:

PAM no instala ninguno de los archivos necesarios para su ejecución ni configuración. Es un paquete de "hágalo Vd. mismo". Sí se graban en el HD, pero no como deberían..... Así que vamos a crear en primer lugar el archivo de configuración de PAM PKCS#11. Creamos la carpeta /etc/pam_pkcs11

sudo mkdir /etc/pam_pkcs11

Ahora "creamos" el archivo de configuración de la siguiente manera:

sudo cp /usr/share/doc/libpam-pkcs11/examples/pam_pkcs11.conf.example.gz /etc/pam_pkcs11/
cd /etc/pam_pkcs11
sudo gunzip pam_pkcs11.conf.example.gz
sudo mv pam_pkcs11.conf.example pam_pkcs11.conf


De momento, no vamos a modificar nada en este archivo, nos sirve tal y como está.

Como estamos trabajando con certificados oficiales, deberían ser validados contra una entidad certificadora. Así se revisaría la validez del certificado, autenticidad, etc.. Para sistemas de máxima seguridad o accesos empresariales seguros en los que se accede con una smartcard, está bien. Si dicha entidad certificadora anula un certificado de un empleado y éste intenta validarse en el sistema, al verificar la validez del certificado, se rechazaría el acceso o entrada al sistema. Lamentablemente para nosotros, y tratándose del DNIe, no es factible. Se produce un error a la hora de validar los certificados y rechaza la autenticación. Y es un fallo de los certificados raíz de la Policía, que me he documentado, ¿eh?. Pero pensemos un poco. Es mi portátil y mi DNIe..... ¿Es necesario que la Policía me diga si mi certificado es válido y correcto? Y, en el caso de una smartcard de otra entidad, ¿acaso va a llegar alguien con una smartcard falsificada para entrar en mi equipo?.... Si alguien piensa que sí, es demasiado paranoico a mi modo de ver. Yo no voy a realizar validación del certificado, aunque explicaré cómo se hace para los obsesionados con la seguridad.

Editamos el archivo /etc/pam_pkcs11/pam_pkcs11.conf. Buscamos la línea cert_policy = ca,signature, y la dejamos en cert_policy = none.


Así establecemos que no haga ninguna comprobación del certificado contra las entidades certificadoras.

Cambiamos también la línea #Enable debugging support, de jando su valor en false.



Y para los trabajadores de la NSA que quieran validar sus certificados:

Copiamos los certificados raíz de la entidad emisora del certificado en la ruta /etc/pam_pkcs11/cacerts. Para variar, la ruta no existe, así que la creamos. Una vez copiados, ejecutamos lo siguiente:
sudo pkcs11_make_hash_link /etc/pam_pkcs11/cacerts.

Por último, dejamos la línea cert_policy del archivo pam_pkcs11.conf sin modificar. Ea, ya estáis más seguros que en Misión: Imposible.....

Ahora vamos a crear el archivo donde relacionaremos el certificado de la smartcard con el nombre de usuario en nuestros equipos. Para ello, vamos a explorar nuestra smartcard. La introducimos en el lector, y tecleamos pkcs11_inspect. Nos pedirá el PIN, y nos mostrará los certificados de la smartcard:


Nos fijamos en la línea Printing data for mapper subject del certificado, en este caso del de autenticación. Copiamos toda la línea. A continuación, creamos el fichero subject_mapping en /etc/pam_pkcs11/:

sudo pluma /etc/pam_pkcs11/subject_mapping

Y añadimos la línea que hemos copiado antes, seguida por el usuario, todo en una línea, de la siguiente manera:


Y así con todos los usuarios que deseemos, cada uno en una línea.

Ya tenemos todo lo necesario para autenticarnos con nuestra smartcard. Es el momento de modificar el comportamiento de PAM en MDM y mate-screensaver. Recordad que los archivos de configuración de estas aplicaciones están en /etc/pam.d . Tenemos que insertar en esos dos archivos lo siguiente:

auth sufficient pam_pkcs11.so config_file=/etc/pam_pkcs11/pam_pkcs11.conf

antes de la línea @include common_auth, en el lugar que os indico:



El parámetro sufficient indica que la autenticación de este módulo es opcional. Si falla la autenticación de la smartcard por cualquier causa (rotura del lector, degradación del chip, error en el certificado....) o simplemente, porque no insertamos la tarjeta, podemos realizar el logon introduciendo nuestro usuario y a continuación la contraseña. Hay otra opción, required, pero yo no la recomiendo a nadie que me caiga bien.... Si falla algo, no podréis logaros en el sistema, y tendréis que entrar con un live-cd para borrar la línea insertada.....

Si habéis seguido todos los pasos correctamente, es momento de cerrar sesión y verificar que todo funciona. Cuando nos pida el usuario, no es necesario introducirlo. Pulsaremos ENTER, y, en un par de segundos, nos pedirá el PIN de la smartcard. Validará el PIN, y ejecutará el logon  del usuario al que corresponda el certificado que encuentre en la tarjeta, comparandolo en el archivo subject_mapping que creamos anteriormente.

Y podremos funcionar normalmente, como si no hubiéramos hecho nada distinto de lo habitual. Os dejo un video, perdonad la calidad.



Para bloquear/desbloquear nuestra sesión al extraer/introducir la smartcard, necesitamos realizar los siguientes pasos. Lo primero de todo, entrar en las propiedades del protector de pantalla y marcar bloquear pantalla cuando el salvapantallas esté activo.


A continuación, copiaremos el archivo /usr/share/doc/libpam_pkcs11/examples/card_eventmgr.conf.example a /etc/pam_pkcs11/card_eventmgr.conf

sudo cp /usr/share/doc/libpam-pkcs11/examples/card_eventmgr.conf.example /etc/pam_pkcs11/
cd /etc/pam_pkcs11
sudo mv card.eventmgr.conf.example card_eventmgr.conf

Ahora lo editamos, para indicarle que ejecute mate-screensaver al retirar la tarjeta. Cuando la insertemos de nuevo, nos pedirá el PIN para desbloquear la sesión. Modificar el archivo, dejándolo como en la imagen


Por último, crearemos en Aplicaciones al inicio una nueva entrada, que será la aplicación que monitoriza el lector para detectar los eventos de la tarjeta (card_eventmgr)


Y verificamos que funciona, reiniciando la sesión. Al entrar, esperando unos 10 segundos para que se ejecuten todos los scripts de arranque, probaremos a extraer la tarjeta del lector. Automáticamente saltará el protector de pantalla. Volveremos a introducir la tarjeta en el lector (o pulsamos cualquier tecla, o movemos el ratón, el caso es "despertar" el equipo), y el protector nos pedirá ahora el PIN de la tarjeta para entrar en la sesión bloqueada. Os dejo otro video, con la misma mala calidad que el de antes.



¿Qué me decís.....? ¿A que es una frikada total?

No hay comentarios:

Publicar un comentario