Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

Les mots de passe simples ne sont pas sécurisés et les mots de passe complexes sont impossibles à mémoriser. C'est pourquoi ils se retrouvent si souvent sur un post-it sous le clavier ou sur le moniteur. Pour garantir que les mots de passe restent dans l'esprit des utilisateurs « oublieux » et que la fiabilité de la protection ne soit pas perdue, il existe une authentification à deux facteurs (2FA).

En raison de la combinaison du fait de posséder un appareil et de connaître son code PIN, le code PIN lui-même peut être plus simple et plus facile à mémoriser. Les inconvénients liés à la longueur ou au caractère aléatoire du code PIN sont compensés par l'exigence de possession physique et les restrictions sur la force brute du code PIN.

De plus, il arrive dans les agences gouvernementales qu'elles souhaitent que tout fonctionne conformément à GOST. Cette option 2FA pour se connecter à Linux sera discutée. Je vais commencer de loin.

Modules PAM

Les modules d'authentification enfichables (PAM) sont des modules dotés d'une API standard et d'implémentations de divers mécanismes d'authentification dans les applications.
Tous les utilitaires et applications pouvant fonctionner avec PAM les récupèrent et peuvent les utiliser pour l'authentification des utilisateurs.
En pratique, cela fonctionne à peu près comme ceci : la commande login appelle PAM, qui effectue toutes les vérifications nécessaires à l'aide des modules spécifiés dans le fichier de configuration et renvoie le résultat à la commande login.

librtpam

Le module développé par la société Aktiv ajoute une authentification à deux facteurs des utilisateurs utilisant des cartes à puce ou des tokens USB utilisant des clés asymétriques selon les dernières normes de cryptographie nationale.

Regardons le principe de son fonctionnement :

  • Le jeton stocke le certificat de l'utilisateur et sa clé privée ;
  • Le certificat est enregistré dans le répertoire personnel de l'utilisateur comme étant fiable.

Le processus d'authentification se déroule comme suit :

  1. Rutoken recherche le certificat personnel de l'utilisateur.
  2. Le code PIN du jeton est demandé.
  3. Les données aléatoires sont signées sur la clé privée directement dans la puce Rutoken.
  4. La signature résultante est vérifiée à l'aide de la clé publique du certificat de l'utilisateur.
  5. Le module renvoie le résultat de la vérification de la signature à l'application appelante.

Vous pouvez vous authentifier à l'aide des clés GOST R 34.10-2012 (longueur 256 ou 512 bits) ou du GOST R 34.10-2001 obsolète.

Vous n'avez pas à vous soucier de la sécurité des clés : elles sont générées directement dans Rutoken et ne quittent jamais sa mémoire lors des opérations cryptographiques.

Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

Rutoken EDS 2.0 est certifié par le FSB et le FSTEC selon NDV 4, il peut donc être utilisé dans les systèmes d'information qui traitent des informations confidentielles.

Utilisation pratique

Presque n'importe quel Linux moderne fera l'affaire, par exemple nous utiliserons xUbuntu 18.10.

1) Installez les packages nécessaires

sudo apt-get install libccid pcscd opensc
Si vous souhaitez ajouter un verrou sur le bureau avec un économiseur d'écran, installez le package en plus libpam-pkcs11.

2) Ajouter un module PAM avec support GOST

Chargement de la bibliothèque depuis https://download.rutoken.ru/Rutoken/PAM/
Copiez le contenu du dossier PAM librtpam.so.1.0.0 dans le dossier système
/usr/lib/ ou /usr/lib/x86_64-linux-gnu/ou /usr/lib64

3) Installez le package avec librtpkcs11ecp.so

Téléchargez et installez le package DEB ou RPM à partir du lien : https://www.rutoken.ru/support/download/pkcs/

4) Vérifiez que Rutoken EDS 2.0 fonctionne dans le système

Dans le terminal, nous exécutons
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
Si tu vois la ligne Rutoken ECP <no label> - ça veut dire que tout va bien.

5) Lire le certificat

Vérifier que l'appareil dispose d'un certificat
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O
Si après la ligne :
Using slot 0 with a present token (0x0)

  • les informations s'affichent concernant les clés et les certificats, vous devez lire le certificat et l'enregistrer sur le disque. Pour ce faire, exécutez la commande suivante, où au lieu de {id} vous devez remplacer l'ID de certificat que vous avez vu dans le résultat de la commande précédente :
    $ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -r -y cert --id {id} --output-file cert.crt
    Si le fichier cert.crt a été créé, passez à l'étape 6).
  • il n'y a rien, alors l'appareil est vide. Contactez votre administrateur ou créez vous-même les clés et le certificat en suivant l'étape suivante.

