Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

Las contraseñas simples no protegen, y las complejas son imposibles de recordar. Por eso, con frecuencia terminan en una nota adhesiva debajo del teclado o en la pantalla. Para que las contraseñas se mantengan en la memoria de los usuarios 'olvidadizos' y no se pierda la fiabilidad de la protección, existe la autenticación de dos factores (2FA).

Gracias a la combinación de factores de posesión del dispositivo y conocimiento de su PIN, el propio PIN puede ser más simple y fácil de recordar. Las desventajas en la longitud o aleatoriedad del PIN se compensan con el requisito de posesión física y las restricciones en el intento de adivinar el PIN.

Además, en las instituciones gubernamentales a veces quieren que todo funcione conforme a las normas GOST. Este artículo abordará una variante de 2FA para iniciar sesión en Linux. Comenzaré desde el principio.

Módulos PAM

Los módulos de autenticación conectables (Pluggable Authentication Modules, PAM) son módulos con una API estándar y implementaciones de varios mecanismos de autenticación en aplicaciones.
Todas las utilidades y aplicaciones que pueden trabajar con PAM los utilizan para la autenticación del usuario.
En la práctica, esto funciona aproximadamente así: el comando login se dirige a PAM, que realiza todas las verificaciones necesarias mediante los módulos especificados en el archivo de configuración y devuelve el resultado al comando login.

librtpam

El módulo desarrollado por la empresa 'Aktiv' añade autenticación de dos factores para usuarios mediante tarjetas inteligentes o tokens USB utilizando claves asimétricas según los últimos estándares de criptografía nacional.

Analicemos su principio de funcionamiento:

  • el token almacena el certificado del usuario y su clave privada;
  • el certificado se guarda en el directorio personal del usuario como confiable.

El proceso de autenticación ocurre de la siguiente manera:

  1. Se busca el certificado personal del usuario en el RUTOKEN.
  2. Se solicita el PIN del token.
  3. Se firma datos aleatorios con la clave privada directamente en el chip del RUTOKEN.
  4. La firma obtenida se verifica con la clave pública del certificado del usuario.
  5. El módulo devuelve el resultado de la verificación de la firma a la aplicación que lo llamó.

Se puede autenticar utilizando claves GOST R 34.10-2012 (de 256 o 512 bits) o el obsoleto GOST R 34.10-2001.

No hay que preocuparse por la seguridad de las claves: se generan directamente en Rutoken y nunca abandonan su memoria durante las operaciones criptográficas.

Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

Rutoken ECP 2.0 está certificado por FSB y FSTEC bajo NDV 4, por lo que puede ser utilizado en sistemas de información que manejan información confidencial.

Uso práctico

Cualquier Linux moderno servirá, por ejemplo, utilizaremos xUbuntu 18.10.

1) Instalamos los paquetes necesarios

sudo apt-get install libccid pcscd opensc
Si desea agregar un bloqueo de escritorio con un protector de pantalla, instale adicionalmente el paquete libpam-pkcs11.

2) Agregamos el módulo PAM con soporte para GOST

Cargamos la biblioteca desde https://download.rutoken.ru/Rutoken/PAM/
Copiamos el contenido de la carpeta PAM librtpam.so.1.0.0 a la carpeta del sistema
/usr/lib/ o /usr/lib/x86_64-linux-gnu/o /usr/lib64

3) Instalamos el paquete con librtpkcs11ecp.so

Descargamos e instalamos el paquete DEB o RPM desde el siguiente enlace: https://www.rutoken.ru/support/download/pkcs/

4) Verificamos que Rutoken ECP 2.0 funcione en el sistema

Ejecutamos en la terminal
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
Si ves la línea Rutoken ECP significa que todo está bien.

5) Leemos el certificado

Verificamos que el dispositivo tenga un certificado
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O
Si después de la línea:
Usando la ranura 0 con un token presente (0x0)

  • se muestra información sobre las claves y certificados, es necesario leer el certificado y guardarlo en el disco. Para ello, ejecute el siguiente comando, donde en lugar de {id} debe sustituir por el ID del certificado que vio en la salida del comando anterior:
    $ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -r -y cert --id {id} --output-file cert.crt
    Si se crea el archivo cert.crt, pasamos al punto 6).
  • nada, entonces el dispositivo está vacío. Comuníquese con el administrador o cree claves y un certificado usted mismo, siguiendo el siguiente punto.

