<?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>Le blog de Sébastien Chevallier</title>
	<atom:link href="http://blog.tuxp.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tuxp.fr</link>
	<description>L&#039;info dans tous ses états... ou presque :)</description>
	<lastBuildDate>Sun, 21 Mar 2010 17:07:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Activer Windows XP manuellement</title>
		<link>http://blog.tuxp.fr/2010/03/activer-windows-xp-manuellement/</link>
		<comments>http://blog.tuxp.fr/2010/03/activer-windows-xp-manuellement/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 17:07:52 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[activation]]></category>
		<category><![CDATA[oobe]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=504</guid>
		<description><![CDATA[Pour activer manuellement une version de windows XP sans attendre le popup de rappel, ou tout simplement vérifier que le système est bien activé, il suffit de taper la commande suivante dans l&#8217;invite de commande :

oobe/msoobe /a

Pour les non habitués, l&#8217;invite de commande est accessible en cliquant sur Démarrer > Exécuter&#8230;.
]]></description>
			<content:encoded><![CDATA[<p>Pour activer manuellement une version de windows XP sans attendre le popup de rappel, ou tout simplement vérifier que le système est bien activé, il suffit de taper la commande suivante dans l&#8217;invite de commande :</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;">oobe/msoobe /a</pre></div></div>

<p>Pour les non habitués, l&#8217;invite de commande est accessible en cliquant sur <em>Démarrer > Exécuter&#8230;</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2010/03/activer-windows-xp-manuellement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webdesign : les indispensables</title>
		<link>http://blog.tuxp.fr/2009/12/webdesign-les-indispensables/</link>
		<comments>http://blog.tuxp.fr/2009/12/webdesign-les-indispensables/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 22:32:32 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[icon]]></category>
		<category><![CDATA[pallete]]></category>
		<category><![CDATA[stripe]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=366</guid>
		<description><![CDATA[Un post-éclair pour les développeurs d&#8217;applications et/ou sites web avec quelques liens intéressants que j&#8217;ai pu collecter au cours de divers projets.
Color Pallete Generator
Désormais vous n&#8217;aurez plus besoin de lancer The Gimp pour obtenir le code hexa du magnifique bleu de votre logo ! Color Pallete Generator permet d&#8217;extraire la palette de couleur d&#8217;une image [...]]]></description>
			<content:encoded><![CDATA[<p>Un post-éclair pour les développeurs d&#8217;applications et/ou sites web avec quelques liens intéressants que j&#8217;ai pu collecter au cours de divers projets.</p>
<h4>Color Pallete Generator</h4>
<p>Désormais vous n&#8217;aurez plus besoin de lancer The Gimp pour obtenir le code hexa du magnifique bleu de votre logo ! <a href="http://www.cssdrive.com/imagepalette/index.php">Color Pallete Generator</a> permet d&#8217;extraire la palette de couleur d&#8217;une image selon deux modes : upload du fichier image ou renseignement de l&#8217;URL.</p>
<h4>Icon Finder</h4>
<p>Une panne d&#8217;inspiration et/ou de talent pour dessiner les visuels de son site ? Rendez-vous sur <a href="http://www.iconfinder.net/">Icon Finder</a> ! En plus d&#8217;être assez efficace, ce moteur de recherche d&#8217;icônes permet de sélectionner celles dont la licence est compatible avec un usage commercial. Méfiance tout de même avec cette fonctionnalité, il m&#8217;a semblé reconnaître des icônes issues de certains packs dont la licence n&#8217;est pas celle indiquée.</p>
<h4>Stripe Generator</h4>
<p>Les rayures sont à la mode, alors pourquoi s&#8217;en priver. <a href="http://www.stripegenerator.com/">Stripe Generator</a> permet de créer des fond bariolés en quelques clics mais attention : trop c&#8217;est trop  !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/12/webdesign-les-indispensables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le forward de port dynamique avec SSH/SOCKS</title>
		<link>http://blog.tuxp.fr/2009/11/le-forward-de-port-dynamique-avec-sshsocks/</link>
		<comments>http://blog.tuxp.fr/2009/11/le-forward-de-port-dynamique-avec-sshsocks/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 23:11:10 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[foxyproxy]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[socks]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=331</guid>
		<description><![CDATA[Derrière ce nom barbare se cache une fonctionnalité très utile de SSH, que nous allons aborder à l&#8217;aide de l&#8217;exemple suivant :
Comment accéder aux services d&#8217;un réseau privé (mail, annuaire, etc.) depuis une connexion Internet classique ?
Le tout sans accès VPN, sinon la question ne se pose pas :)

Le protocole SOCKS
SOCKS est un protocole réseau [...]]]></description>
			<content:encoded><![CDATA[<p>Derrière ce nom barbare se cache une fonctionnalité très utile de SSH, que nous allons aborder à l&#8217;aide de l&#8217;exemple suivant :</p>
<blockquote><p>Comment accéder aux services d&#8217;un réseau privé (mail, annuaire, etc.) depuis une connexion Internet classique ?</p></blockquote>
<p>Le tout sans accès VPN, sinon la question ne se pose pas :)</p>
<p><span id="more-331"></span></p>
<h4>Le protocole SOCKS</h4>
<p>SOCKS est un protocole réseau permettant de router des connexions (TCP ou UDP) initiées par des applications clientes, via un serveur proxy. On peut faire l&#8217;analogie avec un proxy HTTP, sauf qu&#8217;au lieu d&#8217;analyser les en-têtes des requêtes HTTP, un proxy SOCKS agit au niveau de la couche session (5) du modèle OSI, ce qui le rend utilisable par une multitude de protocoles.</p>
<h4>Mise en place d&#8217;un proxy SOCKS via tunnel SSH</h4>
<p>Il existe de nombreuses applications permettant de mettre en place un proxy SOCKS, comme l&#8217;indique la page <a href="http://en.wikipedia.org/wiki/SOCKS#Related_software">Wikipedia</a> dédiée au protocole. Selon les implémentations, il est possible de mettre en place des scénarios complexes d&#8217;authentification et de routage, mais dans notre cas nous allons utiliser SSH, le but étant simplement de réaliser un routage de port dynamique. Pour mieux comprendre les commandes qui vont suivre, jetons un oeil au schéma suivant :</p>
<p><a href="http://blog.tuxp.fr/wp-content/uploads/2009/11/sshsocks.png"><img src="http://blog.tuxp.fr/wp-content/uploads/2009/11/sshsocks-500x203.png" alt="Scénario d&#039;utilisation d&#039;un proxy socks" title="Scénario d&#039;utilisation d&#039;un proxy socks" width="500" height="203" class="aligncenter size-medium wp-image-335" /></a></p>
<p>Depuis un poste client, nous voulons accéder de façon transparente aux services du réseau <em>private.tld</em> et nous disposons pour cela d&#8217;un accès au bastion <em>gate.public.tld</em>, sur lequel se trouve un serveur SSH en écoute sur le port 9999. Le but de la manipulation consiste à établir un tunnel entre le poste client et le bastion, de façon à ce qu&#8217;il transmette toutes les requêtes à destination du réseau protégé. Comme il n&#8217;y a pas de miracles, il faut bien sûr que les accès du bastion vers le réseau interne soient autorisés. Dans ce scénario, le serveur SSH du bastion va faire office de proxy SOCKS. Cette utilisation un peu particulière nécessite de mettre en place au préalable un tunnel SSH entre le client et le proxy, via la commande :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ssh</span>  <span style="color: #660033;">-NvD</span> <span style="color: #000000;">1080</span> user<span style="color: #000000; font-weight: bold;">@</span>gate.public.tld <span style="color: #660033;">-p</span> <span style="color: #000000;">9999</span></pre></div></div>

<p>Ainsi, toutes les requêtes reçues sur le port 1080 de la machine cliente seront transmises au bastion via le tunnel, puis redirigées vers les services du réseau interne.</p>
<p>NB : L&#8217;option <em>-v</em> n&#8217;est pas indispensable, mais il est préférable de l&#8217;activer dans un premier temps pour visualiser le traffic passant dans le tunnel.</p>
<p>Ça y est, tout est en place ! Il suffit maintenant de configurer les applications clientes pour utiliser le proxy SOCKS. De nombreuses applications proposent en standard une configuration SOCKS, mais si ce n&#8217;est pas le cas il est possible de passer par les outils <strong>socat</strong> ou <strong>tsocks</strong>. Pour l&#8217;exemple, nous allons paramétrer Firefox.</p>
<h4>Configuration de Firefox</h4>
<h5>Configuration standard</h5>
<p>Depuis la panneau de paramétrage réseau, il faut configurer un proxy avec les paramètres suivants :</p>
<ul>
<li>Cocher la case <em>Configuration manuelle du proxy</em></li>
<li>Hôte SOCKS : localhost</li>
<li>Port : 1080</li>
<li>Cocher la case <em>SOCKS v5</em></li>
</ul>
<p>Mais si l&#8217;on essaie ensuite de se connecter à l&#8217;adresse <em>http://mail.private.tld</em>, la connexion échoue. En effet, les requêtes DNS ne passent pas par le proxy, et ne sont donc pas résolues par le serveur DNS du réseau interne. Pour y remédier, il faut afficher la fenêtre de paramétrage avancé de Firefox en tapant <em>about:config</em>dans la barre de navigation, et placer l&#8217;option <em>network.proxy.socks_remote_dns</em> sur <em>true</em>.</p>
<h5>Module FoxyProxy</h5>
<p>FoxyProxy est un module Firefox très utile permettant de gérer différentes configurations proxy. Après l&#8217;avoir <a href="https://addons.mozilla.org/en-US/firefox/addon/2464">installé</a>, on peut saisir une configuration similaire à celle décrite précédemment. L&#8217;intérêt de ce module réside surtout dans le fait qu&#8217;il est possible d&#8217;affecter un proxy particulier en fonction de l&#8217;url cible. Dans notre cas, nous voulons restreindre l&#8217;utilisation du proxy SOCKS aux URLs du domaine <em>private.tld</em>. Après avoir sélectionné le mode <em>Utiliser les proxies basés sur leurs motifs et propriétés prédéfinis</em>, on ajoute le motif suivant à l&#8217;instance correspondant au proxy SOCKS :</p>
<ul>
<li>Motif d&#8217;URL : .*://.*\.private\.tld(:[0-9]*)?/.*</li>
<li>Format du motif : Expression régulière</li>
</ul>
<p>Pour résoudre le problème de résolution DNS, il faut cocher la case <em>Utiliser un proxy SOCKS pour les résolutions DNS</em> de l&#8217;onglet <em>Paramètres généraux</em>.</p>
<p>C&#8217;est terminé, vous avez maintenant accès aux services du réseau interne !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/11/le-forward-de-port-dynamique-avec-sshsocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RabbitVCS : le GUI VCS tant attendu sous Linux ?</title>
		<link>http://blog.tuxp.fr/2009/11/rabbitvcs-le-gui-vcs-tant-attendu-sous-linux/</link>
		<comments>http://blog.tuxp.fr/2009/11/rabbitvcs-le-gui-vcs-tant-attendu-sous-linux/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 21:28:35 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nautilus]]></category>
		<category><![CDATA[rabbitvcs]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[vcs]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=317</guid>
		<description><![CDATA[On connaissait l&#8217;excellent TortoiseSVN sous Windows, voici son pendant Linux ! Si l&#8217;on en croit les porteurs du projet, RabbitVCS devrait même proposer une intégration avec d&#8217;autres systèmes de versioning que Subversion :
RabbitVCS is a set of graphical tools written to provide simple and straightforward access to the version control systems you use. Currently, it [...]]]></description>
			<content:encoded><![CDATA[<p>On connaissait l&#8217;excellent <a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a> sous Windows, voici son pendant Linux ! Si l&#8217;on en croit les porteurs du projet, RabbitVCS devrait même proposer une intégration avec d&#8217;autres systèmes de versioning que Subversion :</p>
<blockquote><p>RabbitVCS is a set of graphical tools written to provide simple and straightforward access to the version control systems you use. Currently, it is integrated into the Nautilus file manager and only supports Subversion, but our goal is to incorporate other version control systems as well as other file managers.</p></blockquote>
<p>Je ne l&#8217;ai pas encore testé, mais ça ne saurait tarder. En attendant, rendez-vous sur <a href="http://rabbitvcs.org/">le site officiel</a>.</p>
<p><a href="http://blog.tuxp.fr/wp-content/uploads/2009/11/rabbitvcs-preview.png"><img src="http://blog.tuxp.fr/wp-content/uploads/2009/11/rabbitvcs-preview-500x337.png" alt="Présentation RabbitVCS" title="Présentation RabbitVCS" width="500" height="337" class="aligncenter size-medium wp-image-318" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/11/rabbitvcs-le-gui-vcs-tant-attendu-sous-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Configurer une authentification SSH par clé publique</title>
		<link>http://blog.tuxp.fr/2009/11/configurer-une-authentification-ssh-par-cle-publique/</link>
		<comments>http://blog.tuxp.fr/2009/11/configurer-une-authentification-ssh-par-cle-publique/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 22:02:20 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ssh-agent]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=251</guid>
		<description><![CDATA[À la maison comme au bureau, il n&#8217;est pas rare de posséder un grand nombre de comptes utilisateur sur des serveurs, physiques ou virtuels, ce qui fait (ou devrait faire) autant de mots de passe à retenir ! Dans certains cas, l&#8217;architecture d&#8217;authentification en place (centralisée via un annuaire LDAP par exemple), permet de simplifier [...]]]></description>
			<content:encoded><![CDATA[<p>À la maison comme au bureau, il n&#8217;est pas rare de posséder un grand nombre de comptes utilisateur sur des serveurs, physiques ou virtuels, ce qui fait (ou devrait faire) autant de mots de passe à retenir ! Dans certains cas, l&#8217;architecture d&#8217;authentification en place (centralisée via un annuaire LDAP par exemple), permet de simplifier la gestion de comptes au sein d&#8217;une organisation. Mais lorsqu&#8217;il ne lui est pas possible de profiter d&#8217;une telle structure, l&#8217;utilisateur a le choix entre le classeur de post-it contenant tous ses mots de passe et la greffe d&#8217;un cerveau supplémentaire (mémoriser 30 mots de passe un minimum élaborés n&#8217;est pas forcément facile). Dans ce billet, nous verrons comment nous simplifier la vie en mettant en oeuvre une authentification SSH par clé publique entre un poste client Mac OS X (<em>tuxp@MacBook-de-Sebastien.local</em>) et un serveur Linux Debian (<em>sebchevallier@server.domain.tld</em>). Le mécanisme d&#8217;authentification SSH en lui même ne sera pas abordé, mais j&#8217;y consacrerai certainement un billet par la suite.</p>
<p><span id="more-251"></span></p>
<h4>Côté client</h4>
<p>Ici, le but des opérations est de mettre en oeuvre un mécanisme permettant d&#8217;attester l&#8217;identité du client auprès du serveur. Le séquence de données échangée dans ce but porte le nom de <strong>SSH Identity</strong> et met en jeu une paire de clés privée/publique.</p>
<p>La clé privée permet d&#8217;identifier le client auprès du serveur lors de l&#8217;établissement d&#8217;une connexion. Gardez bien à l&#8217;idée que cette clé privée est le seul moyen d&#8217;attester au serveur que la connexion est bien initée par vous (on peut faire l&#8217;analogie avec votre carte d&#8217;identité) ! Il est donc impératif de la garder secrète car tout individu l&#8217;ayant en sa possession pourra endosser votre identité et accéder aux ressources protégées (ici vos comptes utilisateurs) aussi simplement que vous. Nous verrons cependant qu&#8217;il existe une protection supplémentaire.</p>
<p>La clé publique, quant-à-elle, est utilisée par le serveur lors d&#8217;une connexion SSH entrante, afin de vérifier que la clé privée utilisée par le client correspond bien à celle attendue pour le compte utilisateur spécifié. Dans une paire de clé privée/publique, il existe en effet une procédure de test permettant de s&#8217;assurer de la correspondance entre les deux éléments. En cas de réussite (on parle de <em>match</em>), l&#8217;authentification est assurée et la connexion suit son cours.</p>
<h5>Génération d&#8217;une paire de clés</h5>
<p>La version 2 du protocole SSH supporte les algorithmes asymétriques DSA et RSA, utilisés pour la partie authentification (le reste des échanges est assuré par un chiffrement symétrique). Dans la suite de ce billet j&#8217;utiliserai DSA, mais libre à vous de me suivre ou non. Quel que soit votre choix, la première étape consiste à générer une paire de clés via la commande <b>ssh-keygen</b> :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ssh-keygen</span> <span style="color: #660033;">-t</span> dsa <span style="color: #660033;">-b</span> <span style="color: #000000;">1024</span> <span style="color: #660033;">-f</span> sebastien-chevallier</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in sebastien-chevallier.
Your public key has been saved in sebastien-chevallier.pub.
The key fingerprint is:
e7:a2:00:a2:ec:e7:0c:b9:01:12:ac:7f:76:18:ef:67 tuxp@MacBook-de-Sebastien.local
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|.                |
|..               |
|..               |
|= . .   S .      |
|=o.. +   o       |
|.=. = o . .      |
|. =+ + .E.       |
| ooo  oo         |
+-----------------+</pre></div></div>

<p>NB : il est vivement recommandé de renseigner une passphrase pour protéger l&#8217;accès à sa clé privée car c&#8217;est la seule protection (celle dont je parlais plus haut) qu&#8217;il vous reste en cas de vol de votre clé privée.</p>
<h5>Restriction des permissions</h5>
<p>Par convention (mais cela n&#8217;est pas une obligation), nous allons placer la clé privée (ici le fichier <em>sebastien-chevallier</em>) dans le répertoire <em>~/.ssh</em>. Pour des raisons de confidentialité évidentes, nous en restreignons l&#8217;accès à son seul propriétaire :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">700</span>  ~<span style="color: #000000; font-weight: bold;">/</span>.ssh</pre></div></div>

<p>Il ne reste alors plus qu&#8217;à diffuser la clé publique (fichier <em>sebastien-chevallier.pub</em>) aux administrateurs des serveurs SSH auxquels on souhaite pouvoir se connecter.</p>
<h4>Diffusion de la clé publique</h4>
<p>Pour qu&#8217;un serveur SSH puisse valider l&#8217;identité d&#8217;un utilisateur, il doit avoir connaissance de sa clé publique. Se pose alors la question de la diffusion de celle-ci. Bien souvent vous aller envoyer le fichier contenant votre clé publique par mail à l&#8217;administrateur du serveur auquel vous souhaitez accéder en SSH. Mais qui vous dit que votre mail ne sera pas intercepté par une personne malintentionnée qui remplacera votre clé-publique par la sienne ? Il ne s&#8217;agit pas ici de lancer le débat sur la signature des mails, mais de pointer du doigt les dangers liés à certains canaux de diffusion. Lorsque cela est possible, il vaut mieux privilégier un transfert de type sftp (scp), même si le risque d&#8217;interception n&#8217;est pas nul.</p>
<p>Pour garantir l&#8217;intégrité de la clé publique reçue, nous allons utiliser son <strong>fingerprint</strong>. Il s&#8217;agit d&#8217;une sorte de checksum, permettant de vérifier la non altération du contenu d&#8217;un fichier lors de sa copie. À la reception d&#8217;une clé publique, l&#8217;administrateur du serveur SSH va taper la commande suivante pour afficher son fingerprint et le valider par téléphone (ou en personne, c&#8217;est encore le plus sûr) auprès de son émetteur :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ssh-keygen</span>  <span style="color: #660033;">-l</span>  <span style="color: #660033;">-f</span> sebastien-chevallier.pub 
<span style="color: #000000;">1024</span> e7:a2:00:a2:ec:e7:0c:b9:01:<span style="color: #000000;">12</span>:ac:7f:<span style="color: #000000;">76</span>:<span style="color: #000000;">18</span>:ef:<span style="color: #000000;">67</span> sebastien-chevallier.pub <span style="color: #7a0874; font-weight: bold;">&#40;</span>DSA<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>NB : les plus courageux (ou paranoïaques) pourront aussi procéder à la comparaison caractère-à-caractère de la clé publique mais c&#8217;est un peu plus long :).</p>
<h4>Côté serveur</h4>
<p>Une fois assuré de l&#8217;authenticité de la clé publique reçue, il faut ajouter son contenu au fichier <em>authorized_keys</em> du compte utilisateur concerné (ici <em>sebchevallier</em>) :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier.pub <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sebchevallier<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>authorized_keys</pre></div></div>

<p>Certaines configurations de serveurs SSH (fichier <em>/etc/ssh_config) sont sensibles aux permissions sur le répertoire </em><em>~/.ssh</em> et le fichier <em>authorized_keys</em> qu&#8217;il contient. C&#8217;est le cas par exemple lorsque le mode <em>StrictModes</em> est activé. Par précaution, nous allons leur affecter les permissions suivantes :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">700</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh
$ <span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">600</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>authorized_keys</pre></div></div>

<p>Sur la plupart des distributions linux, la commande <strong>ssh-copy-id</strong> permet de simplifier les étapes de diffusion et d&#8217;ajout de la clé sur le serveur SSH. Il suffit pour cela d&#8217;exécuter la commande suivante depuis le poste client :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ ssh-copy-id <span style="color: #660033;">-i</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier.pub sebchevallier<span style="color: #000000; font-weight: bold;">@</span>demo.domain.tld</pre></div></div>

<p>NB : Il est fortement déconseillé de faire usage de cette méthode sur des serveurs de production car l&#8217;étape de vérification du fingerprint de la clé publique par l&#8217;administrateur du serveur n&#8217;est pas réalisée. Elle convient par contre très bien à un usage interne, sur des machines de développement par exemple.</p>
<h4>Connexion au serveur</h4>
<p>La connexion au serveur depuis le poste client s&#8217;effectue à l&#8217;aide de la commande suivante :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ssh</span> <span style="color: #660033;">-i</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier sebchevallier<span style="color: #000000; font-weight: bold;">@</span>demo.domain.tld</pre></div></div>

<h4>Aller plus loin</h4>
<h5>Personnaliser ses connexions SSH</h5>
<p>Lors de la génération de la paire de clé, l&#8217;option <em>-f</em> a remplacé le nom par defaut de la clé publique (<em>id_dsa</em>) par celui passé en paramètre (<em>sebastien-chevallier</em>), c&#8217;est pourquoi il nous faut utiliser l&#8217;option <em>-i</em> lors de l&#8217;établissement d&#8217;une connexion. De plus, il est fastidieux de renseigner à chaque fois le nom d&#8217;utilisateur et le serveur auquel on souhaite se connecter. Nous allons donc faire d&#8217;une pierre deux coups et remplacer la commande </p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ssh</span> <span style="color: #660033;">-i</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier sebchevallier<span style="color: #000000; font-weight: bold;">@</span>demo.domain.tld</pre></div></div>

<p>par</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ssh</span> demo</pre></div></div>

<p>Pour ce faire, il faut éditer le fichier ~/.ssh/config du client et y renseigner la configuration suivante :</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">Host demo
  HostName demo.domain.tld
  User sebchevallier
  IdentityFile ~/.ssh/sebastien-chevallier</pre></div></div>

<h5>Utiliser le ssh-agent</h5>
<p>Vous l&#8217;aurez compris, la passphrase joue un rôle essentiel dans le processus l&#8217;authentification par clé publique. Le problème c&#8217;est que dans l&#8217;état actuel, l&#8217;utilisateur doit la renseigner à chaque connexion SSH, ce qui est pour le moins pénible. C&#8217;est précisémment pour cela que le processus <strong>ssh-agent</strong> est fait ! Associé à la commande <strong>ssh-add</strong>, il charge en mémoire la partie privée de la paire de clée et la restitue tout au long de la session lorsque cela est nécessaire. Sous Mac OS, l&#8217;agent est intégré avec Keychain donc aucune manipulation supplémentaire n&#8217;est requise. Sous Linux, il faut lancer le processus ssh-agent à l&#8217;aide de la commande</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">eval</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">ssh-agent</span><span style="color: #000000; font-weight: bold;">`</span></pre></div></div>

</p>
<p>si l&#8217;on souhaite associer l&#8217;agent au shell courant, ou</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ssh-agent</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span></pre></div></div>

</p>
<p>pour l&#8217;exécuter dans un nouveau shell. L&#8217;ajout d&#8217;une clé privée à la session se fait via la commande ssh-add :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ssh-add</span>  ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier
Enter passphrase <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sebchevallier<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier:
Identity added: <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sebchevallier<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sebchevallier<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Il est également possible de lister les identités en mémoire et de les supprimer :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ssh-add</span> <span style="color: #660033;">-l</span>
<span style="color: #000000;">2048</span> 7e:<span style="color: #000000;">86</span>:0e:<span style="color: #000000;">89</span>:<span style="color: #000000;">25</span>:6e:5a:8e:d0:c2:<span style="color: #000000;">53</span>:0c:4f:a8:<span style="color: #000000;">23</span>:fb <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sebchevallier<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier <span style="color: #7a0874; font-weight: bold;">&#40;</span>RSA<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">ssh-add</span> <span style="color: #660033;">-d</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier
Identity removed: <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sebchevallier<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sebchevallier<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>sebastien-chevallier.pub<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">ssh-add</span> <span style="color: #660033;">-D</span>
All identities removed.</pre></div></div>

<p>À noter tout de même qu&#8217;il est préférable de limiter la durée de la session du ssh-agent (en le relançant à l&#8217;aide d&#8217;une tâche cron par exemple, ou en indiquant une durée de validité avec l&#8217;option <em>-t</em> lors de l&#8217;ajout d&#8217;une clé avec ssh-add), surtout si vous avez l&#8217;habitude d&#8217;aller prendre votre café sans verrouiller votre poste de travail ;).</p>
<p>C&#8217;est fini pour ce tuto ! Rien de bien compliqué, mais ces quelques manipulations permettent de gagner un temps considérable dans les tâches d&#8217;administration courantes. Cependant, si vous souhaitez mettre en oeuvre le processus d&#8217;authentification par clé publique pour gérer des plateformes de production, il me semble judicieux de standardiser et/ou automatiser un certains nombre de ces opérations (diffusion des clés publiques, invalidation de passphrase au bout d&#8217;une durée déterminée, etc.) et de déporter toute l&#8217;infrastructure sur un ou plusieurs serveurs dédiés (on parle alors de bastions). Il peut être alors intéressant d&#8217;utiliser la fonctionnalité <strong>Agent Forwarding</strong> de SSH pour chaîner les authentifications.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/11/configurer-une-authentification-ssh-par-cle-publique/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cloner une machine virtuelle Linux Debian avec VirtualBox</title>
		<link>http://blog.tuxp.fr/2009/11/cloner-une-machine-virtuelle-linux-debian-avec-virtualbox/</link>
		<comments>http://blog.tuxp.fr/2009/11/cloner-une-machine-virtuelle-linux-debian-avec-virtualbox/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 22:39:19 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Virtualisation]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[vboxmanage]]></category>
		<category><![CDATA[virtualbox]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=220</guid>
		<description><![CDATA[L&#8217;un des principaux intérêts de la virtualisation est de pouvoir déployer à souhait des machines virtuelles à partir d&#8217;une installation de référence (ou master). N&#8217;allez cependant pas croire qu&#8217;il suffit de simplement copier le fichier image du master pour le réutiliser lors de la création d&#8217;une nouvelle machine. Dans ce billet j&#8217;aborderai les principales précautions [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;un des principaux intérêts de la virtualisation est de pouvoir déployer à souhait des machines virtuelles à partir d&#8217;une installation de référence (ou <em>master</em>). N&#8217;allez cependant pas croire qu&#8217;il suffit de simplement copier le fichier image du master pour le réutiliser lors de la création d&#8217;une nouvelle machine. Dans ce billet j&#8217;aborderai les principales précautions à prendre pour éviter de perdre du temps lors du clonage d&#8217;une machine virtuelle Linux Debian avec VirtualBox.</p>
<p><span id="more-220"></span></p>
<h4>Clonage du disque dur</h4>
<p>Les quelques aventuriers ayant tenté le passage en force en copiant le fichier image du master ont certainement été confontés à un message de ce type lors de l&#8217;import du disque nouvellement créé :</p>
<blockquote><p>Cannot register the hard disk [...] with UUID [...] because a hard disk [...] with UUID [...] already exists in the media registry [...].</p></blockquote>
<p>L&#8217;UUID (Universal Unique IDentifier), auquel le message fait référence, est en fait une chaîne de caractères alphanumériques permettant d&#8217;identifier des périphériques de stockage (plus d&#8217;info <a href="http://doc.ubuntu-fr.org/uuid_et_label">ici</a>). Cet identifiant étant inscrit dans les métadonnées du disque dur virtuel (fichier .vdi), il est copié en même temps que ce dernier. Lors de l&#8217;import de la nouvelle copie, l&#8217;unicité des identifiants de périphériques n&#8217;est plus respectée, d&#8217;où le message d&#8217;erreur retourné par VirtualBox.</p>
<p>Heureusement, les développeurs ont pensé à nous ! Plutôt que de modifier l&#8217;UUID du nouveau disque à la main, nous allons utiliser la commande <strong>VBoxManage</strong> associée à l&#8217;option <strong>clonehd</strong> :</p>
<pre>
VBoxManage clonehd          &lt;uuid&gt;|&lt;filename&gt; &lt;outputfile&gt;
                            [--format VDI|VMDK|VHD|RAW|&lt;other&gt;]
                            [--variant Standard,Fixed,Split2G,Stream,ESX]
                            [--type normal|writethrough|immutable]
                            [--remember] [--existing]
</pre>
<p>La commande que j&#8217;utilise le plus couramment est la plus simple :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ VBoxManage clonehd <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>master.vdi <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>clone.vdi</pre></div></div>

<p>NB : Il est important de spécifier <strong>les chemins absolus</strong> des disques source et distant.</p>
<p>Une fois la procédure de clonage terminée, le nouveau disque est prêt à l&#8217;emploi et peut être utilisé en choisissant l&#8217;option &laquo;&nbsp;Utiliser un disque existant&nbsp;&raquo; lors de la création d&#8217;une nouvelle VM. Il ne reste alors plus qu&#8217;à démarrer la machine pour la suite des opérations.</p>
<h4>Modification du hostname</h4>
<p>Le nom d&#8217;hôte de la machine est utilisé par certaines opérations réseau et s&#8217;affiche sur le prompt d&#8217;un utilisateur connecté (bien que ce comportement soit configurable). Vous l&#8217;aurez compris, au premier démarrage, le nom d&#8217;hôte de la nouvelle VM est celui du master. Pour le modifier il faut éditer le fichier <em>/etc/hostname</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> newhostname <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">hostname</span></pre></div></div>

<p>NB : on évitera les caractères trop exotiques pour la définition du hostname ;)</p>
<p>L&#8217;une des erreurs les plus couramment commises est de s&#8217;arrêter là ! En effet, il faut également propager cette modification dans le fichier <em>/etc/hosts </em> de façon à avoir au minimum les déclarations suivantes (en plus de celles pour IPv6) :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">127.0.0.1    localhost
127.0.0.1    newhostname.localdomain newhostname</pre></div></div>

<p>NB : Cette mise à jour est vraiment importante, tant son oubli peut faire perdre du temps. Un exemple typique est l&#8217;impossibilité de démarrer le serveur applicatif JBoss. Inutile de dire que le lien de cause à effet n&#8217;est pas immédiat et que les erreurs causées par l&#8217;omission de cette configuration sont assez difficiles à diagnostiquer (surtout lorsqu&#8217;elles surgissent 15 jours plus tard ! ).</p>
<h4>Mise à jour des rules udev pour les interfaces réseau</h4>
</p>
<p>Les distributions basées sur Debian disposent d&#8217;une règle udev permettant d&#8217;associer de façon pérenne le nom d&#8217;une interface réseau logique (<em>ethX</em>) avec l&#8217;adresse MAC de la carte correspondante. L&#8217;enregistrement des couples ethX/@MAC dans le fichier <em>/etc/udev/rules.d/70-persistent-net.rules</em> permet d&#8217;effectuer des opérations physiques sur les interfaces réseaux (ajout, retrait, interversions) sans pertrber la configuration réseau. La règle udev responsable de l&#8217;écriture de ces associations est située dans le script <em>/etc/udev/rules.d/75-persistent-net-generator.rules</em>. Les adresses MAC figurant dans le fichier <em>70-persistent-net.rules</em> étant celles du master, il faut mettre le fichier à jour pour les faire correspondre avec celles de la nouvelle machine. On peut également tout bonnement supprimer ces 2 fichiers, mais cela n&#8217;est pas conseillé.</p>
<h4>Changez vos mots de passe !</h4>
<p>Et oui, les comptes utilisateurs étant les mêmes que ceux configurés sur le master, il est vivement conseillé de <b>modifier au minimum le pass root !!!</b></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/11/cloner-une-machine-virtuelle-linux-debian-avec-virtualbox/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Une base de données embarquée dans votre application Java avec Derby</title>
		<link>http://blog.tuxp.fr/2009/10/une-base-de-donnees-embarquee-dans-votre-application-java-avec-derby/</link>
		<comments>http://blog.tuxp.fr/2009/10/une-base-de-donnees-embarquee-dans-votre-application-java-avec-derby/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 22:26:18 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Base de données]]></category>
		<category><![CDATA[derby]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdbc]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=205</guid>
		<description><![CDATA[Au cours d&#8217;un développement pour un projet personnel, j&#8217;ai eu besoin de mettre en place une base de données embarquée dans une application Java. Pressé par le temps je n&#8217;ai pas fait d&#8217;étude comparative entre H2, HSQLDB et Derby mais l&#8217;exemple fourni est facilement réutilisable avec l&#8217;un de ces SGBD.

Le code
Sans plus attendre, voici le [...]]]></description>
			<content:encoded><![CDATA[<p>Au cours d&#8217;un développement pour un projet personnel, j&#8217;ai eu besoin de mettre en place une base de données embarquée dans une application Java. Pressé par le temps je n&#8217;ai pas fait d&#8217;étude comparative entre H2, HSQLDB et Derby mais l&#8217;exemple fourni est facilement réutilisable avec l&#8217;un de ces SGBD.</p>
<p><span id="more-205"></span></p>
<h4>Le code</h4>
<p>Sans plus attendre, voici le code source de la classe d&#8217;accès à la base de données :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">resources</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.Connection</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.DriverManager</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.SQLException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.Statement</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.logging.Logger</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * Singleton permettant d'accéder à la base de données DerbyDB embarquée.
 * @author Sébastien Chevallier
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> DerbyDB <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Logger logger <span style="color: #339933;">=</span> Logger.<span style="color: #006633;">getLogger</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;resources.DerbyDB&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Connection</span> connection<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> DerbyDB resource<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> path<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> DerbyDB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">Class</span>.<span style="color: #006633;">forName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;org.apache.derby.jdbc.EmbeddedDriver&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">String</span> dbUrl <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;jdbc:derby:&quot;</span><span style="color: #339933;">+</span>path<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;FStoSolrDB;create=true&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">Connection</span> tmp <span style="color: #339933;">=</span> <span style="color: #003399;">DriverManager</span>.<span style="color: #006633;">getConnection</span><span style="color: #009900;">&#40;</span>dbUrl, <span style="color: #0000ff;">&quot;APP&quot;</span>, <span style="color: #0000ff;">&quot;APP&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            tmp.<span style="color: #006633;">setAutoCommit</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">setConnection</span><span style="color: #009900;">&#40;</span>tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> DerbyDB getResource<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>DerbyDB.<span style="color: #006633;">resource</span> <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            DerbyDB.<span style="color: #006633;">resource</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DerbyDB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">return</span> DerbyDB.<span style="color: #006633;">resource</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Connection</span> getConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> connection<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setConnection<span style="color: #009900;">&#40;</span><span style="color: #003399;">Connection</span> connection<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">connection</span> <span style="color: #339933;">=</span> connection<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h4>Quelques explications</h4>
<p>Le projet ne nécessitant pas l&#8217;utilisation d&#8217;une couche de persistance évoluée, les interactions avec la base de données sont effectuées via l&#8217;API JDBC. Le design pattern <em>singleton</em> permet ici d&#8217;éviter la multiplication des connexions vers la base tout en rendant la connexion active accessible depuis les différentes classes du projet. J&#8217;ai également volontairement désactivé le mode <em>auto-commit</em> via la méthode  	<em>setAutoCommit()</em> pour des besoins propres à l&#8217;application. Dans ce cas, les modifications ne sont effectives qu&#8217;après appel à la méthode <em>commit()</em>.</p>
<h4>Utilisation de la classe DerbyDB</h4>
<p>Avant toute chose, il est nécessaire de préciser l&#8217;emplacement de la base de données sur le disque dur en renseignant le variable statique <em>DerbyDB.path</em>. L&#8217;accès à la ressource est ensuite obtenu en appelant la méthode statique <em>DerbyDB.getResource()</em>.</p>
<p>Pour couper court à toute remarque non constructive, je précise que cette classe est un exemple d&#8217;utilisation et ne constitue en rien un modèle de développement. Je la met tout de même à disposition en espérant que certains d&#8217;entre vous gagneront quelques précieuses minutes !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/10/une-base-de-donnees-embarquee-dans-votre-application-java-avec-derby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gérez efficacement vos mots de passe avec KeePassX</title>
		<link>http://blog.tuxp.fr/2009/10/gerez-efficacement-vos-mots-de-passe-avec-keepassx/</link>
		<comments>http://blog.tuxp.fr/2009/10/gerez-efficacement-vos-mots-de-passe-avec-keepassx/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 11:20:42 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Bureautique]]></category>
		<category><![CDATA[keepassx]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=186</guid>
		<description><![CDATA[Aujourd&#8217;hui, après avoir réinitialisé pour la n-ième fois le mot de passe de mon compte OVH, je me dis qu&#8217;il est peut être temps de (re)prendre de bonnes habitudes en matière de gestion de mes identifiants.

Le cahier des charges
Ancien utilisateur de Revelation sous Ubuntu, j&#8217;ai besoin d&#8217;un logiciel qui assure les fonctionnalités suivantes :

Verrouillage automatique [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui, après avoir réinitialisé pour la n-ième fois le mot de passe de mon compte OVH, je me dis qu&#8217;il est peut être temps de (re)prendre de bonnes habitudes en matière de gestion de mes identifiants.</p>
<p><span id="more-186"></span></p>
<h4>Le cahier des charges</h4>
<p>Ancien utilisateur de <a href="http://freshmeat.net/projects/revelation/">Revelation</a> sous Ubuntu, j&#8217;ai besoin d&#8217;un logiciel qui assure les fonctionnalités suivantes :</p>
<ul>
<li>Verrouillage automatique et/ou manuel de la session courante</li>
<li>Catégorisation des mots de passe</li>
<li>Copie du mot de passe dans le clipboard en un (double) clic</li>
</ul>
<p>Pourquoi ne pas continuer avec Revelation ? Tout simplement parce que je souhaite pouvoir accéder à ma base de mots de passe depuis Mac OS, Linux et Windows, pour des raisons de confort assez évidentes. La solution idéale devra donc être déclinée sur ces trois OS (sans parler pour autant de binaire portable).</p>
<p>Inutile de préciser que le logiciel doit également être gratuit et, si possible, Open Source car bizarrement je n&#8217;ai pas trop envie de jeter mes mots de passe dans une boîte noire, aussi jolie soit-elle.</p>
<p>Avant de présenter l&#8217;heureuse gagnante, je précise que j&#8217;ai écarté d&#8217;office les solutions en ligne ainsi que les modules Firefox. En effet, si je cherche une solution crossplatform, ce n&#8217;est pas pour me limiter à l&#8217;utilisation d&#8217;un seul navigateur, d&#8217;autant plus que je ne l&#8217;apprécie pas.</p>
<h4>La solution : KeePassX</h4>
<p>A l&#8217;origine, <a href="http://www.keepassx.org">KeePassX</a> est un portage Linux de <a href="http://keepass.info/">KeePass</a>, mais le projet semble voler de ses propres ailes depuis un certain temps. Le logiciel correspond tout à fait à ce que je recherche mais, avant de me lancer, je jette un rapide coup d&#8217;oeil sur la dernière news du site, histoire de me rassurer sur la pérennité du projet : <em>16 Septembre 2009</em>, vendu !</p>
<p>Au passage, voici quelques fonctionnalités supplémentaires du logiciel qui me plaisent bien :</p>
<ul>
<li>Authentification par mot de passe principal et/ou clé privée</li>
<li>Fonction de recherche dans la liste des entrées</li>
<li>Génération paramétrable de mots de passe</li>
<li>Drag &#038; Drop des champs champs d&#8217;une entrée dans d&#8217;autres applications (Linux et Mac OS)</li>
<li>Possibilité de renseigner la date d&#8217;expiration d&#8217;un mot de passe</li>
<li>Jeu d&#8217;icônes assez complet</li>
<li>Effacement du presse papier au bout d&#8217;une durée déterminée</li>
</ul>
<p>Côté interface, rien d&#8217;exceptionnel mais cela reste largement utilisable :</p>
<p><a href="http://blog.tuxp.fr/wp-content/uploads/2009/10/keypassx-ui.png"><img src="http://blog.tuxp.fr/wp-content/uploads/2009/10/keypassx-ui-499x271.png" alt="Interface utilisateur de KeePassX" title="Interface utilisateur de KeePassX" width="499" height="271" class="aligncenter size-medium wp-image-190" /></a></p>
<p>Alors, convaincu(e)s ? Et vous, quelles sont les solutions que utilisez pour gérez vos mots de passe ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/10/gerez-efficacement-vos-mots-de-passe-avec-keepassx/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Accédez simplement à vos VM VirtualBox depuis l&#8217;OS hôte</title>
		<link>http://blog.tuxp.fr/2009/09/accedez-simplement-a-vos-vm-virtualbox-depuis-los-hote/</link>
		<comments>http://blog.tuxp.fr/2009/09/accedez-simplement-a-vos-vm-virtualbox-depuis-los-hote/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 08:56:34 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Virtualisation]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[virtualbox]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=116</guid>
		<description><![CDATA[Autrefois réservée à un public averti (voire un peu geek), l&#8217;utilisation des machines virtuelles s&#8217;est énormément démocratisée au cours de ces dernières années. Si vous n&#8217;êtes pas familier avec le monde de la virtualisation, je vous invite à consulter ce livre blanc édité par la société Smile. De la plateforme de démonstration à celle de [...]]]></description>
			<content:encoded><![CDATA[<p>Autrefois réservée à un public averti (voire un peu geek), l&#8217;utilisation des machines virtuelles s&#8217;est énormément démocratisée au cours de ces dernières années. Si vous n&#8217;êtes pas familier avec le monde de la virtualisation, je vous invite à consulter ce <a href="http://www.smile.fr/publications/livres-blancs/virtualisation">livre blanc</a> édité par la société Smile. De la plateforme de démonstration à celle de crash-test en passant par les environnements de développement, les fameuses VM (Virtual Machines) font désormais partie de notre quotidien.</p>
<p>Personnellement j&#8217;utilise l&#8217;application <a href="http://www.virtualbox.org/">VirtualBox</a>, qui répond parfaitement à mes attentes, ne serait-ce que parce qu&#8217;elle est disponible gratuitement pour les 3 plateformes Mac OS X, Linux et Windows. Elle possède cependant quelques lacunes, notamment dans la prise en charge des communications réseau de l&#8217;OS hôte vers l&#8217;OS invité, qui fait l&#8217;objet de ce billet. Les manipulations sont effectuées avec une machine invitée Ubuntu et un hôte Mac OS X, mais s&#8217;adaptent (presque) sans problème à des configurations différentes.</p>
<p> <span id="more-116"></span></p>
<h4>Les différents modes d&#8217;accès réseau</h4>
<p>Comme la plupart des logiciels de virtualisation, VirtualBox propose quatre modes d&#8217;accès réseau pour ses machines invitées :</p>
<p><a href="http://blog.tuxp.fr/wp-content/uploads/2009/09/virtualbox-ModesAccesReseau.png"><img src="http://blog.tuxp.fr/wp-content/uploads/2009/09/virtualbox-ModesAccesReseau-500x246.png" alt="Modes d&#039;accès réseau VirtualBox " title="Modes d&#039;accès réseau VirtualBox " width="500" height="246" class="aligncenter size-medium wp-image-136" /></a></p>
<ul>
<li><strong>NAT :</strong> le plus courant, il permet à l&#8217;OS invité d&#8217;accéder au réseau externe de façon transparente. Techniquement, les connexions initiées par la machine guest sont relayées par l&#8217;interface réseau de la machine hôte, qui possède une addresse IP sur le réseau externe, selon le principe du NAT (Network Address Translation).</li>
<li><strong>Accès par pont (bridge) :</strong> la carte réseau de l&#8217;OS invité possède sa propre addresse IP sur le réseau externe.</li>
<li><strong>Réseau interne (internal network) :</strong> utilisé pour créer un sous-réseau de plusieurs machines virtuelles.</li>
<li><strong>Accès privé hôte (host-only) :</strong> les seules connexions possibles sont celles établies entre la machine hôte et la machine invitée.</li>
</ul>
<h4>Focus sur le mode NAT</h4>
<p>Il est souvent nécessaire de pouvoir accéder à Internet depuis la machine invitée, ce qui exclue les deux derniers modes. Le réglage par défaut de la carte réseau étant positionné sur <em>NAT</em>, mettons nous dans la peau de l&#8217;utilisateur lambda. Une fois la machine invitée démarrée, on se connecte sur notre site préféré et&#8230; ça fonctionne ! </p>
<p><a href="http://blog.tuxp.fr/wp-content/uploads/2009/09/virtualboc-testNAT.png"><img src="http://blog.tuxp.fr/wp-content/uploads/2009/09/virtualboc-testNAT-500x302.png" alt="Test du NAT depuis une machine guest VirtualBox" title="Test du NAT depuis une machine guest VirtualBox" width="500" height="302" class="aligncenter size-medium wp-image-134" /></a></p>
<p>Maintenant, supposons que notre utilisateur, qui n&#8217;est pas si lambda que ça, dispose d&#8217;un serveur Web sur sa machine virtuelle. Comme faire pour s&#8217;y connecter avec un navigateur installé sur la machine hôte ? Un <em>ifconfig</em> nous indique que l&#8217;adresse IP de la machine virtuelle est 10.0.2.15, mais cette fois-ci la connexion échoue. Hé oui, nous voilà face à un comportement assez pénible de VirtualBox : le NAT ne fonctionne que dans un sens (contrairement aux solutions VMware) ! Le contournement le plus simple consiste à passer en mode <em>bridge</em> car la machine virtuelle possèdera alors sa propre IP sur le réseau, et sera donc considérée comme un client à part entière, au même titre que son hôte. Notons quand même, pour les plus étourdis, que TOUT le traffic réseau passe par la carte physique de la machine hôte, le mode bridge consistant simplement en un dédoublement logiciel de celle-ci (un alias de l&#8217;interface réseau en quelque sorte).</p>
<p>Si cette solution répond tout à fait au besoin, elle possède un inconvénient de taille : la machine hôte doit être connectée à un réseau IP. Impossible donc de travailler dans le train, ou tout autre environnement déconnecté. Heureusement pour nous il existe encore deux solutions !</p>
<p><strong>NB :</strong> Avant de continuer, un petit point sur l&#8217;addressage IP utilisé par le mode <em>NAT</em> s&#8217;impose. Toutes les machines configurées pour l&#8217;utiliser se voient attribuer l&#8217;adresse 10.0.2.15, et peuvent communiquer avec la machine hôte addressée en 10.0.2.2. On se rend compte ici que chacune d&#8217;elles est isolée et ne peut donc pas communiquer directement avec ses voisines, à moins de configurer une deuxième interface réseau uilisant le mode <em>internal-network</em>.</p>
<h5>L&#8217;utilitaire VBoxManage</h5>
<p>Si vous utilisez régulièrement VirtualBox vous avez forcémment rencontré cette commande, véritable couteau-suisse de l&#8217;application. Le &laquo;&nbsp;déblocage&nbsp;&raquo; de l&#8217;accès au port <em>80 (http)</em> de la machine invitée depuis la machine hôte s&#8217;effectue à l&#8217;aide de trois lignes de commande du type :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">vboxmanage setextradata <span style="color: #ff0000;">&quot;{nom de machine virtuelle}&quot;</span> <span style="color: #ff0000;">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/{nom du mapping}/Protocol&quot;</span> TCP
vboxmanage setextradata <span style="color: #ff0000;">&quot;{nom de machine virtuelle}&quot;</span> <span style="color: #ff0000;">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/{nom du mapping}/GuestPort&quot;</span> <span style="color: #000000;">80</span>
vboxmanage setextradata <span style="color: #ff0000;">&quot;{nom de machine virtuelle}&quot;</span> <span style="color: #ff0000;">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/{nom du mapping}/HostPort&quot;</span> <span style="color: #000000;">8080</span></pre></div></div>

</p>
<p>Je ne vais pas plus loin dans les explications car je n&#8217;aime vraiment cette façon de procéder, pour les raisons suivantes :</p>
<ul>
<li>La commande est trop difficile à mémoriser et donc peu propice à des interventions d&#8217;urgence ;</li>
<li>En fonction du paramétrage de la carte réseau de la VM, le type de driver passe de <em>pcnet</em> à <em>e1000</em> ;</li>
<li>lors de mes tests elle ne fonctionnait plus à partir de 3 ports ouverts (ce qui n&#8217;a peut être rien à voir, je n&#8217;ai pas investigué davantage).</li>
</ul>
<p>Si vous souhaitez tout de même utiliser cette commande, toute la documentation nécessaire est disponible sur Internet. De mon côté j&#8217;ai opté pour une autre solution, un peu plus geek par contre.</p>
<h5>Le retour du tunnel SSH</h5>
<p>Ayant prévu de faire un billet dédié au tunneling SSH, je passe directement à la phase pratique. Pour reprendre l&#8217;exemple abordé précédemment, voici la procédure de connexion au port 80 de la VM :</p>
<ol>
<li>Sur la VM, on tape la commande suivante en console

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ssh</span> <span style="color: #660033;">-NfR</span> <span style="color: #000000;">8080</span>:localhost:<span style="color: #000000;">80</span> username<span style="color: #000000; font-weight: bold;">@</span>10.0.2.2</pre></div></div>

<p> avec <em>username</em> un compte existant sur la <strong>machine hôte</strong>. Notez que si cet utilisateur ne dispose pas des privilèges d&#8217;administrateur, le premier port indiqué dans la commande doit être >1024.</li>
<li>Puis on se connecte, depuis la machine hôte, à l&#8217;adresse http://localhost:8080 à l&#8217;aide d&#8217;un navigateur web :<br />
<a href="http://blog.tuxp.fr/wp-content/uploads/2009/09/guest-web-virtualbox.png"><img src="http://blog.tuxp.fr/wp-content/uploads/2009/09/guest-web-virtualbox-500x302.png" alt="Connexion au serveur Web de la machine guest VirtualBox" title="Connexion au serveur Web de la machine guest VirtualBox" width="500" height="302" class="aligncenter size-medium wp-image-151" /></a></li>
</ol>
<p>Et&#8230; c&#8217;est tout ! Vous admettrez que c&#8217;est quand même plus simple :) Mais comme rien n&#8217;est jamais parfait : </p>
<ul>
<li>La méthode présentée ne fonctionne que pour le protocole TCP. Même si cela comprend la grande majorité des cas d&#8217;utilisation, cela peut s&#8217;évérer insuffisant et il est préférable dans ce cas d&#8217;employer la commande <em>VboxManage</em>. Sachez tout de même qu&#8217;il existe un contournement pour faire transiter des paquets UDP au travers d&#8217;un tunnel SSH, mais il ne sera pas abordé ici. Je n&#8217;ai fait aucun test pour ICMP car il semble être mal implémenté au niveau des drivers de VirtualBox, mais suis preneur de toute information intéressante.</li>
<li>La machine hôte doit disposer d&#8217;un serveur SSH. Si cela ne pose pas de problème sur Linux et Mac OS X (Préférences Système > Partage > Session à distance) , les Windowsiens devront s&#8217;amuser un peu avec <a href="http://www.cygwin.com/">Cygwin</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/09/accedez-simplement-a-vos-vm-virtualbox-depuis-los-hote/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NTFS et Mac OS jouent à cache-cache !</title>
		<link>http://blog.tuxp.fr/2009/08/ntfs-et-mac-os-jouent-a-cache-cache/</link>
		<comments>http://blog.tuxp.fr/2009/08/ntfs-et-mac-os-jouent-a-cache-cache/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 22:07:33 +0000</pubDate>
		<dc:creator>TuxP</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[disque]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[mac os]]></category>
		<category><![CDATA[ntfs]]></category>
		<category><![CDATA[system]]></category>

		<guid isPermaLink="false">http://blog.tuxp.fr/?p=105</guid>
		<description><![CDATA[Ce billet vient à la suite d&#8217;une mésaventure dont je me serais bien passé hier soir. Comme beaucoup de personnes travaillant sur un ordinateur portable, je dispose d&#8217;un disque dur externe USB sur lequel je stocke la plupart de mes données. J&#8217;ai opté pour le système de fichier NTFS de façon à pouvoir m&#8217;adapter à [...]]]></description>
			<content:encoded><![CDATA[<p>Ce billet vient à la suite d&#8217;une mésaventure dont je me serais bien passé hier soir. Comme beaucoup de personnes travaillant sur un ordinateur portable, je dispose d&#8217;un disque dur externe USB sur lequel je stocke la plupart de mes données. J&#8217;ai opté pour le système de fichier NTFS de façon à pouvoir m&#8217;adapter à tous les postes de travail, ce qui me semble être le but d&#8217;un disque externe.</p>
<p>Le problème c&#8217;est que depuis quelques mois je travaille sous Mac OS X et le moins que l&#8217;on puisse dire c&#8217;est que le support du NTFS n&#8217;est pas sa plus grande force. Je récupère donc la dernière version du driver <a href="http://www.ntfs-3g.org/">NTFS-3G</a> et en moins de deux minutes me voilà en train d&#8217;écrire des données  sur mon disque externe. J&#8217;ai pourtant oublié un détail, qui m&#8217;a valu la perte de deux machines virtuelles hier (inutile de préciser qu&#8217;elles n&#8217;étaient pas sauvegardées ailleurs).</p>
<p><span id="more-105"></span></p>
<h4>Rappel des faits</h4>
<p>Dans la cadre de mes projets informatiques personnels, je travaille sur un petit parc de machines virtuelles. Faute de place sur mon portable, les images disque de ces machines sont entreposées sur mon fameux disque externe. Tout allait pour le mieux jusqu&#8217;à ce qu&#8217;une micro-coupure vienne interrompre mon travail en provoquant la déconnexion du disque. Et là c&#8217;est le drame ! Une fois le disque reconnecté, impossible de mettre la main sur les images disque des machines virtuelles en activité avant l&#8217;incident. Mais comment une si petite coupure a-t-elle pu avaler près de 8Go de données ?</p>
<h4>Petit rappel du fonctionnement d&#8217;un disque dur</h4>
<p>Je n&#8217;entrerai pas dans les détails, mais il faut savoir que les disques durs disposent d&#8217;un espace servant d&#8217;interface entre le mécanisme d&#8217;écriture des données sur les plateaux et le système d&#8217;exploitation : il s&#8217;agit du cache (ou tampon). Lorsqu&#8217;il est utilisé en mode <em>write-back</em> il fonctionne un peu à la manière du tapis roulant d&#8217;une caisse de supermarché : l&#8217;hôte(sse) de caisse, que l&#8217;on assimilera au mécanisme d&#8217;écriture, prend plus de temps à enregistrer un article que le client n&#8217;en met pour le lui tendre. Si la caisse ne dispose pas de tapis roulant, ce dernier doit donc attendre que chaque article soit enregistré avant de passer au suivant. Le temps d&#8217;attente est certes très court (quelques secondes tout au plus), mais cela reste du temps perdu et le client aurait bien aimé pouvoir déposer ses articles par lots de façon à profiter du temps d&#8217;attente cumulé pour aller chercher le lait oublié à l&#8217;autre bout du magasin ou passer un coup de fil (les connaisseurs verront ici une allusion plus ou moins correcte au Time Sharing). C&#8217;est précisément le rôle que joue le tapis roulant et donc, par analogie, le cache d&#8217;un disque dur. Il s&#8217;intercale entre deux processus évoluant à des vitesses différentes de façon à ce que le plus rapide des deux ne soit pas bloqué (il y a des limites quand même car la taille du tampon n&#8217;est pas infinie). Lors de l&#8217;écriture d&#8217;un fichier sur un disque, la vitesse est conditionnée par le déplacement des parties mécaniques (changement de plateau, rotation, etc.). Pour éviter de consommer du temps processeur inutilement, le disque indique au système que les données ont été écrites dès leur réception, mais en réalité il les met en cache pour les traiter plus tard. Du point de vue du système d&#8217;exploitation, les données sont donc présentes sur le disque dur. Leur enregistrement ne sera cependant effectif qu&#8217;une fois le dernier octet traité par le disque. Si celui-ci est déconnecté avant la fin du processus d&#8217;écriture les données seront altérées ou perdues.</p>
<h4>Les systèmes de fichiers journalisés et le cache</h4>
<p>Il ne faut pas confondre le journal tenu par le système de fichier journalisé et le cache disque. L&#8217;objectif d&#8217;un système de fichier journalisé (NTFS, Ext3, etc.) est de tenir à jour un journal des opérations à effectuer sur le disque. Ainsi l&#8217;écriture d&#8217;un document doit se faire selon la séquence :</p>
<ul>
<li>inscription dans le journal des actions à effectuer sur les métadonnées et les données (suivant le système de fichiers utilisé),</li>
<li>écriture sur le disque,</li>
<li>validation des opérations dans le journal.</li>
</ul>
<p>La tenue du journal se faisant au moyen d&#8217;écritures sur le disque, au même titre que les opérations de la deuxième étape, l&#8217;utilisation d&#8217;un cache d&#8217;écriture ne garantie absolument pas l&#8217;ordre d&#8217;exécution de la séquence décrite. Les écritures seront effectuées selon des mécanismes d&#8217;optimisation, indépendamment de leur ordre d&#8217;entrée dans le cache. Pour éviter ce genre de désagrément, le concept de <em>barrière</em> a été  introduit dans la couche de gestion des entrées/sorties des disques. Pour plus d&#8217;infos je vous laisse consulter la bibliographie à la fin de l&#8217;article.</p>
<h4>Et la solution dans tout ça ?</h4>
<p>Il est effectivement temps de revenir à nos moutons ! Nous avons vu que la méthode d&#8217;écriture <em>write-back</em> est la cause de cette perte de données, il suffit donc de la désactiver. La construction des disques imposant l&#8217;utilisation du cache, pour simuler sa désactivation il faut utiliser la méthode <em>write-through</em> qui consiste à attendre la fin (réelle cette fois) de l&#8217;écriture d&#8217;un octet avant de passer à l&#8217;envoi du suivant.</p>
<p>Sous Mac OS, ce réglage s&#8217;effectue en cliquant sur l&#8217;icône NTFS-3G des préférences système. Il est alors possible d&#8217;activer ou désactiver le cache via les options &laquo;&nbsp;File system caching enabled&nbsp;&raquo; pour un réglage global, ou &laquo;&nbsp;Disable file system caching&nbsp;&raquo; pour une configuration spécifique à un volume.</p>
<h4>Enseignements à tirer de cette expérience</h4>
<p>On ne le dira jamais assez, il faut sauvegarder régulièrement ses données ! Mais malgré cela on ne peut pas se prémunir de tous les risques alors autant prendre quelques précautions en</p>
<ul>
<li>évitant au maximum de travailler directement sur des sources externes susceptibles d&#8217;être déconnectées par inadvertance (clés USB, disques externes, etc.) et en préférant les périphériques de stockage réseau (NAS, partage Samba, etc.). A noter quand même qu&#8217;un bon ordinateur fixe n&#8217;est pas à l&#8217;abri de ce genre d&#8217;incident et pourrait de la même façon perdre des données en cas de coupure de courant.</li>
<li>débranchant correctement ses périphériques ! De cette façon on s&#8217;assure que toutes les données sont écrites sur le disque de façon pérenne. Sur les versions de Windows à partir d&#8217;XP le cache est automatiquement passé en mode <em>write-through</em> pour tous les périphériques externes, mais ce n&#8217;est pas une raison pour prendre de mauvaises habitudes et les déconnecter n&#8217;importe comment !</li>
</ul>
<p>Et voilà c&#8217;est fini ! Je vais maintenant pouvoir reprendre mon travail sans peur de perdre à nouveau mes machines virtuelles (ouf !).</p>
<h4>Bookmarks</h4>
<p>Quelques liens qui m&#8217;ont permis de me documenter un peu plus sur le sujet. Attention c&#8217;est assez technique !</p>
<ul>
<li><a href="http://www.hitachigst.com/hdd/technolo/writecache/writecache.htm">Write caching improves server performance</a></li>
<li><a href="http://www.bulma.net/impresion.phtml?nIdNoticia=1154">Journal File Systems in Linux</a></li>
<li><a href="http://rg03.wordpress.com/2008/06/09/write-cache-horrors/">Write cache horrors</a></li>
<li><a href="http://mail.nl.linux.org/linux-crypto/2005-10/msg00004.html">Discussion about disk caching and journalised filesystems</a></li>
<li><a href="http://lwn.net/Articles/283161/">Barriers and journaling filesystems</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.tuxp.fr/2009/08/ntfs-et-mac-os-jouent-a-cache-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