5.1) Créer un certificat de test

Attention! Les méthodes décrites pour créer des clés et des certificats sont adaptées aux tests et ne sont pas destinées à être utilisées en mode combat. Pour ce faire, vous devez utiliser des clés et des certificats émis par l'autorité de certification de confiance de votre organisation ou par une autorité de certification accréditée.
Le module PAM est conçu pour protéger les ordinateurs locaux et est conçu pour fonctionner dans les petites organisations. Comme il y a peu d'utilisateurs, l'administrateur peut surveiller la révocation des certificats et bloquer manuellement les comptes, ainsi que la période de validité des certificats. Le module PAM ne sait pas encore comment vérifier les certificats à l'aide des CRL et construire des chaînes de confiance.

La manière la plus simple (via un navigateur)

Pour obtenir un certificat de test, utilisez service Web "Centre d'enregistrement Rutoken". Le processus ne prendra pas plus de 5 minutes.

À la manière du geek (via la console et éventuellement le compilateur)

Vérifiez la version d'OpenSC
$ opensc-tool --version
Si la version est inférieure à 0.20, mettez à jour ou compilez branche pkcs11-tool avec prise en charge de GOST-2012 depuis notre GitHub (au moment de la publication de cet article, la version 0.20 n'est pas encore sortie) ou depuis la branche master du projet principal OpenSC au plus tard commettre 8cf1e6f

Générez une paire de clés avec les paramètres suivants :
--key-type: GOSTR3410-2012-512:А (ГОСТ-2012 512 бит c парамсетом А), GOSTR3410-2012-256:A (ГОСТ-2012 256 бит с парамсетом A)

--id: identifiant d'objet (CKA_ID) sous forme de nombres de caractères hexadécimaux à deux chiffres de la table ASCII. Utilisez uniquement des codes ASCII pour les caractères imprimables, car... id devra être transmis à OpenSSL sous forme de chaîne. Par exemple, le code ASCII « 3132 » correspond à la chaîne « 12 ». Pour plus de commodité, vous pouvez utiliser service en ligne pour convertir des chaînes en codes ASCII.

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

Ensuite, nous allons créer un certificat. Deux manières seront décrites ci-dessous : la première via une AC (nous utiliserons des AC de test), la seconde est auto-signée. Pour ce faire, vous devez d'abord installer et configurer OpenSSL version 1.1 ou ultérieure pour travailler avec Rutoken via un module rtengine spécial à l'aide du manuel Installation et configuration d'OpenSSL.
Par exemple : pour '--id 3132' dans OpenSSL, vous devez spécifier "pkcs11:id=12«.

Vous pouvez utiliser les services d'une autorité de certification de test, qui sont nombreuses, par exemple : ici, ici и ici, pour cela nous allons créer une demande de certificat

Une autre option consiste à céder à la paresse et à créer un compte auto-signé.
$ openssl req -utf8 -new -keyform engine -key "pkcs11:id=12" -engine rtengine -out req.csr

Téléchargement du certificat sur l'appareil
$ openssl req -utf8 -x509 -keyform engine -key "pkcs11:id=12" -engine rtengine -out cert.cer

6) Enregistrez le certificat dans le système

Assurez-vous que votre certificat ressemble à un fichier base64 :

Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

Si votre certificat ressemble à ceci :

Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

alors vous devez convertir le certificat du format DER au format PEM (base64)

$ openssl x509 -in cert.crt -out cert.pem -inform DER -outform PEM
Nous vérifions à nouveau que tout est en ordre maintenant.

Ajouter le certificat à la liste des certificats de confiance
$ mkdir ~/.eid
$ chmod 0755 ~/.eid
$ cat cert.pem >> ~/.eid/authorized_certificates
$ chmod 0644 ~/.eid/authorized_certificates

La dernière ligne protège la liste des certificats de confiance contre toute modification accidentelle ou intentionnelle par d'autres utilisateurs. Cela empêche quelqu'un d'ajouter son certificat ici et de pouvoir se connecter en votre nom.

7) Configurer l'authentification

