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

<channel>
	<title>Le blog de Michauko</title>
	<atom:link href="http://michauko.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://michauko.org/blog</link>
	<description>Si le titre de l&#039;article ne te fait pas mal au crâne, ce blog est pour toi :)</description>
	<lastBuildDate>Tue, 24 Aug 2010 08:45:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>SFTP : mot de passe en ligne de commande</title>
		<link>http://michauko.org/blog/2010/08/24/sftp-mot-de-passe-en-ligne-de-commande/</link>
		<comments>http://michauko.org/blog/2010/08/24/sftp-mot-de-passe-en-ligne-de-commande/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 08:45:29 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[ligne de commande]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[reseau et sécu]]></category>
		<category><![CDATA[lftp]]></category>
		<category><![CDATA[putty]]></category>
		<category><![CDATA[sftp]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=1095</guid>
		<description><![CDATA[Petit souci du jour : utiliser sftp en ligne de commande, avec un mot de passe, en mode batch, MAIS sans passer par une authentification par clef. Sachant que sftp n&#8217;accepte pas de mot de passe en ligne de commande (ni via une redirection depuis STDIN). Pourquoi donc me direz-vous ? simplement parce-que dans l&#8217;éventualité [...]]]></description>
			<content:encoded><![CDATA[<p>Petit souci du jour : utiliser sftp en ligne de commande, avec un mot de passe, en mode batch, MAIS sans passer par une authentification par clef. Sachant que sftp n&#8217;accepte pas de mot de passe en ligne de commande (ni via une redirection depuis STDIN).</p>
<p>Pourquoi donc me direz-vous ? simplement parce-que dans l&#8217;éventualité où faire bouger le prestataire en face de vous (celui qui héberge le serveur SSH) coûterait trop d&#8217;énergie, on va supposer qu&#8217;on ne peut pas facilement faire avaler notre clef publique à l&#8217;hébergeur du serveur SSH.</p>
<p>Bref, la commande traditionnelle est :</p>
<pre>sftp utilisateur@serveur
Connecting to serveur...
utilisateur@serveur's password:
sftp&gt;</pre>
<p>J&#8217;ai trouvé une méthode simple : utiliser le client SFTP de &#8220;PuTTY&#8221;.<br />
Je pensais au départ utiliser celui de &#8220;lftp&#8221; et sauvegarder ma connexion (avec mot de passe) en bookmark, mais comme mon login dans l&#8217;histoire est un utilisateur de domaine windows (ouais, le serveur SSH en face est sous windows O_o), y&#8217;a un \ dans le login et même en le doublant, lftp semble mal le digérer, ben j&#8217;étais aussi bloqué.</p>
<p>Bref, en installant les outils de PuTTY :</p>
<pre>aptitude install putty-tools</pre>
<p>On peut alors taper :</p>
<pre>psftp -pw mon_pass utilisateur@serveur
Using username "utilisateur".
Remote working directory is /
psftp&gt;</pre>
<p><strong>Attention : le mot de passe est en clair dans la ligne de commande, donc dans les processus etc etc. Donc c&#8217;est pas idéal comme condition.</strong><br />
Enfin, je n&#8217;ai pas mis le paramètre -b pour mon batch, car ce n&#8217;est pas le propos là.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2010/08/24/sftp-mot-de-passe-en-ligne-de-commande/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>tag MP3 : les paroles automatiquement !</title>
		<link>http://michauko.org/blog/2010/08/16/tag-mp3-les-paroles-automatiquement/</link>
		<comments>http://michauko.org/blog/2010/08/16/tag-mp3-les-paroles-automatiquement/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 13:03:54 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[autres outils]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[flac]]></category>
		<category><![CDATA[lyrics3]]></category>
		<category><![CDATA[metatOGGer]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[ogg]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=1091</guid>
		<description><![CDATA[Après une longue errance pour trouver un logiciel potable pour tagger automatiquement des mp3 &#8211; en fait, pour inclure les paroles, le reste, c&#8217;est bon &#8211; je suis enfin tombé sur MetatOGGer, qui fonctionne, et qui est gratuit mais que sous windows je crois Il récupère les paroles de chansons automatiquement, depuis wikia.com. Rien à [...]]]></description>
			<content:encoded><![CDATA[<p>Après une longue errance pour trouver un logiciel potable pour tagger automatiquement des mp3 &#8211; en fait, pour inclure les paroles, le reste, c&#8217;est bon &#8211; je suis enfin tombé sur <a href="http://www.luminescence-software.org/">MetatOGGer</a>, qui fonctionne, et qui est gratuit <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  mais que sous windows je crois<br />
Il récupère les paroles de chansons automatiquement, depuis wikia.com.<br />
Rien à dire. Parfois il sort une erreur 404 qui vient de nulle part, c&#8217;est qu&#8217;il n&#8217;arrivera pas à traiter telle chanson, on l&#8217;enlève de la liste et on relance.<br />
youhouuuu</p>
<p><strong>Les paroles sont stockées dans le mp3 (le tag &#8220;lyrics3&#8243; je suppose) et du coup lisible sur un lecteur qui se respecte. En l&#8217;occurrence un iphone.</strong></p>
<p>Ca gère évidemment les OGG, les FLAC etc&#8230; en plus des MP3.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2010/08/16/tag-mp3-les-paroles-automatiquement/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>utilisateurs postfix virtuels : ajouter un répondeur &#8220;vacation&#8221;</title>
		<link>http://michauko.org/blog/2010/06/16/utilisateurs-postfix-virtuels-ajouter-un-repondeur-vacation/</link>
		<comments>http://michauko.org/blog/2010/06/16/utilisateurs-postfix-virtuels-ajouter-un-repondeur-vacation/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 08:30:27 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[mails]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[master.cf]]></category>
		<category><![CDATA[pipe]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[procmail]]></category>
		<category><![CDATA[vacation]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=1047</guid>
		<description><![CDATA[Avec mes précédents articles ci-dessous, vous avez de quoi monter une architecture complète de mails avec utilisateurs virtuels. Pour faire simple. configurer postfix pour gérer des utilisateurs virtuels monter une architecture complète &#8220;postfix / postgrey / amavisd-new / clamav / spamassassin&#8221; Il manque cependant un morceau : la possibilité de faire appel à des &#8220;procmail&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Avec mes précédents articles ci-dessous, vous avez de quoi monter une architecture complète de mails avec utilisateurs virtuels. Pour faire simple.</p>
<ul>
<li>
<a href="http://michauko.org/blog/2009/10/20/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre/">configurer postfix pour gérer des utilisateurs virtuels</a>
</li>
<li>
<a href="http://michauko.org/blog/2009/09/21/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc/">monter une architecture complète &#8220;postfix / postgrey / amavisd-new / clamav / spamassassin&#8221;</a>
</li>
</ul>
<p></p>
<p><strong>Il manque cependant un morceau : la possibilité de faire appel à des &#8220;procmail&#8221; personnalisés pour ces utilisateurs virtuels.</strong></p>
<p>Lorsqu&#8217;on n&#8217;est pas avec des utilisateurs virtuels, chaque utilisateur réel (ayant un compte utilisateur, donc) utilise généralement son <code>~/.procmailrc</code> pour trier un peu ou <strong>- cas qui m&#8217;intéresse particulièrement &#8211; activer son répondeur d&#8217;absence, &#8220;<code>vacation</code>&#8220;</strong> pour ne pas le nommer.<br />
Dans le cas d&#8217;utilisateurs virtuels, c&#8217;est sensiblement différent. C&#8217;est ce que je décrirai dans cet article. Ce n&#8217;est au final pas compliqué, mais il faut comprendre le rôle de chaque composant et les limites de fonctionnement de chaque outil.<br />
En effet, je n&#8217;ai pas trouvé de doc ultra-claire sur le sujet sur le web, surtout les bricoles de chacun. Avec un peu de recul, et, voyant ma propre solution, j&#8217;ai l&#8217;impression qu&#8217;il y a tellement de configurations possibles (maildrop et pas procmail, mes utilisateurs virtuels comme ci, pas comme ça, il utilise postfixadmin et pas moi etc) qu&#8217;il est impossible d&#8217;écrire un truc qui n&#8217;est pas spécifique.<br />
Le plus dur est donc de comprendre ce qu&#8217;on fait pour transposer à sa conf. Je tâcherai donc, comme d&#8217;hab, d&#8217;expliquer ce que je fais plutôt que de copier-coller les fichiers de conf.</p>
<p>Allez, let&#8217;s go pour la mise en place sur la base d&#8217;une archi postfix &#038; co comme décrite dans les docs mentionnées en début de cet article.</p>
<p><em>Ah, dernier point : à la base, et tel que je le décris, l&#8217;utilisateur ne pourra pas mettre lui même son répondeur en place. Dans mon cas, ce n&#8217;est pas important. En effet, j&#8217;utilise des utilisateurs virtuels car il s&#8217;agit d&#8217;un serveur frontal de mails (qui trie le spam, en gros), livre les messages dans des arborescences virtuelles en attendant d&#8217;être POPées depuis un backend de mails quelconque (un vilain Exchange <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Donc, le répondeur d&#8217;absence des utilisateurs &#8220;physiques&#8221; est géré par eux-mêmes dans Outlook &#8220;normalement&#8221;, et je n&#8217;applique ce principe de répondeur qu&#8217;exceptionnellement, à quelques boîtes mails IMAP génériques, qui n&#8217;ont pas vraiment de notion de &#8220;vacances&#8221;. Des boîtes partagées entre plusieurs personnes, si vous voulez, mais stockées sur le frontal et pas dans le backend, pour diverses raisons dont on se moque ici. Après vous pourrez toujours bricoler un truc pour que tout un chacun accède à son procmail ou son message d&#8217;asbence pour le mettre, l&#8217;enlever etc.</em><span id="more-1047"></span></p>
<h1>Le principe</h1>
<p>On veut activer le répondeur de toto@domaine.fr en utilisant l&#8217;outil &#8220;<code>vacation</code>&#8221; qui gère très bien les réponses. &#8220;<code>vacation</code>&#8221; ne joue qu&#8217;avec des comptes utilisateurs existants. Premier problème.</p>
<p>Pour y arriver, on va créer des alias pour ce compte virtuel &#8220;toto@domaine.fr&#8221; afin que postfix &#8220;forward&#8221; (du nom de la table &#8220;forwardings&#8221; gérant les alias des utilisateurs virtuels) tout mail à destination de toto@domaine.fr vers 2 endroits :</p>
<ul>
<li>
le réel toto@domaine.fr, histoire de délivrer le mail quand même, au final
</li>
<li>
et en plus vers un certain toto@vacation.domaine.fr qui n&#8217;existe pas
</li>
</ul>
<p><bR>Ce dernier nom &#8220;vacation.domaine.fr&#8221; n&#8217;a pas besoin d&#8217;exister au sens DNS et ne correspond pas non plus à un MX réel. On va juste créer un &#8220;transport&#8221; (du nom de la table MySQL qu&#8217;on a créée avec les docs précédentes) particulier afin de router les messages à destination du domaine &#8220;vacation.domaine.fr&#8221; vers un &#8220;<code>pipe</code>&#8221; particulier de postfix qu&#8217;on va créer pour l&#8217;occasion.<br />
Ce &#8220;<code>pipe</code>&#8221; UNIX, composant qu&#8217;on ajoute à la chaîne postfix, gèrera en fait l&#8217;appel à <code>procmail </code>configuré d&#8217;une manière globale (un gros <code>procmailrc </code>générique, si vous voulez).<br />
Ce <code>procmail </code>fera ensuite un tri sur le nom du destinaire et appellera &#8220;<code>vacation</code>&#8221; lorsqu&#8217;on le veut avec un message personnalisé.</p>
<p><i>C&#8217;est ce procmail global qu&#8217;il conviendrait de découper (avec des INCLUDE), ainsi que les fichiers de messages d&#8217;absence qui vont avec, si on voulait donner la main d&#8217;une manière pas super pratique (FTP ? samba ?) à des utilisateurs réels sur leur répondeur de compte virtuel&#8230;</i></p>
<p>Je me suis basé sur pas mal de docs bizarroïdes, et surtout sur les quelques explications <a href="http://lists.mailscanner.info/pipermail/mailscanner/2005-January/044873.html">trouvées ici</a>. Le cheminement y est, mais c&#8217;est pas détaillé sur le principe et le type propose son propre script de répondeur ; script qui peut générer une belle boucle infinie entre répondeurs, à mon humble avis. Ce risque n&#8217;existe pas avec &#8220;<code>vacation</code>&#8220;, car il garde une liste des gens &#8220;déjà répondus&#8221;, sauf si vous forcez à répondre à chaque fois.</p>
<h1>Mise en place</h1>
<h2>Paquets, utilisateur etc</h2>
<p>Au besoin, suivant l&#8217;état de votre installation :</p>
<pre>aptitude install procmail vacation</pre>
<p>Ensuite, j&#8217;ai expliqué que &#8220;<code>vacation</code>&#8221; ne travaillait que sur un compte réel. Je lui dédie donc un compte :</p>
<pre>useradd -m vacation -s /bin/nologin -c "Utilisateur vacation"</pre>
<h2>Création du pipe UNIX</h2>
<p>On crée le processus qui sera en charge de router (de manière interne à postfix) les messages arrivant dans un <code>pipe </code>qu&#8217;on nomme &#8220;repondeur&#8221; vers <code>procmail</code> (lui même appelant le cas échéant le programme de répondeur &#8220;<code>vacation</code>&#8220;).<br />
Dans <code>/etc/postfix/master.cf</code>, à la fin (peu importe), on définit ce pipe comme suit :</p>
<pre>#ajout d'un appel à procmail pour gérer certains 'vacation' sur les boites IMAP
#attention, l'appel à ce pipe est géré dans la table des transports virtuels + des forwardings qui vont bien
repondeur   unix    -       n       n       -       10      pipe
  flags=Rq user=vacation argv=/usr/bin/procmail -Y -m /etc/postfix/procmail-global-repondeur.rc ${sender} ${recipient}
</pre>
<p>Les espaces avant &#8220;flags&#8221; sont importants, c&#8217;est ce qui explique à postfix qu&#8217;il s&#8217;agit d&#8217;option du <code>pipe </code> nommé &#8220;repondeur&#8221;.<br />
Je décrirai le fichier <code>/etc/postfix/procmail-global-repondeur.rc</code> plus tard. C&#8217;est lui qui contiendra les appels aux &#8220;<code>vacation</code>&#8221; de tels et tels utilisateurs.<br />
J&#8217;avoue ne pas être super sûr des flags utilisés, voyez <code>man pipe</code> au besoin.</p>
<h2>transport virtuel</h2>
<p>Si votre base MySQL est exactement celle que je décris dans mes précédentes documentations, insérez une ligne dans la table &#8220;transport&#8221; afin d&#8217;avoir :</p>
<pre>mysql> select * from transport;
+---------------------+-----------+
| domain              | transport |
+---------------------+-----------+
| vacation.domaine.fr | repondeur |
+---------------------+-----------+
1 row in set (0.00 sec)</pre>
<p>Pour bien relier cette table à votre configuration &#8220;virtuelle&#8221;, la table &#8220;transport&#8221; dont je parle est celle décrite comme ça dans postfix :</p>
<pre>[extraits de fichiers]
main.cf:transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf
mysql-virtual_transports.cf:query = SELECT transport FROM transport WHERE domain='%s'</pre>
<h2>Création des alias pour router vers le &#8220;pipe&#8221; &#8220;repondeur&#8221;</h2>
<p>Pour chaque utilisateur virtuel qui devra avoir un répondeur actif (ou potentiellement actif), il faudra ajouter 2 alias le concernant dans la table des alias (&#8220;forwardings&#8221; dans mon cas, là encore, ça dépend de votre conf de &#8220;postfix virtuel&#8221;). Ajoutez donc les lignes pour avoir :</p>
<pre>mysql> select * from forwardings where source like 'j%doma%';
+--------------------+-----------------------------+
| source             | destination                 |
+--------------------+-----------------------------+
| jacques@domaine.fr | jacques@domaine.fr          |
| jacques@domaine.fr | jacques@vacation.domaine.fr |
+--------------------+-----------------------------+
2 rows in set (0.00 sec)</pre>
<p>J&#8217;ai eu un souci pour insérer ces 2 lignes, car il y a une contrainte de clef primaire sur &#8220;source&#8221;, ce qui semble logique, mais qui est en fait bloquant pour nous et inutile dans un cas normal d&#8217;alias d&#8217;utilisateurs virtuels (on pourrait faire une liste de diffusion en créant plusieurs lignes pour une même source car postfix gère très bien le fait d&#8217;avoir plusieurs destination pour une même source).<br />
Bref, j&#8217;ai fait sauté la contrainte PK que j&#8217;avais mise dans mes docs précédents :</p>
<pre>ALTER TABLE forwardings
DROP PRIMARY KEY;</pre>
<p>Rassurez-vous, ça ne fait pas sauter les entrées déjà stockées dans la table si vous en avez.</p>
<h2>procmailrc et vacation</h2>
<p>On y est presque.<br />
Reste à définir le <code>procmail </code>global appelant vacation :<br />
Dans mon &#8220;<code>pipe</code>&#8220;, j&#8217;appelle ce fichier :</p>
<pre>servr:/etc/postfix# cat /etc/postfix/procmail-global-repondeur.rc
SHELL=/bin/sh

:0c
* ^(To|Cc).*jacques@domaine.fr
| vacation -f /home/vacation/jacques@domaine.fr.db -m /home/vacation/jacques@domaine.fr.msg -a jacques@domaine.fr vacation

:0c
* ^(To|Cc).*autre_type@domaine.fr
| vacation -f /home/vacation/autre_type@domaine.fr.db -m /home/vacation/autre_type@domaine.fr.msg -a autre_type@domaine.fr vacation

:0
/dev/null</pre>
<p><strong>Alors, c&#8217;est presque le plus compliqué car ce fichier est plein de petites ruses</strong>. Il vous montre comment procéder lorsque vous aurez plusieurs boîtes concernées par un vacation.<br />
<i>Je rappelle que de cette manière, c&#8217;est un peu pénible à maintenir car c&#8217;est l&#8217;admin qui gère. Là il s&#8217;agit de boîte IMAP partagées et peu nombreuses, donc c&#8217;est gérable.</i></p>
<p>Le détail est donc :</p>
<ul>
<li>
Je stocke tous mes messages de &#8220;vacances&#8221; dans ~vacation/
</li>
<li>
-f : pour indiquer dans quelle &#8220;base de données&#8221; on stocke les gens à qui on a déjà répondu</li>
<li>
</li>
<li>
-m : pour indiquer le mail de réponse d&#8217;un utilisateur donné, je le détaille plus bas
</li>
<li>
-a : <strong>hyper important </strong> : en effet, <code>vacation </code>ne travaille que sur un utilisateur réel. Donc obligé de spécifier un utilisateur réel en fin de commande <code>vacation</code>, c&#8217;est l&#8217;utilisateur &#8220;vacation&#8221; himself qui figure en dernier argument de la ligne de commande. Donc, pour que <code>vacation </code> travaille, j&#8217;explique aussi que cet utilisateur réel peut être connu sous l&#8217;alias (-a) jacques@domaine.fr (ou autre_type@domaine.fr dans la 2è règle). Sinon aucune règle ne s&#8217;appliquera jamais.
</li>
<li>
&#8220;:0c&#8221; : <strong>OUI : il faut activer le &#8220;carbon copy&#8221;</strong>. J&#8217;ai constaté ça à force de tests. En effet, un message arrivant dans postfix a un ID, il est dédoublé avec le même ID, l&#8217;un part vers l&#8217;utilisateur réel pour livraison, l&#8217;autre vers le &#8220;<code>pipe</code>&#8220;, puis <code>procmail</code>, puis <code>vacation</code>. &#8220;<code>vacation</code>&#8221; arrête les règles (si on ne met pas le &#8220;c&#8221; de carbon copy) dès que ça &#8220;match&#8221;. Si un expéditeur envoi un unique mail à en même temps jacques@domaine.fr et autre_type@domaine.fr, la première règle va marcher, donc procmail arrêtera de bosser. Résultat : pas de répondeur pour &#8220;autre_type&#8221;. On ne sait pas qu&#8217;il est en vacances.
</li>
<li>
Et enfin, le piège des &#8220;carbon copy&#8221; : si on ne fait pas une dernière règle virant vers /dev/null tout message au final, un message légitime auquel on aura répondu par &#8220;vacation&#8221; sortira de procmail et continuera sa route : il sera donc livré. Mais c&#8217;est un utilisateur complètement bidon, untel@vacation.domaine.fr, domaine inexistant => erreur de livraison => log dans <code>/var/log/mail.info</code> et <strong>surtout</strong>, mail d&#8217;erreur bien crade informant l&#8217;expéditeur&#8230;</li>
</ul>
<h2>fichier .msg de vacation</h2>
<p>Voici à quoi doit ressembler un fichier de réponse minimaliste :</p>
<pre>servr:/etc/postfix# cat ~vacation/jacques\@domaine.fr.msg
From: jacques@domaine.fr (Jacques)
Subject: Re: $SUBJECT
Precedence: Bulk

Votre mail a bien été reçu, blablablabla
-- Jacques
</pre>
<h2>reload postfix et tests</h2>
<p>A la fin, <code>/etc/init.d/postfix reload</code> et zou, testez des envois de mails, de réenvois de mails (pour n&#8217;avoir qu&#8217;une fois la réponse etc).<br />
Le plus risqué dans cette manip&#8217; sur un serveur en production, c&#8217;est que tout les adresses normales commencent à merdouiller. Le plus rapide pour annuler tout ça le temps de réfléchir, est de commenter les 2 lignes définissant le pipe et de rechargez postfix.</p>
<h1>Autres remarques</h1>
<h2>Réinit d&#8217;un répondeur</h2>
<p>A une époque, il me semblait qu&#8217;en modifiant le fichier .msg, <code>vacation </code>détectait le changement et donc ne tenait plus compte des expéditeurs &#8220;déjà répondus&#8221;. Après quelques tests, je n&#8217;en suis plus si sûr. Le plus simple pour relancer un répondeur &#8220;pour tous&#8221; : supprimez le fichier .db correspondant.</p>
<h2>Permissions</h2>
<p>Attention, j&#8217;ai interdit le login pour l&#8217;utilisateur vacation. Donc tout ce que vous créerez dans ~vacation/*msg sera sûrement au nom de &#8220;root&#8221;, par exemple. Pensez à changer les droits.<br />
Si vous avez raté un truc, les logs sont très explicites dans <code>/var/log/mail.info</code>.<br />
Je crois aussi me rappeler que si <code>vacation </code>ne voit pas le fichier .msg, il ne fera rien. A vérifier, mais c&#8217;est une méthode simple (et crade car ça va faire du log à coup sûr) pour activer/désactiver un répondeur <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>un log complet pour illustrer</h2>
<p>Si tout se passe bien, vous avez ça :<br />
Connexion du serveur expéditeur :</p>
<pre>Jun 14 17:10:21 servr postfix/smtpd[20107]: connect from expediteur.org[xx.yy.zz.tt]
Jun 14 17:10:21 servr postgrey[12166]: action=pass, reason=client AWL, client_name=expediteur.org, client_address=xx.yy.zz.tt, sender=exped@expediteur.org, recipient=jacques@domaine.fr
Jun 14 17:10:21 servr postfix/smtpd[20107]: C2B829C4081: client=expediteur.org[xx.yy.zz.tt]
Jun 14 17:10:21 servr postfix/cleanup[20065]: C2B829C4081: message-id=<20100614151021.AF0F0EEC57C@mail.expediteur.org>
Jun 14 17:10:21 servr postfix/qmgr[19547]: C2B829C4081: from=<exped@expediteur.org>, size=515, nrcpt=2 (queue active)
Jun 14 17:10:21 servr postfix/smtpd[20107]: disconnect from expediteur.org[xx.yy.zz.tt]
Jun 14 17:10:23 servr postfix/smtpd[20208]: connect from localhost.localdomain[127.0.0.1]
Jun 14 17:10:23 servr postfix/smtpd[20208]: 8A0E69C4085: client=localhost.localdomain[127.0.0.1]
Jun 14 17:10:23 servr postfix/cleanup[20065]: 8A0E69C4085: message-id=<20100614151021.AF0F0EEC57C@mail.expediteur.org>
Jun 14 17:10:23 servr postfix/smtpd[20208]: disconnect from localhost.localdomain[127.0.0.1]
Jun 14 17:10:23 servr postfix/qmgr[19547]: 8A0E69C4085: from=<exped@expediteur.org>, size=1045, nrcpt=3 (queue active)</pre>
<p>Pas de greylisting, car c&#8217;est un pote. Analyse par amavis OK, on dédouble le message vers jacques@domaine.fr et jacques@vacation.domaine.fr.<br />
Chaque file suivra alors sa route :</p>
<pre>Jun 14 17:10:23 servr amavis[18918]: (18918-18) Passed CLEAN, [xx.yy.zz.tt] [xx.yy.zz.tt] <exped@expediteur.org> -> <jacques@domaine.fr>,<jacques@vacation.domaine.fr>, Message-ID: <20100614151021.AF0F0EEC57C@mail.expediteur.org>, mail_id: uuW4XqNAoH7S, Hits: 1.714, size: 515, queued_as: 8A0E69C4085, 1902 ms
Jun 14 17:10:23 servr postfix/smtp[20190]: C2B829C4081: to=<jacques@domaine.fr>, relay=127.0.0.1[127.0.0.1]:10024, delay=1.9, delays=0.03/0/0/1.9, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=18918-18, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 8A0E69C4085)
Jun 14 17:10:23 servr postfix/smtp[20190]: C2B829C4081: to=<jacques@vacation.domaine.fr>, orig_to=<jacques@domaine.fr>, relay=127.0.0.1[127.0.0.1]:10024, delay=1.9, delays=0.03/0/0/1.9, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=18918-18, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 8A0E69C4085)
Jun 14 17:10:23 servr postfix/qmgr[19547]: C2B829C4081: removed</pre>
<p>La partie &#8220;utilisateur virtuel de postfix&#8221; traite le &#8220;mail normal&#8221; => &#8220;delivered to maildir&#8221;. Ca roule :</p>
<pre>Jun 14 17:10:23 servr postfix/virtual[20212]: 8A0E69C4085: to=<jacques@domaine.fr>, relay=virtual, delay=0.3, delays=0.15/0.01/0/0.14, dsn=2.0.0, status=sent (delivered to maildir)</pre>
<p>La partie &#8220;vacation&#8221; (pipe repondeur) route vers le &#8220;relay=repondeur&#8221;. Le job s&#8217;accomplit correctement &#8220;(delivered via repondeur service)&#8221;. Là on n&#8217;a pas d&#8217;autre erreur, sinon on pourrait voir vacation ou procmail pas content :</p>
<pre>Jun 14 17:10:23 servr postfix/pickup[19550]: ECF179C408A: uid=5001 from=<vacation>
Jun 14 17:10:23 servr postfix/pipe[20209]: 8A0E69C4085: to=<jacques@vacation.domaine.fr>, orig_to=<jacques@domaine.fr>, relay=repondeur, delay=0.41, delays=0.15/0/0/0.25, dsn=2.0.0, status=sent (delivered via repondeur service)
Jun 14 17:10:23 servr postfix/pipe[20209]: 8A0E69C4085: to=<jacques@vacation.domaine.fr>, relay=repondeur, delay=0.41, delays=0.15/0/0/0.25, dsn=2.0.0, status=sent (delivered via repondeur service)
Jun 14 17:10:23 servr postfix/cleanup[20065]: ECF179C408A: message-id=<20100614151023.ECF179C408A@domaine.fr>
Jun 14 17:10:23 servr postfix/qmgr[19547]: 8A0E69C4085: removed
Jun 14 17:10:24 servr postfix/qmgr[19547]: ECF179C408A: from=<vacation@domaine.fr>, size=343, nrcpt=1 (queue active)</pre>
<p>Deux secondes plus tard, &#8220;vacation&#8221; a détecté qu&#8217;il fallait répondre à &#8220;exped@expediteur.org&#8221;, donc on envoit un mail :<br />
(le champ From sera jacques@domaine.fr, seul Return-Path sera à vacation@domaine.fr)</p>
<pre>Jun 14 17:10:26 servr postfix/smtpd[20208]: connect from localhost.localdomain[127.0.0.1]
Jun 14 17:10:26 servr postfix/smtpd[20208]: 174A99C4081: client=localhost.localdomain[127.0.0.1]
Jun 14 17:10:26 servr postfix/cleanup[20065]: 174A99C4081: message-id=<20100614151023.ECF179C408A@domaine.fr>
Jun 14 17:10:26 servr postfix/qmgr[19547]: 174A99C4081: from=<vacation@domaine.fr>, size=770, nrcpt=1 (queue active)
Jun 14 17:10:26 servr amavis[20202]: (20202-01) Passed CLEAN, <vacation@domaine.fr> -> <exped@expediteur.org>, Message-ID: <20100614151023.ECF179C408A@domaine.fr>, mail_id: xw6dpgfdz+b5, Hits: -0.001, size: 343, queued_as: 174A99C4081, 2197 ms
Jun 14 17:10:26 servr postfix/smtp[20190]: ECF179C408A: to=<exped@expediteur.org>, relay=127.0.0.1[127.0.0.1]:10024, delay=2.3, delays=0.14/0/0/2.2, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=20202-01, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 174A99C4081)
Jun 14 17:10:26 servr postfix/qmgr[19547]: ECF179C408A: removed
Jun 14 17:10:26 servr postfix/smtp[20219]: 174A99C4081: to=<exped@expediteur.org>, relay=mail.expediteur.org[xx.yy.zz.tt]:25, delay=0.21, delays=0.14/0/0.02/0.05, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 4337FEEC560)
Jun 14 17:10:26 servr postfix/qmgr[19547]: 174A99C4081: removed</pre>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2010/06/16/utilisateurs-postfix-virtuels-ajouter-un-repondeur-vacation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu, Lucid Lynx, eeePC, RaLink RT2860 et wifi WPA</title>
		<link>http://michauko.org/blog/2010/05/31/ubuntu-lucid-lynx-eeepc-ralink-rt2860-et-wifi-wpa/</link>
		<comments>http://michauko.org/blog/2010/05/31/ubuntu-lucid-lynx-eeepc-ralink-rt2860-et-wifi-wpa/#comments</comments>
		<pubDate>Mon, 31 May 2010 12:23:21 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[eeePC]]></category>
		<category><![CDATA[freebox]]></category>
		<category><![CDATA[Lucid Lynx]]></category>
		<category><![CDATA[RaLink]]></category>
		<category><![CDATA[RT2860]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=1036</guid>
		<description><![CDATA[Une fois n&#8217;est pas coutume, j&#8217;upgrade Ubuntu vers la dernière release, et là, le wifi me fait des misères. Ca marchait ça marche plus etc. Dans le cas présent, j&#8217;ai upgradé un ASUS eeePC (peu importe le modèle, je crois qu&#8217;ils sont tous concernés car basés sur à peu près la même puce wifi) depuis [...]]]></description>
			<content:encoded><![CDATA[<p>Une fois n&#8217;est pas coutume, j&#8217;upgrade Ubuntu vers la dernière release, et là, le wifi me fait des misères. Ca marchait ça marche plus etc.<br />
Dans le cas présent, j&#8217;ai upgradé un ASUS eeePC (peu importe le modèle, je crois qu&#8217;ils sont tous concernés car basés sur à peu près la même puce wifi) depuis la release précédente (Karmic Koala) où tout marchait très bien.<br />
Voici le problème et des solutions.<span id="more-1036"></span></p>
<h1>Les symptomes</h1>
<p>Après l&#8217;upgrade, on se retrouve en kernel 2.6.32-22. Le wifi fonctionne par exemple sur un réseau en WPA2, mais ça n&#8217;accroche pas sur un réseau WPA (certains disent WPA mixte WPA2, j&#8217;en sais rien).<br />
<strong>Autant utiliser du WPA2. Oui d&#8217;accord, mais ma freebox, elle fait que du WPA&#8230;</strong><br />
=> Le driver RT2860 est buggé dans ce noyau.</p>
<h2>Les logs</h2>
<p>Vous verrez qu&#8217;on tourne en rond entre &#8220;l&#8217;association&#8221; avec le point d&#8217;accès et le rescan des réseaux ça rate X fois, puis on abandonne pour de bon :</p>
<pre>May 19 19:33:17 ubuntu NetworkManager: <info>  Activation (wlan0) Stage 1 of 5 (Device Prepare) scheduled...
May 19 19:33:17 ubuntu NetworkManager: <info>  Activation (wlan0) Stage 1 of 5 (Device Prepare) started...
May 19 19:33:17 ubuntu NetworkManager: <info>  (wlan0): device state change: 6 -> 4 (reason 0)
May 19 19:33:17 ubuntu NetworkManager: <info>  Activation (wlan0) Stage 2 of 5 (Device Configure) scheduled...
May 19 19:33:17 ubuntu NetworkManager: <info>  Activation (wlan0) Stage 1 of 5 (Device Prepare) complete.
May 19 19:33:17 ubuntu NetworkManager: <info>  Activation (wlan0) Stage 2 of 5 (Device Configure) starting...
May 19 19:33:17 ubuntu NetworkManager: <info>  (wlan0): device state change: 4 -> 5 (reason 0)
May 19 19:33:17 ubuntu NetworkManager: <info>  Activation (wlan0/wireless): connection 'Auto folie' has security, and secrets exist.  No new secrets needed.
May 19 19:33:17 ubuntu NetworkManager: <info>  Config: added 'ssid' value 'folie'
May 19 19:33:17 ubuntu NetworkManager: <info>  Config: added 'scan_ssid' value '1'
May 19 19:33:17 ubuntu NetworkManager: <info>  Config: added 'key_mgmt' value 'WPA-PSK'
May 19 19:33:17 ubuntu NetworkManager: <info>  Config: added 'psk' value '<omitted>'
May 19 19:33:17 ubuntu NetworkManager: nm_setting_802_1x_get_pkcs11_engine_path: assertion `NM_IS_SETTING_802_1X (setting)' failed
May 19 19:33:17 ubuntu NetworkManager: nm_setting_802_1x_get_pkcs11_module_path: assertion `NM_IS_SETTING_802_1X (setting)' failed
May 19 19:33:17 ubuntu NetworkManager: <info>  Activation (wlan0) Stage 2 of 5 (Device Configure) complete.
May 19 19:33:18 ubuntu NetworkManager: <info>  Config: set interface ap_scan to 1
May 19 19:33:18 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  disconnected -> scanning
May 19 19:33:23 ubuntu wpa_supplicant[3187]: Trying to associate with 66:f2:bc:b8:cc:30 (SSID='folie' freq=2412 MHz)
May 19 19:33:23 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  scanning -> associating
May 19 19:33:23 ubuntu kernel: [  660.417251] ===>rt_ioctl_giwscan. 5(5) BSS returned, data->length = 636
May 19 19:33:23 ubuntu kernel: [  660.417895] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1)
May 19 19:33:23 ubuntu wpa_supplicant[3187]: Association request to the driver failed
May 19 19:33:28 ubuntu wpa_supplicant[3187]: Authentication with 66:f2:bc:b8:cc:30 timed out.
May 19 19:33:28 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  associating -> disconnected
May 19 19:33:28 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  disconnected -> scanning
May 19 19:33:33 ubuntu wpa_supplicant[3187]: Trying to associate with 66:f2:bc:b8:cc:30 (SSID='folie' freq=2412 MHz)
May 19 19:33:33 ubuntu kernel: [  670.433534] ===>rt_ioctl_giwscan. 5(5) BSS returned, data->length = 636
May 19 19:33:33 ubuntu kernel: [  670.434373] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1)
May 19 19:33:33 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  scanning -> associating
May 19 19:33:33 ubuntu wpa_supplicant[3187]: Association request to the driver failed
May 19 19:33:38 ubuntu wpa_supplicant[3187]: Authentication with 66:f2:bc:b8:cc:30 timed out.
May 19 19:33:38 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  associating -> disconnected
May 19 19:33:38 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  disconnected -> scanning
May 19 19:33:43 ubuntu kernel: [  680.449828] ===>rt_ioctl_giwscan. 5(5) BSS returned, data->length = 636
May 19 19:33:43 ubuntu kernel: [  680.450463] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1)
May 19 19:33:43 ubuntu wpa_supplicant[3187]: Trying to associate with 66:f2:bc:b8:cc:30 (SSID='folie' freq=2412 MHz)
May 19 19:33:43 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  scanning -> associating
May 19 19:33:43 ubuntu wpa_supplicant[3187]: Association request to the driver failed
May 19 19:33:48 ubuntu wpa_supplicant[3187]: Authentication with 66:f2:bc:b8:cc:30 timed out.
May 19 19:33:48 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  associating -> disconnected
May 19 19:33:48 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  disconnected -> scanning
May 19 19:33:53 ubuntu wpa_supplicant[3187]: Trying to associate with 66:f2:bc:b8:cc:30 (SSID='folie' freq=2412 MHz)
May 19 19:33:53 ubuntu kernel: [  690.468163] ===>rt_ioctl_giwscan. 5(5) BSS returned, data->length = 636
May 19 19:33:53 ubuntu kernel: [  690.468883] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1)
May 19 19:33:53 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  scanning -> associating
May 19 19:33:53 ubuntu wpa_supplicant[3187]: Association request to the driver failed
May 19 19:33:58 ubuntu NetworkManager: <info>  wlan0: link timed out.
May 19 19:33:58 ubuntu wpa_supplicant[3187]: Authentication with 66:f2:bc:b8:cc:30 timed out.
May 19 19:33:58 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  associating -> disconnected
May 19 19:33:58 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  disconnected -> scanning
May 19 19:34:03 ubuntu kernel: [  700.491916] ===>rt_ioctl_giwscan. 5(5) BSS returned, data->length = 636
May 19 19:34:03 ubuntu wpa_supplicant[3187]: Trying to associate with 66:f2:bc:b8:cc:30 (SSID='folie' freq=2412 MHz)
May 19 19:34:03 ubuntu kernel: [  700.492792] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1)
May 19 19:34:03 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  scanning -> associating
May 19 19:34:03 ubuntu wpa_supplicant[3187]: Association request to the driver failed
May 19 19:34:08 ubuntu wpa_supplicant[3187]: Authentication with 66:f2:bc:b8:cc:30 timed out.
May 19 19:34:08 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  associating -> disconnected
May 19 19:34:08 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  disconnected -> scanning
May 19 19:34:13 ubuntu kernel: [  710.512617] ===>rt_ioctl_giwscan. 5(5) BSS returned, data->length = 636
May 19 19:34:13 ubuntu wpa_supplicant[3187]: Trying to associate with 66:f2:bc:b8:cc:30 (SSID='folie' freq=2412 MHz)
May 19 19:34:13 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  scanning -> associating
May 19 19:34:13 ubuntu kernel: [  710.513600] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1)
May 19 19:34:13 ubuntu wpa_supplicant[3187]: Association request to the driver failed
May 19 19:34:18 ubuntu NetworkManager: <info>  Activation (wlan0/wireless): association took too long.
May 19 19:34:18 ubuntu NetworkManager: <info>  (wlan0): device state change: 5 -> 6 (reason 0)
May 19 19:34:18 ubuntu NetworkManager: <info>  Activation (wlan0/wireless): asking for new secrets
May 19 19:34:18 ubuntu NetworkManager: <info>  (wlan0): supplicant connection state:  associating -> disconnected
May 19 19:34:18 ubuntu wpa_supplicant[3187]: Authentication with 00:00:00:00:00:00 timed out.
May 19 19:34:33 ubuntu NetworkManager: <info>  wlan0: link timed out.</pre>
<p>Le matos est le suivant (<code>lspci -vv</code>) :</p>
<pre>01:00.0 Network controller: RaLink RT2860
	Subsystem: RaLink Device 2790
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0, Cache Line Size: 32 bytes
	Interrupt: pin A routed to IRQ 19
	Region 0: Memory at fbef0000 (32-bit, non-prefetchable) [size=64K]
	Capabilities: <access denied>
	Kernel driver in use: rt2860
	Kernel modules: rt2860sta</pre>
<h1>Solutions</h1>
<p>Tout est très bien décrit ici : <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/496093">https://bugs.launchpad.net/ubuntu/+source/linux/+bug/496093</a>.</p>
<h2>Noyau 2.6.33</h2>
<p>Pas encore dispo dans Lucid Lynx, mais apparement il règle le problème. A suivre avec les updates de la distribution.</p>
<h2>Ancien noyau</h2>
<p>Coup de bol, j&#8217;ai l&#8217;ancien noyau toujours dispo (2.6.31-21) depuis l&#8217;upgrade (il n&#8217;a supprimé que les vraiment anciens). Avec lui tout marche. Je peux le garder par défaut en attendant que le 2.6.33 fasse partie de Lucid Lynx, s&#8217;il en fera partie un jour (probable).<br />
Pour l&#8217;instant, je m&#8217;en sers pour pouvoir quand même downloader ce qu&#8217;il faut pour appliquer l&#8217;une des méthodes ci-dessous <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Backport du driver dans un 2.6.32 spécifique</h2>
<p>La méthode qui consiste à utiliser un backup 2.6.32 fait par un gentil monsieur est elle-même déconseillée par le gentil monsieur. C&#8217;est pourtant simple sur le papier : tu récupères le paquet, tu l&#8217;installes, tu rebootes.<br />
Je suis son conseil, finalement, et j&#8217;opte pour la solution où on recompile le driver, malgré des désavantages. Voir ci-dessous.<br />
Sinon, c&#8217;est le <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/496093/comments/80">commentaire 80 qu&#8217;il faut lire</a>.</p>
<h2>Recompilation du bon driver</h2>
<p><a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/496093/comments/107">Commentaire 107 </a>sur le post mentionné précédemment<br />
Le désavantage, c&#8217;est que si demain Ubuntu met à jour le 2.6.32-22 en -23, il faudra recommencer la manip&#8217;.<br />
Je décris cette méthode car apparement le bug réapparait régulièrement depuis Ubuntu &#8220;Intrepid Ibex&#8221;, donc certains liens sont devenus obsolètes. Ca vous évitera de vous taper les 4 pages de remarques de tout le monde.<br />
Ce qui compte, c&#8217;est qu&#8217;à-la-fin-ça-marche.</p>
<h3>Installation des outils minimums de compilation de kernel</h3>
<pre>sudo aptitude install linux-headers-`uname -r` build-essential</pre>
<h3>Récupération du driver chez le fabricant</h3>
<p><a href="http://www.ralinktech.com/support.php?s=2">Partez de là </a> (site principal => Software => Linux). Et vous sélectionnez cette ligne là : &#8220;RT2860PCI/mPCI/CB/PCIe(RT2760/RT2790/RT2860/RT2890)&#8221;.<br />
En direct, tant qu&#8217;ils ne refondent pas tout leur site, ça donne <a href="http://www.ralinktech.com/download.php?t=U0wyRnpjMlYwY3k4eU1ERXdMekF4THpJNUwyUnZkMjVzYjJGa05ERTJNVEV5T1RFd05pNWllakk5UFQweU1ERXdYekF4WHpJNVgxSlVNamcyTUY5TWFXNTFlRjlUVkVGZmRqSXVNeTR3TGpBdWRHRnlD">ce fichier</a>.</p>
<h3>Compilation et installation du machin</h3>
<p>Décompressez (tar -xvjf 2010_01_29_RT2860_Linux_STA_v2.3.0.0.tar.bz2) et allez modifier dans les sources le fichier <code>2010_01_29_RT2860_Linux_STA_v2.3.0.0/os/linux/config.mk</code>.<br />
Vous reperez et mettez &#8220;y&#8221; (yes) aux lignes suivantes :</p>
<pre>HAS_WPA_SUPPLICANT=y
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y</pre>
<p>Ensuite, vous passez root. Non, &#8220;sudo ma_commande&#8221; ne revient pas au même dans le cas présent, dixit l&#8217;auteur.<br />
Donc :</p>
<pre>sudo su
cd 2010_01_29_RT2860_Linux_STA_v2.3.0.0
make &#038;&#038; make_install</pre>
<p>Ca mouline 10 minutes (c&#8217;est lent un eeePC <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).<br />
Et on le charge :</p>
<pre>modprobe rt2860sta</pre>
<p>Enfin, si tout marche, vous ajouterez la ligne :</p>
<pre>rt2860sta</pre>
<p>dans le fichier <code>/etc/modules</code> pour que ça tienne après reboot.</p>
<h1>Conclusion</h1>
<p>Linux et le wifi, ça a toujours été le bordel.<br />
Maintenant, j&#8217;ai opté pour une méthode simple : avant d&#8217;upgrader Ubuntu, je télécharge l&#8217;ISO, je crée une clef USB Bootable Live Persistante avec <a href="http://www.linuxliveusb.com/">ce merveilleux outil</a>, je boote, je teste tout. Ensuite si ça passe, alors je migre. Sinon j&#8217;attends, ou j&#8217;aide à débugger si j&#8217;ai que ça à foutre.</p>
<p>Update de dernière minute : rien à faire, il chargeait tout le temps l&#8217;ancien driver rt2860sta de <code>/lib/modules/le_bon_kernel</code>. J&#8217;ai fini par écraser l&#8217;ancien avec le nouveau. Ils sont dans 2 arborescences différentes. Je ne l&#8217;ai plus sous la main, mais tentez un <code>find /lib/modules/ -name "rt2860sta.ko" -exec ls -l {} \;</code> pour voir, compte-tenu de la date, lequel est lequel. Tambouillez un coup et hop, votre driver marche enfin. Au forceps.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2010/05/31/ubuntu-lucid-lynx-eeepc-ralink-rt2860-et-wifi-wpa/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>dotProject &amp; LDAP (Active Directory plus précisemment)</title>
		<link>http://michauko.org/blog/2010/03/30/dotproject-ldap-active-directory-plus-precisemment/</link>
		<comments>http://michauko.org/blog/2010/03/30/dotproject-ldap-active-directory-plus-precisemment/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 13:36:14 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[autres outils]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[dotProject]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=1029</guid>
		<description><![CDATA[C&#8217;est pas que je sois fanatique des outils de ce genre là, mais bon, parfois, le boss veut ça pour hier. Ca permet de faire euh&#8230; de la gestion de projets, c&#8217;est open-source, tout ça. Voyez ici : http://www.dotproject.net/ Bon bref, on s&#8217;en fout. Si vous lisez cet article c&#8217;est que vous comptez l&#8217;installer, je [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est pas que je sois fanatique des outils de ce genre là, mais bon, parfois, le boss veut ça pour hier.<br />
Ca permet de faire euh&#8230; de la gestion de projets, c&#8217;est open-source, tout ça. Voyez ici : <a href="http://www.dotproject.net/">http://www.dotproject.net/</a><br />
Bon bref, on s&#8217;en fout. Si vous lisez cet article c&#8217;est que vous comptez l&#8217;installer, je suppose.<br />
Je donne 2/3 remarques d&#8217;installation, notamment la configuration au LDAP de Microsoft : Active Directory.<span id="more-1029"></span></p>
<h1>Dézip, install etc</h1>
<p>Pour monter le site, je passe en quelques mots.</p>
<ul>
<li>
Vous dézippez le .tar.gz (pas de paquet Debian ; et puis c&#8217;est généralement en retard de versions pour ce genre d&#8217;outils). Par exemple dans /var/www
</li>
<li>
Vous avez en amont un serveur MySQL et Apache en état. Et éventuellement créé un schéma de base dotproject, un admin DB dédié et tout le toutim. Exemple :</p>
<pre>create database dotproject;
create user 'dpadmin'@'localhost' identified by 'mon_passwd_qui_tache';
grant all on dotproject.* to 'dpadmin'@'localhost';</pre>
</li>
<li>
Bien sûr, le paquet php5-ldap est installé et LDAP activé dans votre conf PHP :</p>
<pre>votre.serveur:/srv/www/dotproject# grep -r ldap /etc/php5/
/etc/php5/conf.d/ldap.ini:extension=ldap.so
/etc/php5/cli/conf.d/ldap.ini:extension=ldap.so
/etc/php5/apache2/conf.d/ldap.ini:extension=ldap.so
</pre>
</li>
<li>
De même pour php5-mysql&#8230;
</li>
<li>
Vous accédez à http://votre.serveur/dotproject/install/
</li>
<li>
L&#8217;install se déroule paisiblement. Vérifiez que les modules qui vous intéressent sont bien détectés. Ajoutez les permissions sur /files et créez un fichier /includes/config.php vide, modifiable par www-data.<br />
Bref, du classique.
</li>
<li>
Une fois installé, le mot de passe par défaut du compte admin est passwd. J&#8217;ai cherché quelques temps <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .
</li>
</ul>
<p>A la fin, supprimez le répertoire d&#8217;&#8221;install&#8221;.</p>
<h1>Conf Active Directory</h1>
<p>Dans le menu d&#8217;admin, vous configurerez la connexion à l&#8217;AD comme suit (dans Administration Système -> Configuration système) &#8211; si votre LDAP est en clair (port 389) :<br />
<div id="attachment_1031" class="wp-caption aligncenter" style="width: 468px"><a href="http://michauko.org/blog/wp-content/uploads/2010/03/20100330_151648.png"><img src="http://michauko.org/blog/wp-content/uploads/2010/03/20100330_151648.png" alt="Conf dotproject Active Directory" title="Conf dotproject Active Directory" width="458" height="423" class="size-full wp-image-1031" /></a><p class="wp-caption-text">Conf dotproject Active Directory</p></div><br />
Remarques :</p>
<ul>
<li>
<strong>Méthode d&#8217;authentif</strong>&#8230; : LDAP
</li>
<li>
Avant d&#8217;oublier : BIEN COCHER LA CASE &#8220;LDAP autorise également les connexions standards&#8221;. Sinon, si vous ratez votre conf LDAP et déconnectez votre compte admin => Boum (probablement).
</li>
<li>
<strong>Hôte LDAP </strong>: j&#8217;ai galéré longtemps en mettant le FQDN, comme préconisé un peu partout. C&#8217;est passé lorsque j&#8217;ai mis l&#8217;IP ! Arg !
</li>
<li>
<strong>Base DN LDAP </strong>: le noeud racine des utilisateurs qui pourront se signer. Par exemple : <code>ou=Users,cn=domaine,cn=fr</code>
</li>
<li>
<strong>Filtre Utilisateur LDAP</strong>. Pour un AD : <code>(sAMAccountName=%USERNAME%)</code>. Ca veut dire : on comparera la variable %USERNAME% au champ LDAP sAMAccountName, qui est le login dans un AD.
</li>
<li>
<strong>Recherche Utilisateur LDAP </strong>: le chemin complet pour atteindre l&#8217;utilisateur capable de faire la recherche dans l&#8217;AD. Exemple : <code>CN=sonlogin,CN=Users,dc=domaine,dc=fr</code>
</li>
</ul>
<p>Mais d&#8217;où toute cette syntaxe sort-elle ???? non non, pas DT&#8230; Je vous recommande &#8220;<a href="http://technet.microsoft.com/en-us/sysinternals/bb963907.aspx">AD Explorer</a>&#8220;. Ca permet de vous promener dans votre AD et de connaître le DN (Distinguished Name) de n&#8217;importe quel élément.<br />
Le cas standard est que les utilisateurs sont dans <code>Ou=Users,dc=votredomaine,dc=com</code>. Mais bon, quelques fois, on ose le changement.</p>
<h1>Traduction</h1>
<p>Vous trouverez le paquet français sur le site officiel. Il faut dézipper dans /locales, ça crée un sous-répertoire &#8220;fr&#8221;. Reste à mettre le français par défaut aux utilisateurs dans un des menus d&#8217;admin.</p>
<p>Et voilà, c&#8217;était &#8220;j&#8217;ai pris aucune note d&#8217;installation ni de photo d&#8217;écran donc je torche un papier vite fait mais ça peut rendre service&#8221;.<br />
A+</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2010/03/30/dotproject-ldap-active-directory-plus-precisemment/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>OracleToolbox sous Linux, pour analyser vos perfs Oracle</title>
		<link>http://michauko.org/blog/2010/02/03/oracletoolbox-sous-linux-pour-analyser-vos-perfs-oracle/</link>
		<comments>http://michauko.org/blog/2010/02/03/oracletoolbox-sous-linux-pour-analyser-vos-perfs-oracle/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 17:19:56 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[autres outils]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[oci8]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracletoolbox]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=1005</guid>
		<description><![CDATA[L&#8217;objectif Afin de creuser certaines baisses de perfs d&#8217;une base Oracle non loin de là, j&#8217;ai cherché un outil, si possible libre, pour obtenir facilement des infos du genre top-ten des requêtes les plus lancées, les plus longues, qui brassent le plus de données etc etc. Et de faire un EXPLAIN sur celles-ci pour trouver [...]]]></description>
			<content:encoded><![CDATA[<h1>L&#8217;objectif</h1>
<p>Afin de creuser certaines baisses de perfs d&#8217;une base Oracle non loin de là, j&#8217;ai cherché un outil, si possible libre, pour obtenir facilement des infos du genre top-ten des requêtes les plus lancées, les plus longues, qui brassent le plus de données etc etc. Et de faire un EXPLAIN sur celles-ci pour trouver l&#8217;index qu&#8217;on a raté, l&#8217;algorithme pensé avec les pieds et ce genres de choses.</p>
<p>Comme Oracle est un lointain souvenir, je n&#8217;avais pas envie de me plonger dans la liste des tables V_$TRUC qui contiennent tout ceci, mais dont je n&#8217;ai aucune envie de me souvenir.</p>
<h1>Quelques outils</h1>
<p>Bilan, on trouve rapidement :<span id="more-1005"></span></p>
<ul>
<li>
l&#8217;Enterprise Manager d&#8217;Oracle (java, lourd, chiant, façon Oracle tout simplement)
</li>
<li>
SpotLight de l&#8217;éditeur Quest Software (celui qui pond T.O.A.D). Ca balance du gros, mais c&#8217;est commercial, cher etc. Vu que tout est dans des tables et que j&#8217;ai simplement besoin d&#8217;un outil qui me présente ça lisiblement, c&#8217;est presque trop. M&#8217;enfin, si vous êtes fortunés, n&#8217;hésitez pas.
</li>
<li>
Enfin, OracleToolBox sur <a href="http://www.oracletoolbox.org/">http://www.oracletoolbox.org/</a>
</li>
</ul>
<h1>La configuration de OracleToolbox</h1>
<p>Je livre ici 2/3 détails sur l&#8217;installation de Oracle Toolbox, après avoir ramé un peu.<br />
C&#8217;est rapide, mais ça vaut sûrement le coup d&#8217;être résumé :</p>
<h2>Couche Oracle</h2>
<p>Il faut d&#8217;abord avoir une couche cliente Oracle et PHP/OCI8 fonctionnelle. Ca tombe bien je l&#8217;ai décrit ici : <a href="http://michauko.org/blog/2009/05/07/installer-le-client-oracle-sur-debianlenny-interco-avec-php/">http://michauko.org/blog/2009/05/07/installer-le-client-oracle-sur-debianlenny-interco-avec-php/</a></p>
<h2>Installation</h2>
<p>Facile, il suffit de dézipper, par exemple dans <code>/var/www/oracletoolbox/</code>.</p>
<h2>Variables globales</h2>
<p>Il faut activer le passage de variables globales. C&#8217;est le choix de codage qui est fait avec l&#8217;application. Côté PHP, il s&#8217;agit d&#8217;un paramètre sensible permettant éventuellement quelques failles de sécurité.<br />
Donc 2 options s&#8217;offrent à nous :</p>
<ul>
<li>la première, crade pour tester, c&#8217;est de passer à &#8220;On&#8221; la variable <code>register_globals</code> dans <code>/etc/php5/apache2/php.ini</code>
</li>
<li>la deuxième sera plutôt d&#8217;intégrer cette modification uniquement pour le répertoire <code>/var/www/oracletoolbox/</code>, décrit ci-dessous avec au passage la restriction d&#8217;accès à l&#8217;outil par htaccess.
</li>
</ul>
<h2>htpasswd &#038; register_globals</h2>
<p>Pour protéger l&#8217;accès à l&#8217;outil, je propose une conf spécifique pour ce répertoire (<code>/var/www/oracletoolbox/</code>) qu&#8217;on décrira par exemple dans <code>/etc/apache2/conf.d/oracletoolbox</code> :</p>
<pre>&lt;Directory /var/www/oracletoolbox>
        AuthName "Acces restreint"
        AuthType Basic
        AuthUserFile /etc/oracle/toolbox.htpass
        &lt;limit GET POST>
                require user toolbox
        &lt;/Limit>
        php_value register_globals 1
        &lt;Files *.ini>
                Order allow,deny
                Deny from all
        &lt;/Files>

&lt;/Directory></pre>
<p>A noter le &#8220;php_value&#8221;, qui évite d&#8217;activer &#8220;register_globals&#8221; sur toute l&#8217;installation Apache/PHP. Donc de la restreindre à l&#8217;application OracleToolbox.<br />
La restriction sur les fichiers ini évitera qu&#8217;un gros malin récupère les mots de passe.</p>
<p>
Pour créer un mot de passe associé au compte &#8220;toolbox&#8221; dans le fichier <code>/etc/oracle/toolbox.htpass</code> (emplacement complètement arbitraire), il faut utiliser l&#8217;outil <code>htpasswd</code>, comme d&#8217;hab :</p>
<pre>srv:/# htpasswd -bc /etc/oracle/toolbox.htpass toolbox mon_pass
Adding password for user toolbox
srv:/# cat /etc/oracle/toolbox.htpass
toolbox:76X12345jNUkI</pre>
<h2>Déclaration des bases, tnsnames, tout ça</h2>
<p>Le fichier &#8220;INSTALL&#8221; fourni dans le package donne tous les pré-requis logiciels, en incluant les lib GD, PNG etc. Du facile à installer si vous n&#8217;avez pas ces modules (php5-gd etc).<br />
Ce fichier donne surtout quelques indices sur le reste de la configuration Oracle.<br />
Il faudra donc jeter en vrac tous les logins/passwd des comptes Oracle qui vous permettront d&#8217;accéder à vos bases, dans <code>/var/www/oracletoolbox/pswd.ini</code>. L&#8217;outil testera tout ce qu&#8217;il trouve, quelle que soit la base à laquelle vous vous connectez, en espérant qu&#8217;un marchera.<br />
Au premier lancement de l&#8217;outil (http://votre.serveur/oracletoolbox/), il vous demandera aussi où est votre fichier &#8220;tnsnames.ora&#8221; qui décrit vos bases et lesquelles vous voudrez &#8220;installer&#8221;, c&#8217;est-à-dire rendre accessible depuis OracleToolbox. En gros, il se refait une copie locale de celles qui vous intéressent parmi toutes celles de votre tnsnames.ora. Soit. Si vous avez suivi <a href="http://michauko.org/blog/2009/05/07/installer-le-client-oracle-sur-debianlenny-interco-avec-php/">ma doc de mise en place d&#8217;Oracle sur Debian, citée plus haut</a>, le fichier est <code>/etc/oracle/tnsnames.ora</code>.<br />
Tout ceci est au final stocké dans <code>/var/www/oracletoolbox/tnsnames</code>. Au besoin ça s&#8217;édite à la main, ça va plus vite.</p>
<p>Voilà, normalement-ça-marche &#8482;.</p>
<h1>LE bug corrigé &#038; version Windows autonome</h1>
<p>Il existe une version autonome (portable ?) pour windows embarquant un apache, php et le code source. Bref tout ce qu&#8217;il faut pour lancer l&#8217;outil (il manque peut-être le client Oracle et configuration à faire avant). Ca marche bien. Juste que chaque utilisateur doit avoir tout ça en local, faire tourner momentanément un Apache sur son PC etc.</p>
<p>A côté de cette version Windows, il y a le zip des sources dont je parle depuis le début. Ca marcherait sûrement sur un Windows avec un environnement Apache/PHP/Oracle déjà mis en place d&#8217;ailleurs.<br />
Dans cette version, il y avait un léger bug dans le packaging (dans le zip), l&#8217;auteur m&#8217;a confirmé ça ce matin, qui faisait qu&#8217;un champ RAW d&#8217;Oracle était mal interpreté par PHP. Bref, ça merdait. Normalement, le package est corrigé ce jour et vous n&#8217;aurez pas de problème.<br />
Si toutefois vous voyez une réaction comme ci-dessous dans le top-ten des &#8220;Disk/Buffer intensive request&#8221;, vous êtes concerné, prenez le code de l&#8217;autre zip (celui pour windows) ou retéléchargez les sources si vous l&#8217;avez fait avant la correction :<br />
<div id="attachment_1022" class="wp-caption alignnone" style="width: 585px"><a href="http://michauko.org/blog/wp-content/uploads/2010/02/20100126_1111451.png"><img src="http://michauko.org/blog/wp-content/uploads/2010/02/20100126_1111451.png" alt="OracleToolbox avec RAWTOHEX manquant" title="OracleToolbox avec RAWTOHEX manquant" width="575" height="199" class="size-full wp-image-1022" /></a><p class="wp-caption-text">OracleToolbox avec RAWTOHEX manquant</p></div><br />
Pour en avoir le coeur net, cherchez &#8220;rawtohex&#8221; dans &#8220;fonction_oracle.php&#8221;. Si ça n&#8217;y est pas, c&#8217;est pas bon.</p>
<p>Allez, bonne analyse de perfs</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2010/02/03/oracletoolbox-sous-linux-pour-analyser-vos-perfs-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NRPE : monitorer des Linux avec Nagios</title>
		<link>http://michauko.org/blog/2010/01/06/nrpe-monitorer-des-linux-avec-nagios/</link>
		<comments>http://michauko.org/blog/2010/01/06/nrpe-monitorer-des-linux-avec-nagios/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 05:18:32 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[supervision]]></category>
		<category><![CDATA[nagios]]></category>
		<category><![CDATA[NRPE]]></category>
		<category><![CDATA[NSClient++]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=999</guid>
		<description><![CDATA[Après cet article d&#8217;introduction à Nagios quand on n&#8217;y connait rien , où je tâche de couvrir les bases + le monitoring de machines Windows, essentiellement, voici maintenant le minimum vital pour monitorer un Linux. Quand je dis Linux, je pense Debian. &#8220;What else?&#8221; comme dirait l&#8217;autre. On va donc utiliser NRPE, un équivalent Linux [...]]]></description>
			<content:encoded><![CDATA[<p>Après <a href="http://michauko.org/blog/2009/10/07/mise-en-place-de-nagios/">cet article d&#8217;introduction à Nagios quand on n&#8217;y connait rien <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a>, où je tâche de couvrir les bases + le monitoring de machines Windows, essentiellement, voici maintenant le minimum vital pour monitorer un Linux. Quand je dis Linux, je pense Debian. &#8220;What else?&#8221; comme dirait l&#8217;autre.</p>
<p>On va donc utiliser NRPE, un équivalent Linux (permettez le raccourci) de NSClient++ pour Windows. En gros : un daemon qui permet d&#8217;exécuter des commandes à distance, fournissant en standard la surveillance des tailles des partitions, de la charge CPU, du nombre d&#8217;utilisateurs, de processus et de zombies. Comme d&#8217;habitude, Debian a tout packagé et il n&#8217;y a presque rien à faire&#8230;<span id="more-999"></span></p>
<p>Par la suite, on considère une machine nommée &#8220;srvnagios&#8221; et des machines srv1 et srv2 à monitorer. La solution de base Nagios fonctionne, comme expliqué dans l&#8217;article mentionné plus haut.</p>
<h1>Installation et paramétrage minimum</h1>
<h2>Côté serveur de monitoring</h2>
<p>Sur le serveur &#8220;srvnagios&#8221;, on complète l&#8217;installation existante de Nagios avec le plugin NRPE. Sur Debian, c&#8217;est le paquet &#8220;nagios-nrpe-plugin&#8221;. Ca s&#8217;installe tout seul et la seule chose qu&#8217;on en retiendra, c&#8217;est la mise à dispo des commandes et fichiers de conf Nafios suivants :</p>
<pre>
srv_nagios:~# locate check_nrpe
/etc/nagios-plugins/config/check_nrpe.cfg
/usr/lib/nagios/plugins/check_nrpe
</pre>
<h2>Côté serveur à monitorer</h2>
<p>Sur les machines à monitorer, on installe le &#8220;serveur&#8221; NRPE. Sur Debian, c&#8217;est le paquet &#8220;nagios-nrpe-server&#8221;. Par dépendances, ça installera tout un bazar, normal.<br />
Deux choses à noter :</p>
<pre>srv&#777;1:~# dpkg -L nagios-nrpe-server
[...]
/etc/nagios/nrpe.cfg
/etc/nagios/nrpe_local.cfg
[...]
/etc/default/nagios-nrpe-server
[...]</pre>
<p>Le 3è fichier permet de désactiver le mode SSL (pourquoi feriez-vous ça ?) ou de changer la priorité (&#8220;nice&#8221;) du daemon.<br />
Le 1er fichier définit plein de paramètres qu&#8217;on va écraser dans &#8220;nrpe_local.cfg&#8221;, partiellement. Il est bon de survoler le fichier <code>/etc/nagios/nrpe.cfg</code> pour y dénicher les paramètres que vous voulez modifier. La bonne pratique semble être de le laisser tel quel et d&#8217;écraser les valeurs qui vous concernent dans le fichier <code>nrpe_local.cfg</code>. Ca doit faciliter le boulot lors d&#8217;une montée de version. Le 1er fichier &#8220;include&#8221; le 2ème à la fin.<br />
Le minimum semble être de modifier l&#8217;IP autorisée à interroger la machine et d&#8217;y mettre l&#8217;IP de &#8220;srv_nagios&#8221; puisque c&#8217;est lui qui va appeler des commandes :</p>
<pre>srv1:~# cat /etc/nagios/nrpe_local.cfg
allowed_hosts=x.y.z.t</pre>
<p>Sans ça, seul <code>localhost</code> est autorisé à interroger le daemon. Utile uniquement lorsque Nagios est sur la même machine pour se monitorer elle-même.</p>
<p>La suite, c&#8217;est d&#8217;ajouter les commandes que l&#8217;on souhaite. Notamment pour la surveillance des partitions de disques. Regardez et comprenez la partie de définition des commandes (statiques ou à variables) dans la fin du fichier <code>nrpe.cfg</code>. Ca explique la syntaxe et le chapitre suivant :</p>
<h1>Nouvelles commandes</h1>
<p>J&#8217;ai choisi de créer en dur des commandes pour interroger les partitions. J&#8217;ai tout hard-codé comme un cochon, plutôt que de variabiliser. C&#8217;est un choix. Mais avec la syntaxe lourdingue de Nagios, on est plus à quelques copier-coller près.<br />
J&#8217;ai donc ajouté dans <code>nrpe_local.cfg</code> &#8211; dans le cas d&#8217;un serveur avec du RAID logiciel &#8211; les commandes suivantes :</p>
<pre>command[check_md1]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/md1
command[check_md2]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/md2
command[check_md3]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/md3
command[check_md6]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/md6
command[check_md7]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/md7</pre>
<p>Dans un cas plus traditionnel, l&#8217;équivalent sera des sda1/2/3 ou hda1/2/3.</p>
<p>Enfin, le contrôle du nombre de processus, de la charge etc, est fourni en standard (voir plus bas)</p>
<h1>Tests en commande en ligne</h1>
<p>Depuis le &#8220;srv_nagios&#8221;, on peut alors &#8211; après avoir relancé <code>/etc/init.d/nagios-nrpe-server reload</code> &#8211; tester nos commandes et aussi se familiariser avec la syntaxe de &#8220;check_nrpe&#8221; :</p>
<pre>srv_nagios:~# /usr/lib/nagios/plugins/check_nrpe -H srv1 -c check_md1 -p 5666
DISK OK - free space: /boot 170 MB (94% inode=99%);| /boot=9MB;151;170;0;189
</pre>
<p>Hop, ça marche, on peut définir tout ce qu&#8217;il faut dans Nagios.</p>
<h1>Intégration dans Nagios</h1>
<p>Je passe sur la définition (au sens Nagios) des machines srv1, srv2 etc. Leurs appartenances à des groupes, des templates, des trucs et des bidules de Nagios.<br />
Un exemple simpliste (définition des commandes une à une par partition) est donc une longue série de commandes de ce type à intégrer dans <code>/etc/nagios3/conf.d/ce_que_vous_voulez.cfg</code> :</p>
<pre>define service {
        use     generic-service
        host_name       srv1,srv2 # LE TEST S'APPLIQUERA AUX DEUX MACHINES, ELLES ONT TOUTES LES 2 UN /dev/md2
        service_description     NRPE disk md2
        check_command           check_nrpe_1arg!check_md2
}
#[...]
define service {
        use     generic-service
        host_name       srv2 # UNE SEULE MACHINE BENEFICIERA DE CE TEST
        service_description     NRPE disk md7
        check_command           check_nrpe_1arg!check_md7
}</pre>
<p>Puis, on déclare des commandes pour la charge, les users etc. Cette fois, j&#8217;ai déclaré ces tests communs au groupe de machines &#8220;nrpe-servers&#8221;, dont font partie srv1 et srv2 dans mon cas :</p>
<pre>define service{
        use                     generic-service
        hostgroup_name          nrpe-servers
        service_description     NRPE load
        check_command           check_nrpe_1arg!check_load
}
define service{
        use                     generic-service
        hostgroup_name          nrpe-servers
        service_description     NRPE users
        check_command           check_nrpe_1arg!check_users
}
define service{
        use                     generic-service
        hostgroup_name          nrpe-servers
        service_description     NRPE zombie
        check_command           check_nrpe_1arg!check_zombie_procs
}
define service{
        use                     generic-service
        hostgroup_name          nrpe-servers
        service_description     NRPE procs
        check_command           check_nrpe_1arg!check_total_procs
}</pre>
<p>A noter, dans <code>/etc/nagios-plugins/config/check_nrpe.cfg</code> sur &#8220;srv_nagios&#8221;, j&#8217;ai modifié la commande <code>check_nrpe_1arg</code> en enlevant le paramètre de timeout <code>-t 60</code>. Je ne sais plus s&#8217;il y avait une raison valable.<br />
Rechargez Nagios et admirez.</p>
<h1>Firewalling</h1>
<p>Pour clore tout ça, pensez aux restrictions réseaux. Pour peu qu&#8217;il y en ait entre les machines srv_nagios et srv1/2, pensez à ouvrir le port TCP 5666 (si vous ne l&#8217;avez pas modifié). Exemple avec shorewall, dans <code>/etc/shorewall/rules</code>, sur la machine monitorée &#8220;srv1&#8243; :</p>
<pre>ACCEPT net:$mon_srvnagios $FW tcp 5666</pre>
<p>Et sur le serveur de supervision &#8220;srv_nagios&#8221; :</p>
<pre>ACCEPT $FW net:$mon_srv1 $FW tcp 5666</pre>
<p>Avec les IP de mon_srv1 et mon_srvnagios défini dans <code>/etc/shorewall/params</code>.</p>
<p>Wala, surveillez bien.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2010/01/06/nrpe-monitorer-des-linux-avec-nagios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress sur un iphone (blackberry, android) : plugin WPTouch</title>
		<link>http://michauko.org/blog/2009/12/14/wordpress-sur-un-iphone-blackberry-android-plugin-wptouch/</link>
		<comments>http://michauko.org/blog/2009/12/14/wordpress-sur-un-iphone-blackberry-android-plugin-wptouch/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 10:24:47 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[autres outils]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[WPTouch]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=995</guid>
		<description><![CDATA[J&#8217;ai découvert par hasard ce plugin pour WordPress : il s&#8217;agit d&#8217;un plugin modifiant à la volée le thème du site pour le rendre merveilleusement lisible sur un iPhone (le site dit Blackberry et Android aussi, mais je n&#8217;ai pas de terminal pour tester). Ca se passe comme d&#8217;habitude pour un plugin bien fait sous [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai découvert par hasard <a href="http://wordpress.org/extend/plugins/wptouch/" target="_blank">ce plugin </a>pour WordPress : il s&#8217;agit d&#8217;un plugin modifiant à la volée le thème du site pour le rendre merveilleusement lisible sur un iPhone (le site dit Blackberry et Android aussi, mais je n&#8217;ai pas de terminal pour tester).</p>
<p>Ca se passe comme d&#8217;habitude pour un plugin bien fait sous WordPress :<br />
- <a href="http://wordpress.org/extend/plugins/wptouch/" target="_blank">Téléchargez le zip</a> dans <code>/votre/serveur/wp-content/plugins/</code><br />
- Dézippez la chose, ça crée un sous-répertoire wptouch dans &#8220;plugins&#8221;<br />
- Rendez-vous dans la page d&#8217;administration de WordPress, section plugins, pour l&#8217;activer. C&#8217;est-tout-ça-marche.</p>
<p>Il y a des options, notamment pour l&#8217;intégration de pubs Ad-Sense. Je n&#8217;ai pas cherché, les sites sur lesquels je l&#8217;ai activé s&#8217;en passeront très bien.</p>
<p>Un must !</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/12/14/wordpress-sur-un-iphone-blackberry-android-plugin-wptouch/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Monitoring (vite fait&#777;) du volume de mails</title>
		<link>http://michauko.org/blog/2009/12/09/monitoring-vite-fait-du-volume-de-mails/</link>
		<comments>http://michauko.org/blog/2009/12/09/monitoring-vite-fait-du-volume-de-mails/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 07:21:18 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[mails]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[isoqlog]]></category>
		<category><![CDATA[mailgraph]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=991</guid>
		<description><![CDATA[Hop, juste pour y penser. Sur votre beau serveur de mails, pensez à mettre ces 2 outils (surtout mailgraph en fait) : aptitude install isoqlog mailgraph Il n&#8217;y a rien à dire sur le paramétrage de mailgraph. Dans le cas d&#8217;une installation standard de Debian, vous trouverez le rapport temps réel sur http://le.serveur/cgi-bin/mailgraph.cgi. Si vous [...]]]></description>
			<content:encoded><![CDATA[<p>Hop, juste pour y penser. Sur votre beau serveur de mails, pensez à mettre ces 2 outils (surtout mailgraph en fait) :</p>
<pre>aptitude install isoqlog mailgraph</pre>
<p>Il n&#8217;y a rien à dire sur le paramétrage de mailgraph. Dans le cas d&#8217;une installation standard de Debian, vous trouverez le rapport temps réel sur http://le.serveur/cgi-bin/mailgraph.cgi.</p>
<p>Si vous avez désactivé l&#8217;alias <code>/cgi-bin/</code> de la conf standard Apache, débrouillez-vous pour accéder au script <code>/usr/lib/cgi-bin/mailgraph.cgi</code>.<br />
Voici le genre de rapport que l&#8217;on obtient : <a href="http://www.stat.ee.ethz.ch/mailgraph.cgi">http://www.stat.ee.ethz.ch/mailgraph.cgi</a>.</p>
<p>Pour isoqlog, il ne vous demande que des choses faciles pendant l&#8217;installation : nom du domaine, type de logs (postfix, exim etc). Les rapports tournent en crontab journalière, résultats dans <code>/var/www/isoqlog/</code>. Par défaut, c&#8217;est donc http://le.serveur/isoqlog/ pour accéder.</p>
<p>Voilà, statistiquez bien.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/12/09/monitoring-vite-fait-du-volume-de-mails/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Montage NTFS et CIFS en fstab</title>
		<link>http://michauko.org/blog/2009/12/02/montage-ntfs-et-cifs-en-fstab/</link>
		<comments>http://michauko.org/blog/2009/12/02/montage-ntfs-et-cifs-en-fstab/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 16:30:08 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[autres outils]]></category>
		<category><![CDATA[ligne de commande]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[CIFS]]></category>
		<category><![CDATA[ntfs]]></category>
		<category><![CDATA[ntfs-3g]]></category>
		<category><![CDATA[samba]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=983</guid>
		<description><![CDATA[Ca peut s&#8217;avérer pratique parfois, et lors d&#8217;une automatisation d&#8217;un traitement quelconque, carrément indispensable. Voici un rapide aide-mémoire pour déclarer en /etc/fstab des montages CIFS (montage de répertoires partagés Windows via Samba) et NTFS (des partitions, disques USB etc, mais en lecture/écriture, pas lecture seule). D&#8217;abord, s&#8217;assurer que vous avez le paquet ntfs-3g (si besoin [...]]]></description>
			<content:encoded><![CDATA[<p>Ca peut s&#8217;avérer pratique parfois, et lors d&#8217;une automatisation d&#8217;un traitement quelconque, carrément indispensable. Voici un rapide aide-mémoire pour déclarer en <code>/etc/fstab</code> des montages CIFS (montage de répertoires partagés Windows via Samba) et NTFS (des partitions, disques USB etc, mais en lecture/écriture, pas lecture seule).</p>
<p>D&#8217;abord, s&#8217;assurer que vous avez le paquet <code>ntfs-3g</code> (si besoin d&#8217;écriture sur le disque/partition NTFS) et le paquet <code>smbfs</code> (Samba FileSystem) pour les partages CIFS.</p>
<p>Vous pouvez tester facilement avec des commandes genre <code>mount -t cifs</code> ou <code>mount -t ntfs-3g</code>. Dans le cas du CIFS, il  y a certaines options à passer, notamment l&#8217;utilisateur, le domaine etc. C&#8217;est presque plus simple dans <code>/etc/fstab</code>.</p>
<p>Bref, voici la chose illustrée par l&#8217;exemple :</p>
<pre>srv:/etc# cat fstab
###
# blabla habituel
### puis :
//srvwin1/partage1      /mnt/srv1prt1      cifs    uid=root,credentials=/etc/cifs.credentials,domain=MONDOM 0 0
//srvwin1/partage2      /mnt/srv1prt2      cifs    uid=root,credentials=/etc/cifs.credentials,domain=MONDOM 0 0
//srvwin2/blabla1       /mnt/srv2prt1      cifs    uid=root,credentials=/etc/cifs.credentials,domain=MONDOM 0 0
/dev/sdb1               /mnt/usbsdb1       ntfs-3g defaults,locale=fr_FR.utf8 0 0</pre>
<p>Dans cet exemple tout simple, on monte 3 partages CIFS, mappé sur l&#8217;utilisateur root de la machine linux, en se signant avec les informations contenues dans <code>/etc/cifs.credentials</code> (ci-dessous) sur le domaine NT &#8220;MONDOM&#8221;.<br />
Et dans /mnt/usbsdb1, on monte un disque USB (ou SCSI ou SATA d&#8217;ailleurs), en NTFS lecture/écriture.</p>
<p>Ensuite, de simples &#8220;<code>mount /mnt/celui_que_vous_voulez</code>&#8221; pour monter.</p>
<p>Le contenu de /etc/cifs.credentials est de la forme :</p>
<pre>username=mon_login_windows
password=mon_p4ss</pre>
<p>Il peut évidemment être différent pour chaque montage. Pensez à le protéger (<code>chmod 600 /etc/cifs.credentials</code>)</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/12/02/montage-ntfs-et-cifs-en-fstab/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Monter un serveur NTP, configurer les clients Windows et Linux</title>
		<link>http://michauko.org/blog/2009/11/13/monter-un-serveur-ntp-configurer-les-clients-windows-et-linux/</link>
		<comments>http://michauko.org/blog/2009/11/13/monter-un-serveur-ntp-configurer-les-clients-windows-et-linux/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 14:44:50 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[autres outils]]></category>
		<category><![CDATA[ligne de commande]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[reseau et sécu]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[GPO]]></category>
		<category><![CDATA[ntp]]></category>
		<category><![CDATA[ntpd]]></category>
		<category><![CDATA[ntpdate-debian]]></category>
		<category><![CDATA[tcpdump]]></category>
		<category><![CDATA[W32Time]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=926</guid>
		<description><![CDATA[Bon, un p&#8217;tit billet aide-mémoire sur la configuration d&#8217;un serveur NTP Linux et des postes Windows et Linux de votre LAN. C&#8217;est un sujet tout bête, mais entre les postes Windows qui ne sont pas très bavards à ce sujet et l&#8217;amalgame, côté Linux, entre les paquets ntp et ntpdate utilisant ou pas des fichiers [...]]]></description>
			<content:encoded><![CDATA[<p>Bon, un p&#8217;tit billet aide-mémoire sur la configuration d&#8217;un serveur NTP Linux et des postes Windows et Linux de votre LAN.<br />
C&#8217;est un sujet tout bête, mais entre les postes Windows qui ne sont pas très bavards à ce sujet et l&#8217;amalgame, côté Linux, entre les paquets <code>ntp</code> et <code>ntpdate</code> utilisant ou pas des fichiers communs de conf, on peut être momentanément perdu. J&#8217;espère être clair par la suite.<span id="more-926"></span></p>
<h1>Préparez le serveur</h1>
<h2>Le paquet qui va bien</h2>
<p>Sur le serveur, installez le paquet &#8220;ntp&#8221;. Faisant office de serveur, il se met à jour (donc il fait office de client, si je ne dis pas connerie). Pas la peine donc d&#8217;installer &#8220;ntpdate&#8221; qui est un autre client possible.<br />
Les options du serveur sont dans <code>/etc/default/ntp.conf</code>, j&#8217;en parle un peu plus bas. Lisez le <code>man</code>.<br />
Les paramètres de <code>/etc/ntp.conf</code> sont :</p>
<pre>serv:~# egrep -v "^#|^$" /etc/ntp.conf
driftfile /var/lib/ntp/ntp.drift
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
server 0.debian.pool.ntp.org iburst dynamic
server 1.debian.pool.ntp.org iburst dynamic
server 2.debian.pool.ntp.org iburst dynamic
server 3.debian.pool.ntp.org iburst dynamic
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
restrict 127.0.0.1
restrict ::1
restrict 10.0.0.0 mask 255.0.0.0 nomodify notrap</pre>
<p>J&#8217;ai juste ajouté la plage 10.0.0.0 (c&#8217;est un exemple) pour autoriser mon LAN à joindre ce serveur.</p>
<h2>Firewalling ?</h2>
<p>Il faudra ouvrir en sortie le port &#8220;ntp&#8221; (123), en UDP, depuis le serveur vers les serveurs amonts. Si c&#8217;est la liste par défaut de <code>/etc/ntp.conf</code>, à savoir les &#8220;*.pool.ntp.org&#8221;, c&#8217;est une longue liste, amenée à évoluer dans le temps je suppose. A vous de voir comment faire. Le plus simple : ouvrir UDP/123 vers le web, point.<br />
Pour que les clients joignent votre serveur, c&#8217;est pareil, il faudra ouvrir le LAN vers votre passerelle, port UDP/123.</p>
<h2>Testez</h2>
<p>Je recommande d&#8217;ajouter <code>-l /var/log/ntp.log</code> dans les options du fichier <code>/etc/default/ntp</code>, soit :</p>
<pre>NTPD_OPTS='-g -l /var/log/ntp.log'</pre>
<p>Puis de redémarrer le service via :</p>
<pre>/etc/init.d/ntpd restart</pre>
<p>Vous verrez dans <code>/var/log/ntp.log</code> si votre serveur se met à jour, de combien de temps etc. <strong>Pensez à enlever ce log ou sinon à mettre en place une rotation de logs qui va avec</strong>.<br />
Ca ressemble à ça :</p>
<pre>13 Nov 11:19:30 ntpd[18381]: synchronized to 91.121.121.160, stratum 2
13 Nov 11:19:30 ntpd[18381]: time reset -0.169417 s
13 Nov 11:19:30 ntpd[18381]: kernel time sync status change 0001
13 Nov 11:23:57 ntpd[18381]: synchronized to 91.121.121.160, stratum 2
13 Nov 11:31:29 ntpd[18381]: synchronized to 91.121.86.143, stratum 2
13 Nov 11:35:30 ntpd[18381]: time reset +0.189846 s
13 Nov 11:35:50 ntpd[18381]: synchronized to 91.121.121.160, stratum 2
13 Nov 11:40:06 ntpd[18381]: synchronized to 81.19.16.225, stratum 2
13 Nov 11:42:57 ntpd[18381]: synchronized to 91.121.121.160, stratum 2</pre>
<p>On est maintenant prêt à dire à notre LAN d&#8217;aller taper sur ce serveur pour régler l&#8217;heure.</p>
<h1>Les postes Windows</h1>
<p>Le service W32Time (&#8220;Horloge Windows&#8221;) est en automatique par défaut depuis Windows XP. Il s&#8217;appuie sur le paramètre qu&#8217;on trouvera dans la clef de registre <code>HKLM/SOFTWARE/Policies/Microsoft/W32Time/Parameters</code>. La clef est &#8220;NtpServer&#8221;.<br />
Il faut donc mettre à jour cette clef, d&#8217;une manière ou d&#8217;une autre.</p>
<h2>&#8230;via des GPO</h2>
<p>Si vous êtes en domaine Windows, le réglage est ici :<br />
<a href="http://michauko.org/blog/wp-content/uploads/2009/11/20091113_1502521.png"><img src="http://michauko.org/blog/wp-content/uploads/2009/11/20091113_1502521-150x150.png" alt="NTP" title="NTP" width="150" height="150"  /></a></p>
<p>En gros, vous indiquez le nom de votre serveur.<br />
Vous pouvez forcer la mise à jour des GPO sur un poste, pour tester, via <code>gpupdate /force</code>.</p>
<h2>En pas GPO (domaine Samba-sans-GPO, Workgroup etc)</h2>
<p>Il faut modifier la clef mentionnée plus haut, d&#8217;une manière ou d&#8217;une autre ; et probablement relancer le service &#8220;Horloge Windows&#8221;.</p>
<h2>Sous Windows, comment tester</h2>
<p>Le service Windows ne raconte rien et les &#8220;event logs&#8221; systèmes, c&#8217;est chiant.<br />
Je suggère sur le serveur, un joli <code>tcpdump</code> qui vous montrera qui fait quoi :</p>
<pre>serv:~# tcpdump -i eth0 dst port ntp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:14:49.071538 IP pc315.maboite.fr.ntp > imag.imag.fr.ntp: NTPv3, symmetric active, length 48
15:14:49.172627 IP imag.imag.fr.ntp > pc315.maboite.fr.ntp: NTPv3, symmetric active, length 48
15:15:29.305824 IP pc666.maboite.fr.ntp > serv.maboite.fr.ntp: NTPv3, symmetric active, length 48
15:15:29.306158 IP serv.maboite.fr.ntp > pc666.maboite.fr.ntp: NTPv3, symmetric active, length 48
</pre>
<p>Là, on voit un &#8220;pc315&#8243; qui continue de demander à l&#8217;extérieur (le firewall l&#8217;autorise pour l&#8217;instant) et un pc666 qui a prit le pli.</p>
<h1>Les postes Linux</h1>
<p>Installez le paquet &#8220;ntpdate&#8221; et planifiez <code>ntpdate-debian</code> en crontab. Le manuel explique : ntpdate-debian utilise le fichier <code>/etc/default/ntpdate</code> pour la configuration (liste des serveurs de temps etc). Il contient, sans les commentaires :</p>
<pre>NTPDATE_USE_NTP_CONF=yes
NTPSERVERS="0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org"
NTPOPTIONS=""</pre>
<p>Mais, dans ce cas, à cause du &#8220;yes&#8221;, il utilise la conf de l&#8217;éventuel <code>/etc/ntp.conf</code> installé via le serveur NTP (paquet ntp). Comme on ne l&#8217;a pas mis sur les clients (ça sert à rien de faire tourner un serveur NTP), il faut donc soit passer <code>NTPDATE_USE_NTP_CONF</code> à &#8220;no&#8221;, soit ne pas planifier <code>ntpdate-debian</code>, mais <code>ntpdate</code> avec une tartine de paramètres.<br />
Si vous mettez &#8220;no&#8221;, il faudra indiquer dans NTPSERVERS au moins / uniquement votre serveur du LAN. J&#8217;ai constaté qu&#8217;avec le nom de machine, ça ne passait pas. Mais avec l&#8217;IP, c&#8217;est OK. A creuser.</p>
<p>Pigé ? moi-même, je me perds régulièrement là-dedans.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/11/13/monter-un-serveur-ntp-configurer-les-clients-windows-et-linux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Arborescence de proxy &#8220;Squid&#8221;, calamaris sous Windows&#8230;</title>
		<link>http://michauko.org/blog/2009/11/03/arborescence-de-proxy-squid-calamaris-sous-windows/</link>
		<comments>http://michauko.org/blog/2009/11/03/arborescence-de-proxy-squid-calamaris-sous-windows/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 15:04:56 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[autres outils]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[ActivePERL]]></category>
		<category><![CDATA[calamaris]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[squid]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=902</guid>
		<description><![CDATA[Pour les planet-libristes extrêmistes : oui je parle aussi de Windows, pas la peine de balancer vos trolls habituels. Je parle ici d&#8217;un environnement mixte Windows/Linux sur fond avant tout de Squid, Calamaris et PERL. Hop, Dans une infra avec un proxy central et des sites distants reliés par des connexions assez lentes (et pas [...]]]></description>
			<content:encoded><![CDATA[<p><em>Pour les planet-libristes extrêmistes : oui je parle aussi de Windows, pas la peine de balancer vos trolls habituels. Je parle ici d&#8217;un environnement mixte Windows/Linux sur fond avant tout de Squid, Calamaris et PERL.</em></p>
<p>Hop,<br />
Dans une infra avec un proxy central et des sites distants reliés par des connexions assez lentes (et pas d&#8217;accès web direct), j&#8217;ai décidé de mettre en place des proxies &#8220;fils&#8221; sur les sites distants, pour soulager l&#8217;inter-site.<br />
Manque de bol, à distance, uniquement des serveurs Windows sous la main&#8230;<br />
Bon, squid existe sous Windows. Et &#8220;calamaris&#8221; n&#8217;est que du PERL. Ca doit pouvoir le faire.<br />
Je fais cet article comme aide-mémoire, comme souvent, et surtout parce-que quand il faut automatiser des choses sous Windows, on voit vite que c&#8217;est vraiment la merde&#8230; Alors pour ne pas chercher 107 ans la prochaine fois, voici les quelques commandes à enchainer.</p>
<p>Et puis je n&#8217;avais pas envie/possibilité d&#8217;installer un superbe proxy-by-Microsoft, genre ISA ou je ne sais plus comment il s&#8217;appelle. Pas la peine non plus de chercher les ennuis quand on a un squid qui marche très bien <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>Je parle sur mon blog <a href="http://michauko.org/blog/?s=squid" target="_blank">à différents moments de Squid</a>, ou de proxy. Ca me fait penser que je n&#8217;ai rien écrit sur la mise en place d&#8217;un squid tout bête. On va considérer que c&#8217;est acquis. Sinon, avec le présent article et les autres, vous devriez avoir une certaine aide.</em><span id="more-902"></span></p>
<h1>Installation et configuration des squid Windows</h1>
<p>Je passe sur le <del datetime="2009-11-02T14:05:38+00:00">aptitude install </del>téléchargement à la main du gros zip contenant squid pour Windows, qu&#8217;on trouve à partir du <a href="http://www.squid-cache.org/" target="_blank">site officiel</a> (faut chercher un peu. Bon OK, <a href="http://squid.acmeconsulting.it/download/squid.html" target="_blank">c&#8217;est là</a>). J&#8217;ai pris la même version que pour Debian Lenny, histoire d&#8217;interconnecter des squid de même génération&#8230; sait-on jamais. C&#8217;est donc la 2.7-STABLE7 (en fait ça doit être 2.7-STABLE5 en Debian, il me semble).<br />
Ensuite, j&#8217;ai dézippé comme un cochon dans <code>c:\squid\</code> et adapté la conf. Ce que je décris ci-dessous.</p>
<h2>Configuration minimale</h2>
<p>Il faut copier les fichiers <code>c:\squid\etc\*conf.default</code> en <code>c:\squid\etc\*conf</code> et adapter les contenus, notamment dans <code>squid.conf</code> :</p>
<ul>
<li>
Adapter &#8220;acl localnet src&#8221; pour votre sous-réseau
</li>
<li>
Déclarer le cache à utiliser : cache_dir ufs d:/squid/var/cache 4000 16 256
</li>
<li>
Taille limite des objets mis en cache, à voir suivant votre cas : maximum_object_size 81920 KB
</li>
<li>
Différents répertoires pour les fichiers de logs : cache_log d:/squid/var/logs/cache.log
</li>
<li>
cache_store_log d:/squid/var/logs/store.log
</li>
<li>
netdb_filename d:/squid/var/logs/netdb.state
</li>
</ul>
<p>J&#8217;ai voulu séparer les logs sur un disque à part. <strong>A noter les &#8220;/&#8221; (et non pas des &#8220;\&#8221;).</strong></p>
<h2>Service, initialisation du cache</h2>
<p>Ensuite, il faut installer le service et créer le cache (j&#8217;ai laissé le format de cache par défaut, une arborescence de répertoires avec des fichiers aux noms codés) :</p>
<pre>cd c:\squid\sbin
squid -k
squid -i
net start Squid</pre>
<p>A noter que le nom du service n&#8217;est pas spécifié, ce sera donc par défaut &#8220;Squid&#8221;, c&#8217;est important pour la rotation de logs.<br />
<strong>Le &#8220;<code>net start Squid</code>&#8221; ne devrait être fait qu&#8217;après configuration du lien avec le proxy &#8220;père&#8221; central, ce qu&#8217;on n&#8217;a pas encore fait. Mais bon, je le montre maintenant pour illustrer.</strong></p>
<p>En images, ça donne :<br />
<div id="attachment_903" class="wp-caption alignleft" style="width: 677px"><a href="http://michauko.org/blog/wp-content/uploads/2009/11/20091029_165018.png"><img src="http://michauko.org/blog/wp-content/uploads/2009/11/20091029_165018.png" alt="squid windows" title="Installation de Squid sous Windows" width="667" height="330" class="size-full wp-image-903" /></a><p class="wp-caption-text">Installation de Squid sous Windows</p></div></p>
<h2>Déclaration du squid &#8220;père&#8221;</h2>
<p>Dans la conf, il faut simplement caser un :</p>
<pre>cache_peer proxycentral.maboite.fr parent 3128 3130 name=pxycentral
acl ftp proto FTP
always_direct allow ftp</pre>
<p>J&#8217;explique : on déclare que ce proxy a un père (parent), sur le port 3128, machine &#8220;proxycentral.maboite.fr&#8221;. On attaquera l&#8217;interrogation du contenu de son cache via le protocole <a href="http://en.wikipedia.org/wiki/Internet_Cache_Protocol" target="_blank">ICP</a> (UDP/3130) et on le surnomme &#8220;pxycentral&#8221; dans les logs <code>access.log</code> histoire d&#8217;y voir clair.<br />
Evidemment, le proxy central doit être ouvert sur le port TCP/3128 et UDP/3130 depuis les proxies &#8220;fils&#8221;.</p>
<h2>Rotation de logs</h2>
<p>Pour la rotation de logs, c&#8217;est en général un grand moment de bonheur pur sous Windows lorsqu&#8217;on amène un outil &#8220;du monde libre, tout ça&#8221; dans Windows. Heureusement ce coup-ci, Squid embarque ce qu&#8217;il faut :</p>
<pre>c:
cd \squid\sbin
squid -k rotate -n Squid</pre>
<p>Reste à mettre ça en &#8220;tâche planifiée&#8221; Windows.</p>
<p>Maintenant que ça tourne (testez), reste à synthétiser les logs, comme on le ferait naturellement sous Linux.</p>
<h1>calamaris sous Windows, youpiiiii</h1>
<p>Dans mon cas, ramener les logs sur un Linux qui aurait fait tourné calamaris était compliqué à mettre en oeuvre. Dans votre cas aussi, je suppose, car la rotation des logs fait que les fichiers sont renommés. Donc même avec un rsync (ou truc du genre), vous allez vous resynchroniser des Mo de logs (compressés éventuellement) à chaque fois.<br />
Bref, j&#8217;ai opté pour un déploiement de PERL sur les serveurs distants et une &#8220;tâche planifiée&#8221; pour générer les pages statiques de statistiques des &#8220;fils&#8221; Squid.</p>
<p>Sous Windows, rien n&#8217;est fourni, je noterai donc ici la ligne de commande bien longue qu&#8217;on n&#8217;a pas besoin de chercher sous Linux, car les scripts &#8220;cron&#8221; sont fournis avec le paquet calamaris. Sous Debian en tout cas.</p>
<p>J&#8217;ai donc utilisé ActivePerl et récupéré calamaris en .tar.gz sur le site de l&#8217;éditeur. Manque de bol, j&#8217;ai retrouvé <a href="http://michauko.org/blog/2009/04/21/calamaris-en-debian-stable-ca-bug/" target="_blank">le même bug que décrit ici</a>, donc j&#8217;ai fini par recopier le script perl <code>/usr/bin/calamaris</code> issu de ma Debian, patché pour corriger ledit bug.<br />
Ensuite, plutôt que de ramer avec le fichier de conf, j&#8217;appelle calamaris en ligne de commande, via une &#8220;tâche planifiée&#8221;, et ça fait le boulot. C&#8217;est pas terrible mais bon, ça marche.<br />
Pire que tout, pour générer les stats &#8220;weekly&#8221; et &#8220;monthly&#8221;, je recalcule tout en concaténant les différents &#8220;access.log.*&#8221; issus des rotations de logs, sur <em>X</em> jours.</p>
<p>En résumé, ça donne :</p>
<ul>
<li>
Installation de ActivePERL
</li>
<li>
Création dans C:\PERL\lib d&#8217;un répertoire calamaris avec les 3 fichiers .pm (modules PERL) pour la génération de graphiques dans les stats ; je n&#8217;ai pas trouvé comment lui spécifier d&#8217;utiliser ces modules, sans avoir à les copier dans PERL/lib. Je n&#8217;ai pas trop cherché non plus. Ca doit être avec &#8220;-I&#8221; ou quelque chose comme ça.
</li>
<li>
Recopie du script &#8220;calamaris&#8221; issu de Debian, quelque part sur le Windows
</li>
<li>
Mise en place de tâches planifiées appelant des &#8220;.bat&#8221; dans ce genre là :</p>
<pre>@echo off
d:
cd D:\calamaris-2.99.4.0
type d:\squid\var\logs\access.log.0 | perl calamaris -a -F html,graph -H lookup --output-path d:\calamaris\output\daily</pre>
</li>
</ul>
<p>Notez que GD::Graph, nécessaire pour les graphiques, est installé par défaut avec ActivePERL.</p>
<p>Et voilà, mettez tout ça en oeuvre et ça devrait le faire.</p>
<h1>Quelques remarques en vrac</h1>
<p>Si tous les codes de retours de Squid ne vous parlent pas, <a href="http://wiki.squid-cache.org/SquidFaq/SquidLogs?highlight=%28%28SquidFaq|SquidLogs%29%29" target="_blank">lisez cette documentation là</a>.</p>
<p>Comme je parle dans cet article d&#8217;un environnement mixte Windows &#038; Linux, on peut parler de WSUS. Ces considérations pour Squid concernant les mises à jour Windows peuvent vous intéresser : <a href="http://wiki.squid-cache.org/SquidFaq/WindowsUpdate" target="_blank">http://wiki.squid-cache.org/SquidFaq/WindowsUpdate</a></p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/11/03/arborescence-de-proxy-squid-calamaris-sous-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>postfix : utilisateurs &#8220;virtuels&#8221; MySQL ; accès POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j&#8217;ai tout mis dans le titre)</title>
		<link>http://michauko.org/blog/2009/10/20/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre/</link>
		<comments>http://michauko.org/blog/2009/10/20/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 14:48:16 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[mails]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[courier-authdaemon]]></category>
		<category><![CDATA[courier-imap]]></category>
		<category><![CDATA[courier-imap-ssl]]></category>
		<category><![CDATA[courier-pop]]></category>
		<category><![CDATA[courier-pop-ssl]]></category>
		<category><![CDATA[imap]]></category>
		<category><![CDATA[IMAPS]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[POP3]]></category>
		<category><![CDATA[POP3s]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[postfix-mysql]]></category>
		<category><![CDATA[SASL]]></category>
		<category><![CDATA[TLS]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=829</guid>
		<description><![CDATA[Introduction Hop, Après ma doc d&#8217;initiation Debian, où un rapide chapitre est consacré au montage d&#8217;un serveur postfix, spamassassin, greylisting etc, dans une configuration simple, Après cet article sur le montage complet cette fois, en incluant amavisd-new, anti-virus etc, => Voici le complément idéal, par exemple en PME (et même plus gros) : Gestion d&#8217;utilisateurs [...]]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>Hop,<br />
Après <a href="http://michauko.org/docs/debian_testing/">ma doc d&#8217;initiation Debian</a>, où un rapide chapitre est consacré au montage d&#8217;un serveur postfix, spamassassin, greylisting etc, dans une configuration simple,<br />
Après <a href="http://michauko.org/blog/2009/09/21/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc/">cet article sur le montage complet cette fois</a>, en incluant amavisd-new, anti-virus etc,<br />
=> Voici le complément idéal, par exemple en PME  (et même plus gros) :</p>
<ul>
<li>
Gestion d&#8217;utilisateurs virtuels, entendez par là  &#8220;utilisateurs définis en base de données et non pas utilisateurs réels de l&#8217;OS&#8221;.
</li>
<li>Mise en place de tout ce qu&#8217;il faut pour lire les mails (POP3, POP3S, IMAP, IMAPS) via les outils &#8220;courier-*&#8221;
</li>
<li>Authentification via SASL
</li>
<li>Mise en place d&#8217;authentification sécurisée plus forte pour l&#8217;envoi (TLS).
</li>
</ul>
<p>Pour le webmail, j&#8217;en ai parlé déjà  quelques fois sur mon blog et dernièrement, la version 0.3 de roundcubemail a fait de gros progrès par rapport à  la 0.1. Ca s&#8217;installe en 3 clics. Si j&#8217;ai le temps je ferai un article, mais c&#8217;est mal barré.<span id="more-829"></span></p>
<h2>Situation de départ</h2>
<p>Avoir un serveur postfix correctement monté, avec (ou pas) amavis, spamassassin, un anti-virus, du greylisting, un nom correct etc. Bref, un serveur qui fonctionne et qui accepte les mails correspondant à  des Maildir d&#8217;utilisateur de l&#8217;OS. En gros, ce qui est <a href="http://michauko.org/blog/2009/09/21/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc/">expliqué là </a>.<br />
Je ne parlerai pas d&#8217;ouverture de ports réseaux etc, mais ça tombe sous le sens. Ni du fait qu&#8217;il vous faudra une base MySQL en état de marche.</p>
<p>Je n&#8217;ai pas trouvé de doc officielle sur le sujet. En gros, on a <code>postfix-mysql</code> qui permet de faire le lien entre le serveur de mails et la base, mais rien dans un gros fichier README qu&#8217;on a habituellement avec ce genre de paquet. Ou alors je l&#8217;ai loupé.<br />
Le &#8220;<em>postfix mysql howto</em>&#8221; est juste résumé à  ça : <a href="http://www.postfix.org/MYSQL_README.html">http://www.postfix.org/MYSQL_README.html</a> et ça : <a href="http://www.postfix.org/mysql_table.5.html">http://www.postfix.org/mysql_table.5.html</a>. Et pour le coup, ce n&#8217;est pas très sexy.</p>
<p>J&#8217;ai donc compilé tout un tas de différents articles le sujet, parfois incomplet, parfois des articles décrivant des méthodes à grand coup de compilation-c-est-pénible-et-stupide-pour-suivre-les-mises-à -jour etc. Parfois sans gestion de quota, parfois avec. Et en général, en expliquant rien du tout. Donc dans mon cas, je tâche d&#8217;expliquer ce qu&#8217;on fait.</p>
<p>Alors, comme à  mon habitude, je laisserai trainer 2/3 bugs que j&#8217;ai pu rencontrer (de ma faute), ça peut permettre d&#8217;aider si vous faites les mêmes erreurs. Et on y apprend l&#8217;existence de quelques outils pour tester en ligne de commande.</p>
<p><strong>Remarque pour la partie quota qui ne fonctionne pas nativement dans postfix</strong>, je la passe sous silence volontairement au début et y consacre un chapitre à  la fin. En effet, c&#8217;est relativement dissocié de tout le reste et ça implique de recompiler postfix (ou d&#8217;utiliser un .deb fourni par je ne sais qui, mais vous êtes dépendant de lui pour les mises à  jour). Comme certains se moqueront des quotas, je le traite à  la fin. Beaucoup de guides de mise en place mélangent tout et prévoient des fonctions qu&#8217;ils n&#8217;exploitent pas. J&#8217;essaye pour ma part de faire des briques dissociables.</p>
<p>J&#8217;ai aussi tout installé sur un unique serveur. Ce n&#8217;est pas une nécessité, sur une grosse installation par exemple.</p>
<h2>Autres documentations</h2>
<p>A ce propos, j&#8217;ai lu à  peu près tout ce qui suit (et plein d&#8217;autres) pour monter le serveur, notamment les 2 premiers lien. J&#8217;ai même en gros simplement repompé, traduit et expliqué :</p>
<ul>
<li>
<a href="http://library.linode.com/email-guides/postfix/postfix-courier-mysql-debian-5-lenny" target="_blank">http://library.linode.com/email-guides/postfix/postfix-courier-mysql-debian-5-lenny</a>
</li>
<li>
<a href="http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny" target="_blank">http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny</a>
</li>
<li>
Quelques survols de docs ici : <a href="http://www.postfix.org/docs.html" target="_blank">http://www.postfix.org/docs.html</a>
</li>
</li>
<li>Un psycho de la recompilation : <a href="http://www.phparchitecture.com/howto_show.php?id=2">http://www.phparchitecture.com/howto_show.php?id=2</a>, mais y&#8217;a 2/3 trucs à  prendre
</ul>
<h2>Grandes étapes de la procédure</h2>
<p>En gros, on va :</p>
<ul>
<li>
1) Installer les applicatifs,
</li>
<li>
Créer la structure en base,
</li>
<li>
Décrire cette structure à  postfix pour qu&#8217;il sache l&#8217;interroger
</li>
<li>
2) Créer ce qu&#8217;il faut pour stocker les boites virtuelles
</li>
<li>
Faire quelques tests de livraison de mails pour valider la partie &#8220;utilisateurs définis en base&#8221;
</li>
<li>
3) Paramétrer les outils pour récupérer les mails (courier-POP, IMAP et versions sécurisées par SSL)
</li>
<li>
Tester ces protocoles pour la récupération des mails
</li>
<li>
Voir l&#8217;analyse de quelques erreurs sur la partie &#8220;courier&#8221;
</li>
<li>
4) Paramétrer les mécanismes d&#8217;authentification pour l&#8217;envoi (SASL, TLS)
</li>
<li>
Tester l&#8217;envoi, en TLS ou pas
</li>
<li>
Voir l&#8217;analyse de quelques erreurs sur la partie authentification pour l&#8217;envoi
</li>
<li>
5) Optionnel : activer les quotas
</li>
<li>
Et enfin, voir ce que je n&#8217;ai pas traité
</li>
</ul>
<h1>Installation des paquets</h1>
<p>Pour une fois, tout ne descend pas par dépendance, car les différents modules d&#8217;authentification (identification via une base MySQL) ne sont pas obligatoires, donc pas de dépendance. Donc pour une fois il faut absolument tout copier-coller. Pour illustrer, installer <code>courier-authlib</code> n&#8217;amène pas forcément <code>courier-authlib-mysql</code>.</p>
<p>On a donc :</p>
<pre>
aptitude install postfix-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl postfix-tls  libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl courier-authdaemon courier-authlib-mysql</pre>
<p>Vous pouvez à  la limite zapper certains, comme le POP, si vous ne comptez pas l&#8217;utiliser. Notez que les webmails tapent en IMAP, si vous ne le saviez pas.</p>
<h1>Connexion postfix <-> MySQL</h1>
<h2>Création de la base de données</h2>
<p>J&#8217;ai vu des définitions de base hyper complète, pour désactiver le POP (ou je ne sais quoi d&#8217;autre) par utilisateur. Sachez qu&#8217;il sera toujours temps d&#8217;ajouter une colonne à  une table, de mettre des valeurs par défaut et d&#8217;ajouter une règle dans postfix pour prendre en compte une nouvelle fonctionnalité (c&#8217;est d&#8217;ailleurs ce qu&#8217;on fera pour les quotas de boîtes mails). Donc faisons simple au début.</p>
<p>On crée une base et un utilisateur dédié, avec des droits pas trop larges. Une fois connecté en root dans votre base (exemple : <code>mysql -u root -p</code>), on crée la base et donne des droits à cet utilisateur qu&#8217;on crée au passage :</p>
<pre>mysql> create database postfix;
Query OK, 1 row affected (0.00 sec)

mysql> grant select,insert,update,delete on postfix.* TO 'mail_adm'@'localhost' identified by 'monpassadmin';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)</pre>
<blockquote><p>ATTENTION : dans toute la suite, le nom de la base, le nom des tables, les identifiants etc sont à  modifier pour refléter votre installation. Attention à  ne pas copier-coller trop vite.</p></blockquote>
<p>Ensuite, dans la base &#8220;postfix&#8221;, on crée quelques tables :</p>
<pre>use postfix;

CREATE TABLE domains (
        domain varchar(50) NOT NULL,
        PRIMARY KEY (domain)
);
CREATE TABLE forwardings (
        source varchar(80) NOT NULL,
        destination TEXT NOT NULL,
        PRIMARY KEY (source)
);
CREATE TABLE users (
        email varchar(80) NOT NULL,
        password varchar(20) NOT NULL,
        PRIMARY KEY (email)
);
CREATE TABLE transport (
        domain varchar(128) NOT NULL default '',
        transport varchar(128) NOT NULL default '',
        UNIQUE KEY domain (domain)
);</pre>
<p>Ces 4 tables permettront, dans l&#8217;ordre, de :</p>
<ul>
<li>
définir la liste des domaines qu&#8217;on gère
</li>
<li>
créer des alias (renvoyer toto@domaine.fr vers tata@blabla.com + titi@blibli.com)
</li>
<li>
définir nos comptes et leurs propriétés
</li>
<li>
définir une table de transport, au besoin
</ul>
<h2>Création des requêtes pour savoir comment interroger ces tables</h2>
<p>Le principe est le suivant : on a créé des tables avec des noms de colonnes et de tables libres (on aurait pu tout changer), on doit donc indiquer à  postfix comment vérifier un mot de passe, voir s&#8217;il y a un forward etc. Pour chaque action, on a une directive dans <code>/etc/postfix/main.cf</code> et un fichier de conf décrivant la base et la requête.<br />
Le truc énorme, c&#8217;est qu&#8217;on pourrait ajouter n&#8217;importe quelle colonne (attribut) pour ajouter un test. Exemple stupide : le password est OK entre 8h et 20h, sinon impossible de relever ses mails.<br />
On ajouterait une colonne et une clause supplémentaire dans le WHERE, tenant compte de l&#8217;heure et d&#8217;horaires autorisés pour tel utilisateur.</p>
<p>Voici les 4 fichiers de conf pour les 4 tables précédement créées :<br />
Fichier <code>/etc/postfix/mysql-virtual_domains.cf</code> :</p>
<pre>user = mail_adm
password = monpassadmin
dbname = postfix
query = SELECT domain AS virtual FROM domains WHERE domain=&apos;%s&apos;
hosts = 127.0.0.1</pre>
<p>Fichier <code>/etc/postfix/mysql-virtual_forwardings.cf</code> :</p>
<pre>user = mail_adm
password = monpassadmin
dbname = postfix
query = SELECT destination FROM forwardings WHERE source=&apos;%s&apos;
hosts = 127.0.0.1</pre>
<p>Fichier <code>/etc/postfix/mysql-virtual_mailboxes.cf</code> :</p>
<pre>user = mail_adm
password = monpassadmin
dbname = postfix
query = SELECT CONCAT(SUBSTRING_INDEX(email,&apos;@&apos;,-1),&apos;/&apos;,SUBSTRING_INDEX(email,&apos;@&apos;,1),&apos;/&apos;)
        FROM users WHERE email=&apos;%s&apos;
hosts = 127.0.0.1</pre>
<p>Fichier <code>/etc/postfix/mysql-virtual_transports.cf</code> :</p>
<pre>user = mail_adm
password = monpassadmin
dbname = postfix
query = SELECT transport FROM transport WHERE domain=&apos;%s&apos;
hosts = 127.0.0.1</pre>
<p>Ensuite on sécurise ces fichiers qui contiennent des infos sensibles sur la base d&#8217;authentification de mails :</p>
<pre>chown root:postfix /etc/postfix/mysql*cf
chmod 640 /etc/postfix/mysql*cf</pre>
<h2>Création de la structure de stockage des boîtes</h2>
<p>Le principe est le suivant : on indique un répertoire racine, avec un utilisateur dédié sous lequel tout est stocké.<br />
On aura une belle arborescence de ce type :</p>
<pre>/ma/racine/des/maildirs/
        - /mon.domaine.fr/
                - user1
                        - cur
                        - new
                        - tmp
                        + .autre.sous.rep.de.maildir.genre.Sent
                + user2
        - /autre.domaine.a.moi.fr/
                + userX</pre>
<p>Donc, disons que que le répertoire racine de stockage des boîtes mails sera <code>/vmailboxes</code>. On crée l&#8217;utilisateur avec un ID arbitraire :</p>
<pre>groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /vmailboxes -m</pre>
<p>Attention, vous allez aussi recopier le contenu de /etc/skel dans /vmailboxes, le home de &#8220;vmail&#8221;. Ce n&#8217;est pas forcément utile. Adaptez au besoin.</p>
<h2>On indique tout ça à  postfix</h2>
<p>Dans un premier temps, je n&#8217;ajoute pas toute la conf dans <code>/etc/postfix/main.cf</code>. On va y aller progressivement vu ce qu&#8217;on vient d&#8217;installer. On ajoute donc :</p>
<pre>virtual_alias_domains =
virtual_alias_maps = hash:/etc/postfix/virtual,proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /vmailboxes
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_create_maildirsize = yes
virtual_maildir_extended = yes
transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps \
             $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains \
             $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps \
             $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
</pre>
<p>Les fichiers de conf MySQL en &#8220;mode proxy&#8221; (si on peut dire) permettent d&#8217;optimiser les accès en conservant en mémoire le contenu. Pratique pour éviter une tonne d&#8217;accès disque inutile.</p>
<p><em>N&#8217;oubliez pas de générer le fichier virtual.db, la &#8220;version base de données&#8221; associée au fichier &#8220;virtual&#8221;. Il vous sert à faire suivre par exemple certains comptes locaux vers d&#8217;autres adresses e-mails. Pour centraliser vos remontées de serveur autre part.</em></p>
<p>Rechargez postfix, ça devrait bien se passer. Allez voir dans <code>/var/log/mail.info</code> ou <code>syslog</code> sinon.<br />
On va pouvoir tester.</p>
<h2>Quelques tests de livraison de mails</h2>
<p>Pour créer une boîte, il faudra au minimum :</p>
<ul>
<li>
Avoir déclaré le domaine qu&#8217;on gère
</li>
<li>
Avoir déclaré le compte
</li>
<li>
Avoir envoyé un mail de bienvenue, localement, pour forcer la création de boîte (arborescence
</li>
<li>
Eventuellement avoir ajouté des sous-répertoires pour que le webmail (si vous en mettez un) soit content : Sent, Trash, Drafts, Junk.<br />
</il></ul>
<h3>Ajout d&#8217;un domaine</h3>
<p>Tout comme en postfix &#8220;normal&#8221;, on indique dans &#8220;mydestination&#8221; la liste des noms de domaines gérés, il faut ici les indiquer dans la base. Et les supprimer de &#8220;mydestination&#8221; si vous les gériez localement jusqu&#8217;alors. On crée simplement un enregistrement en base :</p>
<pre>INSERT INTO domains (domain) VALUES (&apos;mxtest.mondomaine.fr&apos;);</pre>
<p>(Je suppose que <code>mxtest.mondomaine.fr</code> existe et que l&#8217;enregistrement MX existe aussi et pointe vers notre serveur.</p>
<h3>Création d&#8217;un utilisateur</h3>
<p>Simplissime, dans la base aussi :</p>
<pre>INSERT INTO users (email, password) VALUES (&apos;jacques@mxtest.mondomaine.fr&apos;, ENCRYPT(&apos;mon_pass_en_clair&apos;));</pre>
<h3>Initialisation de sa boîte mail</h3>
<p>Connecté localement, par exemple, sur la machine, envoyez un mail en ligne de commande, avec mailx, mutt. Ce que vous voulez.<br />
Là , ô magie, vous devriez voir l&#8217;arborescence /vmailboxes se peupler, par exemple avec /vmailboxes/mxtest.mondomaine.fr/jacques/<br />
C&#8217;est une arborescence &#8220;Maildir&#8221; classique, avec <code>cur</code>, <code>new</code>, <code>tmp</code>.<br />
Si le mail est arrivé, on peut pour l&#8217;instant le lire en ligne de commande en allant dans le répertoire, tout bêtement.</p>
<h3>Création des autres sous-répertoires</h3>
<p>Dans cette procédure de création d&#8217;un compte, je suggère d&#8217;ajouter, pour le webmail, la création des répertoires habituels d&#8217;un compte en IMAP. Si vous ne comptez livrer que des boîtes récupérables en POP, ne vous cassez pas la tête, c&#8217;est inutile.<br />
Sinon :</p>
<pre>su - vmail
cd /vmailboxes/mxtest.mondomaine.fr/jacques
for i in Sent Trash Drafts Junk
do
        maildirmake .$i #le . est important
done</pre>
<p>Vous devriez voir les sous-répertoires .Sent, .Junk etc avec à  chaque fois le cur/tmp/new et des permissions restreintes à  l&#8217;utilisateur vmail.</p>
<p>Voilà , la boîte sait recevoir et postfix sait gérer nos comptes virtuels, pour livrer le courier dans les boîtes virtuelles.</p>
<h3>Abonnement aux répertoires IMAP ; pour le webmail ou la consultation IMAP</h3>
<p>Si besoin, pensez à inclure la création du fichier suivant dans votre procédure de création de boîte mail :</p>
<pre>mxtest:/vmailboxes/mxtest.mondomaine.fr/jacques# cat courierimapsubscribed
INBOX
INBOX.Sent
INBOX.Drafts
INBOX.Trash
INBOX.Junk</pre>
<h3>Annexe : création d&#8217;un alias</h3>
<p>Dans la table forwardings, à base de :</p>
<pre>INSERT INTO forwardings VALUES (&apos;mon_alias@bla.fr&apos;, &apos;dest1@toto.fr&apos;, &apos;dest2@tata.fr&apos;);</pre>
<p>Actif immédiatement. Pas plus compliqué que ça <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h1>Partie lecture des mails, via &#8220;courier-*&#8221; utilisant MySQL pour l&#8217;authentification</h1>
<p>Ici, on voit créer les services POP, IMAP et leurs versions sécurisées. Le tout sur fond d&#8217;authentification des utilisateurs définis en base MySQL.</p>
<h2>Indiquer au &#8220;daemon&#8221; courier d&#8217;utiliser MySQL</h2>
<p>Simplement, dans <code>/etc/courier/authdaemonrc</code>, changer la liste des modules utilisés pour l&#8217;authentification :</p>
<pre>#authmodulelist="authpam"
authmodulelist="authmysql"</pre>
<p>Dans <code>/etc/courier/authmysqlrc</code>, il faut positionner les variables suivantes :<br />
MYSQL_SERVER localhost<br />
MYSQL_USERNAME mail_adm<br />
MYSQL_PASSWORD monpassadmin<br />
MYSQL_PORT 0<br />
MYSQL_DATABASE postfix<br />
MYSQL_USER_TABLE users<br />
MYSQL_CRYPT_PWFIELD password<br />
MYSQL_UID_FIELD 5000<br />
MYSQL_GID_FIELD 5000<br />
MYSQL_LOGIN_FIELD email<br />
MYSQL_HOME_FIELD &#8220;/vmailboxes&#8221;<br />
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,&apos;@&apos;,-1),&#8217;/',SUBSTRING_INDEX(email,&apos;@&apos;,1),&#8217;/')<br />
#MYSQL_NAME_FIELD       name # NE PAS LAISSER CETTE VARIABLE, voir plus bas, cas d&#8217;erreur pour moi</p>
<p>Ici, bien évidemment, les valeurs indiquées reflètent les noms choisis en base.</p>
<h2>Générer les certificats pour le POP3S et IMAPS</h2>
<p>Cette partie est optionnelle, si vous ne voulez pas du POP3S et IMAPS. Dans ce cas vous pouvez aussi désinstaller <code>courier-*-ssl</code>.</p>
<p>On modifie les fichiers de conf de génération des certificats des daemon POP et IMAP sécurisés :</p>
<pre>mxtest:/etc/courier# cat pop3d.cnf

RANDFILE = /usr/lib/courier/pop3d.rand

[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
C=FR
ST=France
L=PARIS
O=Courier Mail Server
OU=Automatically-generated POP3 SSL key
CN=mondomaine.fr
emailAddress=certif@mondomaine.fr

[ cert_type ]
nsCertType = server</pre>
<p>Et pour, l&#8217;IMAP :</p>
<pre>

mxtest:/etc/courier# cat imapd.cnf

RANDFILE = /usr/lib/courier/imapd.rand

[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
C=FR
ST=France
L=PARIS
O=Courier Mail Server
OU=Automatically-generated IMAP SSL key
CN=mondomaine.fr
emailAddress=certif@mondomaine.fr

[ cert_type ]
nsCertType = server</pre>
<p>Et on génère les certificats à partir de ces modèles. Ca ne fait que connaître à l&#8217;avance certains paramètres :</p>
<pre>mxtest:/etc/courier# mkimapdcert
cp: not writing through dangling symlink `/usr/lib/courier/imapd.pem'
chmod: cannot operate on dangling symlink `/usr/lib/courier/imapd.pem'
chown: ne peut effectuer une déférence sur `/usr/lib/courier/imapd.pem': Aucun fichier ou répertoire de ce type
Generating a 1024 bit RSA private key
................++++++
....++++++
writing new private key to '/usr/lib/courier/imapd.pem'
-----
1024 semi-random bytes loaded
Generating DH parameters, 512 bit long safe prime, generator 2
This is going to take a long time
..............+.....................................................................................+..+.....................
.........+.............................+....+...+........+...................................................................
.............+..........+...........+..+...+..............................+....................+......................+......
........................+.....+.+......+..........................................................+..........................
.........................................................+...........+.........+.......................+.....................
..+..........++*++*++*++*++*++*
subject= /C=FR/ST=France/L=PARIS/O=Courier Mail Server/OU=Automatically-generated IMAP SSL 

key/CN=mondomaine.fr/emailAddress=certif@mondomaine.fr
notBefore=Oct  7 15:17:54 2009 GMT
notAfter=Oct  7 15:17:54 2010 GMT
SHA1 Fingerprint=9D:62:E6:CF:B7:39:80:C8:4E:F9:09:9C:61:36:14:8F:0B:EF:3C:6E
</pre>
<p>Et :</p>
<pre>
mxtest:/etc/courier# mkpop3dcert
cp: not writing through dangling symlink `/usr/lib/courier/pop3d.pem'
chmod: cannot operate on dangling symlink `/usr/lib/courier/pop3d.pem'
chown: ne peut effectuer une déférence sur `/usr/lib/courier/pop3d.pem': Aucun fichier ou répertoire de ce type
Generating a 1024 bit RSA private key
..++++++
..................++++++
writing new private key to '/usr/lib/courier/pop3d.pem'
-----
1024 semi-random bytes loaded
Generating DH parameters, 512 bit long safe prime, generator 2
This is going to take a long time
...............+..........................++*++*++*++*++*++*
subject= /C=FR/ST=France/L=PARIS/O=Courier Mail Server/OU=Automatically-generated POP3 SSL 

key/CN=mondomaine.fr/emailAddress=certif@mondomaine.fr
notBefore=Oct  7 15:18:10 2009 GMT
notAfter=Oct  7 15:18:10 2010 GMT
SHA1 Fingerprint=DD:8D:7C:0D:87:9D:19:9D:62:BE:5B:9A:B2:D8:43:80:CF:47:E2:14</pre>
<h2>Redémarrer tout ce bazar</h2>
<p>Ayé, tout est prêt, les certificats sont générés, on redémarre tout ce monde :</p>
<pre>/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart</pre>
<h2>Tests pour l&#8217;envoi, quelques erreurs analysées</h2>
<p>Déjà , faites un telnet sur chaque port, 143, 993, 110, 995 pour voir si ça répond bien.<br />
Ensuite, testez chaque protocole. Par exemple avec Thunderbird. Sur un poste Windows, pensez à  la version &#8220;portable&#8221; qui n&#8217;interfèrera pas avec votre actuel Thunderbird. Sous Linux, vous pouvez jouer avec vos ~/.mozilla-thunderbird (j&#8217;ai plus le nom précis en tête) pour ne pas abîmer votre conf actuelle.</p>
<h2>Erreurs rencontrées</h2>
<p>Ces erreurs m&#8217;ont permis de découvrir la commande authtest pour faire des tests d&#8217;aut</p>
<h3>Oubli de package</h3>
<p>J&#8217;ai commencé par tester l&#8217;authentification IMAP en local (depuis un webmail, roundcube, installé sur la même machine). Ca ne passait pas. J&#8217;ai testé depuis Thunderbird, pareil (pas étonnant), mais cette fois ça a généré un message dans les logs, genre <code>syslog</code> ou <code>mail.info</code> je ne sais plus :</p>
<pre>Oct  8 16:10:32 ns305192 authdaemond: libauthmysql.so: cannot open shared object file: No such file or directory</pre>
<p>Oops, il manquait le package <code>courier-authlib-mysql</code>.<br />
Heureusement, ce ne sera pas votre cas, c&#8217;est bien écrit dans le <code>aptitude install</code> du début.</p>
<h3>Erreur sur MYSQL_NAME_FIELD</h3>
<p>Ensuite, j&#8217;ai eu le droit à une vraie erreur :</p>
<pre>Oct  8 16:53:56 serveur imapd: authentication error: Input/output error</pre>
<p>C&#8217;est l&#8217;occasion de mentionner la commande <code>authtest</code> (faites <code>man authtest</code>. Ca peut aider :</p>
<pre>authtest ducon@lajoie.fr monpasswd
Authentication FAILED: Input/output error</pre>
<p>Activez le debug dans <code>/etc/courier/authdaemonrc</code> avec DEBUG_LOGIN=1, redémarrez le service et allez voir les logs. Ca m&#8217;a permis de voir les erreurs SQL :</p>
<pre>Oct  8 18:39:21 ns305192 authdaemond: mysql_query failed, reconnecting: Unknown column 'name' in 'field list'</pre>
<p>En cherchant un peu, j&#8217;ai vu qu&#8217;il restait le champ MYSQL_NAME_FIELD dans <code>/etc/courier/authdaemonrc</code>. Une fois modifié, ça passe :</p>
<pre>mxtest:/etc/courier# !auth
authtest bla@bla.fr monpassword
Authentication succeeded.

     Authenticated: bla@bla.fr (uid 5000, gid 5000)
    Home Directory: /vmailboxes
           Maildir: mondomaine.fr/jacques/
             Quota: (none)
Encrypted Password: OXXXXgfT0lXjI
Cleartext Password: monpassword
           Options: (none)</pre>
<p>A ce moment là, tout marche pour la récupération, webmail aussi (puisque IMAP aussi).</p>
<h1>Partie authentification des utilisateurs, pour l&#8217;envoi</h1>
<p>Pour bien comprendre, on va activer 2 modes : SASL et TLS &#8211; encore que le mode TLS reste optionnel. Vous pourriez dans ce cas désinstaller les paquets concernés.<br />
Le premier (SASL) pour avoir un mécanisme d&#8217;authentification pour le SMTP &#8220;normal&#8221;, port 25.<br />
Le deuxième (TLS) pour avoir un mécanisme plus sécurisé, avec certificat etc, en TLS (anciennement SMTPS, ou SMTP avec SSL). C&#8217;est aussi sur le port 25 (pas 465), et, de ce que j&#8217;en ai compris, ça tend à  remplacer le SMTPS, sur port 465. <a href="http://postfix.traduc.org/index.php/TLS_README.html">C&#8217;est expliqué là </a> et j&#8217;ai peut-être un peu abrégé l&#8217;explication violemment.</p>
<h2>Paramétrage de toute la chaîne postfix/sasl/pam/mysql</h2>
<p>Pour ne pas se perdre, il faut comprendre que postfix va déléguer l&#8217;authentification à  une couche d&#8217;abstraction, SASL. On va dire à  SASL de se baser sur le mécanisme PAM (Pluggable Authentication Module) et on va dire à  PAM de contrôler les logins/passwords dans une base MySQL, en lui décrivant cette base. Pigé ?</p>
<h3>Dire à  SASL d&#8217;utiliser PAM pour l&#8217;authentification</h3>
<p>SASL est chrooté (je ne me souviens plus bien, mais c&#8217;est le boxon, j&#8217;ai dû en parler dans des <a href="http://michauko.org/blog/?s=sasl">posts précédents</a>)<br />
On crée son environnement de &#8220;chroot&#8221; :</p>
<pre>mkdir --parents /var/spool/postfix/var/run/saslauthd</pre>
<p>Ensuite, on paramètre le daemon SASL correctement :<br />
Positionner <code>START=yes</code> dans <code>/etc/default/saslauthd</code><br />
et modifier la fin du fichier comme suite :</p>
<pre>#OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"</pre>
<p>Le reste du fichier par défaut doit être bon (DESC=&#8221;SASL Authentication Daemon&#8221;, NAME=&#8221;saslauthd&#8221;, MECHANISMS=&#8221;pam&#8221;, MECH_OPTIONS=&#8221;", THREADS=5).</p>
<p>Vous pourrez voir au passage qu&#8217;on indique (via le paramètre MECHANISMS) à  SASL d&#8217;utiliser PAM.<br />
Maintenant, on va dire à PAM d&#8217;utiliser MySQL.</p>
<h3>Demander à  PAM d&#8217;utiliser MySQL en décrivant notre structure</h3>
<p>Dans <code>/etc/pam.d/smtp</code> (à  créer je crois), on indique qu&#8217;on va utiliser le module MySQL pour PAM :</p>
<pre>
mxtest:/etc/pam.d# cat smtp
auth    required   pam_mysql.so user=mail_adm passwd=monpassadmin host=127.0.0.1 db=postfix table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_adm passwd=monpassadmin host=127.0.0.1 db=postfix table=users usercolumn=email passwdcolumn=password crypt=1
</pre>
<h3>Ensuite, dire à  postfix de faire confiance à  SASL pour l&#8217;authentification</h3>
<p>Maintenant que SASL sait faire le boulot en base de données, on configure postfix pour authentifier les utilisateurs via SASL/PAM/MYSQL.<br />
Dans <code>/etc/postfix/sasl/</code>, s&#8217;assurer du contenu de <code>smtpd.conf</code> :</p>
<pre>pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_adm
sql_passwd: monpassadmin
sql_database: postfix
sql_select: select password from users where email = &apos;%u&apos;</pre>
<p>Ajoutez l&#8217;utilisateur postfix au groupe sasl :</p>
<pre>adduser postfix sasl</pre>
<p>Enfin, expliquer à  postfix de bien vouloir relayer les envois d&#8217;utilisateurs authentifiés via SASL. Ce qui donne par exemple dans <code>/etc/postfix/main.cf</code> :</p>
<pre>smtpd_sender_restrictions = permit_sasl_authenticated
        reject_unauth_pipelining
        permit_mynetworks
        reject_unauth_destination
        reject_unknown_sender_domain
        reject_non_fqdn_sender
        check_policy_service inet:127.0.0.1:60000</pre>
<p>C&#8217;est surtout le &#8220;permit_sasl_authenticated&#8221; qui nous intéresse là.<br />
Voilà, postfix sait maintenant contrôler les expéditeurs avec l&#8217;aide de SASL. Ils doivent se signer et exister dans la base.<br />
Maintenant on met en place le TLS, si vous voulez utiliser du vrai cryptage SSL pour l&#8217;authentification.</p>
<h2>TLS : certificat et configuration</h3>
<p>Dans <code>/etc/postfix/</code>,on crée les clefs de cryptage :</p>
<pre>mxtest:/etc/postfix# openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509
Generating a 2048 bit RSA private key
................................................+++
................................................+++
writing new private key to 'smtpd.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:PARIS
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MASOCIETE
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:mondomaine.fr
Email Address []:certif@mondomaine.fr</pre>
<p><strong>IMPORTANT </strong>: le &#8220;Common Name&#8221; doit correspondonre à  votre <code>/etc/mailname</code><br />
Protégez la clef privée : <code>chmod 640 smtpd.key</code><br />
J&#8217;ai mis 10 ans, on aurait pu mettre plus ou moins, c&#8217;est le paramètre 3650 dans la ligne de commande.</p>
<p>On ajoute pour finir la conf suivante pour activer le TLS et indiquer le certificat à  utiliser. Dans <code>/etc/postfix/main.cf</code> toujours :</p>
<pre>smtpd_tls_cert_file=/etc/postfix/smtpd.cert
smtpd_tls_key_file=/etc/postfix/smtpd.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes # à  voir, ça peut interdire certains outlook buggés, je crois, de tête.
smtpd_sasl_authenticated_header = yes
</pre>
<h2>C&#8217;est fini, on relance tout ça</h2>
<p>Redémarrez postfix et saslauthd via les <code>/etc/init.d/saslauthd restart</code> et <code>/etc/init.d/postfix restart</code> qui vont bien.</p>
<h2>Tests pour l&#8217;envoi, quelques erreurs analysées</h2>
<p>Après un rapide telnet sur le port 25 (quand même), testez avec un &#8220;ehlo mailhost&#8221; puor voir si le TLS est activé :</p>
<pre>250-STARTTLS</pre>
<p>Ensuite, comme pour la réception des mails, testez avec un client mail correct, en mode SMTP normal et avec TLS.</p>
<h2>Erreurs rencontrées</h2>
<h3>Fausse manip dans /etc/pam.d/smtp</h3>
<p>Tous les tests SMTP, avec et sans TLS étaient KO. Dans les logs, simplement ça :</p>
<pre>Oct 14 13:52:39 ns305192 postfix/smtpd[6759]: connect from bla.fr[81.Y.67.X]
Oct 14 13:52:41 ns305192 postfix/smtpd[6759]: warning: SASL authentication failure: Password verification failed
Oct 14 13:52:41 ns305192 postfix/smtpd[6759]: warning: bla.fr[81.Y.67.X]: SASL PLAIN authentication failed: authentication failure
Oct 14 13:52:41 ns305192 postfix/smtpd[6759]: warning: bla.fr[81.Y.67.X]: SASL LOGIN authentication failed: authentication failure
Oct 14 13:52:43 ns305192 postfix/smtpd[6759]: disconnect from bla.fr[81.Y.67.X]</pre>
<p>Je me souviens avoir utilisé <code>saslfinger</code> pour tester et debugger. Essayez-le.<br />
Au final, je m&#8217;étais simplement trompé dans le mot de passe MySQL du fichier <code>/etc/pam.d/smtp</code></p>
<h1>Quotas</h1>
<p>Sujet totalement optionnel. J&#8217;ai besoin dans mon cas de pouvoir affecter des quotas par utilisateur.<br />
Postfix ne gère pas les quotas nativement, il faut appliquer un patch. Donc recompiler. Ou trouver une source, mais au niveau mise à jour de sécurité, vous dépendez alors du type qui maintient le dépôt.<br />
J&#8217;ai préféré appliquer moi-même le patch.<br />
Le patch est donné par ce projet : <a href="http://vda.sourceforge.net">http://vda.sourceforge.net</a>. Il est disponible pour toutes les versions postfix, notamment la 2.5.5, actuellement celle de Debian/Lenny. 32 ou 64 bits.</p>
<h2>Ajout du dépôt de sources</h2>
<p>D&#8217;abord, dans mon cas, j&#8217;ajoute un dépôt de sources, via la ligne suivante dans <code>/etc/apt/sources.list</code> :</p>
<pre>deb-src ftp://ftp2.fr.debian.org/debian/ lenny main</pre>
<p>Après un <code>aptitude update</code>, on va télécharger les sources et tout le bazar pour compiler.</p>
<h2>Récupération des sources</h2>
<pre>serv:/etc/postfix# apt-get build-dep postfix
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les NOUVEAUX paquets suivants seront installés :
  build-essential comerr-dev debhelper dpkg-dev g++ g++-4.3 gettext hardening-wrapper html2text intltool-debian libcdb-dev libcdb1 libdb-dev libdb4.6-dev libfile-remove-perl
  libkadm55 libkrb5-dev libldap2-dev libmail-box-perl libmail-sendmail-perl libmime-types-perl libmysqlclient15-dev libobject-realize-later-perl libpcre3-dev libpcrecpp0
  libpq-dev libsasl2-dev libssl-dev libstdc++6-4.3-dev libuser-identity-perl lsb-release po-debconf tinycdb zlib1g-dev
0 mis à jour, 34 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 22,7Mo dans les archives.
Après cette opération, 69,1Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ?</pre>
<p>Ensuite, on récupère les sources de postfix :</p>
<pre>serv:/etc/postfix# cd /usr/src
serv:/usr/src# apt-get source postfix</pre>
<p>Ca download et décompresse (et gueule car je n&#8217;ai pas mis la clef GPG blablabla pour vérifier la signature du paquet, tout ça).</p>
<h2>Récupération du patch, compilation</h2>
<p>On récupère le patch qui va bien pour notre version postfix et on génère les .deb</p>
<pre>cd /usr/src
wget http://vda.sourceforge.net/VDA/postfix-2.5.5-vda-ng.patch.gz
gunzip postfix-2.5.5-vda-ng.patch.gz
cd postfix-2.5.5
patch -p1 < ../postfix-2.5.5-vda-ng.patch
dpkg-buildpackage</pre>
<h2>Remplacement du postfix officiel</h2>
<p>Une fois placé dans /usr/src, un simple <code>dpkg -i postfix_2.5.5-1.1_i386.deb postfix-mysql_2.5.5-1.1_i386.deb</code> suffit à remplacer postfix et son extension mysql. Ca ne flingue même pas la conf actuelle. Bref, nickel.</p>
<h2>On ajoute le champ quota, on indique à postfix et courierauth</h2>
<p>Dans la base de données, on ajoute la colonne. J'ai choisi 20 Mo par défaut.</p>
<pre>mysql> alter table users add quota bigint (20) default '20971520' after password;
Query OK, 1 row affected (0.10 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> desc users;
+----------+-------------+------+-----+----------+-------+
| Field    | Type        | Null | Key | Default  | Extra |
+----------+-------------+------+-----+----------+-------+
| email    | varchar(80) | NO   | PRI | NULL     |       |
| password | varchar(20) | NO   |     | NULL     |       |
| quota    | bigint(20)  | YES  |     | 20971520 |       |
+----------+-------------+------+-----+----------+-------+
3 rows in set (0.00 sec)</pre>
<p>Le alter s'est occupé de mettre la valeur par défaut sur les comptes existants</p>
<p>On crée alors la requête qui vérifie les quotas :</p>
<pre>mxtest:~# cat /etc/postfix/mysql-virtual_mailbox_limit_maps.cf
user = mail_adm
password = monpassadmin
dbname = postfix
query = SELECT quota FROM users WHERE email=&apos;%s&apos;
hosts = 127.0.0.1</pre>
<p>Pensez à priver l'accès à ce fichier.</p>
<p>Et on ajoute cette notion de limite dans notre postfix-qui-sait-gérer-les-quotas, dans <code>/etc/postfix/main.fr</code> :</p>
<pre>virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "The user you are trying to reach is over quota - L'utilisateur que vous cherchez a contacter a depasse son quota de mails"
virtual_overquota_bounce = yes</pre>
<p>Sans oublier d'ajouter "<code>$virtual_mailbox_limit_maps</code>" dans la variable "<code>proxy_read_maps</code>".</p>
<h2>Indication des quotas à "courier"</h2>
<p>On précise à courier qu'il y a des quotas en créant ou décommentant la variable suivante :</p>
<pre>mxtest:~# grep quota /etc/courier/authmysqlrc
MYSQL_QUOTA_FIELD       quota</pre>
<p>On recharge le tout, on teste, on se congratule. Youpi, c'est fini.</p>
<h1>Ce que je n'ai pas traité</h1>
<h2>j'ai pas joué avec les transports</h2>
<p>Pas besoin dans mon cas.</p>
<h2>Avoir un procmailrc par utilisateur ?</h2>
<p>Aucune idée, je verrai plus tard.<br />
En effet, où doit-on stocker le .procmailrc ??? ou alors faire un /etc/procmailrc général qui éventuellement trie par destinataire... lourd.</p>
<h2>Désactivation de protocole par utilisateur</h2>
<p>Exemple, besoin de désactiver le webmail ou le POP pour un utilisateur ? A priori, avec les "critères supplémentaires" que l'on peut passer dans les fichiers .cf de description de requêtes, ça doit être jouable. Je n'ai pas cherché car pas encore eu besoin.<br />
Evidemment, il faudra ajouter une/des colonne dans la table, sûrement un booléen indiquant si le protocole est accepté pour l'utilisateur X.</p>
<h2>Alerte sur les dépassements de quota</h2>
<p>Pas eu encore le temps, mais il faudra y penser pour détecter les boulets qui ont des boîtes pleines et ne comprennent pas pourquoi ils ne reçoivent rien.<br />
Je n'ai pas encore regardé : chapitre 11 <a href="http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny-p3" target="_blank">dans cette page</a>.<br />
Voilà, j'espère que ça roulera pour votre installation et que vous aurez ainsi une belle plateforme de mails.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/10/20/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Limiter la bande passante entre 2 hosts (dont l&#8217;un en Linux)</title>
		<link>http://michauko.org/blog/2009/10/20/limiter-la-bande-passante-entre-2-hosts-dont-lun-en-linux/</link>
		<comments>http://michauko.org/blog/2009/10/20/limiter-la-bande-passante-entre-2-hosts-dont-lun-en-linux/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 09:23:55 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[coup de coeur]]></category>
		<category><![CDATA[ligne de commande]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[reseau et sécu]]></category>
		<category><![CDATA[bande passante]]></category>
		<category><![CDATA[LARTC]]></category>
		<category><![CDATA[limitation]]></category>
		<category><![CDATA[tc]]></category>
		<category><![CDATA[WSUS]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=865</guid>
		<description><![CDATA[Dans la série aide-mémoire. Imaginez : approbation d&#8217;une tonne de patchs de sécurité Windows en retard sur un WSUS avec des réplicats. Immédiatement, il commence à downloader, via un proxy Squid sous Linux, donc via une machine Linux. Et là, votre bande passante est réduite à de la poussière car WSUS, via le proxy, pompe [...]]]></description>
			<content:encoded><![CDATA[<p><em>Dans la série aide-mémoire.</em><br />
Imaginez : approbation d&#8217;une tonne de patchs de sécurité Windows en retard sur un WSUS avec des réplicats. Immédiatement, il commence à downloader, via un proxy Squid sous Linux, donc via une machine Linux.<br />
Et là, votre bande passante est réduite à de la poussière car WSUS, via le proxy, pompe tout, à fond.<br />
Raaaaaaaaaa. M&#8217;énerve.</p>
<p>Vite, iptables doit pouvoir m&#8217;aider. Je suis une buse en QoS, mais bon, j&#8217;ai confiance en Google <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-865"></span></p>
<p>Après quelques recherches, je suis tombé sur <a href="http://lartc.org/" target="_blank">LARTC</a>, Linux Advanced Routing &#038; Traffic Control. En quelques mots, une bande de fous-furieux qui aiment les lignes de commandes compliquées (à côté de ça, iptables est un joujou) pour faire de la QoS.<br />
Y&#8217;a un howto super complet : <a href="http://www.traduc.org/docs/howto/vf/lartc.html">http://www.traduc.org/docs/howto/vf/lartc.html</a>. Pas le temps, ça sent le sujet compliqué et vaste. On verra plus tard.</p>
<p>Là je veux juste limiter le trafic entre mon proxy et ce p~!?[n de serveur WSUS.</p>
<p>J&#8217;ai trouvé <a href="http://lartc.org/howto/lartc.ratelimit.single.html" target="_blank">3 lignes magiques ici </a>(après avoir survolé le <code>man tc</code> histoire de suivre le loin ce que je fais) :</p>
<pre>tc qdisc add dev eth0 root handle 1: cbq avpkt 1000 bandwidth 10mbit
tc class add dev eth0 parent 1: classid 1:1 cbq rate 400kbit allot 1500 prio 5 bounded isolated
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.2 flowid 1:1</pre>
<p>Je voulais limiter le trafic vers 192.168.1.2 via eth0 à 50 kB/s, soit en gros 400 kbit/s.<br />
Pour annuler, j&#8217;ai &#8220;annulé&#8221; les commandes, si je peux dire. Sans être trop sûr de moi, j&#8217;ai simplement tenté ça :</p>
<pre>tc filter del dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.2 flowid 1:1
tc class del dev eth0 parent 1: classid 1:1 cbq rate 400kbit allot 1500 prio 5 bounded isolated
tc qdisc del dev eth0 root handle 1: cbq avpkt 1000 bandwidth 10mbit</pre>
<p>Je n&#8217;ai pas vu d&#8217;effet de bord (genre, tout bloqué ou rien qui ne se rétablit une fois le <em>tc</em> annulé). Donc on va dire que c&#8217;est probablement un peu crade, que je n&#8217;y comprends pas tout, mais que ça marche.</p>
<p>Voilà, si ça peut vous servir, j&#8217;en suis content.<br />
noob-powered</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/10/20/limiter-la-bande-passante-entre-2-hosts-dont-lun-en-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mise en place de Nagios : en partant de rien</title>
		<link>http://michauko.org/blog/2009/10/07/mise-en-place-de-nagios/</link>
		<comments>http://michauko.org/blog/2009/10/07/mise-en-place-de-nagios/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 09:31:45 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[reseau et sécu]]></category>
		<category><![CDATA[supervision]]></category>
		<category><![CDATA[check_http]]></category>
		<category><![CDATA[check_ldap]]></category>
		<category><![CDATA[check_nt]]></category>
		<category><![CDATA[nagios]]></category>
		<category><![CDATA[NRPE]]></category>
		<category><![CDATA[NSClient++]]></category>
		<category><![CDATA[snmp]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=360</guid>
		<description><![CDATA[Introduction Gros guide de mise en place de Nagios sur Debian, avec comme principal objectif de vous amener petit à petit à monitorer tout ce qu&#8217;on peut imaginer sur un parc de serveurs Linux, Windows, des équipements réseaux etc. Ca part d&#8217;un exemple bien détaillé (je l&#8217;espère) pour bien faire comprendre les principes et l&#8217;esprit [...]]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>Gros guide de mise en place de Nagios sur Debian, avec comme principal objectif de vous amener petit à petit à monitorer tout ce qu&#8217;on peut imaginer sur un parc de serveurs Linux, Windows, des équipements réseaux etc. Ca part d&#8217;un exemple bien détaillé (je l&#8217;espère) pour bien faire comprendre les principes et l&#8217;esprit Nagios pour espérer à la fin, vous avoir donné de quoi évoluer facilement pour ajouter n&#8217;importe quel test.<br />
Au départ, je voulais faire un guide super complet, mais avec Nagios, on ajoute des tests tous les jours, pour ainsi dire. Bref, ça fait 3 mois que j&#8217;attendais pour faire ce guide. Finalement je l&#8217;écourte un peu et j&#8217;ajouterai (peut-être) des chapitres plus tard sur ce blog.<br />
Après un premier exemple bien complet, je donne des exemples rapides de contrôles courants.</p>
<p>J&#8217;ai eu l&#8217;idée de rédiger cet article sachant que je ne connaissais rien à Nagios (rien de sa mise en place, rien des fichiers de conf, rien de sa syntaxe, rien des outils de base, rien des plug-ins supplémentaires et rien des contributions à gogo sur le web etc). L&#8217;intérêt, n&#8217;y connaissant rien justement, est que j&#8217;explique pas à pas, notamment les principes de l&#8217;outil pour comprendre comment le configurer, en détaillant parfois toutes les panneaux que j&#8217;ai pu me prendre, mais en donnant la solution rapidement <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><del datetime="2009-09-01T15:36:10+00:00">A la fin, je donne mes fichiers de conf, un peu anonymisés et allégés, ils peuvent vous servir pour de la mise en place de certains morceaux ou pour vous guider dans la syntaxe. Exemple, vous voulez surveiller vos serveurs DNS, cherchez le mot &#8220;dns&#8221; dans tous les fichiers, comprenez ce qui y est fait et copiez-collez-modifiez les bons blocs. Reste à changer les noms de hostname <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </del> Hum, ça, ce sera plus tard lorsque j&#8217;aurai complété par d&#8217;autres articles (cf. ci-dessus), je n&#8217;ai pas trop le temps, et sinon, je ne publierai jamais cet article&#8230; il traîne depuis 3 mois&#8230;</p>
<p>Je ne compte pas faire de l&#8217;ombre <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  à <a href="http://blog.nicolargo.com/nagios-tutoriels-et-documentations">Nicolargo</a> (passionné du sujet Nagios) mais mon approche est différente : je pars de ce que Debian a fait pour moi, pas des sources à compiler pour avoir l&#8217;absolue dernière version. Les répertoires de configuration et de chemins des binaires sont différents, tous les plug-ins classiques sont directement disponibles.<br />
Après, une fois l&#8217;outil fonctionnel sur quelques cas, ça reste du Nagios pur. Allez voir son site, il y a de bonnes docs et le forum peut aider aussi. Sans compter d&#8217;autres sites d&#8217;outils de monitoring complémentaires, notamment <a href="http://www.monitoringexchange.org/">http://www.monitoringexchange.org/</a>, et évidemment la <a href="http://nagios.sourceforge.net/docs/3_0/toc.html">doc officielle </a>qui est très bien foutue. J&#8217;y ferai référence autant de fois que j&#8217;y penserai.</p>
<p>La version actuellement packagée sous Debian &#8220;stable&#8221; (Lenny) est Nagios 3.0.6. Comme d&#8217;habitude avec Debian, un peu en retard sur la version officielle, mais il y a d&#8217;autres intérêts à utiliser tout de même la version packagée, à mon avis.<span id="more-360"></span></p>
<h1>Installation</h1>
<h2>Sur un air d&#8217;aptitude install</h2>
<p>Ca commence sur un air connu par un <code>aptitude install nagios3</code>. A noter que ça descend par dépendance 3 paquets <code>nagios-plugins*</code> qui contiendront tout un tas de plugins (contrôle de LDAP, de mail, de MySQL, de MRTG, de serveur FTP&#8230;).<br />
Une remarque pendant l&#8217;installation (pour le chapitre suivant) :</p>
<pre>[...]
Get:10 ftp://ftp.fr.debian.org lenny/main nagios3-doc 3.0.6-3 [2034kB]
[...]
serious bugs of nagios3-common (-> 3.0.6-3) <done>
 #519341 - nagios3-common: missing "then" in nagios3-common.prerm (Fixed: nagios3/3.0.6-4)
[...]</pre>
<p>On voit aussi passer ces plugins :</p>
<pre>[...]
Creating config file /etc/nagios-plugins/config/http.cfg with new version
Creating config file /etc/nagios-plugins/config/load.cfg with new version
Creating config file /etc/nagios-plugins/config/mail.cfg with new version
[...]</pre>
<p>Lisez de préférence tous les fichiers <code>README.Debian</code> des répertoires <code>/usr/share/doc/nagios3</code> et <code>/usr/share/doc/nagios-plugins</code>. Il y a 2/3 infos importantes, mais je les reprends au fil de l&#8217;eau dans la suite de l&#8217;article.</p>
<h2>Droits d&#8217;accès à l&#8217;interface web de Nagios</h2>
<p>Les <code>README.Debian</code> habituels qu&#8217;on trouve dans <code>/usr/share/doc/nagios*</code> parlent du truc et indiquent qu&#8217;on doit avoir une question posée pendant l&#8217;installation. Vu le bug mentionné plus haut par apt-listbugs (<a href="http://michauko.org/blog/2007/10/19/le-paquet-du-jour-apt-listbugs/">c&#8217;est quoi ?</a>), je ne m&#8217;étonne qu&#8217;à moitié de n&#8217;avoir pas vu passer de &#8220;fenêtre&#8221; (ncurses) pendant l&#8217;installation. Doc pas à jour ou vrai bug. Bon bref, il faut rectifier le tir.</p>
<p>On voit dans <code>/etc/apache2/conf.d/nagios3.conf</code> que les droits sont gérés par <code>htaccess</code> (voir directive <code>AuthUserFile</code>)dans <code>/etc/nagios3/htpasswd.users</code>. Or, ce fichier n&#8217;existe pas, on doit donc le créer.</p>
<pre>htpasswd -c /etc/nagios3/htpasswd.users nagiosadmin</pre>
<p>Le nom <code>nagiosadmin</code> semble important pour éviter certains ennuis (de ce que j&#8217;en ai lu, mais je ne sais plus où, peut-être <a href="http://www.onlamp.com/pub/a/onlamp/2002/09/26/nagios.html?page=3">là</a>).<br />
Enfin, vérifiez les droits sur le fichier en question, idéalement, il faut :</p>
<pre>chown root:www-data /etc/nagios3/htpasswd.users
chmod 640 /etc/nagios3/htpasswd.users</pre>
<p>Et recharger apache via <code>/etc/init.d/apache2 reload</code>.<br />
L&#8217;adresse d&#8217;accès doit être <code>http://votre.serveur/nagios3/</code>.</p>
<h1>Principe de base et cheminement de ma doc</h1>
<p>Une fois qu&#8217;on a pataugé un peu, il en ressort quelques grands principes pour gagner en autonomie et arriver à pondre du fichier de conf au kilomètre ou savoir où regarder pour trouver un plug-in tiers, le mettre en place, l&#8217;utiliser et même l&#8217;adapter.<br />
Quelques grandes idées pour démarrer :</p>
<ul>
<li>Nagios appelle des scripts permettant de contrôler un élément particulier (ou plusieurs d&#8217;un coup) : contrôler un service, les espaces disques, la charge CPU, la réponse d&#8217;un site web, la charge d&#8217;un port de switch etc</li>
<li>On a des modèles d&#8217;appels de scripts, nommés en général &#8220;check_quelquechose&#8221; permettant de comprendre les paramètres pour un contrôle donné (valeurs limites, nom du truc à regarder</li>
<li>Il faudra déployer des agents pour certains contrôles, notamment pour contrôler du Windows. En gros, pour obtenir des informations qui sont récupérables par un traitement local uniquement, pas à distance. Normal me direz-vous. Ces agents sont des à côtés du projet Nagios. Mais il y a déjà tout ce qu&#8217;il faut.</li>
<li>Il va falloir décrire nos machines une à une et ce qu&#8217;on contrôle pour chacune (forcément, c&#8217;est pas magique comme outil). On pourra faire des groupes de machines et y associer des contrôles appliqués à ces groupes. Exemples : toute machine hébergeant un serveur web aura de base un contrôle vérifiant le port 80 ; toute machine Windows aura de base un contrôle sur la nécessité d&#8217;applications de patchs, un contrôle sur l&#8217;espace disque etc&#8230;</li>
</ul>
<p>Dans cette doc, je vais décrire chaque sujet dans l&#8217;ordre dans lequel j&#8217;ai mis en place les contrôles, souvent en partant de la doc officielle (parfois pas exactement à jour) puis en adaptant au contexte Debian qui a, comme d&#8217;habitude, pré-mâché certaines choses (mise à dispo de scripts, &#8220;modèles&#8221; pour tel type de machine, de switchs etc).<br />
Je voulais avant tout contrôler un peu tous ces jolis serveurs Windows qui sont peu bavards en général (ou qui racontent uniquement des trucs dont on se fout)&#8230; Donc il y a une bonne partie sur l&#8217;interfaçage avec Windows ; cas somme toute courant je pense.<br />
Du coup, je dissémine des informations malgré moi à mesure de ma compréhension (lorsque j&#8217;ai &#8220;appris&#8221; Nagios) ; et surtout en ayant rédigé la doc quelques mois après (hum).</p>
<p>Bon, en bref, Nagios est un outil <strong>tout sauf clef-en-main</strong> (sauf peut-être si vous optez pour un système comme <a href="http://fannagioscd.sourceforge.net/">FAN</a>, mais vous aurez un système dédié &#8220;limité&#8221; à Nagios&#038;co je suppose)<br />
Le paramétrage est long et on en ajoute chaque jour.<br />
Pour le planning pour le patron, prévoyez large. Mise en place et premiers résultats quelques heures tout au plus, paramétrage plus poussé : quelques semaines. Plus on en découvre, plus on monitore de choses. On corrige les problèmes et on en anticipe d&#8217;autres grâce à Nagios. Bref, le bonheur avec reporting pour le patron. A la fin, on commence à écrire ses propres scripts, en n&#8217;importe quel langage.</p>
<p>Ah au fait, attention aux alertes par mail. Nagios vous dit tout : &#8220;tel service est tombé&#8221;, &#8220;tel service est toujours KO&#8221;, &#8220;tel service est revenu&#8221;. Multiplié par le nombre de service et de machines, ça fait des mails à la pelle. Faudra prévoir des règles de tri dans un premier temps&#8230;</p>
<h1>C&#8217;est parti</h1>
<h2>Surveillance des basiques de serveurs Windows (NT, 2000, XP, 2003 et +)</h2>
<p>Oui les libristes vont encore perdre du temps à critiquer le fait que je parle de Windows-le-mal-incarné d&#8217;abord. Economisez-vous. Mon point de vue est que justement, Nagios aide très bien à monitorer &#8220;du windows&#8221; là où Windows est quand même à chier niveau remontées d&#8217;alertes, en standard. Autant, un Linux un tant soit peu configuré vous remonte déjà plein de choses par mail, par exemple, qu&#8217;il ne sera pas forcément la peine d&#8217;aller contrôler par Nagios.</p>
<h3>Installation et 1er paramétrage de l&#8217;agent NSClient++</h3>
<p>Si vous voulez la doc officielle, commencez par là (<a href="http://nagios.sourceforge.net/docs/3_0/quickstart.html">http://nagios.sourceforge.net/docs/3_0/quickstart.html</a>) et enchainez sur <a href="http://nagios.sourceforge.net/docs/3_0/monitoring-windows.html">http://nagios.sourceforge.net/docs/3_0/monitoring-windows.html</a>.<br />
Il faut donc télécharger et déployer un agent windows pour Nagios. Disponible en 32, 64 bits. Je pense qu&#8217;il y en a plusieurs, j&#8217;ai opté pour celui-ci, qui m&#8217;a l&#8217;air complet : <a href="http://sourceforge.net/projects/nscplus">http://sourceforge.net/projects/nscplus</a>.<br />
Lorsque ça marchera pour une machine, il n&#8217;y aura qu&#8217;à déployer l&#8217;agent à distance et injecter le fichier de conf NSC.ini qui va bien sur chaque machine. Pensez aux outils <del datetime="2009-09-01T15:36:10+00:00">sysinternals.com</del> microsoft, notamment les <a href="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx">PSTools et psexec</a>. C&#8217;est pratique pour automatiser.</p>
<p>L&#8217;agent apporte une interface entre l&#8217;appelant Nagios et un serveur Windows. Il apporte aussi de base quelques outils pour effectuer une certaine batterie de tests. Le paramétrage des tests que l&#8217;on veut se fait sur le serveur Nagios, pas du côté de l&#8217;agent Windows.<br />
Si on veut ajouter un test qui n&#8217;est pas prévu par cet agent, il faudra écrire un script, sous windows cette fois, et le définir dans l&#8217;agent, qui sert de relai, en gros. On le verra plus bas avec le contrôle des patchs Windows en attente d&#8217;installation.</p>
<p>Bref, une fois NSClient++ installé, la doc dit d&#8217;aller trafiquer les options du service Windows qu&#8217;on vient d&#8217;installer. Dans les propriétés du service, allez dans l&#8217;onglet &#8220;Connexion / Log on&#8221; et cocher la case pour autoriser à &#8220;interagir avec le bureau&#8221;.</p>
<p>Maintenant il faut ajuster un peu le fichier de paramétrage de l&#8217;agent, <code>C:\Program Files[ (x86)]\NSClient++\NSC.ini</code>. Sachant que je vais y revenir plus tard pour NRPE (voir plus bas), si c&#8217;est la galère pour déployer le fichier sur vos machines, attendez un peu pour le faire une seule fois (cherchez plus bas dans l&#8217;article NRPE). Enfin bon, commencez par un serveur avant de généraliser un truc qui ne fonctionne pas.</p>
<p>Dans la section [modules], décommenter comme suit (tout sauf CheckWMI.dll et RemoteConfiguration.dll) :</p>
<pre>[modules]
;# NSCLIENT++ MODULES
;# A list with DLLs to load at startup.
;  You will need to enable some of these for NSClient++ to work.
; ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
; *                                                               *
; * N O T I C E ! ! ! - Y O U   H A V E   T O   E D I T   T H I S *
; *                                                               *
; ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
FileLogger.dll
CheckSystem.dll
CheckDisk.dll
NSClientListener.dll
NRPEListener.dll
SysTray.dll
CheckEventLog.dll
CheckHelpers.dll
;CheckWMI.dll
;
; RemoteConfiguration IS AN EXTREM EARLY IDEA SO DONT USE FOR PRODUCTION ENVIROMNEMTS!
;RemoteConfiguration.dll</pre>
<p>Dans la partie [NSClient], attribuer un port d&#8217;écoute (celui par défaut à priori) et dans la section [Settings], à voir si vous voulez un mot de passe. Je n&#8217;en ai pas mis, j&#8217;ai limité l&#8217;écoute à l&#8217;adresse IP de mon serveur Nagios ; pratique dans ce cas simple avec un seul serveur de monitoring.</p>
<pre>[...]
[NSClient]
[...]
port=12489
[...]
[Settings]
[...]
;password=secret-password
allowed_hosts=192.168.y.x
[...]</pre>
<p>Notez la section <code>[log]</code> qui peut être pratique quand rien ne fonctionne et qu&#8217;il faut comprendre ce que NSClient reçoit de Nagios.</p>
<p>Redémarrez le service, le client est prêt.</p>
<h3>Premier morceau de config Nagios, la théorie</h3>
<p>Maintenant on va indiquer à Nagios d&#8217;aller voir ce qu&#8217;il se passe là-bas et quels tests de base effectuer pour une &#8220;machine windows&#8221;.<br />
On va partir d&#8217;un modèle de configuration de poste Windows fourni par Debian et définir notre machine, appelée &#8220;mamachine&#8221;.<br />
Là ça fait un peu mal au crâne la première fois, mais une fois le concept compris, vous pondrez des fichiers de conf Nagios au kilomètre. En effet, c&#8217;est le chapitre où on fait le baptême du feu dans la syntaxe Nagios. J&#8217;espère être clair dans ces prochains chapitres.</p>
<hr />
IMPORTANT</p>
<hr /><P><br />
L&#8217;organisation en terme de fichiers dans <code>/etc/nagios3/conf.d/</code> est complètement libre. Vous pouvez tout mettre dans un seul fichier ou couper par site (par exemple), ou encore séparer la déclaration des machines de celle des groupes de machines, mettre la définition de vos propres services à part ou proche des groupes de machines auxquelles ces services se rapportent etc.<br />
C&#8217;est votre choix, à la fin, Nagios intègrera l&#8217;ensemble des directives de configuration de &#8220;conf.d&#8221; (ainsi que des plugins, tout ceci est configuré en amont par Debian dans <code>/etc/nagios3/*conf</code>) et hurlera au &#8220;reload&#8221; si vous vous êtes trompés.<br />
C&#8217;est d&#8217;autant plus libre qu&#8217;en géréral, il y a plusieurs manières d&#8217;organiser les choses pour arriver à un même résultat. Premier exemple ci-dessous : est-ce que je dis que &#8220;mamachine&#8221; appartient au groupe (<em>hostgroup</em>) &#8220;windows-servers&#8221; ou est-ce que je dis que le groupe &#8220;windows-servers&#8221; contient comme membre (<em>members</em>) &#8220;mamachine&#8221;. A vous de voir.<br />
Je mets les mots-clefs Nagios entre parenthèse et <em>en italique </em>pour faire l&#8217;association &#8220;bon français&#8221;-&#8221;mot-clef Nagios&#8221;.</p>
<hr />
TNATROPMI</p>
<hr /><P></p>
<p>Donc, pour une conf de base pour tester une machine via NSClient++, je prends le &#8220;groupe&#8221; Windows (qu&#8217;on complètera plus tard) et je crée une machine &#8220;mamachine&#8221; appartenant à ce groupe. Ce qu&#8217;on appelle ici un &#8220;groupe&#8221; est un &#8220;ensemble des machines auxquelles un certains nombre de tests communs seront appliqués&#8221;. C&#8217;est un <em>&#8220;hostgroup&#8221;</em>. Debian a déjà affecté plusieurs tests à ce groupe. C&#8217;est pratique.<br />
L&#8217;idée sera d&#8217;ajouter par la suite au groupe (<em>hostgroup</em>) &#8220;windows-servers&#8221; d&#8217;autres les tests qui sont communs à tous les Windows : présence de patchs WSUS par exemple. Par exemple, on n&#8217;ajoutera <strong>pas</strong> le contrôle du disque F: qui n&#8217;existe peut-être pas sur tous les serveurs. Là il faudra faire par machine, ou alors un groupe &#8220;des machines ayant un disque F:&#8221;. C&#8217;est votre choix.</p>
<p>Attention, la notion de &#8220;template&#8221; dans Nagios est différente, c&#8217;est réellement un modèle qui définit d&#8217;autres informations sous-jascentes. On n&#8217;y touchera pas (il me semble). Il y a des templates &#8220;windows&#8221; (nommés windows-server, et pas windows-servers qui est le groupe de machine windows, vu ? <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), mais aussi par exemple un &#8220;template&#8221; de service nommé generic-service sur lequel on se base pour déclarer un service.</p>
<h3>Premier morceau de config Nagios, la pratique</h3>
<p>Alors, je localise le groupe (<em>hostgroup</em>) &#8220;windows-servers&#8221; pré-mâché par Debian. On va l&#8217;utiliser car il amène en standard les contrôles de base : espace disque, charge CPU&#8230;</p>
<pre>srvnag:/etc/nagios3/conf.d# dpkg -S windows.cfg
nagios3-common: /usr/share/doc<strong>/nagios3-common/examples/template-object/</strong>windows.cfg
srvnag:/etc/nagios3/conf.d# cp /usr/share/doc/nagios3-common/examples/template-object/windows.cfg template-windows.cfg
</pre>
<p>Ce fichier contient, sans les commentaires standards mais avec les miens et une fois un peu remodelé, ceci :</p>
<pre>define host{ ; définition d'une machine basée sur le template "windows-server", nommé ci-dessous
        use             windows-server  ; Inherit default values from a template
        host_name       mamachine       ; The name we're giving to this host
        alias           C est mamachine       ; A longer name associated with the host
        address         192.168.x.y     ; IP address of the host
        ; #hostgroups windows-servers ; voir ci-dessous
}
</pre>
<p>Cette dernière ligne (hostgroups) aurait permis de dire &#8220;mamachine&#8221; appartient au groupe (<em>hostgroup</em>) &#8220;windows-servers&#8221; (donc elle hérite de tous ses tests). Dans mon cas, j&#8217;ai plutôt décidé de définir la liste des membres (=machines = <em>&#8220;host&#8221;</em>) d&#8217;un groupe (<em>hostgroup</em>) dans la définition de ce groupe. Voir ci-dessous.<br />
J&#8217;ai adapté les tests fournis par Debian pour le groupe &#8220;windows-servers&#8221; (qui ne contient qu&#8217;une machine pour l&#8217;instant). Voici le fichier résultant :</p>
<pre>### Déclaration du groupes windows-servers auquel on affectera les tests communs à tous les windows
define hostgroup{
        hostgroup_name  windows-servers ; Mes serveurs windows
        alias           Windows Servers ; Long name of the group
}

### Définition des SERVICE que l'on va associer au groupe windows-servers
# Create a service for monitoring the version of NSCLient++ that is installed
define service{
        use                     generic-service
;        host_name               mamachine ; non je ne raisonne pas par machine, mais par groupe
        hostgroup_name         windows-servers; voilà où est l'association service/groupe windows
        service_description     NSClient++ Version
        check_command           check_nt!CLIENTVERSION
}
# Create a service for monitoring the uptime of the server
define service{
        use                     generic-service
;        host_name               mamachine ; non je ne raisonne pas par machine, mais par groupe
        hostgroup_name         windows-servers; voilà où est l'association service/groupe windows
        service_description     Uptime
        check_command           check_nt!UPTIME
}
# Create a service for monitoring CPU load
define service{
        use                     generic-service
;        host_name               mamachine ; non je ne raisonne pas par machine, mais par groupe
        hostgroup_name         windows-servers; voilà où est l'association service/groupe windows
        service_description     CPU Load
        check_command           check_nt!CPULOAD!-l 5,80,90
}
# Create a service for monitoring memory usage
define service{
        use                     generic-service
;        host_name               mamachine ; non je ne raisonne pas par machine, mais par groupe
        hostgroup_name         windows-servers; voilà où est l'association service/groupe windows
        service_description     Memory Usage
        check_command           check_nt!MEMUSE!-w 80 -c 90
}
# Create a service for monitoring C:\ disk usage
define service{
        use                     generic-service
;        host_name               mamachine ; non je ne raisonne pas par machine, mais par groupe
        hostgroup_name         windows-servers; voilà où est l'association service/groupe windows
        service_description     C:\ Drive Space
        check_command           check_nt!USEDDISKSPACE!-l c -w 80 -c 90
}
# Create a service for monitoring the W3SVC service
# c'est un exemple gardé en commentaire pour la syntaxe check_nt de contrôle d'un service, voir plus bas
;define service{
;        use                     generic-service
;        host_name               mamachine
;        service_description     W3SVC
;        check_command           check_nt!SERVICESTATE!-d SHOWALL -l W3SVC
;}
# Create a service for monitoring the Explorer.exe process
# c'est un exemple gardé en commentaire pour la syntaxe check_nt de contrôle d'un processus, voir plus bas
;define service{
;        use                     generic-service
;        host_name               mamachine
;        service_description     Explorer
;        check_command           check_nt!PROCSTATE!-d SHOWALL -l Explorer.exe
;}</pre>
<p>Voilà. Si vous rechargez Nagios via <code>/etc/init.d/nagios3 reload</code>, <strong>ben ça plante !!!</strong><br />
Je décris ça juste après avoir décrit &#8220;check_command&#8221; histoire de finir l&#8217;initiation à la conf de base et aux problèmes pénibles du début :/.</p>
<h3>Autres principes à comprendre de cet exemple</h3>
<p>Qu&#8217;y a-t-il d&#8217;autre d&#8217;important dans cette configuration pour comprendre le principe de Nagios ? le mot-clef &#8220;check_command&#8221; bien sûr. Lors de la définition d&#8217;un service, la directive check_command est celle qui explique à Nagios comment effectuer le test et quels paramètres on lui passe. Les paramètres sont séparés par le &#8220;!&#8221;. Le premier argument est le nom de la commande (<em>command</em>) Nagios (et pas du script appelé, pas encore, qui lui s&#8217;appelle <em>command_line</em>).</p>
<p>Exemple :</p>
<pre>        check_command           check_nt!MEMUSE!-w 80 -c 90</pre>
<p>On voit les valeurs d&#8217;alertes warning et critical pour la charge mémoire utilisée, en pourcentage. On retrouvera souvent les mêmes noms d&#8217;arguments alors que les scripts n&#8217;ont rien à voir entre eux (-w pour seuil de warning etc). Il doit y avoir une sorte de norme dans le développement de ces scripts, je suppose.</p>
<p>Pour comprendre le lien entre la <em>command</em> et le script effectivement appelé sur l&#8217;OS, voici :</p>
<pre>srvnag:/etc/nagios-plugins# grep -r command_name * | grep check_nt
config/nt.cfg:  command_name    check_nt
[...]</pre>
<p>On y voit l&#8217;association entre cette commande Nagios et la commande OS appelée :</p>
<pre>srvnag:/etc/nagios-plugins/config/cat nt.cfg
define command {
        command_name    check_nt
        command_line    /usr/lib/nagios/plugins/check_nt -H '$HOSTADDRESS$' -v '$ARG1$'
# cette ligne est erroné d'ailleurs, on le verra plus tard.
}</pre>
<p>La commande (<em>command</em>) check_nt appelle donc le script <code>/usr/lib/nagios/plugins/check_nt</code>.<br />
<strong>C&#8217;est avec lui qu&#8217;il faudra jouer pour &#8220;tester certains tests&#8221; en ligne de commande, avant de comprendre pourquoi ils plantent depuis Nagios mais pas depuis la ligne de commande. C&#8217;est un cas courant.</strong>.<br />
Bon revenons au bug qui m&#8217;occupait et qui devrait aussi vous occuper, à priori un problème lors du reload (je n&#8217;ai plus le message précis), mais on comprend que :</p>
<h3>Il manque le template windows-server</h3>
<p>J&#8217;ai dit le template &#8220;windows-server&#8221;, pas &#8220;windows-servers&#8221; qui est un <em>hostgroup</em>, j&#8217;insiste.<br />
En effet, ce template est fourni dans les packages Debian, mais pas chargé par défaut. En cherchant un peu, on le trouve ici : <code>/usr/share/doc/nagios3-common/examples/template-object/templates.cfg.gz</code>.<br />
Mais si on le <code>gunzip</code> et qu&#8217;on le place dans <code>/etc/nagios3/conf.d</code>, il y a doublon de définition de <code>generic-service</code> comme le montre encore un reload qui plante. Ca se confirme avec cette commande :</p>
<pre>srvnag:/etc/nagios3/conf.d# egrep "name[[:space:]]+generic-service" *
generic-service_nagios2.cfg:        name                            generic-service ; The 'name' of this service template
templates.cfg:        name                            generic-service   ; The 'name' of this service template</pre>
<p>Deux fichiers définissent &#8220;generic-service&#8221;. Les emmerdes continuent.</p>
<p>Donc, je reprends le minimum du template générique, dans mon cas, &#8220;windows-server&#8221;, on verra plus tard si j&#8217;ai besoin de quelque chose d&#8217;autre de ce super-template. Je crée donc ce fichier, tout au moins j&#8217;ajoute ce bout de code quelque part dans ma conf Nagios :</p>
<pre>srvnag:/etc/nagios3/conf.d# cat windows-server_from_templates-gz.cfg
define host{ ; oui ça passe par un "host" pour définir ce modèle de machine "windows-server"
        name                    windows-server  ; The name of this host template
        use                     generic-host    ; Inherit default values from the generic-host template
        check_period            24x7            ; By default, Windows servers are monitored round the clock
        check_interval          5               ; Actively check the server every 5 minutes
        retry_interval          1               ; Schedule host check retries at 1 minute intervals
        max_check_attempts      10              ; Check each server 10 times (max)
        check_command           check-host-alive        ; Default command to check if servers are "alive"
        notification_period     24x7            ; Send notification out at any time - day or night
        notification_interval   30              ; Resend notifications every 30 minutes
        notification_options    d,r             ; Only send notifications for specific host states
        contact_groups          admins          ; Notifications get sent to the admins by default
        hostgroups              windows-servers ; Host groups that Windows servers should be a member of
        register                0               ; DONT REGISTER THIS - ITS JUST A TEMPLATE
}</pre>
<p>Bien sûr, on comprend que ce template dépend lui-même du template &#8220;generic-host&#8221;, mais, ce &#8220;generic-host&#8221; est dans les templates de base de <code>/etc/nagios3/conf.d/</code>. Pas de problème cette fois.<br />
Là, le restart de Nagios devrait bien se passer <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  hop, connexion à l&#8217;interface. Moi perso, j&#8217;y ai vu une tartine de trucs avec des warnings, des &#8220;critical&#8221;, des machins à hurler partout. Surtout des trucs à débugger en fait. Ce qu&#8217;on va faire en expliquant.</p>
<p><em>Attention les remontées par mail vont commencer (par défaut root@localhost). Faites ce qu&#8217;il faut pour récupérer ces mails.</em></p>
<h3>Bug &#8220;missing -l parameters&#8221;</h3>
<p>Le premier bug relevé fût donc un résultat de commande &#8220;missing -l parameters&#8221; dans &#777;l&#8217;interface web&#777; de Nagios.<br />
Pour débugger, il faut en revenir à la ligne de commande comme montré brièvement plus haut. Si on exécute le vrai binaire <code>/usr/lib/nagios/plugins/check_nt</code>, ça marche. Depuis Nagios, ça ne marche pas. Tiens tiens.<br />
Demandez l&#8217;aide pour apprendre à utiliser ce plug-in en ligne de commande :</p>
<pre>srvnag:/etc/nagios-plugins# /usr/lib/nagios/plugins/check_nt
check_nt: Could not parse arguments
Usage:check_nt -H host -v variable [-p port] [-w warning] [-c critical][-l params] [-d SHOWALL] [-t timeout]</pre>
<p>Vous pouvez faire un <code>/usr/lib/nagios/plugins/check_nt --help</code> pour une doc plus complète.<br />
Si vous jouez avec l&#8217;outil en ligne de commande, ça marche pourtant, exemple :</p>
<pre>srvnag:/etc/nagios-plugins# /usr/lib/nagios/plugins/check_nt -H mamachine_ou_son_IP -v MEMUSE -p 12489 -w 80 -c 90
Memory usage: total:3945.26 Mb - used: 1287.70 Mb (33%) - free: 2657.56 Mb (67%) | 'Memory usage'=1287.70Mb;3156.21;3550.73;0.00;3945.26</pre>
<p><strong>Il y a deux problèmes. D&#8217;abord Nagios n&#8217;est pas configuré pour tolérer l&#8217;appel à des scripts &#8220;extérieurs&#8221; (raison sécuritaire). Ensuite, la <em>command</em> check_nt est mal définie (gasp !). J&#8217;en parlais plus haut.</strong></p>
<p>Le README.Debian le disait, et dans notre cas on en a besoin, il faut autoriser Nagios a appeler des scripts extérieur. Il faut positionner <code>set check_external_commands=1</code> dans <code>/etc/nagios3/nagios.cfg</code>. Ensuite, il faut modifier quelque chose dans dpkg pour qu&#8217;une manip soit retenue après mise à jour/upgrade de nagios par aptitude :</p>
<pre>srvnag:/etc/nagios3# /etc/init.d/nagios3 stop
Stopping nagios3 monitoring daemon: nagios3
.
srvnag:/etc/nagios3# dpkg-statoverride --update --add nagios www-data 2710 /var/lib/nagios3/rw
srvnag:/etc/nagios3# dpkg-statoverride --update --add nagios nagios 751 /var/lib/nagios3
srvnag:/etc/nagios3# /etc/init.d/nagios3 start
Starting nagios3 monitoring daemon: nagios3/etc/init.d/nagios3: line 64: kill: (19130) - No such process.</pre>
<p><em>A noter, j&#8217;ai vu plusieurs fois un problème de PID non trouvé, on dirait que le fichier /var/run/nagios3/nagios3.pid n&#8217;est pas purgé à l&#8217;arrêt de Nagios ; pas grave.<br />
</em><br />
Enfin, on modifie la <em>command</em> check_nt. Le &#8220;missing -l parameters&#8221; signifie bien qu&#8217;on n&#8217;a pas passé le paramètre &#8220;-l&#8221; au binaire check_nt, paramètre obligatoire pour certains tests. En fait, dans <code>/etc/nagios-plugins/config/nt.cfg</code>, l&#8217;appel à check_nt est défini comme suit :</p>
<pre>        #command_line    /usr/lib/nagios/plugins/check_nt -H '$HOSTADDRESS$' -v '$ARG1$'</pre>
<p>Mais souvent, dans les services associés à notre <em>hostgroup</em> windows-servers, on voit qu&#8217;un deuxième paramètre est passé. Le fameux &#8220;-l&#8221;. C&#8217;est simplement que la définition de la commande (<em>command_line</em>) ne s&#8217;occupe de récupérer qu&#8217;un seul paramètre&#8230;<br />
Je suggère donc de modifier <code>/etc/nagios-plugins/config/nt.cfg</code> comme suit :</p>
<pre>gw:/etc/nagios-plugins/config# cat nt.cfg
# 'check_nt' command definition
define command {
        command_name    check_nt
        #command_line    /usr/lib/nagios/plugins/check_nt -H '$HOSTADDRESS$' -v '$ARG1$'
        command_line    /usr/lib/nagios/plugins/check_nt -H $HOSTADDRESS$ -p 12489 -v $ARG1$ $ARG2$
}</pre>
<p>Reload de Nagios. Enfin les premiers testent passent !<br />
Pour dire vrai, je suis passé par un stade intermédiaire de &#8220;wrong -l argument&#8221;. J&#8217;ai forcé l&#8217;appel du port (-p 12489) dans la <em>command_line</em> pour régler le problème. Si vous voulez rendre ce port variable, à vous de modifier la définition des services (dans les <em>define service</em>) appelant check_nt pour passer un n-ième argument.<br />
J&#8217;ai aussi fait sauter les apostrophes, ça me faisait des trucs bizarres.<br />
<em>FIXME : si quelqu&#8217;un sait comment activer une trace qui permet de savoir comment a été appelée telle ou telle commande par Nagios, ce serait cool ça permettrait de débugger plus facilement. J&#8217;ai tenté plusieurs niveaux de débuggage, sans succès.</em></p>
<h1>Ouf, premiers tests fonctionnels. Vite, d&#8217;autres !</h1>
<p>Ca marche, c&#8217;est pas trop tôt. Quelques suggestions tirées de ce qui précède :</p>
<ul>
<li>Dans <code>/etc/nagios-plugins/conf.d/</code>, il y a plein de noms de commandes à lire, pour voir ce qu&#8217;on va pouvoir rapidement contrôler. Exemple : contrôler un port https, avec ou sans authentification (plusieurs commandes dispo).</li>
<li>Dans <code>/usr/lib/nagios/plugins/</code>, il y a le pendant en terme de binaires. C&#8217;est bien de se familiariser avec ceux qu&#8217;on compte utiliser pour être sûr de savoir les utiliser en ligne de commande avant de s&#8217;ajouter des bugs en les définissant mal dans la conf Nagios.</li>
</ul>
<p>Je considère par la suite que vous avez bien assimilé ce qu&#8217;on vient de voir et que vous êtes maintenant parés pour créer de la configuration Nagios à grand coup de grep et de copier-coller d&#8217;exemples. Je vais pouvoir donner des bouts de codes en vrac, par thème.</p>
<p>C&#8217;est reparti.<br />
<em>C&#8217;est là où j&#8217;aurais voulu faire une doc méga-complète, mais c&#8217;est impossible. J&#8217;ajouterai donc plus tard des chapitres lorsque j&#8217;estimerai que tel ou tel sujet n&#8217;était pas trivial à mettre en place ou qu&#8217;il y a un concept fort que je n&#8217;ai pas abordé.</em></p>
<h2>Contrôle DHCP</h2>
<p>Plus exactement, &#8220;tester si le serveur DHCP est en mesure d&#8217;attribuer des IP&#8221; (plage pleine ? service KO ?).<br />
Je considère ici mon serveur Nagios comme un simple ordinateur client DHCP sur le réseau (ou une partie du réseau). En exécutant un script, l&#8217;outil check_dhcp simulera une demande de bail et vérifiera que tout se passe bien.<br />
En lisant <code>/etc/nagios-plugins/config/dhcp.cfg</code>, vous voyez vite que la <em>command_line</em> attend un paramètre, l&#8217;adresse du serveur DHCP. Donc, en ajoutant quelque part dans votre <code>/etc/nagios3/conf.d/quelquechose.cfg</code> les lignes suivantes, on met en place le contrôle DHCP :</p>
<pre>define service {
        use     generic-service
        host_name mon_serveur_dhcp ; ou alors vous raisonnez par hostgroups, au choix
        service_description     Reponse du DHCP
        check_command           check_dhcp
}</pre>
<p>En ayant bien sûr défini &#8220;mon_serveur_dhcp&#8221; dans un bloc <code>define host</code> quelque part.<br />
Notez qu&#8217;il y a aussi un check_dhcp_interface, qui d&#8217;après <code>/usr/lib/nagios/plugins/check_dhcp --help</code> permet de spécifier une interface particulière.</p>
<p>Ce contrôle est un bon exemple car il faut qu&#8217;il soit lancé avec les droits root &#8211; ou en sudo &#8211; car le principe, je suppose, doit être de forger des paquets pour déclencher une attribution de bail du serveur DHCP ; et forger des paquets => droit root, un peu comme l&#8217;outil de scan de port &#8220;nmap&#8221; dans certains types de scans. Lire <code>/usr/share/doc/nagios-plugins/README.Debian</code> à ce propos. Ca raconte de faire :</p>
<pre>dpkg-statoverride --update --add root nagios 4750 /usr/lib/nagios/plugins/check_dhcp</pre>
<p>Sinon, vous aurez un joli <code>Warning: This plugin must be either run as root or setuid root.</code> dans l&#8217;interface Nagios.<br />
Dans mon cas, le serveur DHCP est un Windows (ah, j&#8217;te parle plus). J&#8217;ai donc aussi installé le client NSC++ sur cette machine afin de pouvoir remonter de base tous les autres indicateurs. En effet, j&#8217;ai déclaré &#8220;mon_serveur_dhcp&#8221; dans la catégorie windows-servers, donc il récupère de base tous les tests concernant le groupe &#8220;windows-servers&#8221;, contrôle des disques, RAM, blablabla.<br />
Hop, un test de plus.</p>
<h2>Zoom sur les groupes de machines</h2>
<p>J&#8217;en parle tout de suite car il y a déjà des groupes (<em>hostgroups</em>) définis dans <code>/etc/nagios3/hostgroups_nagios2.cfg</code>. Notamment les machines &#8220;pingables&#8221;. Je trouve que c&#8217;est une bonne idée d&#8217;ajouter des groupes type &#8220;les serveurs web&#8221; ou &#8220;les serveurs de mail&#8221;. Même si pour l&#8217;instant vous n&#8217;avez pas encore défini de service (<em>define service</em>) pour ces groupes, ça permet de s&#8217;organiser et de prévoir la distribution automatique de plein de tests à mesure qu&#8217;on déclare nos <em>host</em> et qu&#8217;on les affecte à ces groupes (<em>hostgroup</em>), et non pas aux machines.</p>
<p><em>Au passage, avec un bon <code>dpkg -S base/debian.png</code> et un grep qui va bien, vous allez vite localiser le bout de configuration qui permet d&#8217;affecter des icones aux types de serveurs, pour faire joli dans l&#8217;interface.</em></p>
<h2>Droits d&#8217;utilisateurs, contacts</h2>
<p>Pour créer un utilisateur en lecture (votre patron par exemple, il faut le limiter, pour pas qu&#8217;il fasse n&#8217;importe quoi depuis l&#8217;interface), le mieux est de lire <a href="http://nagios.sourceforge.net/docs/3_0/cgiauth.html">http://nagios.sourceforge.net/docs/3_0/cgiauth.html</a>. Attention, c&#8217;est fourbe car le menu de replanification &#8211; par exemple &#8211; de test de service est disponible pour tous les utilisateurs, mais c&#8217;est après validation de l&#8217;action qu&#8217;on voit que la personne n&#8217;a bien <strong>pas</strong> le droit de lancer une planification de tests.</p>
<p>Dans le cas d&#8217;une installation énorme de serveurs, il est possible d&#8217;affecter des contacts à tel ou tel serveur. Vous pouvez aussi donner les droits de supervision à une personne sur un certain ensemble de contrôles uniquement, ce genre de trucs.<br />
Car la liste peut être longue une fois déclarés une 20aine de serveurs triés en X catégories&#8230;</p>
<h2>Vue par service</h2>
<p>Dans l&#8217;interface web de Nagios, vous avez sûrement trouvé le menu qui permet d&#8217;avoir un aperçu par <em>hostgroup</em>. On peut aussi créer une vue par service. Exemple, j&#8217;ai mis plein de contrôles de &#8220;services publics&#8221;, à savoir la réponse d&#8217;un FTP distant, la présence d&#8217;un serveur web distant, la réponse spécifique (recherche d&#8217;un mot dans un page web reçue) etc. J&#8217;estime que tout ça représente un ensemble, mes &#8220;services publics dont j&#8217;aimerais être sûr qu&#8217;ils sont bien online à tout moment sinon on perd nos clients&#8221;.<br />
Je vais donc définir un &#8220;groupe de service&#8221; (<em>servicegroup</em>) rassemblant des couples (machine , service).</p>
<p>Plus précisemment, il s&#8217;agit de lister des couples (<em>host_name</em> d&#8217;un <em>host</em> , <em>service_description</em> d&#8217;un <em>service</em>).<br />
Petit exemple :</p>
<pre>define servicegroup {
        servicegroup_name       public-services
        alias                   Services Internet
        members                 srvweb,Check URL non signee,ftpext,Check FTP ; les fameux couples host/service
}</pre>
<p>Je suppose ici que les <em>define host</em> &#8220;srvweb&#8221; et &#8220;ftpext&#8221; sont définis, ainsi que les <em>define service</em> &#8220;Check FTP&#8221; et &#8220;Check URL non signee&#8221; ; ces exemples seront donnés plus bas dans cette doc.<br />
Pour les services, il s&#8217;agit bien de leur description longue, pas de leur nom.<br />
Ainsi, dans le menu &#8220;servicegroup overview&#8221;, vous verrez un groupe &#8220;Services Internet&#8221; vous donnant d&#8217;un coup d&#8217;oeil l&#8217;état de tous vos services publics/web.</p>
<h2>Contrôle de services Windows</h2>
<p>Exemple pour un serveur Exchange ou pour une base Oracle, je veux être sûr que tous les services associés sont en cours d&#8217;exécution.<br />
Bon cette fois, je passe sur les groupes de machines Oracle qu&#8217;on pourrait créer. Là le but est d&#8217;appréhender le contrôle de services Windows via NSClient++.</p>
<h3>Exemple avec Exchange</h3>
<p>Si je vous suggère de tester la commande suivante, vous allez vite comprendre :</p>
<pre>srvnagw:/usr/lib/nagios/plugins# ./check_nt -H mon_serveur_exchange -p 12489 -v SERVICESTATE -d SHOWALL -l MSExchangeIS,MSExchangeMTA,SMTPSVC,RESvc,W3SVC</pre>
<p><strong>La liste des noms technique des services s&#8217;obtient en double-cliquant sur le nom d&#8217;un service Windows, dans ses propriétés</strong>.<br />
Reste à définir le service et la commande qui va bien et à l&#8217;affecter à votre serveur ou votre groupe de serveurs Exchange.<br />
Voir plus bas mes exemples si vous êtes paumés.</p>
<p>Ce qui est bien avec cet agent NSClient++, c&#8217;est que ça marche pour n&#8217;importe quel service. Ci-dessous, on découvre que ça marche aussi pour perfmon <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h3>Exemple avec l&#8217;anti-virus Sophos, remarque sur la syntaxe</h3>
<p>Attention, certains services ont des espaces dans leur nom.</p>
<ul>
<li>Pour les nommer/utiliser en ligne de commande, il faut un backslash \</li>
<li>Pour les nommer/utiliser depuis Nagios, il faut 2 backslash \</li>
</ul>
<p>Exemple :</p>
<pre>define service {
        use generic-service
        hostgroup_name          sophos-servers
        service_description     Svc SOPHOS server
        check_command           check_nt!SERVICESTATE!-d SHOWALL -l Sophos\\ Agent,Sophos\\ Certification\\ Manager,Sophos\\ EMLibUpdate\\ Agent,Sophos\\ Enterprise\\ Manager\\ Scheduler,Sophos\\ Management\\ Service,Sophos\\ Message\\ Router
}
</pre>
<p>Pour tester ce check_nt en ligne de commande, un seul \ suffirait.</p>
<h3>Exemple de surveillance des services Oracle</h3>
<p>Ben c&#8217;est la même chose, un gros <code>check_nt!SERVICESTATE!-d SHOWALL -l blabla</code> où &#8220;blabla&#8221; est la liste de noms de noms instances Oracle, du listener etc.</p>
<h2>Contrôle de perfmon</h2>
<p>Dans la lignée de ce qui précède, si vous voulez surveiller des indicateurs perfmon de serveurs Windows, c&#8217;est jouable.<br />
Notez que perfmon permettant de surveiller à peu près n&#8217;importe quoi sur Windows (charge réseau par exemple), ce test peut être une variante d&#8217;un test de charge via SNMP ; en ce qui concerne la charge réseau. Pour d&#8217;autres indicateurs de perfmon, il n&#8217;y a que NSClient++ je suppose, ou un script dédié.<br />
Notamment, vous pouvez contrôler la taille des files d&#8217;attente du serveur Exchange monitoré précédemment.<br />
Je ne m&#8217;étends pas, mais il faut appeler check_nt avec &#8220;-v COUNTER&#8221; et le nom des indicateurs que l&#8217;on veut suivre.</p>
<h2>Contrôle de switchs</h2>
<p>Les informations sont décrites là : <a href="http://nagios.sourceforge.net/docs/3_0/monitoring-routers.html">http://nagios.sourceforge.net/docs/3_0/monitoring-routers.html</a>.<br />
Il faut être un peu habitué à SNMP, ou alors c&#8217;est l&#8217;occasion de s&#8217;y mettre. Il faut savoir activer le SNMP sur un switch et connaître quelques OIDs.<br />
Ceci dit attention, vous pourrez tester l&#8217;état de certains ports, l&#8217;uptime d&#8217;un switch. Mais pour contrôler la bande passante du trafic d&#8217;un port, il n&#8217;y a pas d&#8217;OID. Il faudra écrire votre script vous-même ou alors, interfacer avec Cacti qui lui stocke l&#8217;historique des informations de compteurs de trafic, permettant ainsi de calculer des vitesses moyennes. Je suis dessus là, donc j&#8217;en parlerai sûrement de ce ces 4.<br />
Le principe est le suivant :</p>
<ul>
<li>Il faut activer le &#8220;requêtage&#8221; SNMP sur le routeur en question, définir une &#8220;communauté&#8221; (si autre que &#8220;public&#8221;), un éventuel mot de passe (si SNMP v3)</li>
<li>S&#8217;inspirer ensuite du modèle de conf générique des switchs dispo ici : <code>/usr/share/doc/nagios3-common/examples/template-object/switch.cfg</code></li>
<li>Reprendre le template generic-switch (et uniquement lui) de <code>/usr/share/doc/nagios3-common/examples/template-object/templates.cfg.gz</code></li>
<li>Lire <a href="http://fr.wikipedia.org/wiki/Snmp">http://fr.wikipedia.org/wiki/Snmp</a></li>
<li>Lire <a href="http://doc.ubuntu-fr.org/snmp">http://doc.ubuntu-fr.org/snmp</a> pour comprendre rapidement les MIB</li>
<li>Tester en ligne de commande pure d&#8217;abord, avec check_snmp</li>
</ul>
<p>Pour activer le SNMP sur un 3com type 4400, l&#8217;attaquer en telnet (menu system management snmp community) car ce n&#8217;est pas accessible en interface web. Pour un netgear, c&#8217;est gérable par l&#8217;interface web du switch (ou alors ça dépend de la version du firmware, j&#8217;ai déjà vu ça aussi). On peut limiter à une interface IP, par exemple le serveur Nagios exécutant la requête.</p>
<h2>Appel à un script tiers, sous Windows : contrôle des patchs en attente</h2>
<p>Truc très pratique, au lieu d&#8217;aller voir dans WSUS-qui-rame-et-qui-est-à-moitié-pratique.<br />
On va utiliser <a href="http://nagios.sourceforge.net/docs/nrpe/NRPE.pdf">NRPE</a>, un agent qui tournera localement sur la machine distante et qui permettra d&#8217;exécuter des scripts. Ca tombe bien NSClient++ peut assurer ce rôle, du moment qu&#8217;on a décommenter <code>NRPEListener.dll</code>, voir plus haut dans la doc.<br />
Nagios appellera donc NRPE qui appellera un script (ici un .wsf). Au niveau des alertes NAgios, on obtiendra des &#8220;warnings&#8221; et &#8220;critical&#8221; suivant la nature des patchs.<br />
J&#8217;utilise le script <a href="http://www.monitoringexchange.org/cgi-bin/page.cgi?g=Detailed%2F2547.html;d=1">suivant </a>(<a href="http://www.monitoringexchange.org/cgi-bin/page.cgi?g=1546.html;d=1">ou celui là, </a>je ne sais plus, essayez les deux).<br />
Placez les par exemple sur C:\ du serveur à monitorer.</p>
<h3>Conf NRPE pour patchs Windows</h3>
<p>Dans la section <code>[NRPE]</code> du fichier NSC.ini d&#8217;un serveur à monitorer, j&#8217;ai dû paramétrer les choses suivantes :</p>
<pre>;# COMMAND ARGUMENT PROCESSING
;  This option determines whether or not the NRPE daemon will allow clients to specify arguments to commands that are executed.
allow_arguments=1

;  This option determines whether or not the NRPE daemon will allow clients to specify nasty (as in |`&#038;><'"\[]{}) characters in arguments.
allow_nasty_meta_chars=1

allowed_hosts=192.mon.nag.ios</pre>
<p>Et dans la section <code>[NRPE Handlers]</code>, comprenez "les commandes autorisées via NRPE", j'ai simplement créé une commande appelée (au niveau de NSClient/NRPE) "windows_updates" :</p>
<pre>command[windows_updates]=c:\\windows\\system32\\cscript.exe //NoLogo //T:120 c:\\check_windows_updates.wsf /w:0 /c:1
;# RESTE du blabla pour que vous situiez l'endroit
;# COMMAND DEFINITIONS
;# Command definitions that this daemon will run.
;# Can be either NRPE syntax:
;command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
</pre>
<p>Attention aux doubles backslashs/slashs etc.<br />
Rechargez le service NSClient++.<br />
Je suppose que le port par défaut (5666) est accessible depuis NAgios vers votre serveur.</p>
<h3>Conf Nagios pour patchs Windows</h3>
<p>Si tous vos serveurs Windows sont équipés du script et que la conf NRPE dans NSClient++ est bonne pour chacun, vous pouvez ajouter quelque part dans /etc/nagios3/conf.d/ ce bout de code :</p>
<pre>define service{
        hostgroup_name          windows-servers
        use                     generic-service
        service_description     Windows Update
        check_command           check_nrpe_1arg!windows_updates
}</pre>
<p>Si vous n'avez qu'une machine (pour tester), pensez à utiliser <code>host_name toto</code> au lieu de <code>hostgroup_name</code>.</p>
<p>Ensuite, on va définir un test Nagios qui appelle la commande "windows_updates" via NRPE. Le nom windows_updates est bien celui reprit dans la conf NSC.ini, section [NRPE Handlers].<br />
Après quelques tests, j'ai dû recréer mon propre passage d'argument à check_nrpe, script qui d'ailleurs vient normalement avec les plugins de Nagios. Voyez :</p>
<pre>monnagios:/etc/nagios-plugins/config# cat check_nrpe.cfg
# this command runs a program $ARG1$ with arguments $ARG2$
define command {
        command_name    check_nrpe
        command_line    /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$
}

# this command runs a program $ARG1$ with no arguments
define command {
        command_name    check_nrpe_1arg
#JACQUES
        command_line    /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 60
        #command_line   /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}</pre>
<p>Notamment en ajoutant un timeout (-t) plus long et en supprimant le 2è argument.<br />
Comme d'habitude, pour inventer cela, il faut jouer avec la commande <code>/usr/lib/nagios/plugins/check_nrpe</code> directement. Et commencer par jouer localement avec le script .wsf (sur la machine Windows, donc), histoire de vérifier que tout va bien et de débugger pas à pas votre bazar (script mal placé, NRPE mal configuré, Nagios mal paramétré pour ce test etc).</p>
<p>Voilà, normalement ce test fonctionne aussi.</p>
<h1>Trucs en vrac</h1>
<p>Par manque de temps et impossibilité de faire un guide "complet", je note 2/3 idées en vrac :</p>
<p>Attention après un <code>/etc/init.d/nagios3 reload</code> : temps de latence (tests en pending) et lorsqu'un test échoue, il est replanifié pour X minutes plus tard. On peut forcer sa réexécution, mais il faut y aller mollo et ne pas être trop impatient.</p>
<p>Il reste tant à dire : la dépendance entre services, la carte des machines, les prévisions de <em>downtime</em> de machines (pour éviter les mails et alertes inutiles), la fréquence des tests.<br />
Mais là, maintenant que vous avez la base, vous allez pouvoir facilement lire n'importe quelle doc (je veux dire, même celles où très peu de choses sont expliquées) pour peaufiner votre installation. J'espère.</p>
<p>A+</p>
<p>(enfin c'est publié, youhou.... ; j'espère que le tout reste cohérent et utile vu que ça a été écrit en plein de fois et à différents moments de mon apprentissage Nagios)</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/10/07/mise-en-place-de-nagios/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>FluxBB : confirmation d&#8217;inscription ?</title>
		<link>http://michauko.org/blog/2009/10/05/fluxbb-confirmation-dinscription/</link>
		<comments>http://michauko.org/blog/2009/10/05/fluxbb-confirmation-dinscription/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 12:13:29 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[autres outils]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[FluxBB]]></category>
		<category><![CDATA[PunBB]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=685</guid>
		<description><![CDATA[Récemment, j&#8217;ai monté un forum FluxBB (version en cours 1.2.22). C&#8217;est un outil qui fait ce qu&#8217;il a à faire. Pas de fioriture. Bref, simple et ça marche. MAIS : rien pour valider les inscriptions. Soit on les ferme, soit on demande confirmation de l&#8217;expéditeur (il reçoit un mail avec son pass et confirme). Pas [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment, j&#8217;ai monté un forum FluxBB (version en cours 1.2.22).<br />
C&#8217;est un outil qui fait ce qu&#8217;il a à faire. Pas de fioriture. Bref, simple et ça marche.</p>
<p>MAIS : rien pour valider les inscriptions. Soit on les ferme, soit on demande confirmation de l&#8217;expéditeur (il reçoit un mail avec son pass et confirme). Pas d&#8217;intermédiaire.</p>
<p>Résultat : des robots un peu partout qui s&#8217;inscrivent. Aucun message derrière, ptet juste pour garder un compte pour le jour où telle faille est publiée. Je ne sais pas.<br />
Bon bref, <a href="http://www.punbb.fr/forums/viewtopic.php?id=2621" target="_blank">en suivant ce qui est expliqué là</a>, vous ajouterez sans mal une question lors de l&#8217;inscription. Question si possible assez balaise pour qu&#8217;un robot ne sache pas y répondre.<span id="more-685"></span></p>
<p><em>EDIT : il y avait des balises php, interprétées&#8230; :</em><br />
Modifiez donc le fichier &#8220;register.php&#8221; comme indiqué <a href='http://michauko.org/blog/wp-content/uploads/2009/10/diff.txt'>dans ce fichier</a> (ou sur le site).</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/10/05/fluxbb-confirmation-dinscription/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Disque USB &#8220;Mac&#8221; : la puissance du Commercial</title>
		<link>http://michauko.org/blog/2009/10/05/disque-usb-mac-la-puissance-du-commercial/</link>
		<comments>http://michauko.org/blog/2009/10/05/disque-usb-mac-la-puissance-du-commercial/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 10:05:23 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[coup de coeur]]></category>
		<category><![CDATA[hors sujet]]></category>
		<category><![CDATA[ext2ifs]]></category>
		<category><![CDATA[ext3]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=680</guid>
		<description><![CDATA[Et hop, un disque USB Western Digital &#8220;My Passport&#8221; de 500 GB dans la poche. Une anecdote à ce sujet : Dans une grande enseigne, on trouve la version &#8220;Mac &#038; PC&#8221; à environ 139 €, de tête ; vente Internet uniquement. A côté, le même, pour &#8220;Mac&#8221;, 99€. Même taille, même couleur. J&#8217;appelle les [...]]]></description>
			<content:encoded><![CDATA[<p>Et hop, un disque USB Western Digital &#8220;My Passport&#8221; de 500 GB dans la poche.<br />
Une anecdote à ce sujet :</p>
<ul>
<li>Dans une grande enseigne, on trouve la version &#8220;Mac &#038; PC&#8221; à environ 139 €, de tête ; vente Internet uniquement.</li>
<li>A côté, le même, pour &#8220;Mac&#8221;, 99€. Même taille, même couleur.</li>
</ul>
<p>J&#8217;appelle les techos sur place &#8211; des fois que je sois complètement neuneu et qu&#8217;il y ait une incompatibilité. Je me demande bien où elle serait.<br />
Il me dit que ça doit être une histoire de formattage par défaut pour Mac, ou d&#8217;outils fournis avec. Je suis d&#8217;accord. J&#8217;achète.</p>
<p>En effet, une fois branché, c&#8217;est un disque dur. Point. Normal en fait. <a href="http://michauko.org/blog/2009/02/25/ntfs-3g-oui-mais-pour-linverse-ext2ifs/">Formatté en ext3</a>. Ca bourrine.</p>
<p>Je me demande combien se sont fait avoir&#8230; c&#8217;est incroyable des trucs pareils.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/10/05/disque-usb-mac-la-puissance-du-commercial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>netcat : je &#8220;déTAR&#8221; d&#8217;une machine vers l&#8217;autre</title>
		<link>http://michauko.org/blog/2009/10/01/netcat-je-detar-dune-machine-vers-lautre/</link>
		<comments>http://michauko.org/blog/2009/10/01/netcat-je-detar-dune-machine-vers-lautre/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 14:03:09 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ligne de commande]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[netcat]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[scp]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=669</guid>
		<description><![CDATA[&#8220;déTAR&#8221; à distance Pense-bête : j&#8217;ai un gros .tar sur un serveur, je dois l&#8217;extraire sur un autre serveur. MAIS, sur cet autre serveur, je n&#8217;ai pas la place pour récupérer le .tar puis le décompresser, c&#8217;est-à-dire stocker deux fois en terme d&#8217;espace. Donc j&#8217;utilise netcat pour faire un &#8220;pipe&#8221; entre commande d&#8217;une machine à [...]]]></description>
			<content:encoded><![CDATA[<h1>&#8220;déTAR&#8221; à distance</h1>
<p>Pense-bête : j&#8217;ai un gros .tar sur un serveur, je dois l&#8217;extraire sur un autre serveur. MAIS, sur cet autre serveur, je n&#8217;ai pas la place pour récupérer le .tar puis le décompresser, c&#8217;est-à-dire stocker deux fois en terme d&#8217;espace.<br />
Donc j&#8217;utilise netcat pour faire un &#8220;pipe&#8221; entre commande d&#8217;une machine à l&#8217;autre.</p>
<p>Une fois le programme netcat installé, peu importe par quel biais, et en considérant que vous n&#8217;avez pas de restriction réseau entre les 2 machines (sinon ouvrez le port ci-dessous en UDP), vous faites ceci :<span id="more-669"></span></p>
<p>Sur la machine cible, on prépare une socket en écoute, ici sur le port 12345 :</p>
<pre>moi@destination:/ou/je/veux/ecrire$ netcat -l -p 12345 | tar xvf -</pre>
<p>Sur la machine émettrice, on balance la purée dans le tuyau :</p>
<pre>moi2@source:~$ cat monfichier.tar | netcat aladdin 12345</pre>
<p>A adapter dans le cas d&#8217;un fichier .bz2 ou .gz, par exemple.</p>
<h1>Recopie d&#8217;arborescence d&#8217;un serveur à l&#8217;autre</h1>
<p>Une autre utilisation très courante est la suivante : recopier une arborescence d&#8217;un serveur à l&#8217;autre, sans utiliser rsync, scp etc. Pourquoi se passer de ces outils ? il y a des cas où on ne les a pas. Et puis là on évite le cryptage, tout ça, charge CPU, blablabla.<br />
Ca donne :</p>
<pre>dest$ nc -l p 12345 | tar x</pre>
<pre>src$ tar cvf - mon_arborescence | nc dest 12345</pre>
<h1>EDIT : truc bien crade : ça marche aussi pour injecter du SQL&#8230;</h1>
<pre>dest$ nc -l p 12345 | mysql -u monlogin -p</pre>
<pre>src$ cat test.sql | nc dest 12345</pre>
<p>Attention à ce que vous faites là quand même.<br />
Notez qu&#8217;au lancement de la commande sur la machine de destination, le mot de passe mysql est demandé tout de suite.</p>
<p>Voilà<br />
A+</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/10/01/netcat-je-detar-dune-machine-vers-lautre/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PS3, Yellow Dog Linux et VLC : toujours pas bon</title>
		<link>http://michauko.org/blog/2009/09/29/ps3-yellow-dog-linux-et-vlc-toujours-pas-bon/</link>
		<comments>http://michauko.org/blog/2009/09/29/ps3-yellow-dog-linux-et-vlc-toujours-pas-bon/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 07:00:29 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[PS3]]></category>
		<category><![CDATA[ps3-video-mode]]></category>
		<category><![CDATA[VLC]]></category>
		<category><![CDATA[Yellow Dog Linux]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=663</guid>
		<description><![CDATA[Objectifs Bon, j&#8217;avais fait quelques articles sur l&#8217;installation d&#8217;une UBUNTU sur PS3. Deux objectifs : avoir un bureau en 1920*1080 sur une grosse TV avec option &#8220;web-mail-cul-dan-l-canap&#8221; et surtout : pouvoir faire manger les formats vidéos inconnus par la PS3 (mkv par exemple ; les XVID passent maintenant) Pas la peine de vous casser la [...]]]></description>
			<content:encoded><![CDATA[<h1>Objectifs</h1>
<p>Bon, j&#8217;avais fait quelques articles sur l&#8217;installation d&#8217;une UBUNTU sur PS3. Deux objectifs :</p>
<ul>
<li>avoir un bureau en 1920*1080 sur une grosse TV avec option &#8220;web-mail-cul-dan-l-canap&#8221;</li>
<li>et surtout : pouvoir faire manger les formats vidéos inconnus par la PS3 (mkv par exemple ; les XVID passent maintenant)</li>
</ul>
<h1>Pas la peine de vous casser la tête</h1>
<p>J&#8217;anticipe sur le résultat : l&#8217;affichage en plein écran (même pas d&#8217;ailleurs), vous oubliez, ça saccade. Je n&#8217;ai pas l&#8217;impression qu&#8217;on puisse s&#8217;en sortir avec des paramétrage de VLC en sortie. Ca n&#8217;exploite pas les ressources de la PS3, point. <em>Enfin si je me trompe, je serais ravi d&#8217;apprendre comment faire manger n&#8217;importe quel film misérable ou gros truc HD à VLC sur PS3 en plein écran. FIXME.</em><span id="more-663"></span></p>
<h1>Installation</h1>
<p>J&#8217;ai tenté l&#8217;expérience avec Yellow Dog Linux. Le site dit &#8220;développée en partenariat avec Sony blablablabla&#8221;. La version 6.1 car je l&#8217;ai installée il y a presque un an et je n&#8217;avais pas eu le temps de jouer avec&#8230; La 6.2 est sortie depuis. Je doute que ça révolutionne la chose.<br />
Je vous la fais courte. Si vous avez déjà joué avec l&#8217;installation d&#8217;une Ubuntu sur PS3, c&#8217;est pareil en plus simple. Survolez <a href="http://michauko.org/blog/category/ps3linux/">mes posts précédents </a>pour vous faire une idée.</p>
<ul>
<li>Installation : RAS. Vous mettez le CD, vous bootez etc. J&#8217;ai opté pour Enlightenment qui semble plus léger que KDE et GNOME. Ca rame quand même relativement bien. Mais moins, sensiblement.</li>
</li>
<p>Le coup de la résolution TV : point de fichier <code>/etc/kboot.conf</code>, c&#8217;est <code>/etc/yaboot.conf</code>. Même problématique, même option à passer à l&#8217;outil <code>ps3-video-mode</code>.</li>
<li>Installation de VLC : <a href="http://news.softpedia.com/news/How-to-Enable-Video-Playback-in-Yellow-Dog-Linux-6-1-101664.shtml" target="_blank">suivez ce guide</a>, très bien fait. Si vous dont understand l&#8217;angliche, copiez-collez les commandes <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  et éditez les fichiers mentionnés. C&#8217;est assez bidon : correction des dépôts YUM (amusant : ils semblent pourris de base par l&#8217;éditeur) ; installation de VLC.</li>
<li>Lancement : voilà ça rame, z&#8217;êtes content ? En tout cas, c&#8217;est vous qu&#8217;avez la plus grosse (résolution), si votre TV suit.</li>
</ul>
<h1>Moralité</h1>
<p>Est-ce que vraiment ça ne servira jamais à rien ou y&#8217;a-t-il espoir d&#8217;utiliser un minimum de puissance de la console ? Juste pour lire des vidéos, pas pour jouer, j&#8217;en suis pas là (&#8216;pis faudrait être tordu pour installer des jeux Linux sur PS3. Voire PlayOnLinux.)<br />
Y&#8217;a-t-il un guru de la vidéo dans l&#8217;assistance qui saurait me faire tenter des paramètres VLC pour espérer améliorer la chose ?<br />
Je ne trouve pas d&#8217;articles sur le web qui annoncent comment faire. Juste des mecs super fiers d&#8217;avoir Linux sur PS3&#8230; pour ne rien faire à part un article sur le blog (moi aussi ? ben et pourquoi vous le lisez alors ? pfff)</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/09/29/ps3-yellow-dog-linux-et-vlc-toujours-pas-bon/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>OpenVPN les doigts dans le nez</title>
		<link>http://michauko.org/blog/2009/09/23/openvpn-les-doigts-dans-le-nez/</link>
		<comments>http://michauko.org/blog/2009/09/23/openvpn-les-doigts-dans-le-nez/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 12:56:27 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[reseau et sécu]]></category>
		<category><![CDATA[certificat]]></category>
		<category><![CDATA[easy-rsa]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[masquerading]]></category>
		<category><![CDATA[openvpn]]></category>
		<category><![CDATA[shorewall]]></category>
		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=631</guid>
		<description><![CDATA[Mmmmm, j&#8217;angoissais à l&#8217;idée d&#8217;installer à nouveau un serveur OpenVPN en urgence (psychose de la grippe A-H1N1-truc oblige, &#8216;faut que le pékin lambda puisse bosser à distance&#8230;). En effet, la génération des certificats, ce genre de trucs, ça m&#8217;énerve, je ne me souviens jamais des lignes de commandes. Renseignements pris, ça tombe bien, les choses [...]]]></description>
			<content:encoded><![CDATA[<p>Mmmmm, j&#8217;angoissais à l&#8217;idée d&#8217;installer à nouveau un serveur OpenVPN en urgence (psychose de la grippe A-H1N1-truc oblige, &#8216;faut que le pékin lambda puisse bosser à distance&#8230;). En effet, la génération des certificats, ce genre de trucs, ça m&#8217;énerve, je ne me souviens jamais des lignes de commandes.<br />
Renseignements pris, ça tombe bien, les choses ont dû évolué depuis&#8230; euh&#8230; la dernière fois. Et le projet OpenVPN fournit un bel outil &#8220;easy-rsa&#8221; pour générer facilement les clefs serveurs, client, les inscrire dans la base de clefs autorisées, les révoquer etc.<br />
Ca rend OpenVPN installable et exploitable facilement en 10 minutes + le temps de faire un peu de firewalling propre à votre configuration (et de prendre un café).</p>
<p>Toujours à mon habitude, j&#8217;essaye d&#8217;utiliser ce qu&#8217;a fait Debian pour moi. Point de compilation, de création de machin-bidule à la main lorsque ce n&#8217;est pas une absolue nécessité.</p>
<p>Pour le contexte, on va dire que le VPN va être installé sur une machine de type passerelle Internet-LAN. Pourquoi pas une Debian avec shorewall et 2 pattes : loc, net (et $FW of course). Je parlerai rapidement des modifications de firewall à la fin. Vous pouvez trouver une introduction à shorewall sur <a href="http://michauko.org/docs/debian_testing/">ma doc d&#8217;initiation à Debian</a>.<span id="more-631"></span></p>
<p>Je vais développer en 3 parties : <del datetime="2009-09-22T15:20:38+00:00">thèse, anti-thèse, foutaises, comme disait mon prof de philo au siècle dernier </del>installation, paramétrage du serveur, paramétrage du client, firewalling. Ca fait 4 ? bien, au moins y&#8217;en a qui suivent.</p>
<p>Let&#8217;s go.</p>
<h1>Installation de l&#8217;outil</h1>
<p>Ca devient presque rasoir, on commence direct dans le feu de l&#8217;action :</p>
<pre>aptitude install openvpn</pre>
<p>Par dépendances, SSL descend. Enfin bon, si sur cette machine vous n&#8217;avez pas SSH, donc openssl, je serais étonné.<br />
Je n&#8217;ai pas pris de notes, mais je pense qu&#8217;à ce niveau là déjà, une interface réseau &#8220;tun0&#8243; est créée. Le futur sous-réseau du VPN est 10.0.8.x. Le serveur n&#8217;est pas lancé car il n&#8217;a aucune conf. Ca veut dire <code>/etc/openvpn/</code> vide ou pas loin. Et c&#8217;est tant mieux.</p>
<h1>Paramétrage serveur</h1>
<h2>Rappel : permissions</h2>
<p>On va jouer avec les clefs cryptées et les clefs publiques d&#8217;un outil donnant accès à l&#8217;intérieur de votre réseau. Faites un peu attention aux permissions des fichiers.</p>
<blockquote><p>Clef privée = permission limitée au niveau de l&#8217;OS, root:root + chmod 600<br />
Clef publique = root:root + chmod 644<br />
Ce qui ne concerne que le service et son lancement = root:root + chmod 640
</p></blockquote>
<p><em>Notez que le service openvpn sera lancé par root même s&#8217;il tournera au nom d&#8217;un utilisateur &#8220;openvpn&#8221;.</em></p>
<p>Traditionnellement, les clefs privées ont un nom en .key, les certificats publics en .crt.<br />
Notez bien les permissions de votre conf OpenVPN <strong>lorsqu&#8217;on l&#8217;aura monté </strong>et gardez ça à l&#8217;esprit tout le long :</p>
<pre>serveur:/etc/openvpn# ls -l
total 40
-rw-r--r-- 1 root root  1176 2009-09-14 14:46 ca.crt
-rw------- 1 root root   245 2009-09-14 14:47 dh1024.pem
-rw------- 1 root root    16 2009-09-23 08:23 ipp.txt
-rw------- 1 root root   232 2009-09-23 08:32 openvpn-status.log
-rw-r----- 1 root root 10560 2009-09-22 17:02 server.conf
-rwxr-xr-x 1 root root  1352 2008-09-18 00:33 update-resolv-conf
-rw-r--r-- 1 root root  3813 2009-09-14 14:46 vpnserveur.crt
-rw------- 1 root root   887 2009-09-14 14:46 vpnserveur.key</pre>
<p>En résumé, seules la clef publique de l&#8217;autorité de certification et la clef publique du serveur doivent être publiques.</p>
<h2>Présentation rapide de easy-rsa</h2>
<p>&#8220;easy-rsa&#8221; est un ensemble de scripts simplifiant votre vie pour gérer les certificats. Que ce soient ceux du serveur pour créer sa configuration ou ceux de vos postes clients.<br />
<em>Vous savez aussi sans doute qu&#8217;il vous faudra gérer votre base de certificats autorisés (et surtout révoqués). Lorsque le portable de votre collègue est oublié dans le train, il est intéressant d&#8217;être mis au courant dans la seconde pour révoquer le certificat en question. Sinon c&#8217;est la porte d&#8217;entrée dans l&#8217;entreprise, suivant le profil du <del datetime="2009-09-22T15:34:07+00:00">voleur </del>type qui a trouvé le portable.</em><br />
Cet outil descend avec OpenVPN et l&#8217;ensemble des scripts se situe dans <code>/usr/share/doc/openvpn/examples/easy-rsa/2.0/</code>. Il y a une version 1.0. J&#8217;ai opté pour la 2.0. Je ne me suis pas trop documenté sur le sujet.</p>
<p>Il y a un tout petit peu de paramétrage à faire sur easy-rsa.<br />
Je recommande de dupliquer le fichier <code>/usr/share/doc/openvpn/examples/easy-rsa/2.0/vars</code> en <code>/usr/share/doc/openvpn/examples/easy-rsa/2.0/vars.maconf</code> et de travailler dedans.<br />
Je vous montre un &#8220;diff&#8221; entre le fichier d&#8217;origine et le mien. C&#8217;est le minimum syndical à renseigner :</p>
<pre>serveur:/usr/share/doc/openvpn/examples/easy-rsa/2.0# diff -h vars vars.maconf
64,68c64,68
< export KEY_COUNTRY="US"
< export KEY_PROVINCE="CA"
< export KEY_CITY="SanFrancisco"
< export KEY_ORG="Fort-Funston"
< export KEY_EMAIL="me@myhost.mydomain"
---
> export KEY_COUNTRY="FR"
> export KEY_PROVINCE="France"
> export KEY_CITY="Petaouana"
> export KEY_ORG="MaBoite"
> export KEY_EMAIL="adminvpn@maboite.fr"</pre>
<p><strong>Notez : pour utiliser les scripts Easy-RSA, il faut à chaque fois positionner les variables d&#8217;environnement du fichier <code>vars.maconf</code>. Donc, à chaque nouvelle session dans laquelle vous jouez avec les scripts easy-rsa, il faudra commencer par la commande suivante :</strong></p>
<pre>. /usr/share/doc/openvpn/examples/easy-rsa/2.0/vars.maconf #sans oublier le point au début !!!</pre>
<p>.</p>
<p>Le répertoire où sont stockées les clefs générées (et d&#8217;autres choses, liste de certificats, certificats révoqués etc) est le sous-répertoire <code>keys/</code>. Inutile de préciser (?) que ce répertoire doit être archi-protégé :</p>
<pre>serveur:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ls -ld keys
drwx------ 2 root root 4096 2009-09-14 18:22 keys</pre>
<p>Enfin, la première fois uniquement (ou tant que vous testez), vous pouvez nettoyer ce répertoire via la commande <code>./clean-all</code>.</p>
<h2>Création de l&#8217;autorité de certification</h2>
<p>Maintenant que vos &#8220;variables&#8221; sont prêtes et chargées dans votre session, on attaque.<br />
Bien évidemment, cette manip n&#8217;est à faire qu&#8217;une fois. Seule la manip de création de certificats pour vos clients (postes clients) sont à faire X fois.<br />
L&#8217;autorité de certification est &#8220;un nom et des clefs&#8221; signant vos certificats. Un exemple connu est Verisign. Ici, on va signer nous-même. Sur un serveur web, ça ferait des warnings de certificats bidouilleux, ici on s&#8217;en fout.</p>
<pre>./build-ca</pre>
<p>Vous obtenez le baratin standard de génération de clefs, lisez ce qui y est dit et renseignez le &#8220;Common Name&#8221;. Le reste doit descendre du fait du fichier &#8220;vars&#8221; chargé au préalable. <strong>Pour &#8220;Common Name&#8221;, mettez le nom de votre serveur.</strong></p>
<h2>Création de la clef Diffie-Hellman</h2>
<p>La <a href="http://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman">clef Diffie-Hellman</a> est une clef permettant au client et au serveur de s&#8217;entendre sur une clef secrète pour crypter la conversation.<br />
Si je me souviens bien, les clefs publiques/privées servent à l&#8217;initialisation de la communication, mais, étant lourdes en calculs, on opte pour un cryptage plus simple pour le reste de la communication. C&#8217;est la clef DH. En gros hein. Et pardon aux puristes. Ou dites moi si je me trompe complètement.</p>
<p>On la génère comme suit, grâce aux script Easy-RSA :</p>
<pre>./build-dh</pre>
<p>Rien à saisir, ça prend juste un peu de temps.</p>
<h2>Génération du certificat serveur</h2>
<p>On continue, pour le dernier élément du serveur : sa propre clef.</p>
<pre>./build-key-server</pre>
<p>(trop cool les scripts Easy-RSA non ?)<br />
Ca sort aussi le baratin standard de génération de clefs. Vous devrez préciser le &#8220;Common Name&#8221;, éventuellement un mot de passe (je ne l&#8217;ai pas fait, je suppose qu&#8217;il demanderait du coup un mot de passe au lancement du service openvpn ; ça peut être contraignant lors de reboot).<br />
Par défaut, votre certificat sera valable 10 ans.<br />
Ca termine par l&#8217;inscription du certificat dans la &#8220;base&#8221; :</p>
<pre>1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated</pre>
<h2>Création des certificats d&#8217;un client</h2>
<p>Rappel : lorsque plus tard, vous créerez un autre certificat pour un autre PC, pensez à &#8220;sourcer&#8221; le fichier <code>vars.maconf</code>.<br />
Le script de génération se lance comme suit :</p>
<pre>./build-key pc123</pre>
<p>Je suggère un nom éloquent rappelant ou bien le PC, ou bien la personne.<br />
Là non plus, rien de sorcier : le &#8220;Common Name&#8221; sera le nom du PC et vous &#8220;committez&#8221; le certificat.</p>
<h2>Création des certificats d&#8217;un client avec mot de passe</h2>
<p>Tout pareil que le paragraphe du dessus, mais le script est <code>./build-key-pass pc123</code><br />
Il faudra alors renseigner le mot de passe là :</p>
<pre>Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:</pre>
<p>Rien à voir avec le &#8220;<code>Challenge password</code>&#8221; demandé plus tard.</p>
<h2>La révocation de certificats</h2>
<p>Si à ce niveau là de la configuration on n&#8217;a pas besoin de révoquer des certificats, ça deviendra obligatoire à mesure que les utilisateurs arriveront, partiront et perdront leur PC portables. Evidemment que c&#8217;est du vécu <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
La commande Easy-RSA est :</p>
<pre>./revoke-full pc123</pre>
<p>Il faut copier le fichier résultant, <strong>après chaque révocation</strong> :</p>
<pre>cp keys/crl.pem /etc/openvpn/</pre>
<p>Ce fichier est lu dès l&#8217;instant que vous avez mis en place l&#8217;option &#8220;crl-verify&#8221; dans votre fichier de conf serveur (voir plus haut).<br />
Notez aussi qu&#8217;il est relu à chaque tentative de connexion. Pas besoin de recharger OpenVPN après une révocation. <strong>Juste de recopier le fichier à jour.</strong> Si vous pensez faire un lien symbolique, attention aux permissions (c&#8217;est l&#8217;utilisateur openvpn qui fait tourner openvpn). Je n&#8217;ai pas testé la solution par lien symbolique.</p>
<p>Vous pourrez consulter la liste des certificats révoqués grâce à la commande :</p>
<pre>openssl crl -in /chemin/vers/keys/crl.pem -text</pre>
<p><em>CRL = Certificate Revocation List</em></p>
<h2>Lancement du service</h2>
<p>A ce niveau là, on a généré tout ce qu&#8217;il faut, mais le service ne tourne pas.<br />
Le contenu de votre sous-répertoire keys ressemble à ça :</p>
<pre>serveur:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ls -l keys/
total 80
-rw-r--r-- 1 root root  3813 2009-09-14 14:06 01.pem
-rw-r--r-- 1 root root  3698 2009-09-14 14:29 02.pem
-rw-r--r-- 1 root root  1176 2009-09-14 14:03 ca.crt
-rw------- 1 root root   887 2009-09-14 14:03 ca.key
-rw-r--r-- 1 root root  3698 2009-09-14 14:29 client_test.crt
-rw-r--r-- 1 root root   668 2009-09-14 14:29 client_test.csr
-rw------- 1 root root   887 2009-09-14 14:29 client_test.key
-rw-r--r-- 1 root root   245 2009-09-14 14:32 dh1024.pem
-rw-r--r-- 1 root root   205 2009-09-14 14:29 index.txt
-rw-r--r-- 1 root root    20 2009-09-14 14:29 index.txt.attr
-rw-r--r-- 1 root root    21 2009-09-14 14:06 index.txt.attr.old
-rw-r--r-- 1 root root   101 2009-09-14 14:06 index.txt.old
-rw-r--r-- 1 root root     3 2009-09-14 14:29 serial
-rw-r--r-- 1 root root     3 2009-09-14 14:06 serial.old
-rw-r--r-- 1 root root  3813 2009-09-14 14:06 vpnserveur.crt
-rw-r--r-- 1 root root   664 2009-09-14 14:05 vpnserveur.csr
-rw------- 1 root root   887 2009-09-14 14:05 vpnserveur.key</pre>
<p>On y retrouve les clefs de l&#8217;autorité de certification (<code>ca*</code>), le certificat serveur (<code>vpnserveur.crt</code> et <code>vpnserveur.key</code>) et un futur poste client (<code>client*.[crt|key]</code>). <em>Les fichiers .csr sont les demandes de signatures, étape intermédiaire de la création des certificats, masquée par l&#8217;enrobage de commandes d&#8217;Easy-RSA. Inutile par la suite</em><br />
Il faut recopier (<strong>avec les bonnes permissions !!!</strong>) les fichiers suivants :</p>
<pre>cp -p dh1024.pem vpnser*crt vpnser*key ca* /etc/openvpn</pre>
<p>Ensuite, on va faire tourner le service sous un utilisateur/groupe sans droit, c&#8217;est mieux côté sécurité.</p>
<pre>groupadd openvpn
useradd -d /dev/null -g openvpn -s /bin/false openvpn</pre>
<p>Enfin, il faut créer le fichier de conf du serveur. Un exemple est donné dans le fichier <code>/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz</code>. Une fois dézippé et mis dans <code>/etc/openvpn</code>, on l&#8217;adapte.<br />
Voici son contenu, sans les commentaires :</p>
<pre>serveur:/etc/openvpn# egrep -v "^$|^#|^;" server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert vpnserveur.crt
key vpnserveur.key  # This file should be kept secret
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.X.0 255.255.255.0"
push "dhcp-option DNS 192.168.X.Y"
push "dhcp-option DOMAIN maboite.net"
push "dhcp-option WINS 192.168.X.Y"
keepalive 10 120
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
status openvpn-status.log
verb 3
;crl-verify crl.pem # j'ai triché, j'ai ajouté le ";" il n'aurait pas dû sortir vu la commande egrep passée. Voir ci-dessous.</pre>
<p>Les 4 paramètres <code>push route</code> et <code>push dhcp-option</code> sont à adapter. Ce sont eux qui feront ajouter à votre PC client les règles de routages et DNS, domaine (et optionnellement WINS) à utiliser. Sinon, point de résolution de nom, point de routage depuis votre PC, tantôt vers sa connexion web, tantôt vers le VPN.<br />
Suivant la configuration de votre passerelle, le simple ajout de ces <code>push</code> ne sera pas suffisant pour permettre à vos postes client VPN de rebondir de votre passerelle vers le LAN. Voir plus bas le chapitre dédié.<br />
Enfin, le paramètre &#8220;crl-verify&#8221; prendra son importance avec les révocations de certificats (voir plus bas).<strong>Pour l&#8217;instant, il est en commentaire car j&#8217;ai noté que OpenVPN plantait (volontairement ?) lorsqu&#8217;on lui dit de tenir compte d&#8217;une liste de révocation et que cette liste n&#8217;existe pas, ou est un fichier vide. Ce sera donc à activer plus tard, après votre première révocation.</strong></p>
<p>Ah, j&#8217;oubliais :</p>
<pre>/etc/init.d/openvpn start</pre>
<p>Vérifiez dans les logs que tout va bien. Et <code>ifconfig</code> qui doit avoir affecté une IP à tun0, probablement 10.8.0.1.</p>
<h1>Paramétrage client (poste Windows dans mon cas)</h1>
<p>On a généré un premier ensembles de clefs d&#8217;un poste client.<br />
Dans le cas d&#8217;un PC sous Windows (cas à mon avis le plus courant lorsqu&#8217;il s&#8217;agit de fourni des portables d&#8217;appoint à des utilisateurs distants), installez OpenVPN <a href="http://openvpn.se/download.html">avec le GUI</a>.<br />
Injectez (par un moyen sûr, éviter d&#8217;envoyer la clef cryptée par mail à votre destinataire) les fichiers suivants dans le répertoire <code>C:\Program Files\OpenVPN\config</code> :</p>
<pre>ca.crt # et pas le .key !!!
client_test.key
client_test.crt</pre>
<p>Puis créez un fichier de configuration client nommé <code>nimportequoi.ovpn</code> dans le même sous-répertoire <code>config</code>. Il contiendra la conf suivante, si on oublie les commentaires :</p>
<pre>client
dev tun
proto udp
remote votre.serveur.vpn.votresociete.fr 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client_test.crt
key client_test.key
comp-lzo
verb 3</pre>
<p>Enfin, lancez le GUI d&#8217;OpenVPN situé dans le sous-répertoire <code>bin/</code> d&#8217;OpenVPN, bouton droit dans le &#8220;system tray&#8221; sur l&#8217;icône qui vient d&#8217;apparaitre, menu &#8220;Connect&#8221; et lisez ce qui passe pour commencer à débugger s&#8217;il y a un hic niveau réseau entre le PC portable et le serveur VPN. Attention à vos règles de firewalling en vigueur, que vous testiez de l&#8217;extérieur ou de l&#8217;intérieur (ce qui semble un peu stupide), vous pourriez ne pas être en mesure d&#8217;atteindre le service, d&#8217;où le chapitre ci-dessous.</p>
<h1>Considérations de firewalling</h1>
<p>Bon là, c&#8217;est bien beau, vous atteignez votre serveur VPN depuis l&#8217;extérieur, et encore, si vous avez bien ouvert la porte d&#8217;entrée vers le port UDP 1194 de votre serveur.<br />
Mais pour l&#8217;instant, point de rebond vers le LAN. Et heureusement que ça ne marche pas par défaut.</p>
<h2>Méthode gore pour tester vite fait</h2>
<p>En activant l&#8217;IP Forwarding à la main et en définissant quelques routes entre votre réseau VPN et votre LAN, vous obtiendrez vite fait un résultat. Mais c&#8217;est pas terrible je trouve.<br />
Activation de l&#8217;IP Forwarding comme un cochon :</p>
<pre>echo 1 > /proc/sys/net/ipv4/ip_forward</pre>
<p>Puis définition de routes. Plutôt que de donner un exemple qui ne sera pas le votre, tâchez plutôt de raisonner sur la liste des routes que vous avez et ajoutez celles qu&#8217;il faut, avec les commandes <code>route</code>, <code>route add</code> et <code>route delete</code>.</p>
<h2>Méthode réfléchie pour shorewall</h2>
<p><em>Si vous utilisez iptables, je ne peux rien pour vous. Enfin si, un conseil : songez à utiliser shorewall.</em><br />
Si vous ne connaissez rien à shorewall, c&#8217;est le moment de vous y mettre. Mais dans ce cas, faites vous la main *avant* d&#8217;installer le VPN, quand même. Voyez <a href="http://michauko.org/docs/debian_testing/">ma doc Debian</a> au besoin, il y a un chapitre consacré à shorewall.<br />
Sinon, dans une conf shorewall à 2 pattes (net, loc), on la modifie pour qu&#8217;elle passe à 3 pattes. Dans un cas idéal (mais néanmoins courant), ça se passera comme ça :</p>
<ul>
<li>Ajout de la ligne <code>vpn     ipv4</code> dans <code>/etc/shorewall/zones</code>.</li>
<li>Ajout de la ligne <code>vpn     tun0            detect</code> dans <code>/etc/shorewall/interfaces</code></li>
<li>Ajout de la ligne <code>eth0    tun0</code> dans <code>/etc/shorewall/masq</code> pour activer le Masquerading entre votre VPN et votre LAN, ici situé sur l&#8217;interface eth0</li>
<li>Ajout de toutes les règles par défaut dans <code>/etc/shorewall/policy</code>, concernant la probable interdiction par défaut d&#8217;aller de n&#8217;importe quelle zone vers le VPN et réciproquement. Le VPN doit en effet, à mon avis, être un moyen de secours pour donner accès à quelques services internes, pas à tout le LAN. A base de <code>vpn loc REJECT info</code> + réciproque.</li>
<li>Enfin, le vrai travail, l&#8217;ouverture du minimum d&#8217;autorisation entre toutes vos zones et le VPN. J&#8217;y consacre le paragraphe suivant.</li>
</ul>
<h2>Ouvertures minimum sur le firewall</h2>
<p>En considérant net=eth1 ; loc=eth0 et vpn=tun0, voici ce qu&#8217;il faudra ajouter au minimum, à mon avis :<br />
Déjà l&#8217;accessibilité du service VPN depuis le NET :</p>
<pre>ACCEPT          net     $FW         udp     openvpn</pre>
<p>Ensuite des règles du VPN vers le LAN :</p>
<pre>ACCEPT          vpn     loc:$dns1      tcp     domain # sinon on ne touche pas le serveur DNS => pas de résol de nom => problème...
ACCEPT          vpn     loc:$dns1      udp     domain # je ne sais pas s'il faut le TCP ou l'UDP. Oops.
Ping/ACCEPT     vpn     loc # pratique pour du dépannage
ACCEPT          vpn     loc:$leserveurapplicatif1 # c'est un exemple
ACCEPT          vpn     loc:$leserveurapplicatif2 tcp 80 # un exemple plus restreint, limité au port http
</pre>
<p>Les variables &#8220;$dns1&#8243; (par exemple), sont à définir dans <code>/etc/shorewall/params</code>, ou alors vous tapez l&#8217;IP en dur.</p>
<p>Et enfin quelques accès minimums vers la passerelle elle-même :</p>
<pre>Ping/ACCEPT     $FW     vpn # pratique pour les tests
SSH/ACCEPT      vpn     $FW # pour les admins tout au moins ?
ACCEPT          vpn     $FW     tcp     80 # s'il y a des intranets à consulter (outil de supervision, par exemple)
</pre>
<p>A noter aussi, pour le Masquerading, de forcer l&#8217;activer (valeur &#8220;On&#8221;) ou de laisser tel quel (valeur &#8220;Keep&#8221;) l&#8217;IP forwarding. Ca se passe dans <code>/etc/shorewall/shorewall.conf</code>, paramètre IP_FORWARDING.<br />
Il me semble que c&#8217;est ce paramètre qui force ou pas la modification du paramètre noyau <code>/proc/sys/net/ipv4/ip_forward</code>. Il me semble.</p>
<p>Voilà. Ca devrait marcher.<br />
Evidemment, comme c&#8217;est fortement lié à toute votre infrastructure réseau, tout ce qui précède est plutôt un guide des trucs-à-pas-oublier-pour-que-ça-marche.</p>
<h1>Divers</h1>
<h2>Ce que je n&#8217;ai pas abordé</h2>
<ul>
<li>Testez avant de déployez !!!! notamment les certificats révoqués, et avec eux la CRL et l&#8217;option <code>crl-verify</code>.</li>
<li>Il y a une notion de règles de routages paramétrables par certificat client. Ca peut être utile.</li>
<li>Vous utilisez Orange Business Everywhere pour votre clef 3G ? attention, ça semble intercaler un proxy sur votre Internet Explorer. Résultat, l&#8217;accès à des Intranets via le VPN ne marchait pas. Firefox passait bien. Je n&#8217;ai pas creusé plus pour l&#8217;instant.</li>
</ul>
<h2>Comportement lors d&#8217;une connexion avec un certificat révoqué </h2>
<p>Côté serveur, on voit cette discrète ligne dans /var/log/syslog :</p>
<pre>Sep 23 11:57:49 gw ovpn-server[24224]: 192.X.Y.Z:1120 CRL CHECK FAILED: /C=FR/ST=France/L=Petaouana/O=SOCIETE/CN=pctest/emailAddress=adminvpn@chezmoi.fr is REVOKED</pre>
<p>Côté client, c&#8217;est moins flagrant, on tourne en rond et tente de se reconnecter.<br />
Peut-être qu&#8217;en montant le niveau de verbosité (paramètre verb), on en saurait plus. Mais à la limite, ça intéresse qui ? (à part l&#8217;utilisateur qui s&#8217;est fait révoquer son certificat par erreur).</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/09/23/openvpn-les-doigts-dans-le-nez/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