5.1) Creamos un certificado de prueba

¡Atención! Los métodos descritos para crear claves y certificados son adecuados para pruebas y no están destinados para uso en producción. Para ello, deben usarse claves y certificados emitidos por una autoridad de certificación confiable de su organización o un centro de certificación acreditado.
El módulo PAM está diseñado para proteger computadoras locales y está destinado a funcionar en pequeñas organizaciones. Dado que hay pocos usuarios, el administrador puede supervisar él mismo la revocación de certificados y bloquear manualmente las cuentas, así como revisar la fecha de vencimiento de los certificados. El módulo PAM aún no puede verificar certificados mediante CRL ni construir cadenas de confianza.

Ruta simple (a través del navegador)

Para obtener un certificado de prueba, utilice el servicio web 'Centro de Registro Rutoken'. El proceso tomará no más de 5 minutos.

Ruta geek (a través de la consola y, posiblemente, el compilador)

Verifique la versión de OpenSC
$ opensc-tool --version
Si la versión es menor que 0.20, actualícese o compile la rama pkcs11-tool con soporte GOST-2012 de nuestro GitHub (al momento de la publicación de este artículo, la versión 0.20 aún no ha sido lanzada) o de la rama master del proyecto principal OpenSC no más tarde del commit 8cf1e6f

Generamos un par de claves con los parámetros:
--key-type: GOSTR3410-2012-512:A (GOST-2012 512 bits con el conjunto de parámetros A), GOSTR3410-2012-256:A (GOST-2012 256 bits con el conjunto de parámetros A)

--id: identificador del objeto (CKA_ID) en forma de números hexadecimales de dos dígitos de la tabla ASCII. Utilice solo códigos ASCII de caracteres imprimibles, ya que el id debe ser pasado a OpenSSL como una cadena. Por ejemplo, el código ASCII “3132” corresponde a la cadena «12». Para su conveniencia, puede utilizar un servicio en línea de conversión de cadenas a códigos ASCII.

$ ./pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-512:A -l --id 3132

A continuación, crearemos el certificado. A continuación se describirán dos métodos: el primero a través de una CA (usaremos CAs de prueba), el segundo - auto-firmado. Para esto, primero necesita instalar y configurar OpenSSL versión 1.1 o superior para trabajar con Rutoken a través del módulo especial rtengine siguiendo las instrucciones Instalación y configuración de OpenSSL.
Por ejemplo: para ‘--id 3132’ en OpenSSL debe especificar «pkcs11:id=12«.

Puede utilizar los servicios de una CA de prueba, que son numerosas, por ejemplo, aquí, aquí y aquí, para ello crearemos una solicitud de certificado

Otra opción es rendirse a la pereza y crear un certificado auto-firmado
$ openssl req -utf8 -new -keyform engine -key "pkcs11:id=12" -engine rtengine -out req.csr

Cargamos el certificado en el dispositivo
$ openssl req -utf8 -x509 -motor de keyform -clave "pkcs11:id=12" -motor rtengine -salida cert.cer

6) Registramos el certificado en el sistema

Asegúrese de que su certificado tenga el aspecto de un archivo base64:

Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

Si su certificado se ve así:

Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

entonces es necesario convertir el certificado del formato DER a PEM (base64)

$ openssl x509 -in cert.crt -out cert.pem -inform DER -outform PEM
Verificamos nuevamente que ahora todo esté en orden.

Agregamos el certificado a la lista de certificados de confianza
$ mkdir ~/.eid
$ chmod 0755 ~/.eid
$ cat cert.pem >> ~/.eid/authorized_certificates
$ chmod 0644 ~/.eid/authorized_certificates

La última línea protege la lista de certificados de confianza contra modificaciones accidentales o intencionadas por otros usuarios. Esto excluye la situación en la que alguien añada su propio certificado y pueda iniciar sesión en su nombre.

7) Configuramos la autenticación