La configuration de notre module PAM est tout à fait standard et se fait exactement de la même manière que la configuration des autres modules. Créer dans un fichier /usr/share/pam-configs/rutoken-gost-pam contenant le nom complet du module, s'il est activé par défaut, la priorité du module et les paramètres d'authentification.
Les paramètres d'authentification contiennent des exigences pour le succès de l'opération :

  • requis : ces modules doivent renvoyer une réponse positive. Si le résultat d'un appel de module contient une réponse négative, cela entraînera une erreur d'authentification. La demande sera abandonnée, mais les modules restants seront appelés.
  • requisite : similaire à requis, mais échoue immédiatement à l'authentification et ignore les autres modules.
  • suffisant : si aucun des modules requis ou suffisants avant un tel module n'a renvoyé un résultat négatif, alors le module renverra une réponse positive. Les modules restants seront ignorés.
  • facultatif : s'il n'y a aucun module requis sur la pile et qu'aucun des modules suffisants ne renvoie un résultat positif, alors au moins un des modules facultatifs doit renvoyer un résultat positif.

Contenu complet du fichier /usr/share/pam-configs/rutoken-gost-pam:
Name: Rutoken PAM GOST
Default: yes
Priority: 800
Auth-Type: Primary
Auth: sufficient /usr/lib/librtpam.so.1.0.0 /usr/lib/librtpkcs11ecp.so

Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

enregistrez le fichier, puis exécutez
$ sudo pam-auth-update
dans la fenêtre qui apparaît, mettez un astérisque à côté Rutoken PAM GOST et appuyez sur OK

Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

8) Vérifiez les paramètres

Pour comprendre que tout est configuré, mais en même temps ne pas perdre la possibilité de vous connecter au système, entrez la commande
$ sudo login
Entrez votre nom d'utilisateur. Tout est configuré correctement si le système nécessite un code PIN de l'appareil.

Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

9) Configurez l'ordinateur pour qu'il soit bloqué lorsque le jeton est extrait

Inclus dans le forfait libpam-pkcs11 utilitaire inclus pkcs11_eventmgr, ce qui vous permet d'effectuer diverses actions lorsque des événements PKCS#11 se produisent.
Pour les paramètres pkcs11_eventmgr sert de fichier de configuration : /etc/pam_pkcs11/pkcs11_eventmgr.conf
Pour différentes distributions Linux, la commande qui provoque le verrouillage d'un compte lorsqu'une carte à puce ou un jeton est supprimé sera différente. Cm. event card_remove.
Un exemple de fichier de configuration est présenté ci-dessous :

pkcs11_eventmgr
{
    # Запуск в бэкграунде
    daemon = true;
     
    # Настройка сообщений отладки
    debug = false;
 
    # Время опроса в секундах
    polling_time = 1;
 
    # Установка тайм-аута на удаление карты
    # По-умолчанию 0
    expire_time = 0;
 
    # Выбор pkcs11 библиотеки для работы с Рутокен
    pkcs11_module = usr/lib/librtpkcs11ecp.so;
 
    # Действия с картой
    # Карта вставлена:
    event card_insert {
        # Оставляем значения по умолчанию (ничего не происходит)
        on_error = ignore ;
 
        action = "/bin/false";
    }
 
    # Карта извлечена
    event card_remove {
        on_error = ignore;
         
        # Вызываем функцию блокировки экрана
        
        # Для GNOME 
        action = "dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock";
        
        # Для XFCE
        # action = "xflock4";
        
        # Для Astra Linux (FLY)
        # action = "fly-wmfunc FLYWM_LOCK";
    }
 
    # Карта долгое время извлечена
    event expire_time {
        # Оставляем значения по умолчанию (ничего не происходит)
        on_error = ignore;
 
        action = "/bin/false";
    }
}

Après cela, ajoutez l'application pkcs11_eventmgr commencer. Pour ce faire, éditez le fichier .bash_profile :
$ nano /home/<имя_пользователя>/.bash_profile
Ajoutez la ligne pkcs11_eventmgr à la fin du fichier et redémarrez.

Les étapes décrites pour configurer le système d'exploitation peuvent être utilisées comme instructions dans n'importe quelle distribution Linux moderne, y compris les distributions nationales.

Comment utiliser les modules PAM pour l'authentification locale sous Linux à l'aide des clés GOST-2012 sur Rutoken

Conclusion

Les PC Linux sont de plus en plus populaires dans les agences gouvernementales russes, et mettre en place une authentification fiable à deux facteurs dans ce système d'exploitation n'est pas toujours facile. Nous serons heureux de vous aider à résoudre le « problème de mot de passe » avec ce guide et à protéger de manière fiable l'accès à votre PC sans y consacrer beaucoup de temps.

Source: habr.com

Ajouter un commentaire