<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Geekfault &#187; LeCoyote</title>
	<atom:link href="http://geekfault.org/author/lecoyote/feed/" rel="self" type="application/rss+xml" />
	<link>http://geekfault.org</link>
	<description>If it doesn&#039;t segfault, you&#039;re doing it wrong.</description>
	<lastBuildDate>Sun, 16 Oct 2011 00:54:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Yubikey : la petite clé qui assure</title>
		<link>http://geekfault.org/2011/04/14/yubikey-la-petite-cle-qui-assure/</link>
		<comments>http://geekfault.org/2011/04/14/yubikey-la-petite-cle-qui-assure/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 10:30:54 +0000</pubDate>
		<dc:creator>LeCoyote</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[aes]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[otp]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=5735</guid>
		<description><![CDATA[Yubikey, c&#8217;est une petite clé USB un peu spéciale. Une petite pastille tactile sur le dessus permet de générer un mot de passe à usage unique, qu&#8217;un service distant saura utiliser pour vous identifier ou non. C&#8217;est pratique, c&#8217;est sûr (si c&#8217;est bien utilisé), et c&#8217;est assez geek pour qu&#8217;on en parle. Le problème Les [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/06/14/guerre-du-warez/' rel='bookmark' title='La petite guerre du Warez'>La petite guerre du Warez</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2011/03/yubikey.jpg" alt="" title="yubikey" width="250" height="167" class="alignleft size-full wp-image-5747" />Yubikey, c&#8217;est une petite clé USB un peu spéciale. Une petite pastille tactile sur le dessus permet de générer un <strong>mot de passe à usage unique</strong>, qu&#8217;un service distant saura utiliser pour vous identifier ou non. C&#8217;est pratique, c&#8217;est sûr (si c&#8217;est bien utilisé), et c&#8217;est assez geek pour qu&#8217;on en parle.</p>
<p><!--more--><br />
<!--pagetitle:Introduction--></p>
<h3>Le problème</h3>
<p>Les mots de passe se multiplient comme des petits pains, surtout chez les geeks. Comme il est impensable de tous les noter dans un petit calepin ou d&#8217;utiliser le même partout (on est d&#8217;accord ?), il faut sans cesse en inventer de nouveaux et les retenir.</p>
<p>Par ailleurs, si on veut être un peu sérieux, il <strong>faut</strong> se méfier du terminal que l&#8217;on utilise, surtout s&#8217;il appartient à un tiers. Qui vous dit que le vilain admin du cyber-café n&#8217;a pas un vilain keylogger sur toutes ses machines ? Plus fourbe, qui vous dit qu&#8217;il n&#8217;y a pas un vilain keylogger malware installé sur le laptop de votre [maman|grand-père|hamster] que vous utilisez en ce moment, &#8220;pour dépanner&#8221; ? Sans parler d&#8217;attaques type MitM et autres joyeusetés &#8230;</p>
<p>Arrive la Yubikey. Sans être une solution miracle à tous les problèmes de mot de passe, c&#8217;est une façon élégante de se simplifier la vie.</p>
<h3>La Yubikey, en bref</h3>
<div id="attachment_5747" class="wp-caption alignright" style="width: 310px"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2011/03/Yubico-Yubikey-USB-Key-300x157.jpg" alt="" title="Yubico-Yubikey-USB-Key" width="300" height="157" class="alignright size-medium wp-image-5742" /><p class="wp-caption-text">Yubikey 2.0, by Yubico</p></div>
<p>Plutôt que de vous pointer vers le manuel de la Yubikey, je vais en synthétiser quelques passage pour commencer.</p>
<p>La Yubikey fonctionne sur n&#8217;importe quel matériel équipé d&#8217;un port USB hôte et tournant sous à peu près n&#8217;importe quel système d&#8217;exploitation supportant un clavier USB (sous Linux, le support HID suffit) : en effet, elle fonctionne en émulant des frappes clavier, sans avoir recours à un driver particulier.</p>
<p>À chaque utilisation, la clé génère une chaîne de caractères unique (appelée <strong>OTP</strong> pour One Time Password), basée entre autres choses sur une identité propre à la clé, un compteur non-volatile, une horloge et un nombre aléatoire. Cette chaîne est ensuite chiffrée à l&#8217;aide d&#8217;une clé AES de 128 bits et envoyée à l&#8217;hôte. Exemples :</p>
<p>[cc]fifjgjgkhchbirdrfdnlnghhfgrtnnlgedjlftrbdeut<br />
fifjgjgkhchbgefdkbbditfjrlniggevfhenublfnrev<br />
fifjgjgkhchblechfkfhiiuunbtnvgihdfiktncvlhck[/cc]</p>
<p><em>(on constate que les 12 premiers caractères sont toujours les mêmes : il s&#8217;agit là de l&#8217;identité de la Yubikey)</em></p>
<p>De l&#8217;autre côté, elle sera déchiffrée à l&#8217;aide de la même clé AES. De par l&#8217;usage d&#8217;un chiffrement symétrique, la sûreté de l&#8217;ensemble repose sur une bonne protection de la clé AES. Celle-ci est stockée dans une mémoire non volatile intégrée au microcontrolleur et n&#8217;est pas accessible, la configuration de la Yubikey se faisant en <strong>écriture seule</strong>. Pour récupérer la clé, il faudrait éventuellement sonder physiquement la puce ou analyser son comportement, ce qui implique de casser physiquement la Yubikey et de disposer de matériel de pointe. En d&#8217;autres termes, si ce n&#8217;est pas complètement adapté aux agents secrets, c&#8217;est probablement suffisamment sûr pour le geek moyen que je suis.</p>
<p>Le résultat est enfin vérifié par un serveur de validation : soit celui de Yubico, soit un serveur fait maison. La validation tient compte de plusieurs critères, au-delà de la simple identité. Notamment, la valeur du compteur est examinée : si elle est inférieure ou égale à la dernière valeur reçue, l&#8217;OTP est rejeté comme étant un &#8220;rejeu&#8221; d&#8217;un OTP plus ancien.</p>
<p> L&#8217;ensemble se résume au schéma suivant (cliquer pour agrandir) :<br />
<div id="attachment_5921" class="wp-caption aligncenter" style="width: 310px"><a href="http://geekfault.org/wp-content/uploads/2011/03/YUBIKEY-23.png" title="Yubikey_Principe" rel="lightbox.5735"><img src="http://geekfault.org/wp-content/uploads/2011/03/YUBIKEY-23-300x222.png" alt="" title="Yubikey_Principe" width="300" height="222" class="size-medium wp-image-5921" /></a><p class="wp-caption-text">Fonctionnement de base de la Yubikey</p></div></p>
<p>Une application doit donc être configurée (ou modifiée) afin d&#8217;accepter un login Yubikey. Comme nous utilisons du logiciel libre, ça se fait en général assez facilement. Nous allons donc voir comment utiliser la Yubikey sous Linux de façon basique, puis nous verrons la configuration dune clé pour une utilisation &#8220;indépendante&#8221; avec serveur de validation maison.</p>
<p><!--nextpage--><!--pagetitle:Utilisation simple --></p>
<h3>Utilisation simple</h3>
<p>De base, nous utiliserons les services de validation de Yubico. Il s&#8217;agit ici de configurer simplement Linux pour identifier un utilisateur en utilisant sa clé.</p>
<h4>Application n°1 : login Linux</h4>
<p>Tout bon Linux moderne utilise en général <a href="http://www.kernel.org/pub/linux/libs/pam/">Linux-PAM</a> pour tout ce qui touche à l&#8217;identification utilisateur. Et comme Yubico a la bonne idée de proposer un module PAM, c&#8217;est ce que nous allons utiliser.</p>
<p>Il y a trois dépôts à aller chercher pour construire notre module PAM : celui de la bibliothèque <a href="https://github.com/Yubico/yubico-c-client">yubico-c-client</a>, celui de l&#8217;outil de configuration<a href="https://github.com/Yubico/yubikey-personalization/">yubikey-personalization</a>, et enfin <a href="https://github.com/Yubico/yubico-pam">yubico-pam</a> lui-même. Pour la suite, je suppose que vous avez déjà git d&#8217;installé, en sus des outils habituels (automake, gcc &#8230;), et que vous savez aller installer une dépendance manquante (comme curl) au besoin.</p>
<h5>Compilations</h5>
<p>On commence par compiler la bilbiothèque client.<br />
[cc][smokey@moira yubi]$ git clone https://github.com/Yubico/yubico-c-client<br />
Cloning into yubico-c-client&#8230;<br />
remote: Counting objects: 397, done.<br />
remote: Compressing objects: 100% (194/194), done.<br />
remote: Total 397 (delta 233), reused 319 (delta 201)<br />
Receiving objects: 100% (397/397), 94.17 KiB, done.<br />
Resolving deltas: 100% (233/233), done.<br />
[smokey@moira yubi]$ cd yubico-c-client/<br />
[smokey@moira yubico-c-client]$ autoreconf &#8211;install<br />
[smokey@moira yubico-c-client]$ ./configure<br />
[smokey@moira yubico-c-client]$ sudo make install<br />
[smokey@moira yubico-c-client]$<br />
[/cc]<br />
Rien que du très classique. La bibliothèque est installée comme il se doit dans /usr/local/lib. Je vous laisse d&#8217;ailleurs faire exactement la même chose avec yubikey-personalization dans un répertoire à côté, vous êtes grands après tout.</p>
<p>On peut maintenant répéter l&#8217;opération avec yubico-pam, à une astuce près : la dépendance ykpers-1 (yubikey-personalization) a été ajoutée très récemment et se vérifie via pkg-config. Il faut donc indiquer à ce dernier où trouver le fichier .pc qui va bien via la variable d&#8217;environnement PKG_CONFIG_PATH. Ce qui donne :<br />
[ccW][smokey@moira yubico-pam]$ cd ..<br />
[smokey@moira yubi]$ git clone https://github.com/Yubico/yubico-pam<br />
[smokey@moira yubi]$ cd yubico-pam/<br />
[smokey@moira yubico-pam]$ autoreconf &#8211;install<br />
[smokey@moira yubico-pam]$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig ./configure<br />
[smokey@moira yubico-pam]$ sudo make install<br />
[smokey@moira yubico-pam]$[/ccW]</p>
<p>Le module est installé dans /usr/local/lib/security. Pour que PAM puisse l&#8217;utiliser, il faut le mettre au bon endroit (et donc être root) :<br />
[cc]# mv /usr/local/lib/security/pam_yubico.so /lib/security/[/cc]</p>
<h5>Configuration de PAM</h5>
<p>Il faut maintenant indiquer à PAM que l&#8217;on veut pouvoir utiliser l&#8217;OTP de la Yubikey. Pour ce faire, on modifie <strong>/etc/pam.d/login</strong> pour y faire ajouter la ligne suivante :<br />
[cc]auth            sufficient      pam_yubico.so id=16[/cc]<br />
<strong>Attention :</strong> si vous n&#8217;êtes pas très familiers avec PAM, sachez qu&#8217;il faut ajouter cette ligne au bon endroit. Je vous recommande de la mettre juste au-dessus de celle du module <strong>pam_unix.so</strong>. Si vous la placez trop haut, étant donné que le module est ici <strong>sufficient</strong> (suffisant), il shuntera les modules auth suivants, même s&#8217;ils sont <strong>required</strong> (requis) : pam_securetty ou pam_nologin seraient par exemple rendus inefficaces, ce qui PEUT être grave OU PAS. À vous de voir <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Variantes possibles :</p>
<ul>
<li> avec debug (conseillé en cas de souci)<br />
[cc]auth  sufficient  pam_yubico.so id=16 debug[/cc]</li>
<li> avec gestion centralisée des identités<br />
[cc]auth  sufficient  pam_yubico.so id=16 authfile=<chemin absolu>[/cc]</li>
</ul>
<p><strong>Note :</strong> pour observer les messages de debug, il suffit de créer le fichier <strong>/var/run/pam-debug.log</strong> et de le rendre inscriptible à tous.</p>
<p>Pour finir, il faut renseigner le système sur l&#8217;identité des yubikeys des utilisateurs. Il y a deux façons de le faire :</p>
<ul>
<li> individuellement : il faut alors créer <strong>~/.yubico/authorized_yubikeys</strong> pour chaque utilisateur ;</li>
<li> globalement : le fichier peut se trouver n&#8217;importe où, du moment que le chemin correspond à celui passé à <strong>authfile=</strong> ci-dessus évidemment.</li>
</ul>
<p>Dans les deux cas, le format du fichier est :<br />
[cc]<login>:<yubi ID1>:<yubi ID2>&#8230;[/cc]<br />
Pour le fichier global, ayez soin d&#8217;utiliser une ligne par enregistrement utilisateur. L&#8217;ID de chaque Yubikey peut facilement être récupéré en prenant les 12 premiers caractères de n&#8217;importe quel OTP généré.</p>
<p>Si tout s&#8217;est bien passé, au prochain login, vous devriez voir quelque chose dans ce genre :<br />
<div id="attachment_5857" class="wp-caption aligncenter" style="width: 332px"><img src="http://geekfault.org/wp-content/uploads/2011/03/yubikey-login1.jpg" alt="yubikey login" title="yubikey login" width="322" height="87" class="size-full wp-image-5857" /><p class="wp-caption-text">Login console avec la Yubikey<br />
On effleure la clé, et c'est gagné <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p></div></p>
<h4>Application n°2 : authentification à 2 facteurs avec SSH</h4>
<p>L&#8217;authentification à 2 facteurs est basée, comme son nom l&#8217;indique, sur deux moyens d&#8217;authentification différents. Ici, nous sommes dans le cas typique de &#8220;ce que l&#8217;on connaît&#8221; (un mot de passe classique) combiné avec &#8220;ce que l&#8217;on détient&#8221; (la Yubikey). Les deux seront combinés pour former un mot de passe hybride, que l&#8217;on va charger pam_yupico de valider. En image, ça donne ça :<br />
<div id="attachment_5929" class="wp-caption aligncenter" style="width: 310px"><a href="http://geekfault.org/wp-content/uploads/2011/03/YUBIKEY-2factorbis1.png" title="YUBIKEY-2factorbis" rel="lightbox.5735"><img src="http://geekfault.org/wp-content/uploads/2011/03/YUBIKEY-2factorbis1-300x249.png" alt="Yubikey 2 Factor" title="YUBIKEY-2factorbis" width="300" height="249" class="size-medium wp-image-5929" /></a><p class="wp-caption-text">Fonctionnement de l&#039;authentification à 2 facteurs avec SHS et PAM</p></div></p>
<p>La marche à suivre est sensiblement la même que précédemment, sauf bien entendu pour ce qui est de la configuration de PAM. Ici, on va s&#8217;intéresser logiquement à <strong>/etc/pam.d/sshd</strong>. Tout d&#8217;abord, on y ajoute la ligne suivante :<br />
[cc]auth       required     pam_yubico.so id=16[/cc]<br />
Par rapport à tout-à-l&#8217;heure, l&#8217;utilisation de la Yubikey est ici requise au lieu d&#8217;être suffisante. Du coup, on ne risque plus de shunter d&#8217;autre modules, mais il faut tout de même placer cette ligne AVANT celle de <strong>pam_unix.so</strong>.</p>
<p>Ensuite, il faut modifier les paramètres du module <strong>pam_unix.so</strong>. Celui-ci peut être configuré directement dans <strong>/etc/pam.d/sshd</strong> (ex. Archlinux), ou être appelé par un <strong>@include</strong> pointant sur <strong>/etc/pam.d/system-auth</strong> (ex. Gentoo) ou <strong>/etc/pam.d/common-auth</strong> (ex. Debian) : à vous d&#8217;adapter en fonction de ce que vous avez sous les yeux. L&#8217;important est d&#8217;ajouter l&#8217;option <strong>try_first_pass</strong>, de façon à ce que la ligne ressemble à ceci :<br />
[cc]auth       required     pam_unix.so try_first_pass nullok[/cc]</p>
<p>Une fois ces modifications faites, il ne reste plus qu&#8217;à vous connecter à la machine distante comme d&#8217;habitude ; mais au lieu de taper simplement <strong>Entrée</strong> pour valider le mot de passe, on va rajouter l&#8217;OTP de la Yubikey. En d&#8217;autres termes, au lieu de faire <strong>mot_de_passe+Entrée</strong>, on fait <strong>mot_de_passe+toucher_la_yubikey</strong>.</p>
<p>Et ça marche ! Sauf si bien sûr vous avez oublié de préciser <strong>PasswordAuthentication yes</strong> dans votre <strong>/etc/ssh/sshd_config</strong> &#8230; c&#8217;était pour voir si vous suiviez <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
<div id="attachment_5870" class="wp-caption aligncenter" style="width: 351px"><img src="http://geekfault.org/wp-content/uploads/2011/03/yubikey_ssh.jpeg" alt="yubikey en ssh" title="yubikey_ssh" width="341" height="70" class="size-full wp-image-5870" /><p class="wp-caption-text">Login SSH. Par défaut, SSH propose d&#039;utiliser la clé publique s&#039;il en trouve une : taper entrée pour passer à l&#039;étape suivante.</p></div></p>
<p><!--nextpage--><!--pagetitle:Utilisation avancée --></p>
<h3>Utilisation avancée</h3>
<p>Dans cette partie, un peu plus technique, nous allons aborder la configuration d&#8217;une Yubikey et le montage d&#8217;un serveur de validation. Mais avant tout &#8230;</p>
<h4>ATTENTION</h4>
<p>La Yubikey est “write-only”. Ceci signifie que lors d&#8217;une opération de configuration, les réglages précédents sont irrémédiablement perdus. Notamment, si vous écrasez la configuration par défaut, votre clé ne pourra plus vous identifier auprès de Yubico.<br />
Par ailleurs, si vous décidez de protéger la clé par un code d&#8217;accès, et que vous oubliez ce code, vous aurez gagné un joli bout de plastique très décoratif &#8230;</p>
<p>Ceci dit, passons aux choses sérieuses.</p>
<h4>Configuration de la clé</h4>
<p>Sous Linux, le seul outil disponible pour l&#8217;instant est en ligne de commande. Si ça vous fait peur, il y a des équivalent pour clicodrome Windows ou Mac OS. <a href="http://www.yubico.com/personalization-tool">Choisissez ici</a> celui qui vous convient le mieux <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Le dépôt de l&#8217;outil de configuration (ou personalization en anglais) est ici : <a href="https://github.com/Yubico/yubikey-personalization.git">https://github.com/Yubico/yubikey-personalization.git</a>. Je ne reviens pas sur la procédure d&#8217;installation, elle est identique aux précédentes et détaillée <a href="https://github.com/Yubico/yubikey-personalization/wiki/Read-Me">sur le wiki du projet</a>. D&#8217;ailleurs, si vous avez suivi la partie sur la configuration de PAM, vous l&#8217;avez déjà installé <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Une fois compilé, je vous engage vivement à jeter un oeil à l&#8217;aide en ligne : [cci]ykpersonalize -h [/cci]</p>
<p>L&#8217;option la plus importante à mes yeux est <strong>-1</strong> ou <strong>-2</strong> : c&#8217;est ainsi que l&#8217;on choisit la configuration que l&#8217;on souhaite modifier. En effet, les Yubikeys version 2.0 et plus possèdent deux “emplacements” différents, contre un seul dans la première version. Par défaut sur une clé 2.0 par exemple, l&#8217;emplacement 1 est paramétré pour une identification OTP auprès des serveurs de Yubico, et l&#8217;emplacement 2 est vide.</p>
<p>Le paramétrage le plus fréquemment rencontré est d&#8217;assigner un <strong>mot de passe statique</strong> à la configuraion 2, mot de passe qui sera accessible par un contact long (≃ 2s). La manipulation est ici très simple :<br />
[cc lines="16"]smokey@moira:~$ sudo ykpersonalize -2<br />
Password:<br />
Firmware version 2.0.2 Touch level 1792 Program sequence 6</p>
<p>Passphrase to create AES key: crévindiou<br />
Configuration data to be written to key configuration 2:</p>
<p>fixed: m:<br />
uid: h:000000000000<br />
key: h:459b2b6c6f4c511d543919efbad3051a<br />
acc_code: h:000000000000<br />
ticket_flags: APPEND_CR<br />
config_flags: STATIC_TICKET|STRONG_PW1|STRONG_PW2|MAN_UPDATE<br />
extended_flags: </p>
<p>Commit? (y/n) [n]:[/cc]<br />
Il ne reste plus qu&#8217;à valider par un &#8220;<strong>y</strong>&#8221; pour sauvegarder la configuration.<br />
Notez que vous n&#8217;êtes pas obligés de taper des bêtises (comme mon &#8220;crévindiou&#8221;) pour créer la clé AES. Le résultat sera ici un mot de passe statique du style :<br />
[cci]è(IFejhdkkjnvrtbdeggeffvbknvbulg[/cci].</p>
<p><strong>Note :</strong> Pourquoi sudo ? tout simplement parce que les permissions de /dev/bus/usb/xxx/yyy n&#8217;autorisent en général pas l&#8217;utilisateur lambda à écrire sur un port USB.</p>
<p>Il est également possible de créer une configuration &#8220;<strong>OTP Yubikey</strong>&#8221; similaire à la configuration par défaut. Je fais ici le choix d&#8217;utiliser l&#8217;emplacement 2, afin de conserver la configuration d&#8217;origine dans l&#8217;emplacement 1. Or, l&#8217;outil ykpersonalize considère par défaut que l&#8217;option -2 va de pair avec une configuration statique ; il faut donc désactiver les options liées au mot de passe statique pour écrire une configuration OTP dans l&#8217;emplacement 2 (d&#8217;où les 4 options -o-xxx). Si ce n&#8217;est pas clair, faites tourner “à vide” (sans écrire) ykpersonalize avec -1 et -2, et observez les différents config_flags. Ici, ça nous donne :<br />
[ccW lines="16"]smokey@moira:~/tmp/yubiserve$ sudo ykpersonalize -2 -o-static-ticket -o-strong-pw1 -o-strong-pw2  -o-man-update -ofixed=cccccccccccc<br />
Firmware version 2.0.2 Touch level 1792 Program sequence 6</p>
<p>Passphrase to create AES key:<br />
Configuration data to be written to key configuration 2:</p>
<p>fixed: m:cccccccccccc<br />
uid: h:000000000000<br />
key: h:8ebfe5cd3dad48f2c5008d686ea5b384<br />
acc_code: h:000000000000<br />
ticket_flags: APPEND_CR<br />
config_flags:<br />
extended_flags: </p>
<p>Commit? (y/n) [n]: y<br />
smokey@moira:~/tmp/yubiserve$<br />
[/ccW]</p>
<p>La configuration 2 de la clé est donc faite pour l&#8217;identité <strong>cccccccccccc</strong> et avec la clé AES <strong>8ebfe5cd3dad48f2c5008d686ea5b384</strong>. Nous allons voir maintenant comment utiliser cette configuration avec un serveur de validation maison.</p>
<h4>Serveur de validation “maison”</h4>
<p>Comme me le faisait remarquer un certain <a href="http://blog.spyou.org/">Spyou</a>, confier à un tiers la vérification du droit d&#8217;accès à son infrastructure n&#8217;est probablement pas l&#8217;idée du siècle. Mon infrastructure se limite à peu de choses, mais tant qu&#8217;à faire, autant garder la vérification en interne. Il s&#8217;agit donc maintenant de monter son propre serveur de vérification. Yubico en référence <a href="http://www.yubico.com/validation-server">quelques-uns</a>, je vais ici détailler l&#8217;installation et la configuration du plus simple, <a href="http://code.google.com/p/yubico-yubiserve/">YubiServe</a>. Et quand je dis simple, je pèse mes mots : le tout tient en 2 scripts Python <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Avant tout, je vous recommande d&#8217;éviter la version 3.1, qui (chez moi en tout cas) contient des &#8220;?&#8221; partout là où on attend des tabulations. Je vais donc partir du trunk svn :<br />
[cc]svn checkout http://yubico-yubiserve.googlecode.com/svn/trunk/ yubiserve[/cc]</p>
<p>Ceci fait, suivons les instructions du README.<br />
Tout d&#8217;abord, on crée un certificat SSL :<br />
[ccW]openssl req -new -x509 -keyout yubiserve.pem -out yubiserve.pem -days 365 -nodes[/ccW]</p>
<p>Ensuite, si vous avez installé Python 2 et 3 sur votre système, il vous faudra peut-être modifier un peu les scripts <strong>dbconf.py</strong> et <strong>yubiserve.py</strong> : soit pour faire pointer l&#8217;interpréteur vers python2, soit pour modifier l&#8217;appel au module sqlite en sqlite3. Par défaut, YubiServe utilisera une base sqlite (déjà présente d&#8217;origine), mais il suffit de modifier le fichier de configuration (yubiserve.cfg) pour utiliser une base MySQL à la place.</p>
<p>Il est temps maintenant d&#8217;ajouter une clé au serveur. Utilisons donc <strong>dbconf.py</strong>, qui prend en arguments un “nickname” permettant d&#8217;identifier facilement la clé, ainsi que l&#8217;uid et la clé AES utilisés lors du paramétrage (cf. plus haut).<br />
[ccW]smokey@moira:~/tmp/yubiserve$ ./dbconf.py -ya smokey cccccccccccc 000000000000 8ebfe5cd3dad48f2c5008d686ea5b384<br />
Key &#8216;smokey&#8217; added to database.<br />
smokey@moira:~/tmp/yubiserve$[/ccW]<br />
On en profite pour ajouter aussi l&#8217;identité <strong>cccccccccccc</strong> dans le /home/utilisateur/.yubico/authorized_yubikeys qui va bien.</p>
<p>Lançons le serveur :<br />
[cc]smokey@moira:~/tmp/yubiserve$ ./yubiserve.py<br />
HTTP Server is running.<br />
[/cc]</p>
<p>Il ne reste plus qu&#8217;à essayer le tout, en faisant pointer un navigateur sur <a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>, ce qui donne normalement ceci :<br />
<a href="http://geekfault.org/wp-content/uploads/2011/04/yubikey_valid1.png" title="yubikey_valid1" rel="lightbox.5735"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2011/04/yubikey_valid1.png" alt="YubiServe" title="yubikey_valid1" width="520" height="273" class="aligncenter size-medium wp-image-5964" /></a></p>
<p>Il suffit alors d&#8217;envoyer l&#8217;OTP dans le champ prévu à cet effet pour obtenir le résultat :<br />
<a href="http://geekfault.org/wp-content/uploads/2011/04/yubikey_valid2.png" title="yubikey_valid2" rel="lightbox.5735"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2011/04/yubikey_valid2.png" alt="" title="yubikey_valid2" width="520" height="273" class="aligncenter size-medium wp-image-5966" /></a></p>
<p>Ça fonctionne ! Mais comment faire en sorte d&#8217;interroger ce serveur ? Nous allons voir le cas du module PAM, configuré dans la partie précédente.</p>
<h4>PAM + Serveur de validation maison</h4>
<p>Rappelez-vous, la configuration ressemblait à ça :<br />
[cc]auth       required     pam_yubico.so id=16[/cc]<br />
Nous allons la transformer en ça :<br />
[ccW]auth       required     pam_yubico.so id=1 debug url=http://127.0.0.1:8000/wsapi/2.0/verify?id=%d&#038;otp=%s[/ccW]</p>
<p>Par ailleurs, vous aurez remarqué que l&#8217;on a précisé un <strong>id</strong> en argument à pam_yubico. Cet id numérique sera passé via l&#8217;URL au serveur de validation : il faut donc qu&#8217;il soit défini côté serveur. Nous allons donc ajouter une clé d&#8217;API :<br />
[cc]smokey@moira:~/tmp/yubiserve$ ./dbconf.py -aa test-ssh<br />
New API Key for &#8216;test2&#8242;: &#8216;WGZydWozbHQyVW9BM092cy9nMTk=&#8217;<br />
Your API Key ID is: 1[/cc]<br />
Bien entendu, notre &#8220;API Key ID&#8221; est 1 seulement si c&#8217;est le premier à être créé ; l&#8217;important est qu&#8217;il existe.</p>
<p>C&#8217;est fini ! On peut maintenant s&#8217;identifier auprès de PAM avec la clé re-configurée par nos soins.</p>
<p><!--nextpage--><!--pagetitle:Conclusion--></p>
<h3>N&#8217;oublions pas &#8230;</h3>
<p>Il serait imprudent de penser que la Yubikey est la réponse à tout. Elle n&#8217;est qu&#8217;un élément de plus dans une stratégie de sûreté qui se doit d&#8217;être solide par ailleurs (c&#8217;est toujours le maillon le plus faible qui compte). Si votre login est connu et que vous n&#8217;utilisez *que* la Yubikey pour vous connecter, c&#8217;est déjà beaucoup moins sûr qu&#8217;un schéma à 2 facteurs.</p>
<p>Par ailleurs, comme la Yubikey fonctionne en émulant une saisie clavier, son comportement dépendra du type de clavier utilisé sur le terminal ; si la plupart des dispositions classiques (azerty/qwerty) ne devraient pas poser problème, il en est tout autrement pour les dispositions plus &#8220;exotiques&#8221; (comme bepo) ou utilisant des caractères non-latins (cyrilliques par exemple). Ce n&#8217;est pas un point bloquant en soi, vu qu&#8217;il suffit de changer temporairement la configuration du clavier, mais je me devais de le souligner, vu qu&#8217;on m&#8217;avait posé la question.</p>
<h3>Conclusion et informations additionnelles</h3>
<p>Tout comme une clé SSH avec un user-agent, une Yubikey permet d&#8217;éviter de taper des mots de passe à chaque login. C&#8217;est un gain de temps et de tranquillité d&#8217;esprit. C&#8217;est aussi une sécurité supplémentaire car les mots de passe générés ne sont pas réutilisables, ce qui invalide toute forme d&#8217;attaque par rejeu. Cerise sur le gâteau, on trouve déjà pas mal de solutions logicielles libres, venant de Yubico ou d&#8217;ailleurs, permettant de tirer le maximum de sa clé. Que demander de plus ? <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Liens</h3>
<ul>
<li>Le site de Yubico, le fabricant : <a href="http://www.yubico.com/">http://www.yubico.com/</a></li>
<li>Le lien direct Yubikey du site : <a href="http://www.yubico.com/yubikey">http://www.yubico.com/yubikey</a></li>
<li>La bibliothèque Yubico-C : <a href="https://github.com/Yubico/yubico-c-client">https://github.com/Yubico/yubico-c-client</a></li>
<li>L&#8217;outil de configuration : <a href="https://github.com/Yubico/yubikey-personalization">https://github.com/Yubico/yubikey-personalization</a></li>
<li>Le module Yubico-PAM : <a href="https://github.com/Yubico/yubico-pam">https://github.com/Yubico/yubico-pam</a></li>
<li>Le HOWTO pour SSH : <a href="https://github.com/Yubico/yubico-pam/wiki/YubikeyAndSSHViaPAM">https://github.com/Yubico/yubico-pam/wiki/YubikeyAndSSHViaPAM</a></li>
</ul>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/06/14/guerre-du-warez/' rel='bookmark' title='La petite guerre du Warez'>La petite guerre du Warez</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2011/04/14/yubikey-la-petite-cle-qui-assure/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>IPv6 pour les nuls^Wgeeks</title>
		<link>http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/</link>
		<comments>http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 11:55:19 +0000</pubDate>
		<dc:creator>LeCoyote</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[IPv6]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=1566</guid>
		<description><![CDATA[
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/28/geekfault-disponible-en-ipv6/' rel='bookmark' title='Geekfault disponible en IPv6'>Geekfault disponible en IPv6</a></li>
<li><a href='http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/' rel='bookmark' title='DenyHosts pour empêcher le bruteforce sur SSH'>DenyHosts pour empêcher le bruteforce sur SSH</a></li>
<li><a href='http://geekfault.org/2009/03/28/ubuntu-jaunty-jackalope-9-04/' rel='bookmark' title='On a testé pour vous : Ubuntu Jaunty Jackalope 9.04'>On a testé pour vous : Ubuntu Jaunty Jackalope 9.04</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><!--pagetitle:C'est quoi, IPv6 ?--><a href="http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/ipv6_ready_logo_phase2-small-2/" rel="attachment wp-att-1879"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/01/IPv6_ready_logo_phase2-small.jpg" alt="IPv6 Ready Logo" title="IPv6_ready_logo_phase2-small" width="200" height="239" class="alignleft size-full wp-image-1879" /></a>À moins d&#8217;avoir passé les 6 dernières années sous un gravillon, ou de n&#8217;avoir vraiment aucun intérêt pour les protocoles Internet (on ne vous juge pas !), vous avez probablement entendu parler d&#8217;IPv6. Seulement voilà : on en dit du bien ou du mal, mais sait-on exactement ce qu&#8217;est IPv6 après tout ? Voici le premier d&#8217;une petite série d&#8217;articles destinés à lever le voile.</p>
<p><!--more--></p>
<h3>Qu&#8217;est-ce qu&#8217;IPv6 ?</h3>
<p>Comme vous le savez certainement, Internet aujourd&#8217;hui repose essentiellement sur IPv4. Pour lui succéder, IPv6 (ou IPng, bien que cette deuxième dénomination soit moins fréquente) a été conçu il y a bien longtemps déjà. Sa mise en service était prévue en 1996 !<br />
Bizarrerie d&#8217;Internet, IPv5 n&#8217;a pas grand chose à voir avec les deux autres ; pour les curieux, il s&#8217;agit du Stream Protocol ST-II, qui est décrit <a href="http://www.faqs.org/rfcs/rfc1819.html">ici</a>.<br />
Alors qu&#8217;une adresse IPv4 ressemble à 81.93.247.142, une adresse IPv6 ressemble plutôt à 2001:758:1664::42 &#8230; mais nous y reviendrons plus tard.</p>
<h3>Pourquoi remplacer IPv4 ?</h3>
<p>Disons-le tout net, IPv4 marche encore très bien (aux dernières nouvelles en tous cas). Mais comme une adresse IPv4 est codée sur 32 bits, IPv4 ne peut adresser que 2<sup>32</sup> hôtes, soit un peu plus de 4 milliards de machines diverses et variées. La quantité d&#8217;adresses disponibles, qui semblait suffisante il y a 30 ans, diminue constamment, sans compter qu&#8217;une bonne partie de ces adresses sont réservées et ne peuvent être allouées. <a href="http://www.potaroo.net/tools/ipv4/index.html">Selon certaines estimations</a>, l&#8217;espace d&#8217;adresses IPv4 sera épuisé d&#8217;ici 2011/2012. </p>
<p>Par ailleurs, la plupart des FAI grand public attribuent en général <em>UNE</em> adresse IPv4 publique par abonné &#8230; et encore. Si vous êtes derrière un routeur ou une *box, sauf cas particulier, vous pouvez dire adieu à l&#8217;adresse IP publique : le routeur fera probablement du NAT (<a href="http://fr.wikipedia.org/wiki/Network_address_translation">Network Address Translation</a>). Et s&#8217;il s&#8217;agit d&#8217;une connexion Internet mobile, là encore, il n&#8217;y aura probablement pas d&#8217;IP publique au bout de la ligne.<br />
Or, selon la définition que l&#8217;on donne à Internet, ne pas avoir d&#8217;adresse IP publique c&#8217;est ne pas être sur Internet (c&#8217;est en tout cas l&#8217;opinion de <a href="http://blog.fdn.fr/post/2010/01/12/Rencontre-avec-l-ARCEP-sur-la-neutralit%C3%A9-du-r%C3%A9seau">Benjamin Bayart</a>, président de <a href="http://www.fdn.fr">FDN</a>).<br />
Par ailleurs, le NAT c&#8217;est bien gentil, mais ça complique très nettement la vie dès qu&#8217;il s&#8217;agit de faire du peer-to-peer (la technologie au sens large) ou de la VoIP par exemple.</p>
<p>Enfin, de façon générale, IPv6 apporte de nombreuses améliorations par rapport à IPv4 : il a été conçu de manière à permettre une répartition plus facile de son espace d&#8217;adressage, à effectuer un routage plus efficace, à mieux supporter le multicast ou encore à intégrer un concept de mobilité pour les terminaux nomades : autant de bonnes raisons de migrer !</p>
<p><!--nextpage--><!--pagetitle:IPv6 FTW--></p>
<p>Avant d&#8217;aller plus loin, voici un petit brin de théorie visant à exposer les bases d&#8217;IPv6. Après cela, nous verrons comment se doter d&#8217;IPv6 à la maison, et nous aborderons enfin quelques-unes des améliorations évoquées précédemment ainsi que certains aspects plus pointus de l&#8217;utilisation et de la configuration.</p>
<h3>Généralités sur les adresses</h3>
<p>Pour commencer, les adresses IPv6 sont codées sur 128 bits, ou encore 16 octets. Il y a donc 2<sup>128</sup> adresses possibles, soit environ 3.4&#215;10<sup>38</sup>, c&#8217;est-à-dire environ 5×10<sup>28</sup> adresses pour chacun des 6.5 milliards d&#8217;habitants de la planète (en 2006, source <a href="http://en.wikipedia.org/wiki/Ipv6#Larger_address_space">Wikipedia</a>).<br />
Selon l&#8217;hypothèse la plus conservatrice, un foyer connecté à Internet pourrait recevoir environ 18 &#8230; milliards &#8230; de milliards d’adresses <strong>publiques</strong> : 18 x 10<sup>18</sup>, ou 2<sup>64</sup> plus exactement. Par foyer. On devrait pouvoir tenir le coup.</p>
<p>Comme ça n&#8217;est pas très pratique d&#8217;écrire 128 bits sous forme décimale (essayez, vous verrez &#8230;), on utilise une représentation hexadécimale : les digits sont groupés par 4, les groupes sépares par des &#8220;:&#8221;, et les zéros non-significatifs peuvent être omis tant que ça reste non-équivoque. Exemples :</p>
<ul>
<li><strong>3FFE:1123:4567:89AB:CDEF:1234:5678:9ABC</strong></li>
<li><strong>2001:7a8:b285::1</strong> ; ici les zéros superflus ont été remplacés par &#8220;::&#8221;, ce qui ne peut être fait qu&#8217;une seule fois dans l&#8217;écriture de l&#8217;adresse pour éviter toute ambiguïté. Cette adresse équivaut donc à <strong>2001:07A8:B285:0000:0000:0000:0000:0001 ;</strong></li>
<li><strong>::1</strong> ; c&#8217;est l&#8217;équivalent du bon vieux 127.0.0.1, la boucle locale (pas celle de FT, vous l&#8217;aurez compris) ;</li>
<li><strong>::</strong> ou <strong>::/0</strong>; l&#8217;adresse la plus simple à écrire sans aucun doute, c&#8217;est le pendant du 0.0.0.0 (/0)  d&#8217;IPv4 ;
<li><strong>::ffff:81.93.247.142</strong> ; petite entorse à la règle, il est acceptable d&#8217;utiliser la notation décimale IPv4 quand on écrit une adresse IPv4 &#8220;mappée&#8221; en IPv6 (attention, ça ne marche pas partout) ;
<li><strong>2001:7a8:b285::12::34</strong> n&#8217;est <strong><em>PAS</em></strong> une adresse valide. Les <strong>::</strong> sont équivoques, on ne sait pas exactement où se situe le <strong>12</strong> au milieu de l&#8217;adresse.
</ul>
<div id="attachment_1989" class="wp-caption aligncenter" style="width: 590px"><a href="http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/ping6/" rel="attachment wp-att-1989"><img src="http://geekfault.org/wp-content/uploads/2010/02/ping6-580x369.png" alt="" title="ping6" width="580" height="369" class="size-large wp-image-1989" /></a><p class="wp-caption-text">ping6 vers le site de GeekFault depuis un serveur voisin</p></div>
<p>La notation CIDR (en &#8220;slash&#8221;) fonctionne sur le même principe qu&#8217;en IPv4 : le suffixe /X signifie qu&#8217;une adresse appartient à un réseau dont les X premiers bits sont fixés (partie réseau de l&#8217;adresse donc) et les 128-X derniers bits sont réservés à l&#8217;hôte. Par exemple, 2001:7a8::/32 désigne le réseau dont les 32 premiers bits sont 2001:7a8 (en l&#8217;occurrence il s&#8217;agit du FAI français <a href="http://www.nerim.net">Nerim</a>), tandis que ::/0 représente n&#8217;importe quelle adresse IPv6. On peut dire que <strong>2001:758:1664::42</strong> et <strong>2001:758:1664::57</strong> sont deux hôtes probablement différents mais appartenant au même sous-réseau <strong>2001:758:1664::/64</strong>, lui même appartenant à <strong>2001:758:1664::/48</strong>. Un sous-réseau de taille 64 est normalement situé sur un même brin physique.</p>
<p>Les 16 premiers bits d&#8217;une adresse IPv6 nous renseignent sur son type d&#8217;utilisation, par exemple 2001 pour les adresses attribuées de façon permanente, ou 3FFE pour le 6bone expérimental aujourd&#8217;hui obsolète. Deux cas particuliers sont à noter : le préfixe <strong>2002::/16</strong> identifie les adresse <strong>6to4</strong> (un protocole de transition pour ceux qui sont privés d&#8217;IPv6), tandis que le préfixe <strong>fe80::/10</strong> est réservé aux adresses locales (un peu à l&#8217;image de 169.254.0.0/16) ou &#8220;link-local&#8221; ; ces adresses locales ne sont utilisables que sur un même segment du réseau local ou sur une connexion point-à-point.</p>
<p>Pour pouvoir continuer à utiliser des noms symboliques plutôt que des adresse littérales, il faut que le DNS soit lui aussi IPv6-ready. Dans la pratique, un serveur DNS délivre des enregistrements <strong>AAAA</strong> pour la recherche directe (conversion de nom en adresse IPv6) et utilise les zones <strong>.ip6.arpa</strong> pour les recherches inverses. Par exemple :<br />
[cc]geeknode@ircd ~ $ dig +short -t aaaa www.kame.net<br />
2001:200:0:8002:203:47ff:fea5:3085<br />
geeknode@ircd ~ $ dig +short -x 2001:200:0:8002:203:47ff:fea5:3085<br />
orange.kame.net.<br />
geeknode@ircd ~ $[/cc]</p>
<p>Dernière astuce à noter, il arrive de devoir (ou de vouloir) taper une adresse IP littérale dans un navigateur, dans un fichier de configuration, ou à d&#8217;autres endroits où le caractère &#8220;:&#8221; est déjà utilisé (pour spécifier le numéro de port par exemple). Dans ce genre de cas, il est possible d&#8217;indiquer une adresse IPv6 littérale en l&#8217;encadrant par des crochets, comme par exemple <strong>[2001:758:1664::42]</strong>.</p>
<p>Maintenant que l&#8217;on connaît un peu mieux les différents types d&#8217;adresses IPv6 et que nous savons à quoi elles ressemblent, nous allons faire un tour du côté de la configuration.</p>
<p><!--nextpage--><!--pagetitle:La configuration--></p>
<h3>Auto-Configuration sans état</h3>
<p>L&#8217;une des nouveautés d&#8217;IPv6, c&#8217;est la possibilité pour l&#8217;OS de configurer automatiquement une interface réseau. Certes, IPv4 le fait déjà assez bien avec l&#8217;aide du DHCP, mais il s&#8217;agit là d&#8217;une configuration dite &#8220;avec état&#8221;, ou &#8220;stateful&#8221; : le serveur DHCP tient à jour une liste des clients configurés et des adresses IP disponibles. Nous allons aborder ici la configuration automatique &#8220;sans état&#8221;, ou &#8220;stateless&#8221;.</p>
<p>Dès lors que le protocole IPv6 est disponible et si l&#8217;auto-configuration est activée, l&#8217;OS va chercher ses réglages tout seul. La première étape consiste à monter une adresse link-local sur l&#8217;interface considérée. Pour cela, on utilise le préfixe <strong>fe80::/10</strong> et l&#8217;adresse MAC de l&#8217;interface ; par une subtile transformation, les 48 bits de cette adresse vont donner les 64 bits de droite de l&#8217;adresse locale. Cette transformation est simple :</p>
<ul>
<li>on part de l&#8217;adresse MAC, <strong>00:18:F8:CC:CC:20</strong> par exemple (ici un Linksys WRT54GL) que l&#8217;on sépare en deux blocs de 24 bits par le milieu : <strong>00:18:F8</strong> et <strong>CC:CC:20</strong> ;</li>
<li>on inverse la valeur du 7è bit du premier groupe, appelé &#8220;universel/local&#8221; ; <strong>0&#215;00</strong> en binaire donne <strong>00000000</strong>, qui devient <strong>00000010</strong> après l&#8217;inversion du 7è bit, et donc <strong>0&#215;02</strong> de retour en hexa ;</li>
<li>on réunit le groupe ainsi modifié et le deuxième groupe du début en insérant au milieu les octets <strong>FFFE</strong>, ce qui donne au final les 64 bits <strong>02:18:F8:FF:FE:CC:CC:20</strong> ;</li>
</ul>
<p><div id="attachment_2011" class="wp-caption aligncenter" style="width: 590px"><a href="http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/ipv6-stateless-2/" rel="attachment wp-att-2011"><img src="http://geekfault.org/wp-content/uploads/2010/02/IPv6-stateless1-580x180.png" alt="" title="IPv6-stateless" width="580" height="180" class="size-large wp-image-2011" /></a><p class="wp-caption-text">Génération de la partie hôte de l'adresse à partir de l'adresse MAC</p></div><br />
Il ne reste plus qu&#8217;à ajouter le préfixe link-local pour obtenir l&#8217;adresse : <strong>fe80::0218:f8ff:fecc:cc20/64</strong>.</p>
<p>Avant d&#8217;utiliser cette adresse, il faut vérifier son unicité sur le lien réseau. C&#8217;est l&#8217;une des applications du <strong>Neighbour Discovery Protocol</strong>, nommément la <strong>Duplicate Address Detection</strong> (DAD). Le protocole NDP repose sur ICMPv6, qui pour l&#8217;occasion se dote de nouveaux types de messages. L&#8217;un d&#8217;eux, &#8220;Neighbour Solicitation&#8221;, sert justement à vérifier que l&#8217;adresse que l&#8217;on s&#8217;apprête à utiliser n&#8217;est pas déjà attribuée à quelqu&#8217;un d&#8217;autre sur le lien. Lorsqu&#8217;une interface est montée est que son adresse locale potentielle (ou &#8220;tentative&#8221; dans le jargon) a été déterminée, l&#8217;hôte envoie un paquet &#8220;Neighbour Solicitation&#8221; à destination de cette même adresse et attend une réponse éventuelle. S&#8217;il n&#8217;y en a pas, l&#8217;adresse est considérée comme disponible et devient utilisable sur l&#8217;interface considérée.</p>
<p>Jusqu&#8217;ici, nous avons tout de même obtenu une adresse utilisable sur le LAN sans l&#8217;aide d&#8217;un DHCP. Cependant, pour sortir du LAN, il nous manque encore deux éléments : un routeur et une adresse IPv6 globale routable. Là encore c&#8217;est grâce à NDP que l&#8217;on va y arriver.<br />
Un routeur IPv6 envoie périodiquement sur le réseau des messages NDP dits &#8220;Routeur Advertisement&#8221; (RA pour faire court) qui contiennent entre autres informations le préfixe réseau à utiliser pour l&#8217;auto-configuration ainsi que l&#8217;adresse du routeur. L&#8217;hôte peut également envoyer un message &#8220;Router Solicitation&#8221; à une adresse multicast spéciale dite &#8220;all routers&#8221; valable sur le lien (link-local), <strong>ff02::2</strong> ; le routeur doit répondre à cette requête par un RA. L&#8217;hôte utilise alors le même mécanisme que pour déterminer l&#8217;adresse link-local, mais en utilisant cette fois-ci le préfixe annoncé par le routeur.<br />
Après vérification (DAD), l&#8217;adresse unicast globalement unique et routable ainsi obtenue est validée pour de bon, et l&#8217;adresse du routeur enregistrée comme passerelle par défaut : bienvenue sur la toile-v6 !</p>
<p>Il est temps maintenant de passer à la pratique <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><!--nextpage--><!--pagetitle:IPv6 en pratique--></p>
<h3>IPv6 en pratique</h3>
<p>Dans la vraie vie, tout le monde est plus ou moins égal face à IPv6. Les plus chanceux (abonnés Nerim, FDN, Free dans une moindre mesure) ont de l&#8217;IPv6 <strong>natif</strong> (ou presque) directement sur leur interface WAN (fût-elle xDSL ou FTTH). Pour les autres, il faudra utiliser des méthodes basées sur les <strong>tunnels</strong>, comme le 6to4 ou Teredo <em>(article à venir &#8230;)</em>.</p>
<p>Quoi qu&#8217;il en soit, un abonné recevra de son FAI (ou de son fournisseur de tunnel) un <strong>préfixe</strong> de la forme <strong>2001:7a8:b285::/48</strong>. Le FAI se charge de router tout ce préfixe vers la ligne de l&#8217;abonné, et ce dernier se débrouille pour faire le reste. Comme il n&#8217;y a en général qu&#8217;une seule ligne chez l&#8217;abonné, par laquelle passe tout le trafic, il faut un routeur.</p>
<p>Fabuleux, vous en avez probablement déjà un. Mais est-il seulement IPv6-aware ? À moins d&#8217;avoir une FreeBox, la réponse est probablement &#8220;non&#8221; : le support IPv6 dans ce genre de matériels est pour le moins anecdotique. Le geek IPv6-friendly va donc se monter une petite bécane sous Linux (ou flasher son WRT54GL par exemple) avec le support IPv6 compilé dedans. On peut certainement faire pareil avec *BSD, mais je ne parle pas de ce que je ne connais pas <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Le routeur fait en général au moins <strong>trois</strong> choses chez un particulier, quatre si on a du bol :
<ul>
<li>il fournit la <strong>connexion au WAN</strong>, fût-ce par ADSL, câble, fibre ou autre ;</li>
<li>il <strong>route les paquets</strong>, c&#8217;est quand même pas banal, avouez-le ;</li>
<li>il aide à se <strong>configurer les postes clients</strong> ;</li>
<li>en option, il fait du <strong>filtrage</strong>.</li>
</ul>
<p>Pour la connexion au WAN, le plus facile reste l&#8217;IPv6 natif. En effet, en ajoutant simplement une ligne contenant <strong>ipv6 ,</strong> à son /etc/ppp/options, pppd se charge de négocier une IPv6 link-local avec le pair d&#8217;en face.</p>
<p>Pour le routage, c&#8217;est là encore désarmant de simplicité :<br />
[cc lang="bash"]echo 1 > /proc/sys/net/ipv6/conf/all/forwarding[/cc]<br />
Félicitations : le routeur est maintenant capable de relayer les paquets à qui de droit. Bien sûr, libre à vous d&#8217;ajouter ça au sysctl.conf pour faciliter les choses.</p>
<p>Il faut ensuite informer les postes clients de la disponibilité d&#8217;IPv6 et à les configurer. On peut bien sûr utiliser l&#8217;auto-configuration stateful, avec DHCPv6, ou stateless, dont on a parlé au chapitre précédent. Cette dernière méthode requiert l&#8217;utilisation sur le routeur de <strong>radvd</strong>, pour Router ADVertisement Daemon. Après l&#8217;avoir installé selon la méthode de votre choix (apt-get, emerge, tar &#8230;), il vous faudra éditer le fichier de configuration (en général /etc/radvd.conf ou approchant), dont voici un example :<br />
[cc]interface br-lan<br />
{<br />
        AdvSendAdvert on;<br />
        MaxRtrAdvInterval 60;<br />
#       AdvLinkMTU 1492;</p>
<p>        prefix 2001:7a8:b285::1/64<br />
        {<br />
        };<br />
};[/cc]</p>
<p>Le fichier comporte au moins une définition d&#8217;interface ; ici, il s&#8217;agit de l&#8217;interface <strong>br-lan</strong> d&#8217;un WRT54GL sous OpenWRT. Dans l&#8217;ordre, les 4 premières options servent à indiquer que le service doit envoyer des RA et répondre aux sollicitations sur l&#8217;interface, les RA sont au maximum espacés de 60 secondes, et le MTU annoncé sur le lien est fixé à 1492 (option désactivée ici, mais très utile si vous êtes en PPPoE sur l&#8217;interface WAN). Vient ensuite une définition de préfixe, ici de longueur 64, qui ne contient ici aucune option particulière : les options par défaut conviendront parfaitement.</p>
<p>Enfin, pour le filtrage, il existe sous Linux le pendant IPv6 d&#8217;iptables, tout simplement nommé <strong>ip6tables</strong>. Tout comme en IPv4, il est possible de faire du conntrack en IPv6, moyennant un kernel &#8220;pas trop vieux&#8221; (ça ne marchera pas avec un 2.4 par exemple). La principale différence avec l&#8217;IPv4 est bien sûr l&#8217;absence du NAT : tout ou presque se passera directement dans la table FORWARD <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Nous n&#8217;avons pas encore parlé de la configuration des postes clients, et il y a une raison très simple à cela : par défaut, il n&#8217;y a rien à faire. Du moment que le routeur est configuré correctement, l&#8217;OS client saura s&#8217;auto-configurer comme nous l&#8217;avons vu au chapitre précédent. Comme IPv6 est utilisé en priorité chaque fois que c&#8217;est possible, l&#8217;accès aux services disponibles se fera automatiquement et de façon transparente pour l&#8217;utilisateur final.</p>
<p><!--nextpage--><!--pagetitle:Conclusion--></p>
<p>Nous voici arrivés à la fin de cette introduction à IPv6. Moyennant un petit temps de prise en main, ce &#8220;nouveau&#8221; protocole ne devrait pas poser trop de soucis à ceux qui ont déjà quelques notions de réseaux IP. Quelques points à retenir :</p>
<ul>
<li>la forme des adresse doit maintenant vous être familière, attention simplement à l&#8217;écriture compacte (placement des &#8220;::&#8221;) et aux préfixes particuliers (2002::, fec0::, fe80:: &#8230;) ;</li>
<li><strong>ICMPv6</strong> joue un grand rôle dans IPv6, le NDP se substituant ainsi pour partie à ARP et DHCP ;</li>
<li>un routeur sous linux avec un démon <strong>radvd</strong> suffira à faire profiter de l&#8217;IPv6 à votre LAN.</li>
</ul>
<p>Cet article est j&#8217;espère le premier d&#8217;une série sur le sujet. Il y a en effet d&#8217;autres aspects à aborder ou certains problèmes à évoquer (comme le souci du pMTU par exemple) et un ou deux mythes à casser (non, IPv6 ne ralentit pas votre connexion !). À bientôt !</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/28/geekfault-disponible-en-ipv6/' rel='bookmark' title='Geekfault disponible en IPv6'>Geekfault disponible en IPv6</a></li>
<li><a href='http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/' rel='bookmark' title='DenyHosts pour empêcher le bruteforce sur SSH'>DenyHosts pour empêcher le bruteforce sur SSH</a></li>
<li><a href='http://geekfault.org/2009/03/28/ubuntu-jaunty-jackalope-9-04/' rel='bookmark' title='On a testé pour vous : Ubuntu Jaunty Jackalope 9.04'>On a testé pour vous : Ubuntu Jaunty Jackalope 9.04</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

