Utiliser des cartes à puce pour s’authentifier sur OS X Lion avec un OpenDirectory

Lorsqu’il est question de sécuriser l’accès à un poste de travail, une méthode communément admise dans beaucoup d’entreprises est l’utilisation de carte à puce. L’utilisateur au lieu de rentrer un identifiant et un mot de passe devra fournir une carte ainsi que son code PIN pour s’authentifier.

S’il existe quelques documentations sur le sujet, OS X Lion change quelque peu la donne… Le système n’est plus livré d’origine avec l’applicatif permettant de traiter avec les cartes à puce, nous allons donc devoir installer quelques outils pour rendre notre configuration fonctionnelle. D’autre part, l’intégration dans OS X Lion a connu quelques problèmes, aussi vous n’obtiendrez une configuration fonctionnelle que depuis 10.7.3.

Lorsque Apple a décidé de ne plus livrer le support des cartes à puce avec OS X Lion, le code source existant a été libéré et est devenu le projet SmartCardService de Mac OS Forge. C’est donc par là que nous allons commencer, il vous faut télécharger et installer la dernière version du package (à cette heure la bêta 2.0b1).

Une fois ce package installé, notre OS X Lion est capable de traiter avec les cartes à puce pour peu qu’il soit capable de dialoguer avec le lecteur de carte dont vous disposez. Pour ma part, j’utilise des Feitian 301 et 310 fournis par notre ami Gooze. Ces lecteurs sont fait pour fonctionner avec un set de pilote libre réunie sur le projet OpenSC. Encore une fois, les pilotes fournis sont actuellement en bêta (OS X Lion est tout jeune encore), il vous faudra donc télécharger une des dernières night build de la version 0.12.3 pour 10.6. Pour ma part j’ai installé la build 89, avant de télécharger cette version, vérifier qu’il n’y ait pas de nouveauté sur la page d’accueil du projet.

Ces deux packages étant installé, vous êtes prêt à travailler avec vos cartes à puce, la première étape consiste à installer sur ces cartes des certificats x509 et les clefs privées qui iront avec. Pour ce faire, je vais utiliser un certificat fourni par InstantSSL, j’ai essayé de configurer la même chose avec certificat généré précédemment avec l’autorité de certification du Mac sans succès et sans comprendre d’où proviens l’échec. Vous pouvez théoriquement utiliser un certificat fourni par n’importe quelle autorité de certification, l’important est que vous en disposiez au format p12 et qu’il contienne votre clef publique et privée, votre Mac doit également contenir dans le trousseau système les clefs publiques de chaque autorité signataire intermédiaire jusqu’à la racine.

Votre certificat à disposition, nous allons brancher le lecteur avec une carte dedans puis effectuer quelques tests pour vérifier le bon fonctionnement du tout. Une première chose que l’on peut faire est de demander au lecteur l’empreinte de la carte disponible via une réinitialisation de la communication :

$ opensc-tool --atr
Using reader with a card: Feitian SCR301 00 00
3b:9f:95:81:31:fe:9f:00:65:46:53:05:30:06:71:df:00:00:00:80:6a:82:5e

Cette commande est propre aux outils OpenSC, si vous utilisez un lecteur d’une autre provenance, sautez cette étape ou reportez-vous à la documentation fournie.

Si vous avez ce genre de résultat, c’est que vous êtes en bonne voie ! Passons donc aux choses sérieuses. Pour pouvoir nous servir d’une carte à puce et y inscrire des certificats, il faut d’abord s’assurer qu’elle soit vierge et formatée.

$ pkcs15-init -E
$ pkcs15-init --create-pkcs15 --profile pkcs15+onepin --use-default-transport-key --label "Yoann Gini" --pin 1234 --puk 11111111
Using reader with a card: Feitian SCR301 00 00

La première commande va effacer le contenue de la carte et la seconde va la formater de manière à contenir des certificats, la carte sera au nom de Yoann Gini et utilisera le code PIN 1234 pour l’authentification et le code PUK 11111111 pour la récupération.

Cette opération terminer, nous pouvons interroger la carte pour obtenir les informations à son sujet :

$ pkcs15-tool --dump
Using reader with a card: Feitian SCR301 00 00
PKCS#15 Card [Yoann Gini]:
	Version        : 0
	Serial number  : 1509152617290911
	Manufacturer ID: EnterSafe
	Last update    : 20120412064836Z
	Flags          : EID compliant
 
PIN [User PIN]
	Object Flags   : [0x3], private, modifiable
	ID             : 01
	Flags          : [0x32], local, initialized, needs-padding
	Length         : min_len:4, max_len:16, stored_len:16
	Pad char       : 0x00
	Reference      : 1 (0x01)
	Type           : ascii-numeric
	Path           : 3f005015

Nous pouvons également demander à la carte de nous lister les PIN utilisables actuellement. Normalement il y en a qu’un, cette commande vous est utile pour confirmer l’ID à utiliser.

