<?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>Je pensais qu&#039;il était avec vous... &#187; Analyse</title>
	<atom:link href="http://www.patpro.net/blog/index.php/tag/analyse/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.patpro.net/blog</link>
	<description>patpro.net</description>
	<lastBuildDate>Mon, 23 Jan 2012 23:09:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Utiliser auditd sur Mac OS X et FreeBSD &#8211; 3</title>
		<link>http://www.patpro.net/blog/index.php/2011/06/05/1895-utiliser-auditd-sur-mac-os-x-et-freebsd-3/</link>
		<comments>http://www.patpro.net/blog/index.php/2011/06/05/1895-utiliser-auditd-sur-mac-os-x-et-freebsd-3/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 16:17:00 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Surveillance]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=1895</guid>
		<description><![CDATA[Cet article est la suite de Utiliser auditd sur Mac OS X et FreeBSD - 2 Exploiter les résultats de l'audit Dans le premier article j'ai mentionné très succinctement une commande qui permet de lire les logs d'audit en temps réel. Et finalement la consultation de ces logs est sans doute la chose la plus [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2011/06/05/1895-utiliser-auditd-sur-mac-os-x-et-freebsd-3/' addthis:title='Utiliser auditd sur Mac OS X et FreeBSD &#8211; 3 '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p>Cet article est la suite de <ins datetime="2011-06-01T13:53:14+00:00"><a href="/blog/index.php/2011/06/01/1840-utiliser-auditd-sur-mac-os-x-et-freebsd-2/">Utiliser auditd sur Mac OS X et FreeBSD - 2</a></ins></p>
<h4>Exploiter les résultats de l'audit</h4>
<p>Dans le premier article j'ai mentionné très succinctement une commande qui permet de lire les logs d'audit en temps réel. Et finalement la consultation de ces logs est sans doute la chose la plus intéressante. Personne n'a envie d'activer l'audit sur une machine pour le simple plaisir de remplir son disque dur. Tout ceci doit avoir une raison d'être&nbsp;: pouvoir ensuite (ou en temps réel) exploiter les logs d'<code>auditd</code>.<span id="more-1895"></span><br />
Comme précisé par défaut dans le fichier <code>audit_control</code>, la taille maximale d'un fichier de log d'audit est 2Mo, et les anciens fichiers sont supprimés pour que le volume total ne dépasse pas 10 Mo&nbsp;:</p>
<pre>filesz:2M
expire-after:10M</pre>
<p>Il existe plusieurs options intéressantes pour <code>expire-after</code> que je vous laisse découvrir dans le <a href="x-man-page://audit_control">man audit_control</a>. Sachez seulement qu'en fonction de ce que vous choisirez de surveiller, vous allez devoir modifier ces paramètres. Sur une machine assez sollicitée, 10 Mo de log peuvent représenter moins d'une heure d'audit. Si vous avez besoin d'enquêter sur un événement de la veille, il vous sera alors impossible d'en retrouver la trace.</p>
<p>Il y a deux moyens immédiats d'exploiter les logs d'audit. Vous pouvez soit les suivre en direct comme je l'ai montré dans le premier article via la commande <code>praudit /dev/auditpipe</code>, soit les étudier <em>a posteriori</em>. C'est sans doute cette option qui sera le plus souvent utilisée. Vous pouvez ainsi utiliser <code>praudit</code> pour lire les fichiers de logs enregistrés dans <code>/var/audit/</code>.<br />
Comme les logs d'audit peuvent grossir très vite, et qu'on cherche souvent l'aiguille dans la meule de foin, il est bon de pouvoir réduire les logs à ce que l'on cherche avant de les afficher. C'est le rôle de la commande <a href="x-man-page://auditreduce">auditreduce</a>. Cette commande permet de filtrer les logs selon une série de critères tels que la date, le ou les flags d'évènement (<code>fc</code>, <code>ex</code>, ...), l'UID, le ou les évènements précis (tels qu'ils sont répertoriés dans le fichier <code>audit_event</code>), et d'autres encore.<br />
auditreduce s'utilise sous la forme générale suivante&nbsp;:</p>
<pre>auditreduce paramètres fichiers_de_log | praudit</pre>
<p>Comme les logs sont binaires, il est impératif de les traduire via <code>praudit</code>.<br />
Sur Mac OS X, voici un exemple de ce que l'on peut obtenir avec la configuration par défaut d'<code>auditd</code>. Je cherche ici tous les événements pour l'UID réelle patpro ayant eu lieu après le 5 juin 2011 à 12h. Je fais cette recherche dans le fichier de log ouvert par <code>auditd</code>.</p>
<pre># auditreduce -a 2011060512 -r patpro /var/audit/current | praudit
header,68,11,logout - local,0,Sun Jun  5 15:47:35 2011, + 877 msec
subject,patpro,root,patpro,patpro,patpro,10485,10485,0,0.0.0.0
return,success,0
trailer,68
header,68,11,logout - local,0,Sun Jun  5 15:57:05 2011, + 718 msec
subject,patpro,root,patpro,patpro,patpro,10948,10948,0,0.0.0.0
return,success,0
trailer,68</pre>
<p>Ces deux évènements correspondent à la fermeture d'une fenêtre de terminal. On voit que chacun d'eux commence par "header" et termine par "trailer". Je ne vais pas couvrir l'intégralité des champs d'un enregistrement de log d'audit, il y a beaucoup trop de possibilités. Reportez-vous au <a href="x-man-page://audit.log">man audit.log</a> pour le détail. Ceux qui ont un intérêt sinon universel, au moins relativement général, sont <code>subject</code> qui décrit le sujet qui a généré les évènements, <code>path</code> qui décrit le chemin du fichier concerné, et <code>return</code> qui indique si l'opération a réussi ou non.<br />
Le champ <code>subject</code> contient les UID et GID (audit UID, effective UID et GID, real UID et GID), le PID, et le port et l'IP de la machine connectée.<br />
Le champ <code>path</code> donne par exemple le chemin d'un exécutable lancé, ou le chemin d'un fichier créé/modifié/détruit.<br />
Le champ <code>return</code> indique success ou failure.</p>
<p>Voici un second exemple, pour un serveur Apache sur Mac OS X, lancé via l'utilitaire <code>setaudit</code>&nbsp;:</p>
<pre>header,127,11,execve(2),0,Wed Jun  1 14:50:44 2011, + 667 msec
exec arg,ls
path,/bin/ls
path,/bin/ls
attribute,100555,root,wheel,234881026,24767,0
subject,_www,_www,_www,_www,_www,26696,100031,0,0.0.0.0
return,success,0
trailer,127
header,131,11,open(2) - write,creat,trunc,0,Wed Jun  1 14:50:44 2011, + 735 msec
argument,3,0x1a4,mode
argument,2,0x601,flags
path,/Users/patpro/Sites/testFile.txt
subject,_www,_www,_www,_www,_www,26694,100031,0,0.0.0.0
return,failure : Permission denied,4294967295
trailer,131</pre>
<p>La requête http s'est faite sur la machine locale (http://localhost/...) vers un fichier PHP dont le code exécute la commande <code>system("ls");</code>  puis tente d'écrire un fichier testFile.txt.<br />
Le premier évènement enregistré montre le lancement de la commande <code>ls</code>, avec succès. Le second évènement montre la tentative d'écriture du fichier testFile.txt qui échoue.<br />
Cet exemple montre donc clairement comment les logs d'audit peuvent permettre, par exemple, de remonter la trace d'une compromission d'un serveur web. Notez que si j'avais lancé le serveur web normalement, sans utiliser <code>setaudit</code>, la ligne <code>subject</code> aurait indiqué <code>subject,patpro,_www,_www,_www,_www...</code>, patpro étant l'UID suivi par auditd. Il aurait donc fallu que le fichier <code>audit_user</code> indique les flags <code>ex</code> et <code>fc</code> pour le login patpro, sans quoi les évènements pour le serveur web n'auraient pas été enregistrés.</p>
<p><code>auditreduce</code> permet de filtrer les évènements selon un critère beaucoup plus fin que le simple flag (<code>fc</code>, <code>fd</code>, <code>ex</code>, ...). Il vous autorise à différencier chaque évènement avec la granularité du fichier <code>audit_event</code>. Si vous avez eu la curiosité d'ouvrir ce fichier, vous savez qu'il contient plus de 600 lignes de ce genre&nbsp;:</p>
<pre>0:AUE_NULL:indir system call:no
1:AUE_EXIT:exit(2):pc
2:AUE_FORK:fork(2):pc
3:AUE_OPEN:open(2) - attr only:fa
4:AUE_CREAT:creat(2):fc
5:AUE_LINK:link(2):fc
6:AUE_UNLINK:unlink(2):fd
7:AUE_EXEC:exec(2):pc,ex
8:AUE_CHDIR:chdir(2):pc
9:AUE_MKNOD:mknod(2):fc</pre>
<p>La nomenclature est simple. Chaque colonne est séparée des autres par ":". La première donne le numéro de référence d'un événement, la seconde donne son nom, la troisième le nom de la fonction correspondante, avec éventuellement un complément d'information, et la dernière indique le ou les flags correspondants.<br />
Sur les 10 lignes citées au dessus, vous notez qu'il y a déjà 4 évènements correspondants au flag <code>pc</code>, et 3 au flag <code>fc</code>. Donc si on se contente de faire un filtrage sur <code>pc</code> ou <code>fc</code>, on peut remontrer beaucoup trop d'évènements par rapport à ce que l'on cherche vraiment. Par ailleurs, dans certains cas, un même évènement peut correspondre à plusieurs flags contradictoires. Par exemple&nbsp;:</p>
<pre>75:AUE_OPEN_RTC:open(2) - read,creat,trunc:fc,fd,fr,fa,fm</pre>
<p>Cet évènement peut être détecté si on souhaite suivre les flags fc, fd, fr, fa ou fm !<br />
C'est ici qu'intervient le contenu de la ligne header des logs d'audit. En effet, l'entête indique clairement l'évènement qui est capturé. Par exemple <code>open(2) - write,creat,trunc</code>. Il suffit alors de chercher son nom dans le fichier <code>audit_event</code> pour pouvoir s'en servir de clé de filtrage&nbsp;:</p>
<pre>grep 'open(2) - write,creat,trunc' /etc/security/audit_event
79:AUE_OPEN_WTC:open(2) - write,creat,trunc:fc,fd,fw,fa,fm</pre>
<p>Il est alors possible d'utiliser <code>AUE_OPEN_WTC</code> comme ceci pour obtenir en sortie une sélection parfaite des évènements qu'on recherche&nbsp;:</p>
<pre>auditreduce -m AUE_OPEN_WTC -r www -o file=".*/bd/.*" /var/audit/current | praudit</pre>
<p>Cette commande permet de trouver tous les évènements <code>AUE_OPEN_WTC</code> pour l'utilisateur www qui ont eu pour cible des fichiers dont le chemin contient la chaîne "/bd/" dans le fichier de log d'audit courant.<br />
Il ne vous reste plus qu'à essayer par vous même !</p>
<h4>Bibliographie sommaire</h4>
<p><a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit-config.html">http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit-config.html</a><br />
<a href="https://ssl.apple.com/support/security/commoncriteria/CommonCriteriaAdminGuide.pdf">https://ssl.apple.com/support/security/commoncriteria/CommonCriteriaAdminGuide.pdf</a><br />
<a href="x-man-page://auditreduce">man auditreduce</a><br />
<a href="x-man-page://auditd">man auditd</a><br />
<a href="x-man-page://audit_user">man audit_user</a><br />
<a href="x-man-page://audit_control">man audit_control</a><br />
<a href="x-man-page://audit_event">man audit_event</a><br />
<a href="x-man-page://audit.log">man audit.log</a><br />
<a href="http://forums.freebsd.org/showthread.php?t=23716">http://forums.freebsd.org/showthread.php?t=23716</a></p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2011/06/05/1895-utiliser-auditd-sur-mac-os-x-et-freebsd-3/' addthis:title='Utiliser auditd sur Mac OS X et FreeBSD &#8211; 3 '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2011/06/05/1895-utiliser-auditd-sur-mac-os-x-et-freebsd-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utiliser auditd sur Mac OS X et FreeBSD &#8211; 2</title>
		<link>http://www.patpro.net/blog/index.php/2011/06/01/1840-utiliser-auditd-sur-mac-os-x-et-freebsd-2/</link>
		<comments>http://www.patpro.net/blog/index.php/2011/06/01/1840-utiliser-auditd-sur-mac-os-x-et-freebsd-2/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 13:45:02 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Surveillance]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=1840</guid>
		<description><![CDATA[Cet article est la suite de Utiliser auditd sur Mac OS X et FreeBSD - 1 Configuration : quid des utilisateurs comme www ? J'expliquais précédemment que le système d'audit ne peut suivre un utilisateur que si ce dernier se connecte à la machine (par ssh par exemple), et que quelques soient les ruses utilisées [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2011/06/01/1840-utiliser-auditd-sur-mac-os-x-et-freebsd-2/' addthis:title='Utiliser auditd sur Mac OS X et FreeBSD &#8211; 2 '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p>Cet article est la suite de <ins datetime="2011-06-01T13:55:03+00:00"><a href="/blog/index.php/2011/05/31/1822-utiliser-auditd-sur-mac-os-x-et-freebsd-1/">Utiliser auditd sur Mac OS X et FreeBSD - 1</a></ins> </p>
<h4>Configuration : quid des utilisateurs comme www ?</h4>
<p>J'expliquais précédemment que le système d'audit ne peut suivre un utilisateur que si ce dernier se connecte à la machine (par ssh par exemple), et que quelques soient les ruses utilisées (su, sudo...) c'est toujours l'UID réelle de l'utilisateur qui est suivie.</p>
<p>À cause de cela, il est totalement impossible de traquer des évènements appartenant à des utilisateurs qui ne peuvent pas se connecter au système. Ainsi, une ligne comme celle-ci dans <code>audit_user</code> ne permettra de traquer aucun évènement : </p>
<pre># pour freebsd remplacer _www par www
_www:fc,fd,ex:</pre>
<p>Il serait pourtant très intéressant de savoir ce que fait Apache dans votre dos, parfois sous la direction de méchants pirates.<br />
De nos jours, La plupart des serveurs utilisent des protocoles comme l'HTTP qui permettent aux utilisateurs d'accéder aux ressources sans être authentifiés au niveau du système. Les utilisateurs en question n'existent d'ailleurs pas au niveau du système. Néanmoins, les applications web permettent de faire énormément de choses via les langages comme le PHP, y compris d'interagir avec le système, en lançant des commandes, en créant des fichiers, etc.</p>
<p>Si on souhaite qu'auditd puisse contrôler les actions de www, il faut recourir à un artifice. Attention tout de même, ce qui suit est plus proche d'un hack que d'une méthode vraiment propre, et je ne peux pas garantir son fonctionnement correct dans un environnement de production.</p>
<p>En premier lieu il faut installer un programme spécifique, qui va permettre de forcer <code>auditd</code> à suivre les actions pour une UID donnée, sans que l'utilisateur correspondant ait besoin de se connecter à la machine.</p>
<pre>curl -LO http://www.freebsd.org/~csjp/setaudit.c
cc -o setaudit -lbsm setaudit.c </pre>
<p>Cela vous donne, si tout se passe bien, le binaire <code>setaudit</code>, que l'on va utiliser sous cette forme&nbsp;: </p>
<pre>setaudit -a UID_WWW -m FLAGS /programme/de/lancement/d/apache</pre>
<p>Pour suivre les évènements d'exécution de commande sous respectivement FreeBSD et Mac OS X, cela donnera :</p>
<pre>setaudit -a www -m ex /usr/local/etc/rc.d/apache22 restart
setaudit -a _www -m ex /usr/sbin/apachectl restart</pre>
<p>Ainsi, toutes les commandes lancées par Apache (donc sous l'UID www) sont enregistrées par <code>auditd</code>.<br />
Comme le masque des évènements (les flags de l'argument <code>-m</code>) décrit ce que l'on doit suivre, il est même inutile de renseigner le fichier <code>audit_user</code>.</p>
<p><strong>Pour résumer</strong> : </p>
<ul compact="" type="square">
<li>Si vous souhaitez que l'audit suive les utilisateurs qui se connectent à la machine, vous pouvez régler les classes d'évènements qui seront soumises à l'audit pour l'ensemble des utilisateurs dans le fichier <code>audit_control</code>, et gérer les cas particuliers dans <code>audit_user</code>.</li>
<li>Si vous souhaitez que l'audit suive des UID "interne", pour traquer tout signe de compromission sur un serveur web, un serveur de mail, etc. il faudra recourir à <code>setaudit</code> pour activer l'audit au moment du lancement du service correspondant.</li>
<li>Faites attention à la liste de flags que vous choisissez. Le volume des logs d'audit peut grossir très rapidement.</li>
</ul>
<p><a href="/blog/index.php/2011/06/05/1895-utiliser-auditd-sur-mac-os-x-et-freebsd-3/">Troisième partie de l'article -&gt;</a></p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2011/06/01/1840-utiliser-auditd-sur-mac-os-x-et-freebsd-2/' addthis:title='Utiliser auditd sur Mac OS X et FreeBSD &#8211; 2 '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2011/06/01/1840-utiliser-auditd-sur-mac-os-x-et-freebsd-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utiliser auditd sur Mac OS X et FreeBSD &#8211; 1</title>
		<link>http://www.patpro.net/blog/index.php/2011/05/31/1822-utiliser-auditd-sur-mac-os-x-et-freebsd-1/</link>
		<comments>http://www.patpro.net/blog/index.php/2011/05/31/1822-utiliser-auditd-sur-mac-os-x-et-freebsd-1/#comments</comments>
		<pubDate>Tue, 31 May 2011 21:51:19 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Surveillance]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=1822</guid>
		<description><![CDATA[FreeBSD et les versions récentes de Mac OS X sont livrées avec un système d'audit intégré, dérivé du Basic Security Module de SUN, et disponible en logiciel libre sous le nom d'OpenBSM. Ce système d'audit se décompose en deux parties : un ensemble d'appels systèmes dédiés et de librairies d'un côté, et des logiciels "utilisateur" [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2011/05/31/1822-utiliser-auditd-sur-mac-os-x-et-freebsd-1/' addthis:title='Utiliser auditd sur Mac OS X et FreeBSD &#8211; 1 '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p><strong>FreeBSD</strong> et les versions récentes de <strong>Mac OS X</strong> sont livrées avec un système d'audit intégré, dérivé du Basic Security Module de SUN, et disponible en logiciel libre sous le nom d'<strong><a href="http://en.wikipedia.org/wiki/OpenBSM">OpenBSM</a></strong>. Ce système d'audit se décompose en deux parties : un ensemble d'appels systèmes dédiés et de librairies d'un côté, et des logiciels "utilisateur" de l'autre. Sauf précision contraire, les explications présentées ici sont valables à la fois pour FreeBSD 7 et 8, et Mac OS X 10.6. Dans cette série d'articles je ne vais aborder que l'aspect "utilisateur" du système d'audit : comment l'activer, comment le configurer, comment exploiter les résultats.<br />
Le système d'audit fourni par OpenBSM a pour but la surveillante des actions des utilisateurs. Un certain nombre d'évènements peuvent être mis sous surveillance, pour tout ou partie des utilisateurs. Quand le système d'exploitation détecte qu'un utilisateur sous surveillance génère un des évènements à surveiller, il averti le démon <code>auditd</code> qui se charge de reporter cet évènement dans un fichier de log.<span id="more-1822"></span><br />
On parle ici d'évènements de bas niveau, c'est à dire que le système d'audit ne peut pas dire que tel utilisateur à envoyé un email ou passé quinze minutes à coder en AppleScript. Par contre, il est capable de dire qu'un utilisateur à ouvert un fichier en écriture, ou juste en lecture, ou qu'il a exécuté un programme, etc.<br />
On parle donc d'un système d'audit de sécurité, totalement sans rapport avec des logiciels comme <a href="/blog/index.php/2008/10/19/541-slife-le-time-tracking-pour-tous/">SLife</a>. </p>
<p><a href="#activation">Activation du système d'audit</a><br />
<a href="#config">Configuration</a><br />
<a href="/blog/index.php/2011/06/01/1840-utiliser-auditd-sur-mac-os-x-et-freebsd-2/">Configuration : quid des utilisateurs comme www ?</a><br />
<a href="/blog/index.php/2011/06/05/1895-utiliser-auditd-sur-mac-os-x-et-freebsd-3/">Exploiter les résultats de l'audit</a></p>
<p><a id="activation"></a></p>
<h4>Activation du système d'audit</h4>
<p>Sous FreeBSD 7 et 8, le noyau est déjà compilé avec <code>options AUDIT</code>, il ne reste donc qu'à lancer le démon <code>auditd</code> en ajoutant la ligne suivante au fichier <code>/etc/rc.conf</code> :</p>
<pre>auditd_enable="YES"</pre>
<p>puis en lançant le démon à la main :</p>
<pre>sudo /etc/rc.d/auditd start</pre>
<p>Sous Mac OS X 10.6, <code>auditd</code> est lancé d'office par <code>launchd</code>, il n'y a rien à faire.<br />
<a id="config"></a></p>
<h4>Configuration</h4>
<p>Une fois lancé, le système d'audit va enregistrer très peu d'évènements par défaut. Il convient donc de faire quelques réglages en fonction de ce que l'on cherche à accomplir.<br />
Les fichiers de configuration d'<code>auditd</code> se trouvent dans le répertoire <code>/etc/security</code> où seul root peut écrire. </p>
<ul compact="" type="square">
<li><code>audit_class</code> : décrit les différentes classes d'évènements qu'il est possible de surveiller. Il est sage de ne pas éditer ce fichier.</li>
<li><code>audit_control</code> : lisible seulement par root, ce fichier défini la politique d'audit par défaut.</li>
<li><code>audit_event</code> : le grand frère de <code>audit_class</code>, on ne le modifie pas.</li>
<li><code>audit_user</code> : le fichier de réglages par utilisateur. Il complète <code>audit_control</code> et n'est lisible que par root.</li>
<li><code>audit_warn</code> : un fichier exécutable qui est lancé quand <code>auditd</code> manque de place sur le disque pour écrire les logs.</li>
</ul>
<p>Pour un usage courant, seuls les fichiers <a href="x-man-page://audit_control">audit_control</a> et <a href="x-man-page://audit_user">audit_user</a> sont intéressants. La première chose à faire est d'aller lire leur page man respective.</p>
<p>Par défaut, le contenu du fichier <code>audit_control</code> est le suivant : </p>
<pre>dir:/var/audit
flags:lo,aa
minfree:5
naflags:lo,aa
policy:cnt,argv
filesz:2M
expire-after:10M</pre>
<p>Avec ces valeurs, <code>auditd</code> ne va répertorier que les évènements des classes "<code>lo</code>" (login/logout) et "<code>aa</code>" (authentification/autorisation). Et il va le faire pour l'ensemble des utilisateurs.<br />
Attention : après avoir lu le <a href="x-man-page://audit_control">man audit_control</a>, vous serez peut être tenté d'ajouter le champs "host" pour compléter la configuration. N'en faites rien. Cela peut perturber les outils utilisateur et rendre l'exploitation des résultats hasardeuse, voire impossible.<br />
Le contenu de <code>audit_user</code> quant à lui nous permet de préciser des flags en se basant sur le login des utilisateurs. Par défaut, le fichier <code>audit_user</code> contient :</p>
<pre>root:lo:no
</pre>
<p>C'est à dire que, quelque soit la liste des flags <code>audit_control</code>, les évènements de la classe "<code>lo</code>" seront suivis pour l'utilisateur root, et les évènements de la classe "<code>no</code>" (invalides) ne seront jamais suivis.<br />
Vous pouvez immédiatement vérifier que votre système d'audit fonctionne en lisant en direct les évènements qu'il enregistre. Il suffit pour cela de taper la commande suivante en root (ou via <code>sudo</code>) :</p>
<pre># praudit /dev/auditpipe</pre>
<p>Utilisez alors une autre fenêtre de terminal pour gérer des traces. Sous Mac OS X vous pouvez faire un sudo, ou simplement fermer la fenêtre de terminal, par exemple. Vous pourrez alors lire des choses comme cela :</p>
<pre>header,104,11,user authentication,0,Wed Jun  1 14:53:39 2011, + 965 msec
subject,root,root,wheel,root,wheel,26712,0,0,0.0.0.0
text,Authentication for user &lt;patpro&gt;
return,success,0
trailer,104
header,68,11,logout - local,0,Wed Jun  1 15:36:12 2011, + 554 msec
subject,patpro,root,patpro,patpro,patpro,28079,28079,0,0.0.0.0
return,success,0
trailer,68</pre>
<p>Nous en reparlerons dans le dernier article de la série.</p>
<p>Faites bien attention aux flags que vous allez régler. Dans certains cas, le nombre d'évènements enregistrés par le système d'audit peut être extrêmement élevé. Par défaut peu de choses sont soumises à l'audit, si bien qu'en 18 mois sur une station de travail, le contenu de <code>/var/audit</code> représente moins de 10 Mo. A contrario, sur un serveur web assez actif, où les classes d'audit sont "<code>fd,^fc,ex:no,fc</code>", on dépasse les 43 Mo en a peine 4 heures d'audit. </p>
<p>Il faut bien comprendre que l'activation de l'audit pour un utilisateur ne se produit qu'au moment de la première connexion de l'utilisateur au système. Prenons un exemple. Le fichier <code>audit_user</code> contient :</p>
<pre>root:lo:no
patpro:fc,fd,ex:
</pre>
<p>Donc pour l'utilisateur patpro, les créations, ouvertures, suppression de fichier, ou exécutions de programmes doivent être suivis. Cet utilisateur a une crontab qui tourne toutes les nuits et télécharge un fichier. Pourtant, auditd ne capturera aucun de ces évènements tant que l'utilisateur patpro ne se sera pas connecté à la machine, alors même que de nombreux évènements correspondants aux critères de l'audit se produisent.<br />
Dès que l'utilisateur patpro se sera connecté à la machine, auditd se mettra à enregistrer toutes les actions correspondant aux classes <code>fc</code>, <code>fd</code> et <code>ex</code> exécutées sous l'UID patpro. Cet audit se poursuivra même après la déconnexion de l'utilisateur.<br />
Par ailleurs, l'UID qui est traquée par auditd n'est pas l'UID apparente, mais l'UID d'origine de l'utilisateur. Si je me connecte en tant que patpro, et que je fais un <code>su -</code> ou un <code>sudo -Es</code>, je deviens root dans le shell (UID apparente), mais je reste patpro aux yeux d'auditd.<br />
Nous verrons dans un second article pourquoi ces deux contraintes sont importantes. D'ici là, vous pouvez approfondir les aspects simples de la configuration en lisant ces différents documents : </p>
<p><a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit-config.html">http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit-config.html</a><br />
<a href="https://ssl.apple.com/support/security/commoncriteria/CommonCriteriaAdminGuide.pdf">https://ssl.apple.com/support/security/commoncriteria/CommonCriteriaAdminGuide.pdf</a></p>
<p><a href="/blog/index.php/2011/06/01/1840-utiliser-auditd-sur-mac-os-x-et-freebsd-2/">Deuxième partie -&gt;</a></p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2011/05/31/1822-utiliser-auditd-sur-mac-os-x-et-freebsd-1/' addthis:title='Utiliser auditd sur Mac OS X et FreeBSD &#8211; 1 '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2011/05/31/1822-utiliser-auditd-sur-mac-os-x-et-freebsd-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Que nous apprend l&#8217;affaire &#171;&#160;Gawker&#160;&#187;</title>
		<link>http://www.patpro.net/blog/index.php/2010/12/24/1733-que-nous-apprend-laffaire-gawker/</link>
		<comments>http://www.patpro.net/blog/index.php/2010/12/24/1733-que-nous-apprend-laffaire-gawker/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 00:45:09 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Sécurité]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=1733</guid>
		<description><![CDATA[Comme je l'évoquais brièvement dans un précédent article, les serveurs de l'entreprise de média en ligne Gawker ont été piratés récemment, avec pour conséquence immédiate la diffusion au public des logins, emails, et mots de passe chiffrés de plus d'un million d'utilisateurs. Pour plusieurs centaines de milliers d'entre eux, les mots de passe avaient même [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2010/12/24/1733-que-nous-apprend-laffaire-gawker/' addthis:title='Que nous apprend l&#8217;affaire &#171;&#160;Gawker&#160;&#187; '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p>Comme je l'évoquais brièvement dans un <a href="/blog/index.php/2010/12/14/1723-de-la-securite-de-vos-mots-de-passe">précédent article</a>, les serveurs de l'entreprise de média en ligne Gawker ont été piratés récemment, avec pour conséquence immédiate la diffusion au public des logins, emails, et mots de passe chiffrés de plus d'un million d'utilisateurs. Pour plusieurs centaines de milliers d'entre eux, les mots de passe avaient même été déchiffrés avant leur diffusion.<br />
Pour quelqu'un comme moi les dessous de l'affaire sont croustillants, et les détails techniques sont même passionnants. Mais, plus important : tout le monde a une leçon à tirer de ce fiasco monumental.<br />
Cette leçon, et non des moindres, est la suivante : dès l'instant où vous confiez un mot de passe à quelqu'un, ce mot de passe est vulnérable. Ça paraît tout bête comme ça, on se dit "mais oui, c'est sûr qu'en donnant mon mot de passe à mon voisin, alors il n'est plus secret". Non. Relisez bien la leçon, elle est à prendre au premier degré. Oubliez votre voisin, votre copine. Vous créez un compte chez Hotmail, vous choisissez un mot de passe pour pouvoir accéder plus tard à votre boîte mail, vous fournissez ce mot de passe à Hotmail. Ça y est, ce mot de passe n'est plus sûr. Un jour, c'est inévitable, c'est déjà arrivé, et ça arrivera à nouveau, des serveurs Hotmail seront piratés et votre mot de passe pourrait tomber dans les mains de quelqu'un.<br />
L'affaire Gawker est bourrée d'exemples illustrants parfaitement ce principe. Les employés de chez Gawker s'échangeaient des mots de passe par chat, dont les archives des conversations ont été piratées. Le piratage des bases de données des sites de Gawker a montré que les mots de passe des utilisateurs n'étaient pas sécurisés : le chiffrement utilisé était archaïque et connu depuis des années pour être déficient, etc. etc.<br />
<span id="more-1733"></span><br />
Bref, votre mot de passe, dès l'instant où il quitte votre tête pour entrer dans un système que vous ne maîtrisez pas, n'est plus en sécurité. Vous ne pouvez pas garantir son inviolabilité, car vous ne contrôlez pas la manière dont il est transmis, stocké, et utilisé.<br />
Cela doit donc vous encourager à utiliser plusieurs mots de passe et plusieurs identifiants. Bien sûr, c'est pénible. Nombreux sont les utilisateurs pour qui la simple contrainte d'un mot de passe est un supplice médiéval à base de lame rouillée et de plomb fondu. Mais à chaque fois que vous hésitez, pensez aux conséquences : que se passera-t-il si le mot de passe que je viens de saisir pour m'enregistrer sur ce forum tombe entre de mauvaises mains ? Est-ce que les pirates pourront alors accéder à ma boîte mail avec le même mot de passe ? Est-ce qu'ils pourront entrer dans ma machine ? etc.<br />
Il ne s'agit donc pas de mettre un login et un mot de passe différents partout (même si idéalement ce devrait être le cas). Il s'agit plutôt de hiérarchiser les risques, de définir des périmètres de sécurité. Votre machine est un périmètre de haute sécurité. Un pirate qui y aurait accès pourrait sans doute récupérer des informations bancaires, des informations professionnelles confidentielles, détruire 10 ans de photos de familles non sauvegardées, etc. Votre email professionnel est sans doute au même niveau de sécurité. Un forum internet concernant vos loisirs, sur le quel vous être très assidu, est important, mais moins que votre messagerie. Des forums ou des sites fréquentés très occasionnellement ne méritent probablement pas autant de précautions.<br />
Dans le périmètre "haute sécurité", chaque accès devra avoir un mot de passe fort, et unique. À l'opposé, dans le périmètre "basse sécurité", vous pourrez sans risque réel utiliser le même mot de passe partout. La sécurité est à tout les coups une affaire de compromis entre le confort et les risques que vous acceptez. Plus votre confort est grand, plus vous prenez des risques. Meilleure est votre sécurité, plus elle est contraignante. Il y a simplement des domaines où vous ne pouvez pas vous permettre d'avoir une faible sécurité.</p>
<p>Ne faites pas comme Nick Denton, le fondateur de Gawker Media : n'utilisez pas le même mot de passe ridicule (24862486) partout. Ne partagez jamais un mot de passe par email, chat, ou autre, mais partez du principe que les autres le font. Pour finir, ne faites pas confiance aux dépositaires de vos mots de passe.</p>
<p>Joyeux Noël ;)</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2010/12/24/1733-que-nous-apprend-laffaire-gawker/' addthis:title='Que nous apprend l&#8217;affaire &laquo;&nbsp;Gawker&nbsp;&raquo; '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2010/12/24/1733-que-nous-apprend-laffaire-gawker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De la sécurité de vos mots de passe</title>
		<link>http://www.patpro.net/blog/index.php/2010/12/14/1723-de-la-securite-de-vos-mots-de-passe/</link>
		<comments>http://www.patpro.net/blog/index.php/2010/12/14/1723-de-la-securite-de-vos-mots-de-passe/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 11:26:24 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Sécurité]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=1723</guid>
		<description><![CDATA[En terme de mot de passe, on nous rebat souvent les oreilles avec des recommandations sécuritaires qui tombent sous le sens. Par contre, les arguments qui sous-tendent ces recommandations sont parfois largement infondés. Tout d'abord, on nous dit de ne pas choisir un mot de passe facile à deviner, c'est bien sûr du bon sens. [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2010/12/14/1723-de-la-securite-de-vos-mots-de-passe/' addthis:title='De la sécurité de vos mots de passe '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p>En terme de mot de passe, on nous rebat souvent les oreilles avec des recommandations sécuritaires qui tombent sous le sens. Par contre, les arguments qui sous-tendent ces recommandations sont parfois largement infondés.<br />
Tout d'abord, on nous dit de ne pas choisir un mot de passe facile à deviner, c'est bien sûr du bon sens. On nous dit que le mot de passe doit être long, car les ordinateurs actuels permettent de tester des milliers de mots de passe par seconde. Plus le mot de passe est long, plus il sera long à trouver. Certes. C'est mathématiquement exact. Mais à quoi arrive-t-on si on force les gens à utiliser un mot de passe à la fois long et compliqué ? Ils vont utiliser le même mot de passe partout, ils vont le noter quelque part, etc.<br />
Imaginons un instant qu'un pirate tente de deviner votre mot de passe de messagerie. Il a une très bonne connexion internet, et son ping (le délai qui s'écoule entre le moment où il envoie une requête au serveur, et le moment où le serveur dit qu'il a bien reçu cette requête) est de 10 millisecondes. Il faut ajouter à cela le temps de traitement sur le serveur, et l'envoi de la réponse. Mettons pour simplifier que la totalité de la transaction dure 20 ms. Si votre mot de passe de messagerie fait 8 caractères différents et qu'il utilise des lettres minuscules (26 possibilités), des lettres majuscules (26 possibilités), et des chiffres (10 possibilités), c'est probablement assez correct. Ce mot de passe utilise donc 8 caractères différents pris dans une série de 62. Soit un total de 136325,9 milliards de mots de passe possibles. À raison d'un mot de passe testé toutes les 20 ms, cela donne plus de 864 siècles, pour tester tous les mots de passe.<br />
Maintenant, ajoutez des caractères parmi @#&#038;"'(§!)-_$*/:;.,?+ (20 possibilités), et il faudra presque 9114 siècles pour tester tous les mots de passe.<br />
Moralité, la puissance des ordinateurs permet effectivement de tester des millions de mots de passe par heure, mais la latence des connexions internet rend ce mode d'attaque quasiment impossible, car elle ralentit terriblement le processus.<br />
<span id="more-1723"></span><br />
Les pirates se sont donc rabattus sur trois types d'attaques : l'ingénierie sociale, l'attaque de type "dictionnaire", et l'attaque directe des serveurs.<br />
L'ingénierie sociale, c'est le processus qui consiste à vous faire fournir vous même votre mot de passe, ou à deviner votre mot de passe par les données personnelles que le pirate connaît de vous. Un proche avec qui vous êtes en mauvais terme pourrait tester votre date de naissance, le nom de votre chien, etc. Un pirate qui ne vous connaît pas peut envoyer un <a href="http://www.urbanbike.com/index.php/site/comments/piegeakon-du-jour-caisse-depargne">mail de phishing</a> à toute la planète pour pousser les destinataires à révéler leur login et mot de passe, ou d'autres informations qui ont de la valeur.<br />
Certains poussent le vice jusqu'à mettre en pratique ces techniques au téléphone. Ils vous appellent et font croire qu'ils sont techniciens de tel fournisseur de service, et qu'ils ont besoin de votre mot de passe pour corriger quelque chose sur votre compte.<br />
Les attaques de type "dictionnaire" consistent à tester des couples login/mot de passe, pour une liste de valeurs très répandue uniquement. Le pirate teste quelques milliers d'identifiants classiques (john, root, user1, admin, test...) avec une liste de mots de passe classiques (mots du dictionnaire, mots dérivés du dictionnaire, séries de chiffres come 123456, mots de passe par défaut d'équipement grand public, etc.).<br />
Croyez-le ou pas, ça marche. Les deux techniques précitées sont les plus fréquentes, car elles demandent le moins d'efforts, et peuvent rapporter très gros.<br />
La troisième est la plus spectaculaire. Un groupe de pirates peut s'attaquer à un serveur d'une grosse entreprise spécialisée dans les contenus en ligne, par exemple <a href="http://www.dailytech.com/Gawker+Media+Suffers+Massive+Data+Breach+Courtesy+of+Gnosis/article20384.htm">Gawker Media</a>. Les pirates obtiennent alors l'accès à l'ensemble des comptes utilisateurs (plus d'un million dans le cas de Gawker Media) avec l'ensemble des données personnelles enregistrées : email, login, mot de passe... Bien sûr, les mots de passe sont chiffrés. Mais maintenant que les pirates ont l'accès direct aux mots de passe sans devoir les tester au travers d'une connexion internet, ils peuvent les déchiffrer en utilisant toute la puissance des machines actuelles. Et bien sûr, ils peuvent revendre la liste d'adresse email à des spammers.</p>
<blockquote><p>This weekend we discovered that Gawker Media's servers were compromised,<br />
resulting in a security breach at Lifehacker, Gizmodo, Gawker, Jezebel,<br />
io9, Jalopnik, Kotaku, Deadspin, and Fleshbot. As a result, the user name<br />
and password associated with your comment account were released on the<br />
internet. If you're a commenter on any of our sites, you probably have<br />
several questions.
</p></blockquote>
<p>Outch.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2010/12/14/1723-de-la-securite-de-vos-mots-de-passe/' addthis:title='De la sécurité de vos mots de passe '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2010/12/14/1723-de-la-securite-de-vos-mots-de-passe/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Le fonctionnement des snapshots</title>
		<link>http://www.patpro.net/blog/index.php/2010/01/04/1288-le-fonctionnement-des-snapshots/</link>
		<comments>http://www.patpro.net/blog/index.php/2010/01/04/1288-le-fonctionnement-des-snapshots/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 08:00:09 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[BSD]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=1288</guid>
		<description><![CDATA[Si les tractations entre Apple et Sun s’étaient passées correctement, les utilisateurs de Mac OS X auraient pu profiter d’ici un an ou deux d’un fabuleux système de fichiers : ZFS. Mais comme souvent, l’intérêt des clients passe après les intérêts de l’entreprise, et il semble finalement qu’Apple ait décidé de créer son propre nouveau [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2010/01/04/1288-le-fonctionnement-des-snapshots/' addthis:title='Le fonctionnement des snapshots '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p>Si les <a href="http://www.macrumors.com/2009/09/01/lack-of-zfs-file-system-support-in-snow-leopard-due-to-licensing-issues/">tractations</a> entre Apple et Sun s’étaient passées correctement, les utilisateurs de Mac OS X auraient pu profiter d’ici un an ou deux d’un fabuleux système de fichiers : ZFS. Mais comme souvent, l’intérêt des clients passe après les intérêts de l’entreprise, et il semble finalement qu’Apple ait décidé de créer son propre nouveau système de fichiers.</p>
<p>Un aspect sympathique de ZFS (parmi tant d’autres !), est sa capacité à générer et gérer des snapshots. Un snapshot, c’est une sorte de photographie à un instant donné d’un système de fichiers. Cette photographie peut alors être montée comme n’importe quel autre système de fichiers, elle peut servir de base à une sauvegarde, elle peut servir à rechercher un fichier effacé après la création du snapshot…<br />
Plus que l’utilité évidente en matière de sauvegarde de ces snapshots, j’aimerai revenir sur leur fonctionnement interne, car c’est là que réside toute la magie. En effet, au premier abord l’idée d’une photographie à un instant T de son disque dur semble séduisante, mais très rapidement des voix s’élèvent qui s’interrogent sur le temps que cela prend, la place que cela occupe… Imaginez votre disque dur de 250 Go, 500 Go,  ou même 1 To, bien rempli. Vous concluez naturellement que pour faire un snapshot de votre volume, il vous faudra un disque dur externe, de grande capacité, et que cela prend un temps fou. Fort heureusement, c’est faux.</p>
<p>ZFS crée ses snapshots selon le mode <em>copy on write</em>, tout comme le système de fichiers par défaut de FreeBSD : UFS. C’est ce dernier que je vais utiliser pour présenter le fonctionnement des snapshots. Il est probable que l’implémentation des snapshots dans ZFS diffère légèrement, mais la logique reste la même, et de nombreux autres systèmes la partage.<br />
<span id="more-1288"></span><br />
<strong>Attention</strong>. Les explications suivantes sont parfois simplifiées outrageusement. D'une part car les informations techniques précises sont très dispersées et pas toujours très claires ni faciles à se procurer. D'autre part pour rendre compte de manière accessible des mécanismes généraux impliqués dans la création de snapshots.<br />
Si vous êtes un as des systèmes de fichiers et des snapshot, n'hésitez pas à proposer des rectifications.</p>
<p>Sur un système de fichiers, les données sont organisées en blocs. Au début du système de fichiers, un index des blocs existe qui permet de retrouver les différents blocs appartenant à chaque fichier. On parle de <em>block bitmaps</em>. À l’instant T où je crée un snapshot d’un système de fichiers, je n’ai pas besoin de recopier l’intégralité du disque, car tous les fichiers s’y trouvent déjà. J’ai juste besoin de faire une image des <em>block bitmaps</em>.<br />
Si on recopiait les <em>block bitmaps</em> à l’identique, on ne pourrait pas monter un snapshot comme on le fait avec une image disque classique. En effet, les <em>block bitmaps</em> du snapshot pointeraient vers des blocs que l’on n’a pas recopiés, sans que le système puisse le savoir. En réalité, à la création du snapshot, toutes les références contenues dans les <em>block bitmaps</em> sont traduites. Quand l’index d’origine référence un bloc vide, alors l’index du snapshot utilise le pointeur <em>not used</em>, et si l’index d’origine référence un bloc utilisé, alors l’index du snapshot utilise le pointeur <em>not copied</em>.<br />
Finalement, juste au moment de sa création, le snapshot ne contient que des indexes remplis de pointeurs <em>not used</em> et <em>not copied</em>. Cela prend très peu de place, et la création est relativement rapide (instantanée sur ZFS, parfois longue sur UFS).</p>
<p>L’utilisateur se dit maintenant que si il modifie ou efface un fichier, son snapshot ne lui servira à rien puisque tous les blocs de données résident sur le système de fichiers et non pas sur le snapshot. C’est ici qu’intervient le mécanisme de <em>copy on write</em>. L’instant T est passé, le snapshot existe, système et utilisateurs écrivent sur le disque. Le système sait qu’un snapshot existe, il intercepte donc toute les demandes d’écriture, et les converti en “copie à l’écriture”.</p>
<p>Voici ce qui se passe lors de l’effacement d’un bloc sur le système de fichier (suppression ou réécriture d’un fichier, par exemple) :</p>
<ol type="1">
<li>Le système intercepte la demande d’écriture.</li>
<li>Il lit le pointeur correspondant dans l’index du snapshot.</li>
<li>Si le pointeur est à <em>not copied</em>, le système recopie le bloc dans le snapshot, et met à jour l’index du snapshot pour qu’il pointe vers ce nouveau bloc, et non plus vers <em>not copied</em>.</li>
<li>Si le pointeur est à <em>not used</em> ou si il contient déjà l’adresse d’un bloc du snapshot, rien n’est modifié dans le snapshot.</li>
<li>Enfin, le bloc est effacé sur le système de fichiers.</li>
</ol>
<p>Pour ceux qui ont besoin d'un dessin, voici un schéma trop compliqué (et donc forcément faux) du mécanisme de <em>copy on write</em> appliqué au snapshot. En haut, l'étape T=0 : le snapshot est créé. Au milieu, la réécriture des blocs (suppression du fichier bleu marine) est interceptée : les blocs sont recopiés dans le snapshot, la block bitmap du snapshot est mise à jour. En bas, l'écriture est faite sur le système de fichier original : le fichier n'existe plus, les indexes correspondant sont vidés.</p>
<p><img src="/blog/wp-content/uploads/2009/12/copy-on-write.png" alt="copy-on-write" title="copy-on-write" width="580" height="819" class="alignnone size-full wp-image-1289" /></p>
<p>L’ajout de fichiers sur le système de fichiers ne fait pas grossir le snapshot, car ce dernier doit continuer de référencer les blocs <em>not used</em> correspondants, pour maintenir une image fidèle du système de fichiers à l’instant T. De même, les réécritures multiples de blocs n’ont pas d’impact sur la taille du snapshot, car ce dernier ne conserve qu’une version des blocs : celle qui date de l’instant T.</p>
<p>On peut donc dire que la taille d’un snapshot est approximativement égale à la taille des blocs utilisés à sa création et qui ont été modifiés depuis. Mais il faut surtout retenir que la taille d’un snapshot dépend beaucoup de l’utilisation que l’on fait de son système de fichiers, et de la durée de vie de ce snapshot. En effet, tant qu’il n’a pas été supprimé, un snapshot est toujours maintenu par le système. Sa taille maximum théorique est égale au volume de données stocké sur le système de fichier de départ.<br />
On peut lire en divers endroits que la taille d’un snapshot est en général 10 à 15% de la taille du système de fichiers original. C’est une estimation tout à fait farfelue qui ne repose sur rien de concret. Seule l’expérience ou une analyse très fine de vos usages permet d’estimer la taille que vos snapshots pourraient atteindre. Par exemple, nous avons calculé que la taille d’un snapshot quotidien de la baie RAID qui stocke les emails de l’Université Lyon 2 occuperait moins de 1% du volume occupé par les messages eux-même (par jour d’existence).</p>
<p>Quand l’utilisateur lit le snapshot, le système lui présente une vue cohérente de son système de fichiers à l’instant T. Le système lit les <em>block bitmaps</em> du snapshot, et reconstitue les fichiers. Quand il tombe sur un pointeur <em>not copied</em>, il sait que le bloc n’a pas été modifié depuis la création du snapshot, et qu’il peut retrouver ce bloc sur le système de fichiers d’origine. Quand il tombe sur un pointeur qui désigne une adresse de bloc dans le snapshot il sait que le bloc a été modifié entre temps, et que son contenu à l’instant T est stocké dans le snapshot.<br />
À cause de cette dépendance entre les <em>block bitmaps</em> et les blocs de données, un snapshot doit forcément résider sur le système de fichiers qu’il réplique. Il est donc malheureusement impossible d’avoir un snapshot d’un disque sur un second disque.</p>
<p>Un peu de lecture pour aller plus loin :<br />
ZFS et snapshot </p>
<ul type="circle">
<li><a href="http://en.wikipedia.org/wiki/ZFS">http://en.wikipedia.org/wiki/ZFS</a></li>
<li><a href="http://en.wikipedia.org/wiki/Snapshot_(computer_storage)">http://en.wikipedia.org/wiki/Snapshot_(computer_storage)</a></li>
<li><a href="http://en.wikipedia.org/wiki/Copy-on-write">http://en.wikipedia.org/wiki/Copy-on-write</a></li>
</ul>
<p>UFS et snapshot </p>
<ul type="circle">
<li><a href="http://www.nycbug.org/files/FFS.pdf">http://www.nycbug.org/files/FFS.pdf</a></li>
</ul>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2010/01/04/1288-le-fonctionnement-des-snapshots/' addthis:title='Le fonctionnement des snapshots '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2010/01/04/1288-le-fonctionnement-des-snapshots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spam de blog : les user agents</title>
		<link>http://www.patpro.net/blog/index.php/2009/10/19/1150-spam-de-blog-les-user-agents/</link>
		<comments>http://www.patpro.net/blog/index.php/2009/10/19/1150-spam-de-blog-les-user-agents/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 12:44:38 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Grrr]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=1150</guid>
		<description><![CDATA[Depuis que j'ai codé mon propre antispam pour protéger ce blog des attaques quotidiennes de malfaisants spambots, je collecte précieusement tout ce que ces derniers ont à me dire dans une base de données. Ainsi, j'ai pu découvrir que, mis à part en de rares occasions, les user agents des spambots sont très variés. Le [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2009/10/19/1150-spam-de-blog-les-user-agents/' addthis:title='Spam de blog : les user agents '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p>Depuis que j'ai codé mon propre antispam pour protéger ce blog des attaques quotidiennes de malfaisants spambots, je collecte précieusement tout ce que ces derniers ont à me dire dans une base de données.<br />
Ainsi, j'ai pu découvrir que, mis à part en de rares occasions, les <a href="http://fr.wikipedia.org/wiki/User-Agent">user agents</a> des spambots sont très variés. Le graphique ci-dessous montre pour la période de mai 2008 à octobre 2009 comment sont répartis le nombre de user agents distincts et le nombre de tentative de spam.</p>
<p><img src="/blog/wp-content/uploads/2009/10/ua_spamweb.png" alt="Nombre de user agents différents en fonction du temps" title="Nombre de user agents différents en fonction du temps" width="580" height="400" class="aligncenter size-full wp-image-1151" /></p>
<p>En mai 2008, on note le pic (il dépasse 130 POST/jour) qui correspond à très peu de user agents différents (1 à 2, suivant le jour). Alors que dans le reste de la période la courbe du nombre de POST est très proche de la courbe du nombre d'UA différents.<br />
À noter que, plutôt que de me limiter au seul User Agent, j'ai fait ma petite analyse sur la concaténation des variables <code>HTTP_USER_AGENT</code>, <code>HTTP_ACCEPT</code>, <code>HTTP_ACCEPT_LANGUAGE</code>, et <code>HTTP_ACCEPT_ENCODING</code>. On obtient ainsi une meilleure discrimination entre les différents attaquants.</p>
<p>Voici un exemple abrégé de capture :</p>
<pre>REQUEST_TIME : 2008-12-09 19:51:33
HTTP_HOST : www.patpro.net
REMOTE_ADDR : 88.198.53.43
HTTP_USER_AGENT : Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.6)
                  Gecko/20070725 Firefox/2.0.0.6
HTTP_ACCEPT : text/xml, application/xml, application/xhtml+xml,
              text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_LANGUAGE : ru
HTTP_ACCEPT_ENCODING : deflate</pre>
<p>Si on s'intéresse particulièrement aux variables HTTP_ACCEPT* on voit qu'elles sont utilisées de manières très inégales en fonction du robot :</p>
<p><img src="/blog/wp-content/uploads/2009/10/header_spamweb.png" alt="header_spamweb" title="header_spamweb" width="580" height="400" class="aligncenter size-full wp-image-1155" /></p>
<p>On peut supposer que ces caractéristiques permettent de différencier les différents botnets, et versions des scripts. Les spammers poussent donc le raffinement assez loin, dans le but, bien sûr, de passer au travers des protections antispam. Dans certaines tentatives que j'ai enregistrées, le client fourni même un cookie de session.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2009/10/19/1150-spam-de-blog-les-user-agents/' addthis:title='Spam de blog : les user agents '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2009/10/19/1150-spam-de-blog-les-user-agents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le spam en France</title>
		<link>http://www.patpro.net/blog/index.php/2009/06/30/918-le-spam-en-france/</link>
		<comments>http://www.patpro.net/blog/index.php/2009/06/30/918-le-spam-en-france/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 16:51:41 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Grrr]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=918</guid>
		<description><![CDATA[Le spam en France, c'est un vaste sujet. On pourrait gloser à loisir pendant des jours sur tel ou tel aspect du problème. Alors je vais juste donner un nombre : 96,1%. Ce nombre, c'est le taux de spam de la France pour le mois de juin. C'est à dire que dans notre beau pays, [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2009/06/30/918-le-spam-en-france/' addthis:title='Le spam en France '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="/images/blog/spam/mailicone.jpg" title="icone de Mail" class="alignright" width="143" height="142" />Le spam en France, c'est un vaste sujet. On pourrait gloser à loisir pendant des jours sur tel ou tel aspect du problème. Alors je vais juste donner un nombre :  96,1%. Ce nombre, c'est le taux de spam de la France pour le mois de juin. C'est à dire que dans notre beau pays, plus de 96% du trafic d'email sont du spam. C'est le record mondial (pour le mois de juin). Pour la même période, les États Unis d'Amérique sont à 78,4% et le Japon atteint un très enviable 67,1% de pollution. Et puis, si c'est <a href="http://www.messagelabs.com/mlireport/MLIReport_2009.06_June_FINAL.pdf">MessageLab</a> qui nous le dit, c'est forcément vrai (j'ironise, mais vu les logs de mes serveurs de messagerie, ils sont sûrement dans le vrai).</p>
<p>Je rappelle à toutes fins utiles que, si le cœur vous en dit, vous pouvez <a href="/blog/index.php/2007/07/13/109-plug-in-signal-spam-pour-mail/">télécharger le "plug-in" signal-spam pour Mail</a>, qui permet de déclarer votre spam à l'organisme paresseux nommé Signal Spam (c'est pas bien de se moquer, méchant patpro).</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2009/06/30/918-le-spam-en-france/' addthis:title='Le spam en France '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2009/06/30/918-le-spam-en-france/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jot et seq, créer des séquences en ligne de commande</title>
		<link>http://www.patpro.net/blog/index.php/2008/12/02/644-jot-et-seq-creer-des-sequences-en-ligne-de-commande/</link>
		<comments>http://www.patpro.net/blog/index.php/2008/12/02/644-jot-et-seq-creer-des-sequences-en-ligne-de-commande/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 15:30:47 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=644</guid>
		<description><![CDATA[Quand on écrit des scripts shell, il arrive fréquemment d'avoir besoin de générer des séquences de chiffres ou de lettres (nourrir une boucle, créer des noms de fichiers aléatoires ou non...). Il existe pour cela deux outils, seq et jot. seq est la commande GNU, elle est donc très répandue (Linux). jot est une commande [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2008/12/02/644-jot-et-seq-creer-des-sequences-en-ligne-de-commande/' addthis:title='jot et seq, créer des séquences en ligne de commande '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p>Quand on écrit des scripts shell, il arrive fréquemment d'avoir besoin de générer des séquences de chiffres ou de lettres (nourrir une boucle, créer des noms de fichiers aléatoires ou non...).<br />
Il existe pour cela deux outils, <code>seq</code> et <code>jot</code>. <code>seq</code> est la commande GNU, elle est donc très répandue (Linux). <code>jot</code> est une commande originaire du monde BSD (FreeBSD, Mac OS X, ...). Elle est moins répandue, et surtout moins connue, ce qui est bien dommage. En effet, <code>jot</code> est nettement plus puissante et versatile que <code>seq</code>.</p>
<p>Voyons quelques cas d'utilisation concrets de ces deux commandes, avec pour commencer une boucle <code>for</code> classique. Note&nbsp;: toutes les commandes présentées ici ont été testées dans un shell bash. La syntaxe des différentes boucles peut varier dans d'autres shells.<br />
Imaginons que j'ai besoin d'une boucle qui tourne sur une liste de chiffres de 1 à 10, je peux très simplement faire ceci, et obtenir à chaque fois le même résultat exactement&nbsp;: </p>
<pre># syntaxe basique
for i in 1 2 3 4 5 6 7 8 9 10; do
	# mon travail
	echo $i
done

# syntaxe avancée
for ((a=1; a<=10 ; a++)); do
	# mon travail
	echo $a
done

# autre syntaxe avancée
for a in {1..10}; do
	# mon travail
	echo $a
done

# syntaxe avec seq
for b in $(seq 1 10); do
	# mon travail
	echo $b
done

# syntaxe avec jot
for c in $(jot 10); do
	# mon travail
	echo $c
done</pre>
<p>Pour ces cas simples, l'intérêt des commandes <code>seq</code> et <code>jot</code> n'est pas immédiat, d'autant que si la syntaxe basique est hors jeux pour les listes longues (1 à 1000 par exemple), les syntaxes avancées sauront en général s'en tirer.<br />
Voyons comment faire maintenant si je souhaite faire une liste de 01 à 10 :</p>
<p>La syntaxe basique fonctionne toujours, mais je dois taper à la main 01, 02, ... C'est fastidieux. Les syntaxes avancées ne savent pas faire directement. Je peux par contre invoquer <code>printf</code> pour faire une réécriture de mes valeurs :</p>
<pre>for a in {1..20}; do
	a=$(printf "%02d" $a)
	# mon travail
	echo $a
done</pre>
<p>Pour faire ce type d'itération sans étapes intermédiaires il reste <code>seq</code> et <code>jot</code>.<br />
L'ajout de l'option <code>w</code> à la commande <code>seq</code> permet de forcer le formatage de sorte que tous les nombres affichés aient la même largeur. En cas de besoin, un ou plusieurs 0 sont ajoutés devant le nombre pour compléter&nbsp;:</p>
<pre>seq -w 1 10
# résultat :
01
02
...
09
10</pre>
<p>Pour <code>jot</code>, le <em>padding</em> n'est pas complètement automatique, il faut en régler la largeur via le formatage de type <code>printf</code>. On obtient le même résultat qu'avec seq :</p>
<pre>jot -w '%02d' 10</pre>
<p>C'est plus délicat, mais cela nous permet de mettre le doigt sur une première limitation de <code>seq</code>&nbsp;: ce dernier ne sait pas utiliser d'autres options de <code>printf</code> que <code>%e</code>, <code>%f</code> et <code>%g</code>.<br />
Ainsi, pour produire une liste de 00001 à 00010, je peux utiliser <code>jot</code>, mais pas <code>seq</code>&nbsp;: </p>
<pre>jot -w '%05d' 10
# résultat :
00001
00002
...
00009
00010</pre>
<p>Les deux commandes sont bien sûr capables de gérer une borne inférieure et une borne supérieure, mais leur gestion des incréments est une de leurs différences fondamentales. Vous pouvez indiquer à chacune de travailler de 1 à 1000 mais <code>seq</code> ne sait travailler que par incrément fixe&nbsp;:</p>
<pre># seq sait aller de 1 à *maximum* 1000 par saut de 250 :
seq 1 250 1000
# résultat :
1
251
501
751</pre>
<p>Alors que <code>jot</code> travaille par défaut sur le nombre d'étapes&nbsp;:</p>
<pre># jot sait aller de 1 à 1000 strictement, en 5 étapes :
jot 5 1 1000
# résultat :
1
251
500
750
1000</pre>
<p><code>jot</code> fonctionne en fait en calculant l'incrément optimal. Ce dernier comporte parfois des décimales. Comme le format par défaut pour <code>jot</code> est l'entier, le résultat ci-dessus n'est qu'un arrondi des valeurs réelles de travail de <code>jot</code>. Si on force l'affichage des décimales, on obtient bien une série mathématiquement satisfaisante : </p>
<pre>jot -w '%g' 5 1 1000
# résultat :
1
250.75
500.5
750.25
1000</pre>
<p>Il sait aussi travailler sur un incrément explicite, comme seq&nbsp;:</p>
<pre># et jot donne alors le même résultat que seq :
jot 5 1 1000 250
# résultat :
1
251
501
751</pre>
<p>Nous laissons définitivement <code>seq</code> derrière nous, car il ne sait travailler qu'avec des chiffres, alors que <code>jot</code> peut utiliser tout l'ASCII, générer des listes aléatoires, écrire une chaîne donnée x fois. Et si vous le jumelez avec son ami <code>rs</code>, il sait générer des matrices, des séries de mots de passe...<br />
Voici quelques exemples tirés du man et d'ailleurs&nbsp;:</p>
<pre># les 128 caractères ASCII :
jot -c 128 0

# une ligne de 40 points :
jot -s "" -b . 40

# l'alphabet en majuscule :
jot -c 26 A

# créer 5 noms de fichiers partiellement aléatoires :
jot -r -w '/tmp/fichier-%05d' 5 0 10000

# 10 mots de passe de 12 caractères ASCII aléatoires entre ! et ~ :
jot -r -c 120 33 126 | rs -g0 -w12

# une matrice 10x10, de 100 nombres tirés au hasard entre 1 et 100
jot -r 100 | rs 10 10 </pre>
<p>Un peu d'histoire pour finir. Le nom de la commande <code>jot</code> ne cesse de faire râler les linuxiens qui doivent un jour ou l'autre travailler sur un système BSD. Il est indéniable que <code>seq</code> est un nom qui tombe sous le sens, de sequence à <code>seq</code>, il n'y a qu'un pas. Pour <code>jot</code>, ce n'est pas aussi immédiat.<br />
Le nom de jot signifie en anglais "très petite quantité", et vient du latin iota. <a href="http://dot.ucop.edu/home/jak/">John A. Kunze</a>, qui a développé <code>jot</code>, mais aussi <code>rs</code> et <code>lam</code>, m'a expliqué qu'il a écrit ces trois commandes il y'a très longtemps, en s'inspirant des opérateurs <code>iota</code>, <code>reshape</code>, et <code>laminate</code> du <a href="http://en.wikipedia.org/wiki/APL_(programming_language)">langage APL</a>. Il a alors décidé de donner à ses commandes des noms typiquement "unixiens". Ainsi sont nées <code>jot</code>, <code>rs</code> et <code>lam</code>.</p>
<p>edit 1 : ajout du résultat pour certains exemples, correction d'une typo dans une commande.<br />
edit 2 : correction d'un exemple, suppression de certaines boucles <code>for</code> inutiles, ajout de précision sur les incréments décimaux.<br />
edit 3 : ajout des séquences du type {1..10} gérées par bash.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2008/12/02/644-jot-et-seq-creer-des-sequences-en-ligne-de-commande/' addthis:title='jot et seq, créer des séquences en ligne de commande '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2008/12/02/644-jot-et-seq-creer-des-sequences-en-ligne-de-commande/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Slife et la vie privée, un mois après</title>
		<link>http://www.patpro.net/blog/index.php/2008/11/20/621-slife-et-la-vie-privee-un-mois-apres/</link>
		<comments>http://www.patpro.net/blog/index.php/2008/11/20/621-slife-et-la-vie-privee-un-mois-apres/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 11:20:17 +0000</pubDate>
		<dc:creator>patpro</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Surveillance]]></category>

		<guid isPermaLink="false">http://www.patpro.net/blog/?p=621</guid>
		<description><![CDATA[Il y a un mois, j'écrivais ici à propos de Slife, un outil de time tracking gratuit pour Mac OS X et Windows. Je m'en suis servi tout ce temps sur ma machine personnelle et sur ma machine professionnelle. Il est donc temps de revenir sur ce logiciel. À mon sens, le gros défaut de [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2008/11/20/621-slife-et-la-vie-privee-un-mois-apres/' addthis:title='Slife et la vie privée, un mois après '><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.patpro.net/blog/wp-content/uploads/slife-icone.jpg" alt="icone Slife (c) SlifeLabs" title="icone Slife (c) SlifeLabs" class="alignright" />Il y a un mois, j'écrivais <a href="/blog/index.php/2008/10/19/541-slife-le-time-tracking-pour-tous/">ici</a> à propos de Slife, un outil de time tracking gratuit pour Mac OS X et Windows. Je m'en suis servi tout ce temps sur ma machine personnelle et sur ma machine professionnelle. Il est donc temps de revenir sur ce logiciel.<br />
À mon sens, le gros défaut de Slife (une fois qu'on a accepté ses limites fonctionnelles) c'est l'impossibilité d'accéder aux données enregistrées <em>a postériori</em>. Cela pose un vrai gros problème de respect de la vie privée. En effet, chaque document, chaque page web, chaque email ouvert va donner lieu à un enregistrement dans la base de données de Slife. Ce dernier pourra afficher sans état d'âme des événements comme ceux-ci dans votre tracking journalier et mensuel :</p>
<ul type="circle">
<li>aide mobilité site:SuperJob.fr - Google Search</li>
<li>Grosse Cochonne sans culotte - xXx</li>
</ul>
<p>Inutile de vous faire un dessin. Dans votre navigateur vous êtes libre à tout moment d'effacer votre historique. Dans Slife, vous ne pouvez pas le faire. Si vous avez oublié d'activer le mode "Privé" avant de chercher un nouveau job, ou d'aller mater quelques paires de fesses au nez et à la barbe de votre employeur, vous êtes cuits.<br />
Bien sûr, il y aura toujours un petit malin pour aller éditer la base de données de Slife à la main. Mais ce n'est pas le genre d'acrobatie à la portée du premier venu. Je vais néanmoins donner la marche à suivre. Notez bien : j'ai bien sûr testé cette manipulation, mais je ne peux pas garantir qu'elle est inoffensive sur le long terme. Il n'est pas complètement exclu que cela crée des problèmes de cohérence des données dans Slife.<br />
Comme on s'y serait attendu, Slife stocke ses données dans une base de données SQLite (en tout cas sous Mac OS X). SQLite est un moteur de bases de données SQL, léger et rapide. Contrairement à MySQL ou autre, vous n'avez pas besoin qu'un serveur tourne en permanence pour accéder aux données. C'est aussi ce moteur qui est utilisé par Spotlight.<br />
Il est possible de rentrer dans des bases de données SQLite directement avec les outils fournis dans Mac OS X. Il faut pour cela lancer l'application Terminal, et taper au prompt : </p>
<pre>sqlite3 "Library/Application Support/Slife/db20.slife"</pre>
<p>ce qui retourne :</p>
<pre>SQLite version 3.4.0
Enter ".help" for instructions
sqlite&gt;</pre>
<p>On peut ensuite taper :</p>
<pre>.databases</pre>
<p>ce qui doit donner quelque chose de ce genre, modulo votre nom d'utilisateur :</p>
<pre>seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             /Users/patpro/Library/Application Support/Slife/db20.slife</pre>
<p>Posons maintenant que vous souhaitiez supprimer tous les événements enregistrés dont le titre contient SuperJob.fr, car vous ne voulez pas que votre patron soupçonne que vous préparez votre départ.<br />
La première étape pour ne pas faire de bêtise c'est de quitter Slife car être deux (Slife et vous) en train d'éditer la base de données au même instant pourrait être fâcheux. Après avoir quitté Slife, faites une copie de sauvegarde du fichier db20.slife.<br />
La seconde étape consiste à afficher sans les détruire les événements ciblés. On utilise pour cela l'instruction SQL <code>SELECT</code>. Au prompt <code>sqlite&gt;</code> tapez&nbsp;:</p>
<pre>SELECT * FROM ZITEMRECORDED WHERE ZNAME LIKE "%SuperJob.fr%";</pre>
<p>Après validation, vous allez obtenir un listing de tous les enregistrements qui contiennent "SuperJob.fr" dans le titre :</p>
<pre>10|2478|1|2008|7|10|30|34.0|Safari||aide mobilité site:SuperJob.fr - Google Search
10|2479|2|2008|7|10|30|8.0|Safari||SuperJob.fr, numéro 1 de l’emploi en ligne
10|2480|1|2008|7|10|30|9.0|Safari||Bulletin Officiel de SuperJob.fr n° 2002-2</pre>
<p>Lisez bien tous les titres pour vérifier que vous n'allez pas supprimer des événements qui ne devraient pas l'être.<br />
Si c'est bon, vous pouvez lancer le <code>DELETE</code> :</p>
<pre>DELETE FROM ZITEMRECORDED WHERE ZNAME LIKE "%SuperJob.fr%";</pre>
<p>Vous pouvez, à l'issue de ce <code>DELETE</code>, refaire le <code>SELECT</code> pour vérifier qu'il ne reste rien. Mais il n'y a aucune raison qu'un enregistrement ait échappé au <code>DELETE</code>.</p>
<p>Ensuite, vous quittez SQLite en tapant au prompt <code>.quit</code>, puis vous pouvez relancer Slife et vérifier que les enregistrements incriminants ont disparu.</p>
<p>Pour ceux qui sont désespérément allergiques au terminal, il existe une paire de clients graphiques pour accéder à des bases SQLite. J'ai testé rapidement <a href="http://sourceforge.net/project/showfiles.php?group_id=87946">SQLite Database Browser 1.3</a>, et <em>à première vue</em> il donne satisfaction. Néanmoins il est compilé pour PowerPC uniquement. Je ne saurai garantir son fonctionnement sur plateforme Intel.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.patpro.net/blog/index.php/2008/11/20/621-slife-et-la-vie-privee-un-mois-apres/' addthis:title='Slife et la vie privée, un mois après '><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47f81ddfbdce" class="addthis_button_compact">Share</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.patpro.net/blog/index.php/2008/11/20/621-slife-et-la-vie-privee-un-mois-apres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

