<?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>Linux Attitude&#187; Savoir-faire</title>
	<atom:link href="http://linux-attitude.fr/tag/savoir-faire/feed" rel="self" type="application/rss+xml" />
	<link>http://linux-attitude.fr</link>
	<description>Le libre est un état d&#039;esprit</description>
	<lastBuildDate>Tue, 20 Jul 2010 19:54:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Test de bootloader à distance</title>
		<link>http://linux-attitude.fr/post/test-de-bootloader-a-distance</link>
		<comments>http://linux-attitude.fr/post/test-de-bootloader-a-distance#comments</comments>
		<pubDate>Fri, 18 Jun 2010 08:17:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Savoir-faire]]></category>
		<category><![CDATA[Serveur]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=901</guid>
		<description><![CDATA[Niveau&#160;:     
Résumé&#160;: ssh qemu-system -hda /dev/sda


Supposons que vous administriez une machine distante. Vous n'avez pas d'accès physique à cette machine.
C'est ennuyant puisque vous venez de changer la configuration de votre bootloader.


Comment faire pour rebooter tout en garantissant que ca va marcher&#160;?


Hé bien j'ai la solution qui vous permettra de tester ce [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/e.gif" alt="Empty" /><br />
<strong>Résumé</strong>&nbsp;: ssh qemu-system -hda /dev/sda</p>


<p>Supposons que vous administriez une machine distante. Vous n'avez pas d'accès physique à cette machine.
C'est ennuyant puisque vous venez de changer la configuration de votre bootloader.</p>


<p>Comment faire pour rebooter tout en garantissant que ca va marcher&nbsp;?</p>


<p>Hé bien j'ai la solution qui vous permettra de tester ce boot avant de rebooter&nbsp;: <a href="http://wiki.qemu.org/Main_Page" hreflang="en">qemu</a>.</p>


<h3>Préparer les disques</h3>

<p>Il nous faut des disques en lecture seule pour éviter que le boot de la machine virtuelle n'écrive sur un disque en cours d'utilisation.
Donc pour chacun de vos disques physique&nbsp;:</p>
<pre>
$ cp -a /dev/sda /root/sda
$ chmod 440 /root/sda
</pre>


<p>Ainsi nous avons des disques garantis en lecture seule.</p>


<p><span id="more-901"></span></p>


<h3>Préparer son terminal</h3>

<p>Nous allons enregistrer ce qui se passe sur le terminal, lequel va tourner en ncurses, il est donc important pour la lisibilité des logs de le dimensionner à la même taille que l'écran de boot, c'est-à-dire 80x25.</p>


<p>Modifiez la taille de votre fenêtre de terminal jusqu'à ce que les variables $COLUMNS et $LINES vaillent respectivement 80 et 25.</p>


<h3>Préparer son bootloader</h3>

<p>Quel que soit votre bootloader configurez le de façon à ce qu'il ne lance pas de mode graphique, sinon vous ne pourrez pas stocker les logs de ce qui se passe.</p>


<h3>Choisit son qemu</h3>

<p>Installez qemu. Puis en fonction du matériel à émuler choisissez qemu-system-i386 ou qemu-system-x86_64 ou une autre architecture si vous travaillez sur d'autres machines.</p>


<h3>Lancer le tout</h3>

<p>Préparez un 2e terminal pour tuer qemu , ca sera plus simple que d'attendre qu'il se termine proprement (killall qemu pour les impatients).</p>

<pre>
$ sync
$ ssh -t localhost &quot;qemu-system-x86_64 -m 512 -curses -hda /root/sda&quot; | tee logs
</pre>


<p>Pourquoi sync&nbsp;? au cas où vous auriez fait des modification impactant le boot, on force l'écriture de celles-ci sur le disque.</p>


<p>Pourquoi ssh&nbsp;? Pour profiter de l'option -t qui crée un terminal virtuel même lorsqu'on travaille dans un pipe.</p>


<p>Pourquoi tee&nbsp;? Pour stocker les logs de ce qui se passe tout en gardant la main sur le clavier. Tout est tellement rapide qu'il peut y avoir des erreurs invisibles.</p>


<p>Pourquoi -m 512 (512Mo de ram): prenez une valeur inférieure à votre matériel mais malgré tout proche pour éviter les effets de bord.</p>


<p>Pensez à ajouter les disques dont vous pourriez avoir besoin selon le niveau de boot que vous voudriez tester.</p>


<h3>Lire les logs</h3>

<p>Bon, qemu s'est lancé, le boot a planté, mais vous n'avez pas eu le temps de voit l'erreur.</p>


<p>Commencez par tuer le qemu s'il vous gêne. Puis lisez les logs&nbsp;:</p>
<pre>
$ less -R logs
</pre>


<p>Pourquoi -R&nbsp;? parce que cette option vous permet de ne pas traduire les caractères spéciaux que qemu écrit à travers ncurses et vous permet de voir le contenu des logs tels qu'ils sont apparus à l'écran.</p>


<h3>Mode graphique</h3>

<p>Si vous ne voulez pas de logs ou que vous ne pouvez pas empêcher le mode graphique de se lancer, vous pouvez faire sans. Dans ce cas, à vous de vous connecter à la machine de façon à ce qu'un serveur X soit accessible (par exemple avec ssh -X).</p>


<p>La commande devient alors&nbsp;:</p>
<pre>
$ sync
$ qemu-system-x86_64 -m 512 -hda /root/sda
</pre>


<p><strong>PS</strong>&nbsp;: Et ça marche avec les outils de virtualisation comme xen.</p>
	Tags:<a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/savoir-faire" title="Savoir-faire" rel="tag">Savoir-faire</a>, <a href="http://linux-attitude.fr/tag/serveur" title="Serveur" rel="tag">Serveur</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/test-de-bootloader-a-distance/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Raid 10 ou raid 0+1 ?</title>
		<link>http://linux-attitude.fr/post/raid-10-ou-raid-01</link>
		<comments>http://linux-attitude.fr/post/raid-10-ou-raid-01#comments</comments>
		<pubDate>Thu, 20 May 2010 16:31:50 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Disque]]></category>
		<category><![CDATA[Matériel]]></category>
		<category><![CDATA[Savoir-faire]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=886</guid>
		<description><![CDATA[Niveau&#160;:     
Résumé&#160;: Raid 10, raid 0+1, raid 5, raid 6


Lorsqu'on parle de redondance, de haute disponibilité et de disque, on parle de Raid. J'en ai déjà parlé


Voici un petit aperçu des différents types de RAID, le but est ici de trouver les qualités de chacun. Un tableau final récapitule les avantage [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /><br />
<strong>Résumé</strong>&nbsp;: Raid 10, raid 0+1, raid 5, raid 6</p>


<p>Lorsqu'on parle de redondance, de haute disponibilité et de disque, on parle de Raid. J'en ai <a href="/post/que-faire-et-ne-pas-faire-en-raid">déjà parlé</a></p>


<p>Voici un petit aperçu des différents types de RAID, le but est ici de trouver les qualités de chacun. Un tableau final récapitule les avantage et les inconvénients qu'il y a à choisir un type de raid donné.</p>


<h3>Jbod</h3>

<p>Just a bunch of disk, ce n'est pas un raid, le choix de ceux qui veulent pouvoir ajouter des disques bout à bout sans gain de performance.</p>


<p>Contrairement au raid 0 il a un avantage, la perte d'un disque n'empêche pas la récupération des données sur les disques restants par un outil de récupération tel que photorec. En effet, comme les disques sont simplement mis bouts à bout, la plupart des fichiers tiennent intégralement sur un seul des disques. Il est donc possible d'en récupérer le contenu après un crash.</p>


<p>Le jbod se fait avec du LVM sans striping ou avec le driver linear de md.</p>


<h3>Raid 0</h3>

<p>Le choix de ceux qui veulent des performances.</p>


<p>Chaque disque est découpé en bande (stripe) et les bandes sont entrelacées pour donner le disque final. Ce qui donne un gain de performance appréciable puisque les disque peuvent être lus simultanément, même pendant la lecture d'un gros fichier. Et ils peuvent être écrits simultanément pendant les écritures.</p>


<p>Le raid 0 peut être matériel, logiciel avec le driver md de linux ou logiciel avec LVM (avec striping)</p>


<p><span id="more-886"></span></p>


<h3>Raid 1</h3>

<p>Le choix de ceux qui ne veulent pas de pertes.</p>


<p>Tous les disques sont des copies intégrales. L'avantage le plus important est que lors de la perte d'un disque tout fonctionne comme si de rien n'était. On peut donc remplacer ce disque (ou pas :-).</p>


<p>Un autre avantage existe lors des lectures non séquentielles (lors de la lecture de 2 fichiers par exemple), dans ce cas il est possible d'utiliser un disque pour chaque lecture et donc d'accélérer ce type de lecture. Par contre la lecture d'un seul gros fichier n'est pas accélérée (sous linux).</p>


<p>Il n'y a en revanche aucun impact sur l'écriture, c'est le disque le plus lent qui détermine la vitesse d'écriture (la vitesse devrait être à peu près identique pour chacun).</p>


<p>Notez qu'on peut faire du raid 1 avec plus de 2 disques.</p>


<p>Le Raid 1 peut être matériel, logiciel avec le driver md ou logicielle avec LVM (support du miroring), enfin il est possible de faire du raid1 réseau avec drbd.</p>


<h3>Raid 5</h3>

<p>Le choix des économes.</p>


<p>En raid 5 chaque disque est découpé en bande, pour chaque groupe de bandes situées au même endroit des disques, une des bandes est choisie pour contenir des octets de redondance (la différence avec le 4 c'est le choix de la bande). Ainsi ce type de raid peut survivre au crash d'un des disques (la redondance permet de reconstruire la bande manquante), mais pas de plusieurs.</p>


<p>L'avantage du raid 5 est que lorsqu'on a de nombreux disques on économise des disques de redondance en n'en achetant qu'un pour la redondance et les autres pour les données.</p>


<p>Mais le raid 5 est assez limité en performances. La lecture se passe comme pour le raid 1. Par contre l'écriture nécessite la lecture de chacune des bandes d'un groupe pour écrire la bande de données, puis calculer et écrire la bande de redondance. C'est donc très lent, à éviter pour les bases de données actives.</p>


<p>D'autre part, lors du crash d'un disque, toutes bandes des disques doivent être lues pour reconstituer une bande manquante. Ce qui implique des baisses de performances énormes, auxquelles il faut ajouter la baisse de performances due à la reconstruction du disque qu'on va remettre. Comme les disque tournent à fond, il n'est pas rare de voir un autre disque exploser en vol à ce moment là -&gt; fin des données.</p>


<p>Le raid 5 peut être matériel ou logiciel avec le driver md de linux.</p>


<h3>Raid 6</h3>

<p>Le choix des très gros disques.</p>


<p>Le raid 6 fonctionne de la même façon que le raid 5 mais ajoute un deuxième disque de redondance. Ce ne sont pas simplement les données de redondance qui sont dupliquée, mais le calcul qui est différent, toutefois le concept est identique.</p>


<p>Le raid 6 soufre des mêmes inconvénients que le raid 5, il utilise même un disque de plus donc est un peu plus cher, de plus cela provoque une écriture supplémentaire pour chaque groupe de bandes.</p>


<p>Mais le raid 6 résiste au crash de 2 disques, ce qui est intéressant lorsque les disques sont assez gros et que la reconstruction du raid comment à être assez longue (et donc le risque de perte plus gros).</p>


<p>Le raid 6 peut être matériel ou logiciel avec le driver md de linux.</p>


<h3>Raid 10</h3>

<p>Le choix des riches.</p>


<p>Le raid 10 consiste à accumuler plusieurs raid 1 avec du raid 0 pour en augmenter la taille et les performances.</p>


<p>Le raid 10 offre les avantages simultanés du raid 1 et du raid 0. La perte d'un disque n'empêche pas le raid de tourner et l'utilisation de plusieurs disques en striping permet d'augmenter les performances de lectures.</p>


<p>Le seul inconvénient, c'est qu'il coûte deux fois le prix du raid 0.</p>


<p>Il peut se faire en matériel ou logiciel, md ou lvm.</p>


<h3>Raid 0+1</h3>

<p>Le mauvais choix.</p>


<p>Le raid 0+1 consiste à mettre 2 raid 0 en parallèle pour les redonder avec du raid 1. On pourrait croire que c'est la même chose que du raid 10, mais non. Et même si certains veulent vous faire croire que les performances sont meilleures, il n'en est rien.</p>


<p>Mais surtout imaginez un instant la perte d'un disque. Dans ce cas un des raid 0 sous-jacent est perdu. Il faut donc le recréer avec un nouveau disque (ce qui est à peu près instantané puisqu'on le laisse vide), puis reconstruire le raid 1 situé au dessus. Et cette deuxième partie va être longue puisqu'elle doit être faite sur la taille totale du raid 0, contrairement au raid 10 qui ne l'aurait fait que sur la taille totale du disque perdu.</p>


<h3>Petit récapitulatif</h3>

<table>
<tr>
<th>RAID</th>
<th>jbod</th>
<th>0</th>
<th>1</th>
<th>4</th>
</tr>
<tr>
<th>Quand le choisir</th>
<td>Pas d'argent, pertes partielles acceptables</td>
<td>Besoin de performances mais pertes totales acceptées</td>
<td>Pour éviter les pertes</td>
<td>Jamais</td>
</tr>
<tr>
<th>Inconvénients</th>
<td><ul><li>Pas de redondance</li><li>Pas de gain de performances</li></ul></td>
<td><ul><li>Pas de redondance</li></ul></td>
<td><ul><li>Peu de gains de performances</li><li>La taille ne peut dépasser celle du plus petit disque</li></ul></td>
<td><ul><li>Moins bon que raid 5 dans tous les domaines</li></ul></td>
</tr>
<tr>
<th>Avantages</th>
<td><ul><li>Possibilité de récupérer une parties de données après crash</li><li>Possibilité d'étendre un disque</li></ul></td>
<td><ul><li>Performances en lecture accrues</li></ul></td>
<td><ul><li>Résistance à la perte de N-1 disque</li><li>Légère amélioration des performances en lecture.</li></ul></td>
<td><ul><li>Ceux du raid 5</li></ul></td>
</tr>
</table>


<table>
<tr>
<th>RAID</th>
<th>5</th>
<th>6</th>
<th>10</th>
<th>0+1</th>
</tr>
<tr>
<th>Quand le choisir</th>
<td>Pour le prix</td>
<td>Pour les gros raid</td>
<td>Pour la sécurité et les performances</td>
<td>Jamais</td>
</tr>
<tr>
<th>Inconvénients</th>
<td><ul><li>Performances faibles en écriture</li><li>Performances en lecture faibles après un crash</li></ul></td>
<td><ul><li>Performances faibles en écriture</li><li>Performances en lecture faibles après un crash</li></ul></td>
<td><ul><li>Cher</li></ul></td>
<td><ul><li>Cher</li><li>reconstruction très longue</li></ul></td>
</tr>
<tr>
<th>Avantages</th>
<td><ul><li>Résistance à la perte d'un disque</li><li>Coût moindre par rapport aux autres raid</li></ul></td>
<td><ul><li>Résistance à la perte de 2 disques</li><li>Coût moindre par rapport aux autres raid sauf le 5</li></ul></td>
<td><ul><li>Résistance à la perte d'un certain nombre de disque</li><li>Performances en lecture accrues</li></ul></td>
<td><ul><li>Ceux du raid 10</li></ul></td>
</tr>
</table>

	Tags:<a href="http://linux-attitude.fr/tag/disque" title="Disque" rel="tag">Disque</a>, <a href="http://linux-attitude.fr/tag/materiel" title="Matériel" rel="tag">Matériel</a>, <a href="http://linux-attitude.fr/tag/savoir-faire" title="Savoir-faire" rel="tag">Savoir-faire</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/raid-10-ou-raid-01/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sécurité du processus de boot</title>
		<link>http://linux-attitude.fr/post/securite-du-processus-de-boot</link>
		<comments>http://linux-attitude.fr/post/securite-du-processus-de-boot#comments</comments>
		<pubDate>Wed, 14 Apr 2010 16:57:46 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Matériel]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Savoir-faire]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Théorie]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=703</guid>
		<description><![CDATA[Niveau&#160;:     
Résumé&#160;:


Maintenant que nous connaissons le processus de boot, si on examinait ce processus d'un point de vue de la sécurité&#160;!


Lorsqu'on parle de sécurité, il faut d'abord savoir dans quel cas on se positionne et de quoi on cherche à se prémunir. Ici, je considère que le système lui-même est sécurisé. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /><br />
<strong>Résumé</strong>&nbsp;:</p>


<p>Maintenant que nous connaissons le <a href="/post/processus-de-boot">processus de boot</a>, si on examinait ce processus d'un point de vue de la sécurité&nbsp;!</p>


<p>Lorsqu'on parle de sécurité, il faut d'abord savoir dans quel cas on se positionne et de quoi on cherche à se prémunir. Ici, je considère que le système lui-même est sécurisé. Je suppose que l'attaquant est devant la machine et cherche un accès root.</p>


<p>On considère que chaque élément est sécurisé pour ce qui est de ses propres fonctionnalités, ce qui veut dire que si le bootloader est protégé par mot de passe, il n'y a pas de faille dans le bootloader lui-même permettant d'outrepasser ce mot de passe. Nous nous attacherons donc à chercher ce qui peut être détourné dans le flux d'exécution en entrée et en sortie de chaque élément.</p>


<p>Je vais commencer par la fin, du plus facile au plus difficile.</p>


<h3>rc</h3>

<p>Rc est lancé par init et ne prend ses paramètres que de init. Ceux-ci sont fixés en dur dans <a href="/post/configuration-de-init">/etc/inittab</a>. Son démarrage ne peut donc être détourné que d'une façon&nbsp;: par modification du contenu du disque. <em>GoTo partition /</em></p>


<p>Parmi ces paramètres il y a le paramètre 1 qui lance rc dans le runlevel 1, ce qui dans la plupart des cas se termine par un sulogin. Ouf on est protégé par le mot de passe root.</p>


<p>Mais vérifiez bien, dans certains cas il se termine par un simple shell et donc réussir à passer un tel paramètre permettrait à l'attaquant un accès root à votre machine.</p>


<p>Pour passer 1 en paramètre <em>GoTo init</em></p>


<p><span id="more-703"></span></p>


<h3>init</h3>

<p>Init est lancé par le noyau après lecture de la racine. Il lit sa configuration dans /etc/inittab. Il peut donc être détourné par modification du disque&nbsp;: <em>GoTo partition /</em></p>


<p>Parmi les paramètres qu'on peut lui passer il y a 1 et S, 1 renvoie au problème ci-dessus et S lance lui-même sulogin, donc même vérification. Ces paramètres viennent du noyau&nbsp;: <em>GoTo noyau</em></p>


<p>Init est un binaire choisi par le noyau, or il est possible de dire au noyau de changer d'init à travers le bon paramètre. Par exemple, je peux ajouter init=/bin/sh aux paramètres du noyau pour qu'init ne soit jamais lancé qu'un shell apparaisse à sa place. Ça y est je suis root&nbsp;! C'est d'ailleurs la technique pour changer de mot de passe root lorsque vous l'avez perdu.</p>


<p>Pour changer d'init <em>GoTo noyau</em>.</p>


<p>Init peut aussi être lancé par initrd, il souffre dans ce cas exactement des mêmes problèmes que lorsqu'il est lancé par le noyau&nbsp;: <em>GoTo initrd</em>.</p>


<p><strong>Note upstart, initrdng...</strong>&nbsp;: <br />
Il se peut (et ca va être de plus en plus courant) qu'init ou rc soit remplacé par autre chose, type upstart. Dans ce cas seul les noms des paramètres et le format des fichiers change. Mais les impacts sont exactement les mêmes.</p>


<h3>Initrd</h3>

<p>Initrd prend ses paramètres de la ligne de commande du noyau, mais généralement (il y a plein d'initrd différents) ils sont passés tels quels à init.</p>


<p>D'autre part initrd peut être chargé par 2 moyens, j'ai décrit le bootloader comme un moyen mais le noyau peut aussi charger lui-même l'initrd si on lui demande (avec le paramètre initrd=). On peut donc détourner son chargement par plusieurs moyens&nbsp;: <em>GoTo noyau</em>, <em>GoTo bootloader</em>.</p>


<p>Il est aussi possible de modifier directement l'initrd, par exemple lors d'une <a href="/post/Reinstallation-distante">réinstallation distante</a>. Celui-ci contenant tout ce qu'on veut, modifier son contenu permet de lancer n'importe que processus ... <em>GoTo partition /boot</em></p>


<h3>Noyau</h3>

<p>Le noyau en lui-même ne vous rend pas root mais rien ne vous empêche d'y faire une modification pour qu'il vous fasse <a href="http://en.wikipedia.org/wiki/Rootkit" hreflang="en">root</a> une fois le système chargé.</p>


<p>Le noyau est chargé depuis la partition /boot donc une modification de cette partition et c'est gagné&nbsp;: <em>GoTo partition /boot</em></p>


<p>Le noyau prend ses paramètres du bootloader, parmi ceux-ci de nombreux paramètres permettent de détourner le système&nbsp;: root= init= initrd= et surement bien d'autres. <em>GoTo bootloader</em></p>



<h3>Partition /</h3>

<p>Jusque là, nous n'avons évoqué que les risques mais pas encore de faille. C'est parce qu'aucune interférence de l'utilisateur n'a été possible, tout est automatisé. Mais ça va changer.</p>


<p>Lors du montage de la racine, il y a une interférence possible&nbsp;: le disque contenant / peut avoir été modifié, voire remplacé, pour modifier /etc/inittab, /sbin/init, /etc/init.d/rc ou toute autre chose.</p>


<p>Pour éviter ce problème, il y a deux possibilités&nbsp;:</p>
<ul>
<li>mettre un cadenas sur la machine pour garantir l'intégrité physique du disque</li>
<li>chiffrer le disque</li>
</ul>

<p>Dans le premier cas, le problème est remonté aux autres couches pour garantir l'intégrité logique et éviter qu'on réussisse à booter sur un autre OS pour modifier le disque. <em>GoTo bootloader</em>.</p>


<p>Dans le deuxième cas, le chiffrement (par exemple avec <a href="/post/faire-du-chiffre">luks</a> ou <a href="http://www.truecrypt.org/" hreflang="en">truecrypt</a>) doit être assuré par une clé.</p>
<ul>
<li>si cette clé est sur la machine et son mot de passe aussi&nbsp;: elle est dans un élément de boot (initrd, partition de boot ...) on reporte le problème <em>GoTo partition /boot</em></li>
<li>si cette clé ou son mot de passe n'est pas sur la machine (carte à puce, mot de passe, clé usb ...) alors il y a besoin d'un personne présente à chaque boot ...</li>
<li>le chiffrement peut aussi être assuré <a href="http://www.thinkwiki.org/wiki/Full_Disk_Encryption_%28FDE%29" hreflang="en">par une puce</a> (TPM) qui ne quitte pas la machine, auquel cas, on garanti que le disque ne quittera pas la machine pour être lu ou modifié (mais pas de garantie contre le formatage), par contre il peut être lu sur place par un autre OS.</li>
</ul>

<p>Dans tous les cas, seul le démarrage post-noyau est préservé, pour le reste <em>GoTo bootloader</em>.</p>



<h3>bootloader</h3>

<p>Le bootloader est la source de tous les maux. C'est en effet par lui que l'utilisateur a tout loisir de modifier des paramètres de démarrage.</p>


<p>Le bootloader passe ses paramètres au noyau qui les passe à l'initrd qui les passe à init. Ces paramètres viennent de la configuration du bootloader mais pour un certain nombre de bootloader ils peuvent être directement demandés à l'utilisateur. Dans ce cas il y a moyen d'interdire cette modification à travers un mot de passe. Par exemple <a href="http://www.gnu.org/software/grub/manual/html_node/Security.html" hreflang="en">grub</a>.</p>


<p>Le bootloader charge sa configuration puis choisit et charge le noyau et l'initrd, tout ceci depuis la partition de boot. Dans tous les cas il doit lire une version non chiffrée, ce qui interdit le chiffrement de cette partition.</p>


<p>Pire, le bootloader est incapable de savoir que le disque n'a pas changé. Donc un simple ajout de disque permet de le faire booter sur un noyau/initrd différent.</p>


<p>Vous ne pouvez presque rien y faire: <em>GoTo partition /boot</em>.</p>


<p>Bon en supposant qu'il n'y a pas de problème, le bootloader est chargé par le bios, il peut donc être détourné&nbsp;: <em>GoTo Bios</em>.</p>


<h3>Partition /boot</h3>

<p>J'inclue dans la définition de la partition de boot tout ce qui contient la configuration du bootloader, le bootloader lui-même, le noyau et l'initrd, même si ils peuvent être physiquement à des endroits différents.
Protéger la partition de boot est très complexe, car tout doit être accessible en clair depuis des outils ayant des fonctionnalités très restreintes.</p>


<p>Les possibilités sont&nbsp;:</p>
<ul>
<li>sceau physique sur la machine</li>
<li>TPM</li>
</ul>

<p>Mettre un gros cadenas sur la machine permet d'éviter une lecture ou une modification de /boot. Mais il on ne se prémunit pas d'une personne un peu patiente avec un accès complet à la machine.</p>


<p>La dernière solution, complexe à mettre en place et sans garantie absolue est d'utiliser une puce TPM qui va vérifier (<a href="http://domino.research.ibm.com/comm/research_people.nsf/pages/sailer.ima.html" hreflang="en">mesurer</a>) le <a href="http://ko.sourceforge.jp/projects/openpts/wiki/GRUB-IMA" hreflang="en">bootloader</a> à chaque étape de son chargement, puis vérifier chaque élément que le bootloader charge avant de lancer le noyau.</p>


<h3>Bios</h3>

<p>Le bios s'exécute tout seul depuis lui-même, il se charge puis lis ses paramètres. Parmi ces paramètres il y a la séquence de boot, qui peut elle-même être modifiée par l'utilisateur.</p>


<p>Il est donc possible, voire facile de dire au bios de booter sur une clé USB et de prendre le contrôle du disque et donc de la machine. Pour éviter ce cas de figure il est possible de mettre un mot de passe au bios. Ainsi on est sûr de booter sur le bon disque, mais seulement s'il y a un cadenas sur la machine puisque le bios ne vérifie pas que le disque n'a pas été remplacé.</p>


<p><em>GoTo Matériel</em>.</p>


<h3>Matériel</h3>

<p>Il est possible de changer le bios lui-même. Et ce de plusieurs façons. Si c'est un flash, il est possible de le remplacer logiciellement, si c'est une rom il est possible de la remplacer matériellement.</p>


<p>Et enfin le plus simple pour remplacer le bios est de remplacer la carte mère. Hop ni vu ni connu ...</p>


<p>Pour se protéger de cela&nbsp;? Le cadenas ... ou la puce TPM, dont la mise en place est toujours très complexe et non garantie.</p>



<h2>Conclusion</h2>

<p>Résumons-nous car cet article commence à être un peu long.
Différencions les cas dont on veut se protéger.</p>


<h3>Accès réseau</h3>

<p>Si l'attaquant n'a accès à la machine que par le réseau, on est tranquille pour ce qui est de la séquence de boot&nbsp;: No problemo.</p>


<h3>Accès KVM</h3>

<p>Si l'attaquant n'a accès à la machine que par <a href="http://fr.wikipedia.org/wiki/Commutateur_%C3%A9cran-clavier-souris" hreflang="fr">KVM</a> (pas de possibilité de toucher aux périphériques). Mettre un mot de passe sur le bootloader, le bios et vérifier que le mode rescue demande le mot de passe root devrait suffire. En effet les seul moyen d'attaque sont les paramètres de lancement du système.</p>


<p>N'oubliez pas que le simple accès KVM permet des choses comme le reboot via les <a href="/post/Les-mains-dans-la-noyau">magic keys</a></p>


<h3>Accès cadenassé</h3>

<p>Si on suppose que l'attaquant peut apporter un CD ou une clé usb sur le système, paramétrer le bios pour booter sur un disque et y mettre un mot de passe est un moyen simple à mettre en place pour éviter le boot sur un autre système.</p>


<p>Mais attention, il ne faut pas que l'utilisateur puisse ouvrir la machine, il pourrait réinitialiser le bios.</p>


<h3>Accès au disque sans droit de boot</h3>

<p>A partir du moment où l'attaquant a accès au disque c'est presque foutu. Si l'attaquant n'est pas une personne autorisée à booter la machine, il est possible de chiffrer le disque avec une clé qui ne se trouve pas sur le disque. Il faudra alors la rentrer à chaque démarrage. L'attaquant ne disposant pas de cette clé, il me pourra ni lire ni modifier les données où le système. Mais c'est déjà une solution assez contraignante.</p>


<p>D'autant plus que pour être complète cette solution doit garantir le noyau et l'éventuel initrd sur lequel on boote et donc vérifier soi même à chaque boot qu'on utilise une partition de boot non modifiée.</p>


<p>On en arrive au dernier cas ...</p>


<h3>Accès complet</h3>

<p>Lorsque l'attaquant a un accès complet à la machine, il n'existe qu'un moyen de se protéger (et encore)&nbsp;: la puce TPM.</p>


<p>Elle permet de&nbsp;:</p>
<ul>
<li>protéger le bios d'un changement</li>
<li>protéger le bootloader d'un changement</li>
<li>protéger le noyau d'un changement</li>
<li>protéger le contenu du disque d'un changement</li>
</ul>

<p>Mais tout cela est compliqué et nécessiterait un autre article que je ne suis pas encore prêt à faire, je n'ai même pas de puce TPM chez moi.</p>


<p><strong>PS :</strong> Notez une dernière chose que je n'ai pas abordé, le chiffrement des données. Le chiffrement du disque contenant les données (/home et /srv selon vos besoins) devient obligatoire dès qu'on prévoit qu'il y aura un accès physique. Il doit de préférence se faire avec un moyen propre à l'utilisateur (mot de passe / clé / carte à puce ...) pour éviter les attaques à travers le boot de l'OS.</p>


<p><strong>PPS :</strong> Considérez qu'a partir du moment où quelqu'un a un accès physique à votre machine c'est mort.</p>


<p><strong>PPPS :</strong> Sauf si votre machine est une carte à puce.</p>


<p><strong>PPPPS :</strong> Et encore ...</p>


<p>Bon courage&nbsp;!</p>
	Tags:<a href="http://linux-attitude.fr/tag/materiel" title="Matériel" rel="tag">Matériel</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/savoir-faire" title="Savoir-faire" rel="tag">Savoir-faire</a>, <a href="http://linux-attitude.fr/tag/securite" title="Sécurité" rel="tag">Sécurité</a>, <a href="http://linux-attitude.fr/tag/theorie" title="Théorie" rel="tag">Théorie</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/securite-du-processus-de-boot/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Git pour tous</title>
		<link>http://linux-attitude.fr/post/git-pour-tous</link>
		<comments>http://linux-attitude.fr/post/git-pour-tous#comments</comments>
		<pubDate>Fri, 10 Apr 2009 08:52:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Savoir-faire]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/git-pour-tous</guid>
		<description><![CDATA[Niveau&#160;:     
Résumé&#160;: cd &#38;&#38; git init&#160;; cd /etc &#38;&#38; git init


Maintenant que vous avez étudié git, voyons à quoi il peut servir.


Configuration


Git  peut, entre autre, fonctionner en local, comme RCS. Git est plus intéressant que d'autres outils comme svn pour plusieurs raison&#160;:

Il stocke tout en local à la racine du [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /><br />
<strong>Résumé</strong>&nbsp;: cd &amp;&amp; git init&nbsp;; cd /etc &amp;&amp; git init</p>


<p>Maintenant que vous avez <a href="/post/Git-%C3%A0-tous-les-%C3%A9tages">étudié git</a>, voyons à quoi il peut servir.</p>


<h3>Configuration</h3>


<p>Git  peut, entre autre, fonctionner en local, comme RCS. Git est plus intéressant que d'autres outils comme svn pour plusieurs raison&nbsp;:</p>
<ul>
<li>Il stocke tout en local à la racine du répertoire de travail</li>
<li>Il n'éparpille pas de fichiers un peu partout</li>
<li>Il prend 2 à 3 fois moins de place que svn pour des petits fichiers comme les fichiers de configuration</li>
<li>Il est un ordre de grandeur plus rapide que svn (ce qui importe peu pour /etc)</li>
</ul>
<p>Notez que mercurial répond aussi à ces besoins.</p>


<p>Git est donc parfaitement adapté à votre configuration qui se trouve dans /etc&nbsp;:</p>
<pre>
# En root
$ cd /etc
$ git init
</pre>


<p>J'ai commencé par faire un "git add *" mais en pratique ce n'est pas une très bonne idée car on récupère tout et n'importe quoi et à moins de ne pas avoir de backup, ce n'est pas très utile. En effet cela entre en conflit avec les gestionnaires de paquet et gestionnaire s de configuration et c'est assez gênant lors des migrations.
Une bonne utilisation est plutôt de faire un "git add" uniquement pour les logiciels dont on modifie la configuration. Ainsi, vous avez dans votre dépôt toutes vos modifications et uniquement vos modifications. Cela nécessite de s'imposer de faire les "git add" mais c'est plus simple.</p>


<p>D'autre part, rien ne vous empêche d'avoir un cron de commit automatique pour rattraper les cas où vous oubliez de le faire.</p>
<pre>
# Autocommit une fois par semaine, s'il n'y a rien à commiter, il ne fera rien
0 0 * * 1 cd /etc &amp;&amp; git commit -a -m &quot;Autocommit by cron&quot;
</pre>


<p>Le jour où vous avez un problème de configuration&nbsp;:</p>
<pre>
# On cherche ce qui a changé depuis le dernier commit (fonctionnel ?)
$ git diff
# On cherche quand ça a changé avant
$ git log
# On cherche ce qui a changé avant
$ git diff ee9eac2a4deb43e7c73b50444fcb7269f172fb69
</pre>


<p><span id="more-312"></span></p>


<h3>Ma configuration</h3>


<p>Mieux, j'utilise maintenant git pour mon home&nbsp;:</p>
<pre>
$ cd 
$ git init
</pre>


<p>Pour le coup, on ne met vraiment que ce qu'on modifie, au coup par coup. Pour savoir quoi y mettre, commencez par lister tout ce qui commence par un point&nbsp;:</p>
<pre>
$ ls -ad .*
</pre>


<p>A vous de savoir ce que vous voulez y mettre sachant que ça sera transféré sur toutes vos machines. Exemples&nbsp;:</p>
<ul>
<li>.bashrc et les .bash_*</li>
<li>.irssi</li>
<li>.vimrc</li>
<li>.ssh</li>
<li>.gnupg</li>
</ul>

<p>Et du coup, il devient facile de se "téléporter". Dès que j'obtiens un compte sur une nouvelle machine, j'y emporte toute ma configuration. C'est assez simple (avec toutes les options)&nbsp;:</p>
<pre>
# Avec un git récent et une connexion bidirectionnelle
$ ssh peck@machine2.net
$ git clone ssh://peck@machine1.net/~peck/.git .

# Si la communication retour ne fonctionne pas directement
$ ssh -R 1022:localhost:22 peck@machine2.net
$ git clone ssh://peck@machine1.net:1022/~peck/.git .

# Si git se plaint de ne pouvoir créer le répertoire de destination
$ ssh peck@machine2.net
$ git clone ssh://peck@machine1.net/~peck/.git temporary
$ mv temporary/* .
$ rmdir temporary
</pre>


<p>De par le côté décentralisé de git, vous pouvez faire les modification où bon vous semble et les propager au fur et à mesure de votre usage. Voyons cela&nbsp;!</p>


<h5>Ne pas oublier de de commiter</h5>


<p>Pour les gérer les oublis, Vous avez le choix entre un autocommit régulier (voir plus haut) et un warning automatique à chaque connexion</p>
<pre>
# dans mon .bashrc
$ git status | grep modified
</pre>


<h5>Vérifier les mises à jour à chaque connexion</h5>


<p>A chaque nouvelle connexion faites un git pull, cela vous mettra à jour les données en provenance de la machine parente. Vous avez ainsi une synchronisation quasi automatique de vos répertoires personnels entre vos comptes.</p>
<pre>
# je le mets dans mon .bashrc mais c'est assez lourd si vous n'avez pas de clé ssh
$ git pull
</pre>


<h5>Pousser une mise à jour vers le parent</h5>


<p>Lorsque vous faites une modification sur un machine qui n'est pas la source (celle pour laquelle vous n'avez pas fait de git clone), il est appréciable de faire un git push pour propager les choses dans l'autre sens. Un inconvénient toutefois, c'est un lourd difficile à faire. Le plus simple est de récupérer les données depuis la source, mais ce n'est pas toujours facile à faire, cela peut nécessiter plusieurs tunnels.</p>
<pre>
# Sur la machine du changement 
$ git commit -a
# Sur la source
$ git pull ssh://peck@machine1.net/home/peck/.git
</pre>
	Tags:<a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/savoir-faire" title="Savoir-faire" rel="tag">Savoir-faire</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/git-pour-tous/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Brutus Processus</title>
		<link>http://linux-attitude.fr/post/brutus-processus</link>
		<comments>http://linux-attitude.fr/post/brutus-processus#comments</comments>
		<pubDate>Sat, 04 Apr 2009 00:32:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Commande]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Savoir-faire]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/brutus-processus</guid>
		<description><![CDATA[Niveau&#160;:     
Résumé&#160;: ps&#160;; top&#160;; htop&#160;; atop&#160;;


Suite à un article sur les processus, j'ai trouvé une excellente série d'article vous permettant de découvrir le fonctionnement interne du noyau sur les processus et la mémoire&#160;:

memory-translation-and-segmentation
getting-physical-with-memory
anatomy-of-a-program-in-memory
how-the-kernel-manages-your-memory
page-cache-the-affair-between-memory-and-files


Maintenant, essayons de résumer la gestion des processus d'un point de vue utilisateur et développeur.


Naissance, vie et mort d'un [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /><br />
<strong>Résumé</strong>&nbsp;: ps&nbsp;; top&nbsp;; htop&nbsp;; atop&nbsp;;</p>


<p>Suite à un article sur <a href="/post/Processus-et-threads">les processus</a>, j'ai trouvé une excellente série d'article vous permettant de découvrir le fonctionnement interne du noyau sur les processus et la mémoire&nbsp;:</p>
<ul>
<li><a href="http://duartes.org/gustavo/blog/post/memory-translation-and-segmentation" hreflang="en">memory-translation-and-segmentation</a></li>
<li><a href="http://duartes.org/gustavo/blog/post/getting-physical-with-memory" hreflang="en">getting-physical-with-memory</a></li>
<li><a href="http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory" hreflang="en">anatomy-of-a-program-in-memory</a></li>
<li><a href="http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory" hreflang="en">how-the-kernel-manages-your-memory</a></li>
<li><a href="http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files" hreflang="en">page-cache-the-affair-between-memory-and-files</a></li>
</ul>

<p>Maintenant, essayons de résumer la gestion des processus d'un point de vue utilisateur et développeur.</p>


<h3>Naissance, vie et mort d'un processus</h3>


<p>Un processus est créé lorsque l'appel système fork est appelé et seulement dans ce cas. Les autres méthodes possibles se basent toutes sur fork (et clone, mais il ne faut pas le dire). Fork ne fait qu'une chose (et il le fait bien), il duplique un processus existant, entièrement, à l'identique, y compris ses droits.</p>


<p>Ensuite, durant sa vie un processus peut être modifié de nombreuses façons&nbsp;:</p>
<ul>
<li>Changement d'utilisateur</li>
<li>Changement de code</li>
<li>Changement de père</li>
<li>Changement de priorité</li>
<li>etc.</li>
</ul>

<p>Enfin un processus meurt dans 2 cas&nbsp;:</p>
<ul>
<li>Il se termine tout seul comme un grand (appel système exit)</li>
<li>Il reçoit un signal qui lui est fatal</li>
</ul>

<h3>Informations sur un processus</h3>


<h5>Informations générales</h5>


<p>Pour récupérer des informations sur un processus vous disposez de plusieurs commandes. Ces commandes ou toutes pour source <strong>/proc/&lt;pid&gt;</strong> qui est un répertoire virtuel peuplé directement par le noyau.</p>


<p>Les commandes les plus courantes sont&nbsp;:</p>
<ul>
<li><strong>ps</strong>&nbsp;: liste des processus et de leurs caractéristiques</li>
<li><strong>htop</strong>&nbsp;: liste dynamique des processus et de ce qu'ils consomment</li>
<li><strong>pgrep</strong>&nbsp;: récupération d'une liste de processus par expression régulière</li>
<li><strong>pidof</strong>&nbsp;: récupération du pid d'un processus recherché</li>
<li><strong>fuser</strong>&nbsp;: informations sur les file descriptor d'un processus</li>
<li><strong>lsof</strong>&nbsp;: idem</li>
<li><strong>pmap</strong>&nbsp;: afficher le mapping mémoire d'un processus</li>
</ul>

<p><span id="more-305"></span></p>


<h5>Données sur l'activité</h5>


<p>Un processus a une activité somme toute limitée, c'est pourquoi il est parfaitement faisable de tout tracer. Le plus évident est de tracer les appels système, mais cela ne révèle que ses interactions avec le reste du monde. Il est aussi possible de tracer les appels de fonctions voire chacune des instructions.</p>

<ul>
<li><strong>strace</strong>&nbsp;: liste les appels système du processus</li>
<li><strong>ltrace</strong>&nbsp;: liste les appels de fonction de bibliothèques dynamiques (.so) du processus</li>
<li><strong>pstack</strong>&nbsp;: affiche la pile d'appel du processus</li>
<li><strong>gdb</strong>&nbsp;: avec gdb on peut tout savoir et même modifier l'action d'un processus. gdb utilise l'appel système ptrace pour cela.</li>
</ul>

<h3>Agir sur un processus</h3>


<p>Les actions sur un processus peuvent être effectuées par plusieurs entités&nbsp;:</p>
<ul>
<li>Le processus lui -même</li>
<li>Le processus père du processus</li>
<li>Un autre processus ayant les droits pour effectuer une action (c'est-à-dire même propriétaire ou root ... en l'absence de patch sur le noyau)</li>
</ul>

<p>Les actions qu'on peut effectuer sur un processus sont toutes liées à un appel système. En général il existe une commande shell fournissant une fonctionnalité équivalente.</p>


<h5>Envoi d'un signal</h5>


<p>Les signaux permettent de communiquer de façon basique avec un processus. Il peuvent être envoyé par un autre processus ou par le noyau. <strong>man 1 kill</strong> vous indique la liste des signaux et l'action par défaut associée pour les processus qui ne les surchargent pas.</p>


<p>Pour envoyer un signal à un processus il existe plusieurs commandes (qui utilisent toutes l'appel système kill)&nbsp;:</p>

<ul>
<li><strong>kill</strong>&nbsp;: envoyer un signal à un processus connaissant son pid</li>
<li><strong>killall</strong>&nbsp;: envoie un signal à tous les processus portant un certain nom</li>
<li><strong>pkill</strong>&nbsp;: envoie un signal aux processus matchant une expression régulière</li>
<li><strong>ctrl-z</strong>&nbsp;: envoie le signal STOP au processus en avant plan du shell en cours</li>
<li><strong>fg</strong>, <strong>bg</strong>&nbsp;: envoie le signal CONT à un processus stoppé du shell en cours</li>
</ul>


<h5>Répartir les tâches</h5>


<p>Les processus peuvent être plus ou moins consommateurs de ressource processeur. La partie du noyau nommée ordonnanceur (scheduler) s'occupe d'allouer ces ressources aux différents processus.</p>


<p>Pour influencer l'activité de l'ordonnanceur, il existe plusieurs méthodes. Tout d'abord chaque processus dispose d'une priorité, le niveau de nice. Pour altérer son propre niveau, il y a l'appel système nice qui a donné la commande <strong>nice</strong>. Pour altérer celui d'un autre processus il y a l'appel système setpriority qui a donné la commande <strong>renice</strong>.</p>


<p>L'ordonnanceur a la charge de répartir l'activité de plusieurs processus, de plus en plus souvent entre plusieurs processeurs. Il est possible d'influencer la répartition des processus entre processeurs avec la commande <strong>taskset</strong> (utilisant l'appel système sched_setaffinity). Cette commande permet de limiter un processus à un ou plusieurs processeurs donnés.</p>


<p>Il existe aussi avec CFS, un moyen de contrôler finement le temps alloué à chaque processus à travers <strong>/sys/kernel/uids</strong> ou à travers les cgroups (voir Documentation/scheduler/sched-design-CFS.txt).</p>


<p>De plus il existe dans le noyau un deuxième ordonnanceur qui, cette fois, organise les tâches d'accès au disque. Si c'est le CFQ qui a été choisi (car il est modifiable), il est possible de l'influencer. Le grand intérêt de ceci est de limiter les processus qui pourraient phagocyter les autres en faisant énormément d'accès disque (pensez aux backups). L'appel système ioprio_set est implémenté dans la commande <strong>ionice</strong> pour gérer cette fonctionnalité. Lisez Documentation/block/ioprio.txt pour plus de détails.</p>



<h5>Gestion des droits</h5>


<p>Il n'est pas possible de changer les droits d'un processus de l'extérieur. Seul lui-même en est capable. Mais le mécanisme standard d'héritage lors du fork et de changement de droits lors de l'exec permet de faire tout ce qu'on veut.</p>


<p>Il n'existe qu'un seul cas où les droits peuvent être augmentés (en supposant l'absence de patch de sécurité spécifique)&nbsp;: lancer la commande exec sur un fichier disposant du bit suid (et éventuellement de capabilities).</p>


<p>Ensuite pour réduire ses droits, le processus peut utiliser&nbsp;:</p>
<ul>
<li>L'appel système chroot qui a donné la commande <strong>chroot</strong></li>
<li>L'appel système setXXuid qui est utilisé dans pam (commande <strong>login</strong> par exemple)</li>
<li>Les capabilities à travers l'appel système setcap qui permet de limiter la liste des appels systèmes disponibles pour un processus (ceci est une option du noyau)</li>
</ul>


<h5>Devenir indépendant</h5>


<p>Un processus reçoit des signaux mortels lorsque son tty est coupé. C'est pourquoi un processus peut vouloir obtenir son indépendance.</p>


<p>Il appelle alors l'appel système setsid qui le détache de son terminal. De plus il crée un nouveau groupe de processus pour lui et ses fils, ce qui en pratique le détache de son père (lequel ne pourra donc plus le tuer lorsqu'il mourra).</p>


<p>La commande <strong>setsid</strong> fait la même chose en ligne de commande.</p>



<h5>Limitations</h5>


<p>Il est possible d'imposer des limitations à un processus ainsi qu'à ses fils, il existe un appel système pour cela nommée setrlimit. Bash propose une implémentation en ligne de commande pour cet appel nommée <strong>ulimit</strong>.</p>


<p>Les limitations incluent des limitations en nombre de fichiers ouverts, en consommation CPU, en occupation mémoire ... vous trouverez les détails dans le manuel de bash à la commande ulimit.</p>



<h5>IPC et mémoire partagée</h5>


<p>Une ancienne méthode chamanique utilisée pour communiquer entre processus est constituée des IPC (inter process communication). Les ipc permettent à des processus de&nbsp;:</p>
<ul>
<li>s'envoyer des messages (appels système msgXXX)</li>
<li>poser des sémaphores, une technique de lock pour l'accès à des données (appels systèmes semXXX)</li>
<li>partager de la mémoire (appels système shmXXX)</li>
</ul>

<p>Ces 3 catégories de méthodes génèrent des données qui sont indépendantes des processus de par le fait qu'elle sont destinées à d'autres processus. C'est pourquoi lorsqu'un processus utilisant des ipc plante, il laisse des traces dans le système. Ces traces consomment de la mémoire inutilement et parfois bloquent d'autres processus.</p>


<p>C'est pourquoi les commandes <strong>ipcs</strong> et <strong>ipcrm</strong> permettent de manipuler ces données de façon extérieures. Pensez à lire le manuel, c'est très court et vous pourrez en profiter pour monitorer les données en question.</p>



<h3>Communication avec le processus</h3>


<p>Enfin, un processus est isolé et communique avec le reste du monde de très peu de façons différentes&nbsp;:</p>
<ul>
<li>avec des file descriptor (réseau, fichier, pipe, tty, device ...)</li>
<li>à travers la mémoire partagée et les IPC</li>
<li>avec des signaux</li>
<li>par la ligne de commande (en lecture seule)</li>
<li>et avec quelques appels système ayant une action sur le système lui-même</li>
</ul>
	Tags:<a href="http://linux-attitude.fr/tag/commande" title="Commande" rel="tag">Commande</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/savoir-faire" title="Savoir-faire" rel="tag">Savoir-faire</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/brutus-processus/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PKI</title>
		<link>http://linux-attitude.fr/post/pki</link>
		<comments>http://linux-attitude.fr/post/pki#comments</comments>
		<pubDate>Thu, 26 Mar 2009 18:33:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Savoir-faire]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/pki</guid>
		<description><![CDATA[Niveau&#160;:     
Résumé&#160;: PKI&#160;; IGC


Une PKI (Public Key Infrastructure), en français IGC (Infrastructure de Gestion des Clés) est un système permettant de gérer des clés publiques. Il s'agit en général de gérer des certificats x509. Elle établit un réseau de confiance entre utilisateurs, lequel passe nécessairement par l'autorité de certification.


Ces certificats peuvent [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /><br />
<strong>Résumé</strong>&nbsp;: PKI&nbsp;; IGC</p>


<p>Une PKI (Public Key Infrastructure), en français IGC (Infrastructure de Gestion des Clés) est un système permettant de gérer des <a href="/post/Cle-publique">clés publiques</a>. Il s'agit en général de gérer des <a href="/post/Certificats">certificats</a> x509. Elle établit un réseau de confiance entre utilisateurs, lequel passe nécessairement par l'<a href="/post/Garder-lautorite">autorité de certification</a>.</p>


<p>Ces certificats peuvent servir selon leur contenu à&nbsp;:</p>
<ul>
<li><a href="/post/Cryptographie">Chiffrer</a> (des communications)</li>
<li><a href="/post/Cryptographie">Signer</a> (des documents)</li>
<li><a href="/post/Cryptographie">S'authentifier</a> (sur des applications)</li>
<li>Certifier d'autres clés</li>
</ul>

<p>Disposer d'une PKI signifie qu'on est capable de créer, pour chacun de ses utilisateurs, des certificats qui nous permettront par la suite de lui faire confiance. Pour cela une PKI offre plusieurs services&nbsp;:</p>

<ul>
<li>Un service d'enregistrement qui vérifie l'identité des "utilisateurs"</li>
<li>Un service de signature de demande de certificats</li>
<li>Un service de renouvellement de certificats</li>
<li>Un service de publication des certificats</li>
<li>Un service de révocation des certificats</li>
<li>Un service de publication des révocations</li>
<li>Parfois un service de création de clés</li>
</ul>

<p>Ces fonctionnalités sont généralement regroupées dans des entités séparées pour des raisons de sécurité. En effet, une PKI une fois en place devient rapidement un élément critique puisqu'elle permet de se faire passer pour une entité digne de confiance (pensez social engineering mais sans le social) . C'est pourquoi un certain nombre de fonctionnalités peuvent être installés dans un équipement dédié (un HSM, hardware security module). Du coté utilisateur, on peut faire pareil, sauf qu'on appel cet appareil dédié une carte à puce.</p>



<p>Mettre en place une PKI est une chose assez lourde. Mais elle devient intéressante à partir du moment où on se retrouve à gérer un grand nombre de certificats (beaucoup de serveurs ou beaucoup d'utilisateurs). Vous n'avez pas envie d'installer une PKI pour vous authentifier sur un seul serveur. Mais si vous avez 200 000 employés et que vous voulez que tout le monde signe ses mail en x509, il est temps d'en installer une.</p>



<p>Je voudrais attirer votre attention sur le fait qu'il ne s'agit pas seulement de créer des certificats et de les signer. La confiance se fait sur toute une chaîne, et il faut pouvoir garantir que l'autorité n'a pas été compromise (AC séparée). Il faut pouvoir garantir cette confiance dans le temps (renouvellement), il faut pouvoir se prémunir des erreurs, des vols ou des changements d'organisation (révocation). C'est pourquoi il est nécessaire de prendre son temps avant de l'installer pour bien comprendre le fonctionnement de chaque élément.</p>



<p>Il existe plusieurs PKI open source dont <a href="http://www.ejbca.org/" hreflang="en">EJBCA</a> ou <a href="http://www.newpki.org/" hreflang="en">NewPKI</a>. Je parlerai d'<a href="http://www.openssl.org/" hreflang="en">OpenSSL</a>, la PKI du pauvre, dans mes prochains articles. Principalement pour pouvoir mettre les mains dans le cambouis, ne pensez pas à l'utiliser tel quel comme PKI.</p>
	Tags:<a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/savoir-faire" title="Savoir-faire" rel="tag">Savoir-faire</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/pki/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Soyez réguliers (1)</title>
		<link>http://linux-attitude.fr/post/soyez-reguliers-1</link>
		<comments>http://linux-attitude.fr/post/soyez-reguliers-1#comments</comments>
		<pubDate>Mon, 23 Feb 2009 18:24:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Savoir-faire]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/soyez-reguliers-1</guid>
		<description><![CDATA[Niveau&#160;:     
Résumé&#160;: perl -pe 's///'


Il arrive régulièrement d'avoir à développer des expressions régulières. Si on excepte grep et sed, la plupart des outils utilisant des expressions régulières sont compatibles perl (en utilisant PCRE).
C'est donc un bon point. Apprendre les expression régulières (qu'on peut considérer comme un langage à part entière) ne [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <img src="/public/Pics/s.gif" alt="Star" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /> <img src="/public/Pics/e.gif" alt="Empty" /><br />
<strong>Résumé</strong>&nbsp;: perl -pe 's///'</p>


<p>Il arrive régulièrement d'avoir à développer des expressions régulières. Si on excepte grep et sed, la plupart des outils utilisant des expressions régulières sont compatibles perl (en utilisant <a href="http://www.pcre.org/" hreflang="en">PCRE</a>).
C'est donc un bon point. Apprendre les expression régulières (qu'on peut considérer comme un langage à part entière) ne sera pas perdu même si on change d'outil ou de langage.</p>


<h3>Tests</h3>


<p>Avant de développer une expression régulière, je vous propose de vous familiariser avec le test de ces expressions. Si vous avec une ligne de commande c'est tout simple, hop un test ligne par ligne&nbsp;:</p>
<pre>
$ perl -pe 's/expression/########/'
données
a matcher, 
autant que vous voulez
&lt;ctrl-d&gt;
</pre>


<p>Mais si vous préférez un interface plus évoluée&nbsp;: voici un des nombreux qui permettent de tester vos expressions en direct <a href="http://myregexp.com/" title="http://myregexp.com/">http://myregexp.com/</a> et avec coloration des éléments matchés.</p>


<h3>Syntaxe de base</h3>


<p>Une expression régulière, c'est une chaîne de caractère qui a pour but de repérer des informations dans un texte. Elles sont en général implémentées sous forme d'<a href="http://fastnet.univ-brest.fr/~gire/COURS/COMPIL_IUP/node202.html" hreflang="fr">automates à état finis</a>. Cette méthode est extrêmement efficace et dans la plupart des cas il est très difficile de faire plus rapide.</p>


<p>Cette chaîne peut être utilisée pour chercher des informations dans un texte, mais aussi pour faire des remplacements automatisés. Perl utilise une syntaxe <strong>autour</strong> des expressions régulières pour préciser comment les utiliser. Celle-ci est souvent reprise par les utilisateurs des PCRE mais ca n'a rien d'obligatoire&nbsp;:</p>

<ul>
<li><strong>/expression/</strong>&nbsp;:  pour faire des recherches</li>
<li><strong>s/expression/remplacement/</strong> pour faire du recherche/remplacer</li>
<li><strong>y/expression/remplacement/</strong> pour faire des substitutions de caractères</li>
</ul>

<p>y/// est un cas particulier que nous ignorerons.</p>


<p><span id="more-300"></span></p>


<p>Chacune de ces chaînes peut être suivie par un modificateur. Le plus utile est /i qui permet de ne pas se soucier de la <a href="http://fr.wikipedia.org/wiki/Caract%C3%A8re_(typographie)" hreflang="en">casse</a>. Exemple&nbsp;: /toto/i matchera ToTo.
Le deuxième plus important est /g qui permet de faire le remplacement autant de fois que c'est possible et non pas seulement la première fois que l'expression matche.</p>


<p>Attention, hors perl, il se peut que tout ceci ne soit pas valable, mais cela ne change rien quant à la syntaxe des expressions expliquée ci après.</p>


<h3>Syntaxe des expressions</h3>


<p>Le principe d'une expression régulière (abrégé en regex) est de matcher des milliers de possibilités sans devoir toutes les écrire. Il ne s'agit donc (quasiment) que de "raccourcis".</p>


<p>Donc commençons par les non-raccourcis&nbsp;:</p>
<ul>
<li><strong>()</strong>&nbsp;: les parenthèses ont deux fonctions, grouper des éléments entre eux et mémoriser le contenu matché pour le rendre réutilisable par la suite</li>
<li><strong>|</strong>&nbsp;: opérateur OU comme dans "confiture ou nutella ?"</li>
</ul>

<p><strong>Exemples</strong>&nbsp;:</p>
<pre>
^vive (la confiture|le nutella)$
</pre>


<p>Maintenant les raccourcis&nbsp;:</p>
<ul>
<li><strong>.</strong>&nbsp;: n'importe quel caractère</li>
<li><strong>^ $</strong>&nbsp;: début et fin de <strong>chaîne</strong></li>
<li><strong>[abf]</strong>&nbsp;: a ou b ou f</li>
<li><strong>[a-m]</strong>&nbsp;: a ou b ou ... ou m</li>
<li><strong>[^a b]</strong>&nbsp;: tout sauf a ou espace ou b</li>
<li><strong>\d</strong>&nbsp;: un chiffre</li>
<li><strong>\w</strong>&nbsp;: un caractère alphanumérique</li>
<li><strong>\W</strong>&nbsp;: un caractère non alphanumérique</li>
<li><strong>\s</strong>&nbsp;: un caractère d'espacement</li>
<li><strong>\S</strong>&nbsp;: un caractère de non-espacement</li>
<li><strong>a?</strong>&nbsp;: 0 ou 1 fois a</li>
<li><strong>b+</strong>&nbsp;: 1 ou plus fois b</li>
<li><strong>c*</strong>&nbsp;: 0 ou plus fois c</li>
<li><strong>d{3}</strong>&nbsp;: 3 fois d</li>
<li>...</li>
</ul>

<p>Il y en a plein d'autres, mais avec celles-ci vous saurez vous débrouiller dans la plupart des situations.</p>


<p>Exemples&nbsp;:</p>
<pre>
# récupérer le hostname d'un nom de domaine dans $1
(\w+)(\.\w+)*
# récupérer une heure/minute/seconde en début de ligne dans $1, $2 et $3
^(\d\d):(\d\d):(\d\d)\s
# matche une ligne variable=&quot;valeur&quot; avec ou sans guillemets et des espaces autorisés
^\s*(\w+)\s*=\s*&quot;?(.*)&quot;?
</pre>



<p>Après cette petite initiation sans conséquences, vous pouvez aller lire la vraie documentation fournie en manpage avec la documentation perl <a href="http://perldoc.perl.org/perlre.html" hreflang="en">man perlre</a>.</p>
	Tags:<a href="http://linux-attitude.fr/tag/perl" title="Perl" rel="tag">Perl</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/savoir-faire" title="Savoir-faire" rel="tag">Savoir-faire</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/soyez-reguliers-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using apc (user agent is rejected)
Database Caching 8/30 queries in 0.108 seconds using apc

Served from: linux-attitude.fr @ 2010-07-31 04:14:24 -->