$ pkcs15-tool --list-pins
Using reader with a card: Feitian SCR301 00 00
PIN [User PIN]
	Object Flags   : [0x3], private, modifiable
	ID             : 01
	Flags          : [0x32], local, initialized, needs-padding
	Length         : min_len:4, max_len:16, stored_len:16
	Pad char       : 0x00
	Reference      : 1 (0x01)
	Type           : ascii-numeric
	Path           : 3f005015

Votre carte est presque prête, il ne reste plus qu’à charger votre certificat dessus avec la commande suivante :

$ pkcs15-init --store-private-key Desktop/YoannGini.p12 -l "yoann@inig-services.com" --format pkcs12 --auth-id 01
Using reader with a card: Feitian SCR301 00 00
error:23076071:PKCS12 routines:PKCS12_parse:mac verify failure
Please enter passphrase to unlock secret key:
Importing 1 certificates:
  0: /emailAddress=yoann@inig-services.com
User PIN [User PIN] required.
Please enter User PIN [User PIN]:

Le label passez après le commutateur -l est personnel, il sert uniquement à identifier votre clef privé autrement que sous le nom Private Key. Un nouveau dump vous donnera quelque chose de ce genre :

$ pkcs15-tool --dump
Using reader with a card: Feitian SCR301 00 00
PKCS#15 Card [Yoann Gini]:
	Version        : 0
	Serial number  : 1509152617290911
	Manufacturer ID: EnterSafe
	Last update    : 20120412113152Z
	Flags          : EID compliant
 
PIN [User PIN]
	Object Flags   : [0x3], private, modifiable
	ID             : 01
	Flags          : [0x32], local, initialized, needs-padding
	Length         : min_len:4, max_len:16, stored_len:16
	Pad char       : 0x00
	Reference      : 1 (0x01)
	Type           : ascii-numeric
	Path           : 3f005015
 
Private RSA Key [yoann@inig-services.com]
	Object Flags   : [0x3], private, modifiable
	Usage          : [0x2C], sign, signRecover, unwrap
	Access Flags   : [0x0]
	ModLength      : 2048
	Key ref        : 1 (0x1)
	Native         : yes
	Path           : 3f005015
	Auth ID        : 01
	ID             : 7bbc7d5c611930933778c54cdb3261af8064f9a2
	GUID           : {7bbc7d5c-6119-3093-3778-c54cdb3261af}
 
X.509 Certificate [/emailAddress=yoann@inig-services.com]
	Object Flags   : [0x2], modifiable
	Authority      : no
	Path           : 3f0050153100
	ID             : 7bbc7d5c611930933778c54cdb3261af8064f9a2
	GUID           : {7bbc7d5c-6119-3093-3778-c54cdb3261af}
	Encoded serial : 02 11 00B315BDC28CECC9F6342EB2C1EDB2F0E0

La configuration de votre carte est terminé. Tout ce qu’il vous reste à faire c’est éventuellement changer son code PIN pour fournir à l’utilisateur quelque chose d’aléatoire :

$ pkcs15-tool --change-pin
Using reader with a card: Feitian SCR301 00 00
Enter old PIN [User PIN]:
Enter new PIN [User PIN]:
Enter new PIN again [User PIN]:

Sortez et réinsérer votre carte dans son lecteur puis ouvrez l’application Trousseaux d’accès.

 

Votre carte est correctement lue et les certificats sont reconnus.

Pour que vos utilisateurs puissent maintenant s’authentifier avec ces cartes à puce, il vous faut encore faire deux choses, associer les certificats de vos clefs à vos utilisateurs OpenDirectory et configurer vos OS X client pour interroger le lecteur de carte à l’authentification.

L’association des clefs et des utilisateurs est assez simple, avec la carte connectée, la commande sc_auth vous permet de récupérer les hash des clefs disponibles et de les associer à un utilisateur.

Commençons par vérifier que la commande est bien capable de lire notre carte :

$ sc_auth hash
8FC26FBDB681121596292A3D0A8AB9952EC1A4AC yoann@inig-services.com
5BC8B21A7C529619FE74FE3DC3F0683C3C2A3EE2 com.apple.systemdefault
574C167B36F78078DC4087282AF2F5C0630E897E com.apple.kerberos.kdc
5BC8B21A7C529619FE74FE3DC3F0683C3C2A3EE2 com.apple.systemdefault
574C167B36F78078DC4087282AF2F5C0630E897E com.apple.kerberos.kdc
6F5ABA1813E4D7BB705F33AFCBBB506E1B1C3415 Device Management Identity Certificate

Le verbe hash renvois une liste de hash et d’identifiant de certificat actuellement disponible dans chacun de vos trousseaux. Cette commande permet également d’associer un utilisateur local à une clef, mais n’est pas conçue pour faire l’association pour un compte en réseau. La documentation nous dit explicitement que cet outil est un script basique fourni à titre d’exemple et demande à être adapté en fonction de votre environnement. Je vous propose donc une version de sc_auth modifié pour supporter l’environnement OpenDirectory. Son usage est strictement identique à la version originale exception faite de l’ajout des options a p et P permettant de spécifier votre compte administrateur et son mot de passe (voir l’aide).