La configuración de nuestro módulo PAM es completamente estándar y se realiza de la misma manera que la configuración de otros módulos. Creamos en el archivo /usr/share/pam-configs/rutoken-gost-pam que contiene el nombre completo del módulo, si está habilitado por defecto, la prioridad del módulo y los parámetros de autenticación.
En los parámetros de autenticación hay requisitos sobre el éxito de la operación:

  • required (requerido): estos módulos deben devolver una respuesta positiva. Si el resultado de la llamada al módulo contiene una respuesta negativa, esto dará lugar a un error de autenticación. La solicitud será rechazada, pero se llamarán a los demás módulos.
  • requisite (necesario): similar a required, pero provoca inmediatamente un fallo en la autenticación e ignora los demás módulos.
  • sufficient (suficiente): si no se ha devuelto resultado negativo por ninguno de los módulos required o sufficient antes de este módulo, entonces el módulo devolverá una respuesta positiva. Se ignorarán los módulos restantes.
  • optional (opcional): si no hay módulos required en la pila y ningún módulo sufficient ha devuelto un resultado positivo, al menos uno de los módulos optional debe devolver una respuesta positiva.

Contenido completo del archivo /usr/share/pam-configs/rutoken-gost-pam:
Nombre: Rutoken PAM GOST
Predeterminado: sí
Prioridad: 800
Tipo de Autenticación: Primaria
Auth: suficiente /usr/lib/librtpam.so.1.0.0 /usr/lib/librtpkcs11ecp.so

Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

guardamos el archivo, después de lo cual ejecutamos
$ sudo pam-auth-update
en la ventana que aparece marcamos la casilla junto a Rutoken PAM GOST y hacemos clic en OK

Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

8) Verificamos la configuración

Para entender que todo está configurado, pero sin perder la posibilidad de iniciar sesión, ingrese el comando
$ sudo login
Ingrese el nombre de usuario. Todo está configurado correctamente si el sistema solicita el PIN del dispositivo.

Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

9) Configuramos el bloqueo del ordenador al extraer el token

El paquete incluye libpam-pkcs11 la utilidad pkcs11_eventmgr, que permite realizar diversas acciones al ocurrir eventos PKCS#11.
Para la configuración pkcs11_eventmgr sirve un archivo de configuración: /etc/pam_pkcs11/pkcs11_eventmgr.conf
Para diferentes distribuciones de Linux, el comando que provoca el bloqueo de la cuenta al extraer tarjetas inteligentes o tokens será diferente. Véase event card_remove.
Un ejemplo del archivo de configuración se presenta a continuación:

pkcs11_eventmgr
{
    # Ejecución en segundo plano
    daemon = true;
     
    # Configuración de mensajes de depuración
    debug = false;
 
    # Tiempo de sondeo en segundos
    polling_time = 1;
 
    # Establecer tiempo de espera para la tarjeta
    # Por defecto 0
    expire_time = 0;
 
    # Selección de la biblioteca pkcs11 para trabajar con Rutoken
    pkcs11_module = usr/lib/librtpkcs11ecp.so;
 
    # Acciones con la tarjeta
    # Tarjeta insertada:
    event card_insert {
        # Mantener los valores predeterminados (no sucede nada)
        on_error = ignore ;
 
        action = "/bin/false";
    }
 
    # Tarjeta extraída
    event card_remove {
        on_error = ignore;
         
        # Llamar a la función de bloqueo de pantalla
        
        # Para GNOME 
        action = "dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock";
        
        # Para XFCE
        # action = "xflock4";
        
        # Para Astra Linux (FLY)
        # action = "fly-wmfunc FLYWM_LOCK";
    }
 
    # Tarjeta extraída por mucho tiempo
    event expire_time {
        # Mantener los valores predeterminados (no sucede nada)
        on_error = ignore;
 
        action = "/bin/false";
    }
}

Después de esto, agregue la aplicación pkcs11_eventmgr al inicio automático. Para esto, edite el archivo .bash_profile:
$ nano /home//.bash_profile
Agregue la línea pkcs11_eventmgr al final del archivo y reinicie.

Los pasos descritos para la configuración del sistema operativo se pueden utilizar como instrucciones en cualquier distribución moderna de Linux, incluyendo las nacionales.

Cómo utilizar módulos PAM para la autenticación local en Linux con claves GOST-2012 en RUTOKEN

Conclusión

Las PC con Linux en las estructuras gubernamentales rusas se están volviendo cada vez más populares, y configurar una autenticación de dos factores confiable en este SO no siempre es fácil. Esperamos que esta guía ayude a resolver el “problema de las contraseñas” y a proteger de manera confiable el acceso a la PC sin dedicar mucho tiempo.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster