Authentification par carte à puce sous OS X Mavericks

OS X 10.9 est maintenant dans la nature et comme depuis 10.7, le support des cartes à puce n’est pas quelque chose de mis en avant par Apple. Pour autant, OS X supporte toujours l’authentification par carte à puce, que ce soit via des solutions commerciales ou par des projets libres.

Aussi, 10.9 supporte les cartes à puce sans aucun souci. Cependant, quelques modifications dans le système de gestion de la base d’autorisation me donnent l’occasion de faire une mise à jour de mon précédent article où j’expliquant comment supporter l’authentification par carte à puce sur OS X Lion via un serveur Open Directory.

Pour être faire simple, quasiment rien ne change. Aucun système de carte à puce n’est supporté nativement, vous devez installer les pilotes nécessaires. Si vous avez déjà lu mon ancien article, vous pouvez très rapidement passer à la fin de l’article. La seule chose qui change concerne la modification de la base d’autorisation.

Jusqu’à présent, les cartes de type BELPIC, CAC, CACNG, JPKI et PIV étaient supportés via le projet SmartCard Service sur MacOSForge. À l’heure où j’écris ces lignes, le projet n’est pas à jour pour 10.9. Cependant, il semble que les pilotes pour 10.8 fonctionnent sans aucun souci sur 10.9, il suffit de les installer à la main. Si vous avez besoin d’un support plus officiel d’une de ces cartes, vous devrez vous tourner vers des solutions commerciales comme Centrify, Thursby ou autre. Autrement, comme moi vous pouvez choisir un système de carte à puce fonctionnant avec OpenSC (attention, le site à changé, il est maintenant sur GitHub). Si vous êtes en Europe et que vous souhaitez vous procurer des lecteurs et cartes compatibles OpenSC, voyez auprès du site gooze.eu.

Pour que le système soit reconnu, il faut donc installer les pilotes nécessaires à la lecture de la carte. Dans mon cas, ce sera le package de OpenSC pour OS X.

Préparation des cartes

Cette partie de la procédure concerne les cartes vierges. Si vous utilisez une carte déjà pourvue d’un certificat comme une carte gouvernementale, vous pouvez passer à l’étape suivante.

Pour initialiser une carte, il faut en premier s’assurer de son bon fonctionnement. En fonction des outils, les choses sont différentes, ici OpenSC fourni un utilitaire en ligne de commande permettant de tester le bon fonctionnement du lecteur et de la carte en affichant le message ATR de la carte.

$ 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

Si à ce stade vous n’arrivez pas à interroger la carte, vous êtes bon pour un redémarrage de la dernière chance avant de contacter le support technique de votre système de carte à puce.

Si tout se passe bien, il vous faut formater votre carte à puce pour la préparer à recevoir vos certificats X.509.

$ 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

Ici la commande permet d’indiquer le type d’usage attendu de la carte ainsi que son nom, son code PIN initial et le code PUK de récupération associé. Vous êtes déjà habitué avec ces concepts via les cartes SIM de vos opérateurs de téléphonie mobile.

Une fois la carte formatée il est possible de la consulter pour voir qu’elle est prêt et vierge.

$ 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

Il ne reste donc plus qu’à charger votre certificat de sécurité sur la carte.

$ 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]:

Les données du certificat ici contenues dans Desktop/YoannGini.p12 sont la clef publique ainsi que la clef privée. La clef publique doit être impérativement signée par une autorité reconnue valide par le Mac. Le certificat racine de l’autorité ainsi que les certificats intermédiaires nécessaires à la validation de votre certificat utilisateur doivent impérativement se trouver dans le trousseau système des Mac devant réaliser de l’authentification par carte à puce.

Lors de l’enregistrement du certificat sur la clef, il vous sera demandé le mot de passe de protection de votre clef privée (qui protège l’accès à votre fichier p12) ainsi que le code PIN de la carte.

Une fois le tout chargé, il est possible de lire de nouveau le contenu de la carte pour vérifier la présence des données.

$ 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

Si vous sortez puis réinsérez votre carte de son lecteur, vous verrez les données disponible dans le Trousseau d’accès.

Tout ce qu’il vous reste à faire, c’est éventuellement changer le code PIN de la carte avant de la donner à l’utilisateur.

$ 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]:

Association des utilisateurs à leur certificat

Pour que le système soit capable d’authentifier un utilisateur (local ou réseau) via une carte, il faut à un moment avoir fait une association entre la carte et cet utilisateur. Différentes méthodes existent, ici je ne parlerais que de la plus simple, qui consiste en l’enregistrement de l’empreinte du certificat dans l’annuaire de service.

Pour cela, il faut commencer par obtenir cette empreinte. Cela se fait avec une ligne de commande, sc_auth, présent par défaut sur OS X.

$ 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

Avec le verbe hash, la commande vous sort la liste des empreintes de clef actuellement disponible sur le système. Repérez celle qui vous intéresse en fonction du nom et copiez ce nom.

Pour maintenant associer effectivement l’utilisateur à sa clef, il faut de nouveau utiliser la commande sc_auth. Cependant, la version fournie par Apple sur OS X présente une limitation, elle ne peut pas éditer un annuaire réseau, elle ne travaille qu’en local. Aussi, j’ai mis à disposition une version modifier du script sc_auth contournant cette limitation.

L’usage de ce script est en tout point identique à la version fournie par Apple 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).

Pour associer un utilisateur Open Directory à son certificat, il faudra utiliser le verbe accept.

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

Il est possible de vérifier le bon fonctionnement de la commande via le verbe list.

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

L’opération effectuée par sc_auth est au final très simple, elle ajoute une possibilité au champ AuthenticationAuthority de l’utilisateur cible, indiquant la possibilité d’une authentification de type « pubkeyhash » et spécifiant alors le hash attendu.

$ 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

L’annuaire de service contient maintenant les informations nécessaires pour l’authentification. Il ne reste plus qu’à configurer les systèmes client pour utiliser les cartes à puce.

Configuration des postes clients pour l’usage de la carte à puce

Ici ce trouve la grande différence entre 10.9 et ces prédécesseurs. En effet, la base d’autorisation du système normalement situé dans /etc/authorization n’existe plus sous la forme d’un fichier plist. Aujourd’hui, c’est une base SQLite située dans /var/db/auth.db. Hors de question de l’éditer directement.

La méthode normale d’édition de cette base est via la ligne de commande « security authorizationdb ». Chose étonnante, sous 10.9 Apple a étendu cette commande pour supporter directement l’activation ou la désactivation de l’authentification par carte à puce. Il n’est plus nécessaire de jouer avec les différents droits de la base à la main.

$ sudo security authorizationdb smartcard enable
YES (0)

Sortez votre carte du lecteur, fermez votre session, insérez la carte et attendez quelques secondes, le champ mot de passe se transforme en champ code PIN.

Si lorsque vous entrez votre code PIN l’authentification échoue, connectez-vous en même temps en SSH sur cette machine pour suivre en temps réel le journal d’évènement avec la commande « syslog -w ». La plupart du temps, le problème vient d’un certificat qui n’est pas considéré comme étant de confiance.

Dans le cas de 10.9.0, il reste un problème vis-à-vis de l’authentification par carte à puce. La ligne de commande d’Apple permet en effet d’activer le support des cartes à puce, mais ne permet pas (pour le moment?) de désactiver l’authentification par mot de passe.

Laisser un commentaire