$ ./sc_auth accept -a diradmin -P -d /LDAPv3/office.inig-services.com -u yoanngini -k yoann@inig-services.com
Password for diradmin:

Nous pouvons vérifier que notre commande a fonctionné de cette manière :

$ ./sc_auth list -u yoanngini -d /LDAPv3/office.inig-services.com
8FC26FBDB681121596292A3D0A8AB9952EC1A4AC

Ce que fait sc_auth est très simple, il rajoute une option à la clef AuthenticationAuthority de votre utilisateur, vous pouvez le constater de cette manière :

$ dscl /LDAPv3/office.inig-services.com read /Users/yoanngini AuthenticationAuthority
AuthenticationAuthority:
 ;ApplePasswordServer;0x5b4b4946b6ea9b2fd0000000600000006,1024 35 12345 root@office.inig-services.com:192.168.42.10
 ;Kerberosv5;0x5b4b4946b6ea9b2fd0000000600000006,1024 35 12345 root@office.inig-services.com:192.168.42.10
 ;pubkeyhash;8FC26FBDB681121596292A3D0A8AB9952EC1A4AC

Notre OpenDirectory est donc prêt pour identifier nos utilisateurs via leur clef publique. Il ne reste plus qu’à configurer les postes clients pour s’en servir.

Ici nous rentrons dans la partie la plus sensible de cet article. Nous allons modifier le le fichier /etc/authorization du Mac. Ce fichier est utilisé pour savoir comment gérer l’identification des utilisateurs ainsi que leur authentification. Une mauvaise manipulation et votre Mac sera incapable d’authentifier qui que ce soit. Il vous faudra alors démarrer sur Lion Recovery HD ou en mode target pour aller annuler vos modifications. Attention, les modifications faites sur ce fichier sont appliquées en temps réel, ne sauvegardez pas un fichier à moitié modifié.

La première chose à faire est donc de faire une copie de sauvegarde du fichier ainsi qu’une copie de travail.

$ sudo cp /etc/authorization /etc/authorization.bck
$ sudo cp /etc/authorization /etc/authorization.working

Le fichier authorization est un fichier PList, un XML standardisé. Les anciennes documentations d’Apple sur le sujet vous demandent de naviguer à travers le fichier via un éditeur de texte pour rajouter et modifier des clefs à la main. Pour ma part, je préfère vous donner une suite de commandes qui effectueront ces modifications pour vous.

$ sudo /usr/libexec/PlistBuddy -c "add rights:system.login.console:mechanisms:0 string builtin:smartcard-sniffer,privileged" /etc/authorization.working
$ sudo /usr/libexec/PlistBuddy -c "add rules:authenticate:mechanisms:0 string builtin:smartcard-sniffer,privileged" /etc/authorization.working

Et voici le moment fatidique, la mise en place de notre nouvelle configuration…

sudo cp /etc/authorization.working /etc/authorization

Retirez votre carte, fermez votre session, insérez votre carte, au bout de quelque seconde, votre utilisateur est identifié et le code PIN de cotre carte à puce est demandée pour vous authentifier.

Notes

Cet article à pour but de montrer les bases du fonctionnement des cartes à puce sous OS X Lion. Néanmoins, il reste une certaine dose de configuration pour obtenir quelque chose d’intéressant pour une entreprise. Dans la liste des choses à traiter il y a :

  • verrouillage ou déconnexion automatique en cas de retrait de la carte ;
  • comment gérer l’authentification réseau ? Enregistrement le mot de passe pour l’authentification Kerberos dans le trousseau ? Est-il possible d’obtenir un TGT via une authentification par carte à puce ?
  • Désactivation totale de l’ouverture de session avec mot de passe sur certaines machines.

Concernant l’écran de veille. Apple nous propose de modifier le fichier authorization de cette manière :

$ sudo /usr/libexec/PlistBuddy -c "set rights:system.login.screensaver:comment The owner can unlock the screensaver." /etc/authorization.working
$ sudo /usr/libexec/PlistBuddy -c "set rights:system.login.screensaver:rule authenticate-session-owner" /etc/authorization.working

Pour ma part, cela m’a conduit à une impossibilité de déverrouiller l’écran de veille si la carte est dans le lecteur. Sans la carte, j’ai pu accéder à ma session avec le mot de passe habituel.

Une réflexion au sujet de « Utiliser des cartes à puce pour s’authentifier sur OS X Lion avec un OpenDirectory »

  1. Article sympa et informatif.

    In the US, smart cards (CAC and PIV) have to be used by law (HPSD-12) for Macs in government, although usually with Active Directory (AD) rather than Open Directory (OD) because of the limited power of Apple server hardware and a *perception* of end-of-life around OS X Server itself.

    Et alors? There are commercial products for 10.4 to 10.9 that may be helpful, even using third party TokenD codes. Google details all the options.

Laisser un commentaire