<?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 &#187; Debian</title>
	<atom:link href="http://michauko.org/blog/category/debian/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>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>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>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>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>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>
		<item>
		<title>Montage d&#8217;un serveur de mail complet (postfix, postgrey, amavisd-new, clamav, spamassassin etc)</title>
		<link>http://michauko.org/blog/2009/09/21/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc/</link>
		<comments>http://michauko.org/blog/2009/09/21/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 14:40:35 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[mails]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[amavisd-new]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[greylisting]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[postgrey]]></category>
		<category><![CDATA[pyzor]]></category>
		<category><![CDATA[razor]]></category>
		<category><![CDATA[rulesemporium]]></category>
		<category><![CDATA[spamassassin]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=590</guid>
		<description><![CDATA[Cet article présente la mise en place complète d&#8217;un serveur de mails sous Debian mélangeant les composants suivants : postfix, postgrey, amavisd-new, clamav, spamassassin, razor, pyzor, les règles spamassassin de RulesEmporium et enfin procmail pour délivrer dans des boîtes (ou faire suivre sur un autre backend si c&#8217;est votre cas). Ce type d&#8217;installation peut tout [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article présente la mise en place complète d&#8217;un serveur de mails sous Debian mélangeant les composants suivants : postfix, postgrey, amavisd-new, clamav, spamassassin, razor, pyzor, les règles spamassassin de RulesEmporium et enfin procmail pour délivrer dans des boîtes (ou faire suivre sur un autre backend si c&#8217;est votre cas).</p>
<p>Ce type d&#8217;installation peut tout à fait convenir pour des petites et moyennes entreprises (quelques centaines de personnes), sur un serveur moyennement puissant. Pour faire simple.<span id="more-590"></span></p>
<h1>Encore une doc sur ce sujet ?</h1>
<p>Oui on s&#8217;excuse, mais comme d&#8217;habitude avec Debian, tout est déjà prêt à fonctionner et pourtant, on trouve généralement des docs de personnes mettant en place l&#8217;outil en recompilant les sources, en prenant des fichiers de conf à droite à gauche, en démolissant le beau travail déjà accompli par les packageurs Debian.<br />
Mon approche reste la même : Debian a fait le boulot pour moi, j&#8217;en profite.<br />
Au final, cet article est simplement brodée autour du README.Debian de chaque paquet qu&#8217;on va installer (surtout amavisd-new) et de quelques autres docs glanées sur le web expliquant tel ou tel paramètre, un peu plus que la doc officielle.<br />
Mais comme rares sont les gens qui lisent les README, mon article devrait quand même intéresser quelques lecteurs, je l&#8217;espère.</p>
<h1>Ce dont je ne parle pas</h1>
<p>Je ne parle pas de l&#8217;aspect lecture des mails (en POP, en IMAP, renvoi vers un autre backend (Exchange ?)), mais juste au nettoyage et au blocage amont des spams et virus.<br />
Je pars d&#8217;ailleurs d&#8217;une machine avec un postfix minimaliste sachant envoyer et recevoir des mails.<br />
Vous pouvez vous reporter à <a href="http://michauko.org/docs/debian_testing/">ma doc Debian</a> pour ce cas là, elle décrit en plus de postfix :<br />
- la mise en place de postgrey (<a href="http://michauko.org/blog/?s=postgrey">voyez l&#8217;intérêt ici</a>)<br />
- la mise en place de quelques blocages par blacklists (RBL &#038; co)<br />
- procmail<br />
Je ne parle pas non plus du montage d&#8217;un backup MX. Probablement lors d&#8217;un prochain article.</p>
<p>Enfin, je colle tous les éléments de ce serveur sur une unique machine physique. Vous pourriez séparer les éléments. A ce moment-là, un peu de raisonnement et une lecture des documentations officielles que je cite me paraît judicieux. Cet article se limiterait alors,pour vous, à comprendre le rôle de chaque morceau, à appréhender la configuration de base et à partir du coup dans la bonne direction.</p>
<p>Comme à mon habitude, je décris aussi quelques bêtises et oublis que j&#8217;ai pû rencontrer, ça aidera à débugger et ça explique des choses.</p>
<h1>Pré-requis</h1>
<p>Etre sur une Debian stable (Lenny) avec le dépôt Debian &#8220;volatile&#8221; opérationnel (pour les mises à jour de clamav).<br />
Le dépôt &#8220;volatile&#8221;, c&#8217;est ça :</p>
<pre>moi@srv:~$ cat /etc/apt/sources.list | grep vola
deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free</pre>
<p>C&#8217;est un dépôt créé pour palier aux problèmes des applications mises à jour constamment (les bases anti-virus par exemple, tout autant que des outils de mssageries instantanées qui voient les protocoles sous-jascents évoluer régulièrement). Si on restait sur le rythme Debian (tous les 2 ans ; <a href="http://www.debian.org/News/2009/20090729">bientôt 6 mois</a>), on aurait des applications inutiles.</p>
<h1>Rôle de chaque élément</h1>
<p>D&#8217;abord le schéma qui va bien :<br />
<div id="attachment_598" class="wp-caption aligncenter" style="width: 462px"><img src="http://michauko.org/blog/wp-content/uploads/2009/09/amavisd-new.png" alt="Cheminement du mail" title="amavisd-new" width="452" height="444" class="size-full wp-image-598" /><p class="wp-caption-text">Cheminement du mail</p></div></p>
<p>1. Postfix reçoit donc la connexion d&#8217;un serveur voulant envoyer un mail.<br />
2. Grâce à postgrey, il va filtrer déjà un bon paquet de spams qui n&#8217;atteindra pas la suite des composants (et donc pas de charge réseau/cpu inutile).<br />
3. Donc au besoin, le mail revient plus tard, suite à greylisting.<br />
4. Postfix passe le relai à amavisd-new qui orchestre les appels à :<br />
5. ClamAV qui fait ce qu&#8217;il a à faire<br />
6. et à spamassassin, lui-même gérant pyzor/razor<br />
7. Retour du mail nettoyé (disons, avec les en-têtes qui vont bien) vesr postfix<br />
8. Postfix livre le mail (dans la boîte de l&#8217;utilisateur, au backend, à je ne sais quel autre élément en aval.</p>
<h1>Doc officielle, doc complémentaire</h1>
<p>Lire <code>/usr/share/doc/amavisd-new/README.postfix.gz</code> est un passage obligé, je trouve. Je me base dessus et je fais certains choix qui pourraient ne pas être les votres. Je n&#8217;invente pas grand chose, tout est quasiment dedans.<br />
Si vous êtes sur une installation déjà en production, vous pourriez être intéressés par le paramètre <code>soft_bounce</code>, voyez <a href="http://funt.wordpress.com/2007/03/19/postfix-soft_bounce/" target="_blank">ici</a> via un :<br />
<code>postfix -e "soft_bounce = yes"</code></p>
<p>Autre doc intéressante : <a href="http://www200.pair.com/mecham/spam/spamfilter20090215.html">http://www200.pair.com/mecham/spam/spamfilter20090215.html</a>. A noter : l&#8217;auteur n&#8217;utilise pas trop le boulot de Debian, donc beaucoup de choses à reparamétrer dans son cas, sans compter les manips à la main : récupérer le fichier de conf X, prendre tel binaire postfix plutôt que celui de la distrib. Bref, pas très Debian-style à mon goût.<br />
Mais au moins il donne une bonne explication de certains paramètres, à vous de voir.<br />
Enfin, cette doc décrit le montage complet d&#8217;une Debian, installation, serveur DNS etc. On s&#8217;en fout pas mal dans le cas présent. Commencez donc à lire cette doc à partir du mot &#8220;postfix anti-spam settings:&#8221;. A peu près au milieu.<br />
Vous verrez passer dans les chapitres qui suivent cet endroit quelques paramètres importants sur le comportement des différents outils, les destinataires des notifications de mails vérolés etc, quelques optimisations sur les niveaux de spam acceptables etc. Mon article reprend certaines de ces suggestions et de ma propre expérience.<br />
Cette doc va aussi plus loin : installation de DCC (Distributed Checksum Clearinghouses) et des outils de statistiques. Je n&#8217;en parle pas (pour l&#8217;instant), on verra avec des articles ultérieurs.</p>
<p>Bon, allez, on installe tout ça.</p>
<h1>Installation des logiciels</h1>
<pre>aptitude install clamav clamav-daemon clamav-freshclam
aptitude install amavisd-new
aptitude install lha arj rar unrar nomarch lzop cabextract razor pyzor p7zip-full pax zip unzip lha zoo</pre>
<p>Certains des paquets ici sont discutables, pour les pros du ça-pue-c-est-pas-libre-(tm). Moi je veux simplement analyser un maximum de contenu de mails, pièces jointes en format moins courants y compris.<br />
Les outils type &#8220;décompression&#8221; serviront à ClamAV pour analyser les contenus de pièces jointes.</p>
<p>Les parties postfix, postgrey, spamassassin et les Maildir sont déjà expliqués dans mes docs/blog à différents endroits.<br />
Deux nuances tout de même :<br />
Je suppose enfin que votre spamassassin est en mode daemon (donc &#8220;spamd&#8221; tourne) car vous avez mis à 1 le paramètre ENABLED dans <code>/etc/default/spamassassin</code>.<br />
Par rapport à ce que j&#8217;explique sur procmail, j&#8217;ai opté pour une conf standard pour tous dans <code>/etc/procmailrc</code> plutôt que dans chaque <code>~/.procmailrc</code>.</p>
<h1>Paramétrage de base</h1>
<h2>Configuration postfix <=> amavis</h2>
<p>D&#8217;abord, on configure un canal de communication postfix => amavis en mode SMTP et pas LMTP (voir le /usr/share/doc/amavisd-new/README.postfix.gz). J&#8217;ajoute à la fin de <code>/etc/postfix/master.cf</code> des lignes suivantes :</p>
<pre>amavisfeed unix    -       -       n       -       2     smtp
     -o smtp_data_done_timeout=1200
     -o smtp_send_xforward_command=yes
     -o smtp_tls_note_starttls_offer=no</pre>
<p>Le nom &#8220;amavisfeed&#8221; est libre. Mais c&#8217;est le nom du tuyau que vous venez de créer. Il faudra utiliser ce nom plus bas (dans <code>main.cf</code>)</p>
<p>Puis le canal retour (message reinjection), toujours à la fin de <code>/etc/postfix/master.cf</code> :</p>
<pre>127.0.0.1:10025 inet n    -       n       -       -     smtpd
     -o content_filter=
     -o smtpd_delay_reject=no
     -o smtpd_client_restrictions=permit_mynetworks,reject
     -o smtpd_helo_restrictions=
     -o smtpd_sender_restrictions=
     -o smtpd_recipient_restrictions=permit_mynetworks,reject
     -o smtpd_data_restrictions=reject_unauth_pipelining
     -o smtpd_end_of_data_restrictions=
     -o smtpd_restriction_classes=
     -o mynetworks=127.0.0.0/8
     -o smtpd_error_sleep_time=0
     -o smtpd_soft_error_limit=1001
     -o smtpd_hard_error_limit=1000
     -o smtpd_client_connection_count_limit=0
     -o smtpd_client_connection_rate_limit=0
     -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
     -o local_header_rewrite_clients=
     -o smtpd_milters=
     -o local_recipient_maps=
     -o relay_recipient_maps=</pre>
<p>Enfin, on active le tuyau postfix => amavisd-new pour permettre l&#8217;analyse : (pas de tri, on balance tout ; on pourrait restreindre par domaine, adresse émettrice etc). C&#8217;est dans <code>/etc/postfix/main.cf</code> :</p>
<pre>content_filter=amavisfeed:[127.0.0.1]:10024</pre>
<p><P><br />
Dans cette configuration par défaut, il faut que les ports 10024 et 10025 (localement) soient libres. Les paramètres sont décrits dans la doc en .gz mentionnée ci-dessus. L&#8217;idée, en gros, est de créer un autre serveur SMTP, local uniquement sur le port 10024, avec une conf postfix indépendante et vierge &#8211; en gros &#8211; car on sait que les messages arrivant là seront passés par amavis, donc ils seront propres/nettoyés. Cette seconde instance postfix sera la porte d&#8217;entrée pour les retours d&#8217;amavisd-new.</p>
<h2>Tests des briques de la communication postfix <=> amavisd-new</h2>
<p>Là, on peut tenter un <code>/etc/init.d/postfix reload</code>.</p>
<h3> Ecoute de amavis</h3>
<p>Le 10024 répondait déjà (car c&#8217;est le port d&#8217;écoute de amavis, lancé depuis qu&#8217;on l&#8217;a installé) :</p>
<pre># telnet localhost 10024
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready</pre>
<h3> Ecoute du 2è postfix (la voie de retour d&#8217;amavis)</h3>
<p>Le port 10025 ne fonctionne qu&#8217;après la conf dans <code>master.cf</code> et un <code>postfix reload</code> :</p>
<pre># telnet localhost 10025
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 srv.net ESMTP Postfix (Debian/GNU)</pre>
<h3>Tests des décodeurs de pièces jointes</h3>
<p>On peut voir les &#8220;décodeurs&#8221; qu&#8217;il manque dans <code>/var/log/mail.log</code>.</p>
<pre>/var/log/mail.log:Aug 25 17:18:21 srv amavis[28164]: No decoder for       .lha</pre>
<p>Dans le cas ci-dessus, on peut conclure que le paquet lha n&#8217;est pas installé.<br />
Attention, la doc dit quelque part de se méfier des décodeurs pour analyse des <a href="http://michauko.org/blog/2007/12/05/winmaildat-kek-jen-fais-je-le-decode-bien-sur/">TNEF</a>. Vous risquez de perdre les mails écrits en RTF par Outlook-le-casse-<del datetime="2009-09-10T11:50:45+00:00">coui</del>pied.</p>
<h3>Test du retour de mails</h3>
<p>On teste un envoi de mail à amavis, et donc le retour :</p>
<pre># telnet localhost 10024
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
helo localhost
250 [127.0.0.1]
mail from: <>
250 2.1.0 Sender <> OK
rcpt to:
<postmaster>
250 2.1.5 Recipient
<postmaster> OK
data
354 End data with <CR><LF>.<CR><LF>
From: virus-tester
To: undisclosed-recipients:;
Subject: amavisd test - simple - no spam test pattern

 This is a simple test message from the amavisd-new test-messages.
.
250 2.0.0 Ok, id=28165-03, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 5FD7D9C4057
quit
221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
Connection closed by foreign host.</pre>
<p>Résultats dans <code>/var/log/mail.log</code> (le retour à postfix prend quelques secondes) :</p>
<pre># tail /var/log/mail.log
Aug 27 11:37:43 srv postfix/smtpd[681]: connect from localhost.localdomain[127.0.0.1]
Aug 27 11:37:43 srv postfix/smtpd[681]: 5FD7D9C4057: client=localhost.localdomain[127.0.0.1]
Aug 27 11:37:43 srv postfix/cleanup[683]: 5FD7D9C4057: message-id=<20090827093743.5FD7D9C4057@srv.net>
Aug 27 11:37:43 srv postfix/qmgr[30259]: 5FD7D9C4057: from=<>, size=724, nrcpt=1 (queue active)
Aug 27 11:37:43 srv amavis[28165]: (28165-03) Passed BAD-HEADER, <> ->
<postmaster>, quarantine: 5/badh-5kHJ7I-xUr2T, mail_id: 5kHJ7I-xUr2T, Hits: -, size: 175, queued_as: 5FD7D9C4057, 81992 ms
Aug 27 11:38:39 srv postfix/local[684]: 5FD7D9C4057: to=<root@srv.net>, orig_to=
<postmaster>, relay=local, delay=56, delays=0.14/0/0/56, dsn=2.0.0, status=sent (delivered to command: /usr/bin/procmail -a "$EXTENSION")
Aug 27 11:38:39 srv postfix/qmgr[30259]: 5FD7D9C4057: removed</pre>
<h2>Activation de l&#8217;appel amavisd-new <=> ClamAV+Spamassassin</h2>
<h3>Enlevez les commentaires, c&#8217;est tout</h3>
<p>C&#8217;est expliqué ici : <code>/usr/share/doc/amavisd-new/README.Debian</code>.<br />
Comme d&#8217;hab, les fichiers de conf pré-machés par Debian sont très bien et attention à ne pas tenir trop compte de documentation de bidouilleurs qui paramètrent tout ça à la sauce pas-très-Debian.<br />
D&#8217;après le README cité ci-dessus, la conf s&#8217;active dans <code>/etc/amavis/conf.d/15-content_filter_mode</code>. Il suffit de décommenter les 4 lignes suivantes dans <code>/etc/amavis/conf.d/15-content_filter_mode</code> : (2 pour ClamAV, 2 pour spamassassin)</p>
<pre>@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);</pre>
<p>En faisant celà, on active la conf définie dans les autres fichiers de <code>/etc/amavis/conf.d/</code>, exemple <code>15-av_scanners</code> pour les anti-virus. Il s&#8217;agit là aussi de modèle de configuration standard de tout un tas d&#8217;outils connus (une bonne 15aine d&#8217;anti-virus dont NOD32, F-Prot, Grisoft, KAV, du symantec etc). Amavisd-new va donc charger les AV qu&#8217;il trouve. De même pour spamassassin.</p>
<h3>Petit oubli pour ClamAV</h3>
<p>On se paye une erreur :</p>
<pre>Aug 27 16:03:09 mon_srv amavis[17143]: (17143-01) (!!)run_av (ClamAV-clamd) FAILED - unexpected , output="/var/lib/amavis/tmp/amavis-20090827T160309-17143/parts: lstat() failed: Permission denied. ERROR\n"
Aug 27 16:03:09 mon_srv amavis[17143]: (17143-01) (!!)ClamAV-clamd av-scanner FAILED: CODE(0x90a9148) unexpected , output="/var/lib/amavis/tmp/amavis-20090827T160309-17143/parts: lstat() failed: Permission denied. ERROR\n" at (eval 86) line 527.
Aug 27 16:03:09 mon_srv amavis[17143]: (17143-01) (!!)WARN: all primary virus scanners failed, considering backups</pre>
<p>L&#8217;utilisateur clamav doit être dans le groupe amavis, on fait ce qui est dit dans le README.Debian de amavisd-new :</p>
<pre># adduser clamav amavis
Ajout de l'utilisateur « clamav » au groupe « amavis »...
Ajout de l'utilisateur clamav au groupe amavis
Terminé.</pre>
<p>Et on contrôle le paramètre suivant dans la conf ClamAV : <code>AllowSupplementaryGroups true</code>. C&#8217;est déjà positionné dans le <code>/etc/clamav/clamd.conf</code> fraîchement dépaqueté. Vérifiez tout de même.<br />
Et on redémarre ClamAV évidemment.</p>
<h1>On peaufine certains paramètres</h1>
<h2>Destinataires des alertes</h2>
<p>Pensez à bien ajuster les destinataires de &#8220;abuse&#8221;, &#8220;postmaster&#8221; et &#8220;root&#8221; de votre serveur. Soit en modifiant les variables comme :</p>
<pre>$virus_admin
$banned_admin
$mailfrom_notify_admin OU recip OU spamadmin
$hdrfrom_notify_sender</pre>
<p>Soit en étant sûr que ces comptes par défaut (et obligatoires, surtout postmaster) font bien suivre les mails vers une adresse que vous lisez/survolez.</p>
<p>Voyez la doc mentionnée plus haut pour des suggestions à propos des variables <code>$virus_admin</code> &#038; co.</p>
<h2>Resctrictions de base de postfix</h2>
<p>Je n&#8217;en parle pas trop, mais pensez à la conf de base de postfix, notamment votre paramètre <code>smtpd_sender_restrictions</code> dans <code>/etc/postfix/main.cf</code>.<br />
Utilisez un service web quelconque sur Google pour valider que votre serveur n&#8217;est pas un open-relay.</p>
<h2>Pièces jointes</h2>
<p>Dans <code>/etc/amavis/conf.d/20-debian_defaults</code>, je suggère d&#8217;élargir la liste des pièces jointes interdites (par extension). <em>Plus besoin de sanitizer, c&#8217;est intégré dans amavisd-new</em>. Exemple :</p>
<pre>### JACQUES
#  qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl)$'i, # banned extension - basic
 qr'.\.(ade|adp|app|bas|bat|chm|cmd|com|cpl|crt|emf|exe|fxp|grp|hlp|hta|
        inf|ins|isp|js|jse|lnk|mda|mdb|mde|mdw|mdt|mdz|msc|msi|msp|mst|
        ops|pcd|pif|prg|reg|scr|sct|shb|shs|vb|vbe|vbs|
        wmf|wsc|wsf|wsh)$'ix,  # banned ext - long
###

# qr'.\.(mim|b64|bhx|hqx|xxe|uu|uue)$'i,  # banned extension - WinZip vulnerab.

  qr'^\.(exe-ms)$',                       # banned file(1) types
# qr'^\.(exe|lha|tnef|cab|dll)$',         # banned file(1) types
### JACQUES
  qr'^\.(exe|lha|cab|dll)$', # OK pour TNEF, merci outlook
###</pre>
<h2>Comportement lors de détection de spam</h2>
<p>EDIT 08/10/2009. Quelques variables importantes à positionner (écraser par rapport à la conf par défaut) :</p>
<pre>[...]
serveur:/etc/amavis/conf.d# cat 50-user
$final_spam_destiny = D_DISCARD; # pour eviter de renvoyer des notifications inutiles a des zombies
$sa_tag_level_deflt  = undef; # pour toujours avoir le tag dans les headers, même si c'est pas du spam
$sa_tag2_level_deflt = 5.0; # d'habitude je mets 5, na !
$sa_kill_level_deflt = 12.0; # d'experience, a 10 on est deja bien bien sur que c'est du spam
[...]</pre>
<p><strong>Enfin, j&#8217;avais oublié un point important, la variable &#8220;@local_domains_acl&#8221;.</strong> Elle défini la liste des domaines sur lesquels spamassassin va intervenir. Les domaines non listés ici ne sont tout simplement pas pris en compte, donc pas analysés, donc pas &#8220;flaggés&#8221;&#8230;<br />
Je ne l&#8217;avais pas vu au début car avec un seul domaine qui est le nom de la machine etc, tout va bien avec le choix par défaut de Debian dans <code>05-domain_id:@local_domains_acl = ( ".$mydomain" );</code>.<br />
Là où ça se complique, c&#8217;est quand vous gérez plusieurs domaines, suivant comment votre bousin est défini. Par exemple avec des domaines virtuels, gérés en base de données, c&#8217;est mort (<em>prochain article à venir sur la gestion de domaines et d&#8217;utilisateurs virtuels</em>).<br />
J&#8217;ai donc forcé cette variable dans le fichier <code>/etc/amavis/conf.d/50-user</code> :</p>
<pre>@local_domains_acl = ( ".maboite.fr", "un.autre.alias.net" );</pre>
<p>A noter que là, je prends en charge les éventuels sous-domaines &#8220;toto.maboite.fr&#8221; (c&#8217;est voulu, grâce au point devant &#8220;maboite&#8221;) et uniquement &#8220;un.autre.alias.net&#8221;, mais pas un domaine de mails qui s&#8217;appellerait &#8220;encore.un.autre.alias.net&#8221;. Pigé ?</p>
<h2>Quarantaine</h2>
<p>Où doivent aller les mails vérolés ? Par défaut, je suggère de ne rien toucher au paramètre <code>$virus_quarantine_to</code>, ainsi les mails vérolés vont dans une arborescence de <code>/var/lib/amavis/virusmails</code>. Jetez-y un oeil une fois des tests de détection effectués (voir ci-dessous, dernier chapitre).<br />
Et documentez vous sur <code>amavisd-release</code>.</p>
<h2>Décodeurs, suite et fin</h2>
<p>Dans <code>/etc/amavis/conf.d/01-debian</code>, jouez avec les variables <code>$unrar</code> et autres qui vous intéressent (oui oui, unrar c&#8217;est pas libre, tout ça, installez le paquet vrms). Il vous faut les applications correspondantes. Voyez le log <code>/var/log/mail.log</code> pour savoir ce qu&#8217;il manque par rapport à votre conf.</p>
<h2>spamassassin</h2>
<blockquote><p>If you use spamassassin with the Bayes database system, you should make sure<br />
that the spamassassin configuration option &#8220;bayes_auto_expire 0&#8243; is set in<br />
spamassassin configure files.  This disables the automatic expiration of tokens<br />
which causes problems for amavisd-new when activated.  The amavisd-new package<br />
includes cron jobs that take care of syncing and expiring the token database<br />
frequently.</p></blockquote>
<p>Je ne mesure pas trop l&#8217;impact, à vrai dire, mais je suppose qu&#8217;il vaut mieux le faire, donc ajoutez <code>bayes_auto_expire 0</code> dans la conf <code>/etc/spamassassin/local.cf</code>.</p>
<h2>Mise à jour de l&#8217;anti-virus</h2>
<p>Le programme freshclam est planifié automatiquement lors de l&#8217;installation de ClamAV. Vous pouvez contrôler sa bonne exécution (il tourne une fois par heure) dans :</p>
<pre>srv:/etc# tail /var/log/clamav/freshclam.log
Received signal: wake up
ClamAV update process started at Thu Sep 10 15:25:18 2009
main.cvd is up to date (version: 51, sigs: 545035, f-level: 42, builder: sven)
daily.cld is up to date (version: 9791, sigs: 77548, f-level: 43, builder: guitar)
--------------------------------------
Received signal: wake up
ClamAV update process started at Thu Sep 10 16:25:18 2009
main.cvd is up to date (version: 51, sigs: 545035, f-level: 42, builder: sven)
daily.cld is up to date (version: 9791, sigs: 77548, f-level: 43, builder: guitar)
--------------------------------------</pre>
<h1>Testez avec EICAR</h1>
<p>EICAR est un virus inoffensif. Essayez de vous envoyer des mails avec différentes pièces jointes fournies ici : <a href="http://securite-informatique.info/virus/eicar/">http://securite-informatique.info/virus/eicar/</a>. Vous validerez ainsi la réaction de votre serveur.<br />
J&#8217;ai eu une erreur dans le <code>mail.info</code> lors de la détection du virus. Le serveur tente d&#8217;informer l&#8217;admin des virus, mais avec une légère erreur de syntaxe sur l&#8217;expéditeur :</p>
<pre>Sep 21 15:33:37 ns305192 postfix/smtpd[20381]: warning: Illegal address syntax from localhost.localdomain[127.0.0.1] in MAIL command:
<postmaster@${myhostname}></pre>
<p>J&#8217;ai alors modifié la liste des expéditeurs de mails d&#8217;alertes. Dans le fichier <code>/etc/amavis/conf.d/50-user</code> :</p>
<pre>$mailfrom_notify_admin='postmaster@chezmoi.fr';
$mailfrom_notify_recip='postmaster@chezmoi.fr';
$mailfrom_notify_spamadmin='postmaster@chezmoi.fr';
$mailfrom_to_quarantine='postmaster@chezmoi.fr';</pre>
<p>J&#8217;ai trouvé la liste de toutes les adresses émettrices d&#8217;alertes sur ce site : <a href="http://www.radical-spam.org/documentations/amavisd-new.html" target="_blank" >http://www.radical-spam.org/documentations/amavisd-new.html</a>. Il y a de belles explications sur les modèles de mails et d&#8217;autres trucs. Bref, à survoler.<br />
Je n&#8217;ai pas trouvé comme pour postfix une commande permettant de voir les variables en mémoire d&#8217;amavisd-new. Si ça existe, je suis preneur.</p>
<p><hR><br />
Voilà. Je crois qu&#8217;une fois tout ceci fait, votre serveur est paré à en prendre plein la tête.<br />
Pensez à des outils genre mailgraph, surveillez vos logs, surtout au début.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/09/21/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Séquence de greylisting</title>
		<link>http://michauko.org/blog/2009/08/27/sequence-de-greylisting/</link>
		<comments>http://michauko.org/blog/2009/08/27/sequence-de-greylisting/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 14:35:09 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[mails]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[greylisting]]></category>
		<category><![CDATA[mail.info]]></category>
		<category><![CDATA[mail.log]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[postgrey]]></category>
		<category><![CDATA[rulesemporium]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[spamassassin]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=581</guid>
		<description><![CDATA[Je suis en train de préparer une doc de mise en place sauce Debian de la fameuse chaîne complète de traitement de mails : postfix + postgrey + amavisd-new + spamassassin + RulesEmporium + clamav. (j&#8217;en oublie ? ) D&#8217;ici que la doc soit prête dans sa globalité, j&#8217;en profite pour zoomer sur le greylisting [...]]]></description>
			<content:encoded><![CDATA[<p>Je suis en train de préparer une doc de mise en place sauce Debian de la fameuse chaîne complète de traitement de mails : postfix + postgrey + amavisd-new + spamassassin + RulesEmporium + clamav. (j&#8217;en oublie ? <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )<br />
D&#8217;ici que la doc soit prête dans sa globalité, j&#8217;en profite pour zoomer sur le greylisting (qui en gros, me divise en général par 10 les spams entrants sur un serveur donnée qui ne faisait pas de greylisting).<span id="more-581"></span></p>
<p>Pour ceux qui n&#8217;utiliseraient pas encore de greylisting pour limiter le nombre de spams en entrée de ses serveurs de mails, j&#8217;explique comment mettre en place <a href="http://michauko.org/docs/debian_testing/">dans ma doc Debian</a> et dans <a href="http://michauko.org/blog/tag/spam/">plusieurs articles sur ce blog</a>.</p>
<p>Voici donc une capture d&#8217;un échange dans <code>/var/log/mail.[info|log]</code> d&#8217;un serveur envoyant un mail à cette architecture postfix/postgrey. Vous pouvez l&#8217;imprimer et l&#8217;afficher au-dessus de votre lit, c&#8217;est joli.</p>
<h1>Rappel de la théorie</h1>
<p>Le greylisting demande à l&#8217;émetteur de renvoyer le mail plus tard, disons 5 minutes. C&#8217;est un comportement normal et possible d&#8217;un serveur SMTP. Si l&#8217;expéditeur est complètement bidon (un zombie par exemple), cette réponse n&#8217;arrive jamais. Le mail &#8211; qui est un spam ou venant d&#8217;un serveur configuré avec les pieds &#8211; ne reviendra jamais et n&#8217;ira donc pas plus loin que la porte d&#8217;entrée du serveur. Pas de traitement anti-spam, rien. Economie de charge CPU etc.<br />
Au bout de quelques mails effectivement reçus de la part de tel serveur, alors on le whiteliste car il semble au moins digne de confiance (je n&#8217;ai pas dit qu&#8217;il n&#8217;envoyait pas du spam). Attention au délai de réception pendant une journée ou 2.</p>
<h1>Let&#8217;s go</h1>
<h2>Prise de contact</h2>
<pre>Aug 27 15:51:05 mon_srv postfix/smtpd[17150]: connect from le.nouvel.expediteur.fr[10.20.30.40]
Aug 27 15:51:06 mon_srv postgrey[12790]: action=greylist, reason=new, client_name=le.nouvel.expediteur.fr, client_address=10.20.30.40, sender=exped@iteur.fr, recipient=destin@mon_srv.fr
Aug 27 15:51:06 mon_srv postgrey[12790]: cleaning up old logs...
Aug 27 15:51:06 mon_srv postfix/smtpd[17150]: NOQUEUE: reject: RCPT from le.nouvel.expediteur.fr[10.20.30.40]: 450 4.2.0 <exped@iteur.fr>: Sender address rejected: Greylisted, see http://postgrey.schweikert.ch/help/mon_srv.ovh.net.html; from=<exped@iteur.fr> to=<destin@mon_srv.fr> proto=ESMTP helo=<intern.srv.fr>
Aug 27 15:51:06 mon_srv postfix/smtpd[17150]: disconnect from le.nouvel.expediteur.fr[10.20.30.40]
</pre>
<p>On voit l&#8217;action de postgrey (<code>action=greylist</code>) au motif que ce serveur n&#8217;a pas encore été whitelisté (<code>reason=new</code>)<br />
Avant dernière ligne : on informe le serveur expéditeur qu&#8217;il est greylisté, on en profite pour expliquer à l&#8217;admin d&#8217;en face qui (peut-être) lit les logs ce qu&#8217;est le greylisting.<br />
Sous-entendu, on lui dit via le code retour 450 que la boite a un problème temporaire, sous-entendu, retente plus tard. Attention, on ne dit pas code 550 qui signifierait &#8220;la boite est morte définitivement&#8221;.</p>
<p>Maintenant on attend de voir s&#8217;il nous recontacte</p>
<h2>Il revient, mais trop tôt </h2>
<p>Une minute plus tard, on a :</p>
<pre>Aug 27 15:52:06 mon_srv postfix/smtpd[17150]: connect from le.nouvel.expediteur.fr[10.20.30.40]
Aug 27 15:52:06 mon_srv postgrey[12790]: action=greylist, reason=early-retry (239s missing), client_name=le.nouvel.expediteur.fr, client_address=10.20.30.40, sender=exped@iteur.fr, recipient=destin@mon_srv.fr
Aug 27 15:52:06 mon_srv postfix/smtpd[17150]: NOQUEUE: reject: RCPT from le.nouvel.expediteur.fr[10.20.30.40]: 450 4.2.0 <exped@iteur.fr>: Sender address rejected: Greylisted, see http://postgrey.schweikert.ch/help/mon_srv.ovh.net.html; from=<exped@iteur.fr> to=<destin@mon_srv.fr> proto=ESMTP helo=<intern.srv.fr>
Aug 27 15:52:06 mon_srv postfix/smtpd[17150]: disconnect from le.nouvel.expediteur.fr[10.20.30.40]
</pre>
<p>L&#8217;action est de le greylister à nouveau au motif qu&#8217;il est trop tôt (<code>reason=early-retry (239s missing)</code>). Le temps doit être donné dans la réponse d&#8217;indisponibilité temporaire mais ça ne se voit pas au niveau des logs).<br />
Et on le renvoit dans ses pénates.<br />
Le revoilà, mais encore trop tôt.< méchanceté gratuite>C&#8217;est un serveur Exchange, il ne doit rien comprendre à ce qu&#8217;on dit< /méchanceté gratuite>.</p>
<pre>Aug 27 15:53:06 mon_srv postfix/smtpd[17150]: connect from le.nouvel.expediteur.fr[10.20.30.40]
Aug 27 15:53:08 mon_srv postgrey[12790]: action=greylist, reason=early-retry (177s missing), client_name=le.nouvel.expediteur.fr, client_address=10.20.30.40, sender=exped@iteur.fr, recipient=destin@mon_srv.fr
Aug 27 15:53:08 mon_srv postfix/smtpd[17150]: NOQUEUE: reject: RCPT from le.nouvel.expediteur.fr[10.20.30.40]: 450 4.2.0 <exped@iteur.fr>: Sender address rejected: Greylisted, see http://postgrey.schweikert.ch/help/mon_srv.ovh.net.html; from=<exped@iteur.fr> to=<destin@mon_srv.fr> proto=ESMTP helo=<intern.srv.fr>
Aug 27 15:53:08 mon_srv postfix/smtpd[17150]: disconnect from le.nouvel.expediteur.fr[10.20.30.40]
</pre>
<h2>&#777;Trop c&#8217;est trop : anvil</h2>
<p>Maintenant, c&#8217;est simplement le processus &#8220;anvil&#8221; de postfix, le &#8220;contrôleur de nombre de sessions et taux de bourrinage&#8221; qui détecte que le serveur en face est un peu trop insistant (il vient trop souvent) :</p>
<pre>
Aug 27 15:56:28 mon_srv postfix/anvil[17153]: statistics: max connection rate 1/60s for (smtp:10.20.30.40) at Aug 27 15:51:05
Aug 27 15:56:28 mon_srv postfix/anvil[17153]: statistics: max connection count 1 for (smtp:10.20.30.40) at Aug 27 15:51:05
Aug 27 15:56:28 mon_srv postfix/anvil[17153]: statistics: max cache size 1 at Aug 27 15:51:05
</pre>
<p>On ferme carrément la connexion. Reviens plus tard on te dit.</p>
<h2>Là il est calmé</h2>
<pre>Aug 27 16:03:09 mon_srv postfix/smtpd[17159]: connect from le.nouvel.expediteur.fr[10.20.30.40]
Aug 27 16:03:09 mon_srv postgrey[12790]: action=pass, reason=triplet found, delay=724, client_name=le.nouvel.expediteur.fr, client_address=10.20.30.40, sender=exped@iteur.fr, recipient=destin@mon_srv.fr
</pre>
<p>J&#8217;accepte son mail comme on voit ci-dessous (<code>action=pass</code>) au motif qu&#8217;on l&#8217;a déjà bien embêté (<code>reason=triplet found</code>). Au final, il y a aura eu pour ce mail 724 secondes de délai. Rappelez-vous que ça peut être gênant lors d&#8217;une mise en place sur un serveur déjà en prod.</p>
<p>La suite est l&#8217;enchaînement logique postfix :</p>
<pre>Aug 27 16:03:09 mon_srv postfix/smtpd[17159]: 1E6B29C4057: client=le.nouvel.expediteur.fr[10.20.30.40]
Aug 27 16:03:09 mon_srv postfix/cleanup[17164]: 1E6B29C4057: message-id=<8DDA8A0D37FFCE449E93D51188CDBE5BEDA572@intern.srv.fr>
Aug 27 16:03:09 mon_srv postfix/qmgr[15006]: 1E6B29C4057: from=<exped@iteur.fr>, size=6905, nrcpt=1 (queue active)
Aug 27 16:03:09 mon_srv postfix/smtpd[17159]: disconnect from le.nouvel.expediteur.fr[10.20.30.40]
</pre>
<p>On arrive dans amavisd-new :</p>
<pre>Aug 27 16:03:09 mon_srv amavis[17143]: (17143-01) (!!)run_av (ClamAV-clamd) FAILED - unexpected , output="/var/lib/amavis/tmp/amavis-20090827T160309-17143/parts: lstat() failed: Permission denied. ERROR\n"
Aug 27 16:03:09 mon_srv amavis[17143]: (17143-01) (!!)ClamAV-clamd av-scanner FAILED: CODE(0x90a9148) unexpected , output="/var/lib/amavis/tmp/amavis-20090827T160309-17143/parts: lstat() failed: Permission denied. ERROR\n" at (eval 86) line 527.
Aug 27 16:03:09 mon_srv amavis[17143]: (17143-01) (!!)WARN: all primary virus scanners failed, considering backups
</pre>
<p>Aaaaah, ça foire (normal j&#8217;ai juste installé clamav, il est détecté par amavis, mais je n&#8217;ai rien configuré. Je dois avoir un problème de droits/groupes, ce genre-là. On verra dans mon prochain article qui décrira toute la mise en place.</p>
<pre>
Aug 27 16:03:10 mon_srv postfix/smtpd[17169]: connect from localhost.localdomain[127.0.0.1]
Aug 27 16:03:10 mon_srv postfix/smtpd[17169]: C2A8D9C405B: client=localhost.localdomain[127.0.0.1]
Aug 27 16:03:10 mon_srv postfix/cleanup[17164]: C2A8D9C405B: message-id=<8DDA8A0D37FFCE449E93D51188CDBE5BEDA572@intern.srv.fr>
Aug 27 16:03:10 mon_srv postfix/qmgr[15006]: C2A8D9C405B: from=<exped@iteur.fr>, size=7349, nrcpt=1 (queue active)
Aug 27 16:03:10 mon_srv amavis[17143]: (17143-01) Passed CLEAN, [10.20.30.40] [10.20.30.40] <exped@iteur.fr> -> <exped@iteur.fr>, Message-ID: <8DDA8A0D37FFCE449E93D51188CDBE5BEDA572@intern.srv.fr>, mail_id: xmX0C24kDlYt, Hits: -, size: 6905, queued_as: C2A8D9C405B, 1764 ms
Aug 27 16:03:10 mon_srv postfix/smtp[17165]: 1E6B29C4057: to=<exped@iteur.fr>, orig_to=<destin@mon_srv.fr>, relay=127.0.0.1[127.0.0.1]:10024, delay=1.9, delays=0.11/0/0/1.8, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=17143-01, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as C2A8D9C405B)
Aug 27 16:03:10 mon_srv postfix/qmgr[15006]: 1E6B29C4057: removed
</pre>
<p>Ci-dessus on a le baratin standard d&#8217;un amavis sans clamav (avec son anti-virus interne) qui finit par accepter le mail et le délivrer.</p>
<p>Voilà, c&#8217;est beau, on dirait du Rimbaud.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/08/27/sequence-de-greylisting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>@tele2.fr : erreur ? migration en cours&#8230;</title>
		<link>http://michauko.org/blog/2009/08/27/tele2-fr-erreur-migration-en-cours/</link>
		<comments>http://michauko.org/blog/2009/08/27/tele2-fr-erreur-migration-en-cours/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 10:02:20 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[mails]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[sfr]]></category>
		<category><![CDATA[swip.net]]></category>
		<category><![CDATA[tele2.fr]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=578</guid>
		<description><![CDATA[Depuis quelques temps, j&#8217;ai un serveur de mails communiquant avec des clients ayant une adresse &#8220;@tele2.fr&#8221; qui se fait jeter systématiquement lors de l&#8217;envoi de mails. Il n&#8217;y a pas de code de retour : quel.qu.un@tele2.fr le 26/08/2009 16:06 Le système de messagerie n'a pas pu remettre ce message mais n'a pas signalé de raison [...]]]></description>
			<content:encoded><![CDATA[<p>Depuis quelques temps, j&#8217;ai un serveur de mails communiquant avec des clients ayant une adresse &#8220;@tele2.fr&#8221; qui se fait jeter systématiquement lors de l&#8217;envoi de mails.<br />
Il n&#8217;y a pas de code de retour :<span id="more-578"></span></p>
<pre>quel.qu.un@tele2.fr le 26/08/2009 16:06
            Le système de messagerie n'a pas pu remettre ce message mais n'a pas signalé de raison particulière. Vérifiez l'adresse du destinataire et réessayez d'envoyer le message. Dans le cas d'un nouvel échec, contactez votre administrateur système.
            < mailfe09.swip.net #4.0.0>
</pre>
<p>J&#8217;ai d&#8217;abord pensé à un problème passager lié sûrement au rachat par SFR/NEUF/CEGETEL. Mais le problème dure dans le temps&#8230;<br />
Puis j&#8217;ai pensé à une sorte de blacklist où le serveur en face ne se donnerait même pas la peine de m&#8217;expliquer pourquoi il me jette.<br />
Donc j&#8217;ai contacté postmaster@tele2.fr pour demander ; en anglais, car il y a un renvoi vers des bal @swip.net qui ne sont pas des français.</p>
<p>Réponse claire : suite au rachat, migration en cours, les clients sont informés, les boîtes n&#8217;existent plus.</p>
<blockquote><p>Hello Jacques,<br />
Tele2 Europe has divested its french operations.<br />
We are in the middle of a migrationprocess with the buyer(www.sfr.se) of our french operations right now.</p>
<p>This involves that the customers chooses a new emailadress in SFR mailsystem.<br />
The mailadress you are trying to reach has been moved to their system.</p>
<p>Best Regards<br />
Jonas Johnsson<br />
Postmaster<br />
Tele2 Europe
</p></blockquote>
<p>(Et démerdez-vous pour contacter les gens qui se cachaient derrière cette adresse ; et si ce sont des clients tant pis)</p>
<p>Je ne connais personne &#8220;chez&#8221; tele2.fr, donc je n&#8217;ai pas d&#8217;information du client lambda.<br />
Si vous en avez, n&#8217;hésitez pas à faire un commentaire.</p>
<p>Je doute qu&#8217;il suffise de remplacer tele2 par SFR dans l&#8217;adresse. Les clients vont sûrement en choisir une nouvelle. Risque de téléscopage trop gros avec les abonnés déjà existants chez SFR.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/08/27/tele2-fr-erreur-migration-en-cours/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pidgin 2.6.1 &amp; OpenFire (Jabber) 3.6.* =&gt; bug</title>
		<link>http://michauko.org/blog/2009/08/27/pidgin-2-6-1-openfire-jabber-3-6-bug/</link>
		<comments>http://michauko.org/blog/2009/08/27/pidgin-2-6-1-openfire-jabber-3-6-bug/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 07:32:03 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[autres outils]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[bureautique]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[jabber]]></category>
		<category><![CDATA[libpurple.dll]]></category>
		<category><![CDATA[openfire]]></category>
		<category><![CDATA[pidgin]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=576</guid>
		<description><![CDATA[Ca peut resservir à d&#8217;autres je pense. Depuis mon passage en Pidgin 2.6.1 (version portable, sous windows), la connexion au serveur Jabber OpenFire 3.6.4 (sous Debian) ne marchait plus, voire faisait planter Pidgin. Le fix est décrit ici, il faut remplacer votre libpurple.dll par celle-ci. En attendant un repackaging officiel (de Pidgin je suppose, pas [...]]]></description>
			<content:encoded><![CDATA[<p>Ca peut resservir à d&#8217;autres je pense.<br />
Depuis mon passage en Pidgin 2.6.1 (version portable, sous windows), la connexion au serveur Jabber OpenFire 3.6.4 (sous Debian) ne marchait plus, voire faisait planter Pidgin.</p>
<p>Le fix est <a href="http://developer.pidgin.im/ticket/10095">décrit ici</a>, il faut remplacer votre libpurple.dll par <a href="http://pidgin.im/~nosnilmot/2.6.1/srvfix/libpurple.dll">celle-ci</a>. En attendant un repackaging officiel (de Pidgin je suppose, pas d&#8217;OpenFire).</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/08/27/pidgin-2-6-1-openfire-jabber-3-6-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installer un serveur OVH avec Debian Lenny &#8220;nue&#8221;</title>
		<link>http://michauko.org/blog/2009/08/04/installer-un-serveur-ovh-avec-debian-lenny-nue/</link>
		<comments>http://michauko.org/blog/2009/08/04/installer-un-serveur-ovh-avec-debian-lenny-nue/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 16:18:16 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[dédié]]></category>
		<category><![CDATA[ovh]]></category>
		<category><![CDATA[shorewall]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=416</guid>
		<description><![CDATA[A l&#8217;occasion de la location de 2 serveurs dédiés chez OVH, montés en Debian Lenny (what else? comme dirait l&#8217;autre), voici un petit tour du propriétaire et du coup un guide minimaliste d&#8217;installation/paramétrage d&#8217;un tel serveur. Ca fait aussi un petit retour d&#8217;expérience sur OVH. Y&#8217;a des trucs marrants, vous allez voir. Il s&#8217;agit de [...]]]></description>
			<content:encoded><![CDATA[<p>A l&#8217;occasion de la location de 2 serveurs dédiés chez OVH, montés en Debian Lenny (what else? comme dirait l&#8217;autre), voici un petit tour du propriétaire et du coup un guide minimaliste d&#8217;installation/paramétrage d&#8217;un tel serveur. Ca fait aussi un petit retour d&#8217;expérience sur OVH. Y&#8217;a des trucs marrants, vous allez voir.<br />
Il s&#8217;agit de 2 serveurs dont j&#8217;ai oublié les noms commerciaux, ceux à 69 € et 199 €.<br />
J&#8217;ai opté pour Debian &#8220;nue&#8221;, pas le truc prépackagé qui doit t&#8217;amener webmin et ce genre de bazar.<span id="more-416"></span></p>
<h1>Partitionnement par défaut</h1>
<p>Le serveur arrive avec en gros un swap et une partition &#8220;/&#8221; de quasimment 1 To (la capacité de mon disque) et un /var (dans mes souvenirs) de quelques dizaines de Mo. C&#8217;est assez cool pour héberger une base de données, genre des gros fichiers dans /var/lib/mysql&#8230;<br />
Aucune restriction type nosuid, noexec, nodev.<br />
Donc je suggère d&#8217;abord une réinstallation en mode &#8220;je personnalise mes partitions&#8221;. L&#8217;interface web est curieuse, il faut d&#8217;abord affecter un peu de place à /boot, puis de la place (mais pas tout) à /. (pas slashdot, c&#8217;est un point pour finir ma phrase <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )<br />
A ce moment là, l&#8217;interface vous permet de nommer et modifier n&#8217;importe que point de montage: /home, /var, /tmp, le swap. A votre convenance.<br />
Pour ce qui est des options noexec, nodev, nosuid, que vous voulez peut-être positionner, il faudra modifier /etc/fstab à la main et rebooter ou faire des <code>mount -o remount</code> qui vont bien.</p>
<p>A la fin j&#8217;ai ça, dans le cas d&#8217;un serveur en RAID 1 logiciel (celui à 69 €, l&#8217;autre est en RAID 1 hard, je préfère). Remplacez mentalement /dev/md par /dev/sda si ça vous pose un problème existentiel.</p>
<pre>/dev/md2        /       ext3    errors=remount-ro       0       1
/dev/md1        /boot   ext3    errors=remount-ro,nodev,nosuid,noexec   0       1
/dev/md3        /home   ext3    nodev,nosuid    1       2
/dev/md6        /tmp    ext3    nodev,nosuid    1       2
/dev/md7        /var    ext3    nodev   1       2
/dev/sda5       swap    swap    defaults        0       0
/dev/sdb5       swap    swap    defaults        0       0
proc            /proc   proc    defaults        0       0
sysfs           /sys    sysfs   defaults        0       0
</pre>
<h1>Sources logicielles (apt)</h1>
<p>Il y a un miroir OVH. Je n&#8217;aime jamais trop ce concept, ne sachant pas si c&#8217;est à jour ou pas.<br />
De toute manière, il manque le repository &#8220;volatile&#8221;. Quitte à l&#8217;ajouter, je suis revenu aux standards Debian, voici mon <code>/etc/apt/sources.list</code> :</p>
<pre>deb ftp://ftp2.fr.debian.org/debian/ lenny main contrib non-free
deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
deb http://security.debian.org/ lenny/updates main contrib non-free
</pre>
<p>Un petit <code>aptitude update</code> et <code>aptitude safe-upgrade</code> plus tard, vous voilà à jour.</p>
<h1>Kernel</h1>
<p>Le kernel par défaut est le <code>2.6.27.10-grsec-xxxx-grs-ipv4-32</code> pour un serveur 32 bits. Le patch grsec apporte des modifications de sécurité (mouais) au kernel standard.<br />
Le truc louche est que je ne vois aucun <code>linux-image</code> installé via <code>dpkg -l</code>. J&#8217;ai tenté l&#8217;installation du dernier 2.6 packagé par Debian (le 2.6.26, via le paquet <code>linux-image-2.6-686</code>), ça a un peu foiré, j&#8217;ai lâché l&#8217;affaire.<br />
J&#8217;ai un peu peur de l&#8217;upgrade de sécurité du kernel, qui viendra bien un jour ou l&#8217;autre. Pas de paquet qui a amené le noyau (!) et je suis sur les repos autres que les miroirs OVH. Bref à mon avis, le kernel est figé pour longtemps. EDIT: A priori, vu des commentaires, c&#8217;est comme chez dedibox : un serveur FTP mettant à jour les noyaux. Supeeeer. Il doit y avoir une mailing-list ou un newsgroup pour suivre les upgrades recommandés, j&#8217;espère. C&#8217;est le cas chez dedibox.</p>
<h1>LILO vs. GRUB</h1>
<p>Ils ont choisi LILO. Soit. Je n&#8217;ai pas osé mettre GRUB, de peur de foutre la zone avec le reboot en mode rescue. ou de faire sauter (peut-être) le KVM sur IP (ça m&#8217;étonnerait quand même). &#8216;Pas eu envie de tester.<br />
Inconvénient de LILO : penser à taper <code>lilo</code> après un upgrade de noyau. Mais bon, vu la situation décrite ci-dessus&#8230;</p>
<h1>Accès SSH</h1>
<p>Evidemment, accès root autorisé, de toutes les IP.<br />
J&#8217;ai changé tout ça : <code>PermitRootLogin no</code> et <code>AllowUsers</code> après avoir créé des utilisateurs locaux. Pour ce qui du classique changement de port, j&#8217;ai plutôt opté pour du bridage par IP source sur ce port. Faites comme vous voulez.<br />
OVH peut se connecter en root via clef publique autorisée (installée avec la machine). Si le concept vous plait (et que vous ne virez pas la clef de authorized_keys), il serait judicieux de laisser passer le SSH pour l&#8217;IP source qu&#8217;ils utilisent (décrite dans le chapitre du firewall ci-après).<br />
Le PermitRootLogin doit être largement incompatible avec ce principe, au passage. Mais bon, on le sait, le RootLogin, c&#8217;est mal.</p>
<h1>Shorewall (ou iptables)</h1>
<p>Là, c&#8217;est l&#8217;épisode &#8220;La mise en place du firewall ou si tu bloques le ping, j&#8217;te reboote&#8221;. Arg. La cocasse anecdote. Je vous raconte ça comme je l&#8217;ai vécu. Les conclusions pour éviter une galère potentielle seront donc à la fin. C&#8217;est plus marrant comme ça.<br />
Donc, voici le truc.</p>
<p><em>(vous pouvez lire mon guide complet sur debian, notamment shorewall, à cette adresse : <a href="http://michauko.org/docs/debian_testing/">http://michauko.org/docs/debian_testing/</a></em></p>
<p>Après un <code>aptitude install shorewall</code>, il faut configurer Shorewall, avec le postulat de base &#8220;je bloque tout sauf ce qui m&#8217;intéresse&#8221;. Normal. J&#8217;ouvrirai le reste à mesure que j&#8217;installerai les services (MySQL, apache, mail&#8230;)</p>
<p>Les &#8220;templates&#8221; shorewall pour un serveur à une interface (c&#8217;est notre cas) sont amenés par le paquet <code>shorewall-common</code>, dans <code>/usr/share/doc/shorewall-common/examples/one-interface/</code><br />
Copiez donc tout le contenu dans <code>/etc/shorewall/</code> et passez en revue tous les fichiers pour que ça corresponde à vos besoins : bridage du SSH sur quelques IP par exemple.<br />
Attention à cette règle (policy) :</p>
<pre>$FW             net             ACCEPT</pre>
<p>Elle rend possible l&#8217;attaque réseau depuis votre machine si elle est compromise. Détailler chaque flux sortant peut permettre d&#8217;éviter ça, si votre machine a été compromise juste assez pour faire chier, mais pas assez pour être root, auquel cas l&#8217;intervenant fera mumuse avec votre shorewall de toute manière.<br />
Si vous avez besoin d&#8217;un fichier &#8220;params&#8221; vide, il est donné là  : <code>/usr/share/doc/shorewall-common/default-config/params</code>.<br />
Une fois votre conf adaptée, modifiez <code>/etc/default/shorewall</code> => <code>startup=1</code> et relancez shorewall. Testez votre connexion SSH sans perdre l&#8217;ancienne session, au cas où la conf n&#8217;accepte plus rien, suite à fausse manip&#8230;</p>
<p><strong>Cocasse anecdote </strong>: une sonde de leur côté (OVH) a immédiatement détecté que mon serveur ne répondait plus au ping=> REBOOT quasi-instantané pour cause de défaillance. O_o woooow. Que ça détecte une &#8220;panne&#8221;, admettons, que ça force un reboot, PUTAIN NON !!!!!<br />
J&#8217;ai eu un ticket quelques instants après m&#8217;indiquant qu&#8217;il y avait un kernel panic et qu&#8217;ils l&#8217;avaient donc passé en mode rescue. Moi je veux bien, mais sur la console, y&#8217;avait bien écrit &#8220;reboot&#8221;, et pas le bon gros figeage d&#8217;un &#8220;kernel panic&#8221;. Le type au téléphone m&#8217;avait confirmé quelques minutes avant qu&#8217;ils avaient forcé le reboot. Bref passons. Ca commence bien la relation client&#8230;<br />
Je pense surtout que quelqu&#8217;un a eu un excès de zèle et sous couvert d&#8217;un ping qui ne répondait pas, m&#8217;a rebooté comme un porc la machine, &#8220;pour m&#8217;aider&#8221;, en me la mettant en mode rescue. Ah ouais, super, ça m&#8217;aide à mort&#8230;<br />
Quelques cris  plus tard, un type du service des serveurs dédiés m&#8217;indique le &#8220;Guide OVH pour le firewall&#8221; (<a href="http://guides.ovh.net/fireWall">http://guides.ovh.net/fireWall</a>). A priori, il me confirme que les machines de monitoring évoquées dans ce guide ne changent pas et qu&#8217;il n&#8217;y en a pas d&#8217;autres en terme de monitoring qui feraient que ma machine serait vu comme défaillante et qui ferait que le mec qui s&#8217;emmerde au mois de juillet dans la salle serveur prendrait un coup de chaud et me rebooterait le serveur. Pour m&#8217;aider.</p>
<p>Bref, il faut laisser passer le ping pour les machines suivantes : proxy.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net, ping.ovh.net et les 3 premiers octets de votre IP+250/251/249 (3 machines en plus donc).<br />
Plus une machine pour le SSH si vous pouvez avoir besoin d&#8217;eux un jour.</p>
<p>Changez enfin les permissions 755 à 750 sur /etc/shorewall</p>
<p><em>Question : le &#8220;PermitRootLogin no&#8221; => peut-on quand même passer en mode rescue ? Je le pense, mais bon&#8230; car le pass du root est différent. C&#8217;est un autre OS qui boote, véritablement, avec uniquement un compte root. Si quelqu&#8217;un peut me confirmer ça en commentaire, merci.<br />
</em><br />
Le guide OVH donne la syntaxe iptables pour tolérer le ping de tout ça. Si vous adorez ces longues lignes iptables inbuvables, c&#8217;est pour vous. Pour le reste, il y a <del datetime="2009-08-04T14:48:58+00:00">mast </del> shorewall.<br />
Côté shorewall, avec les fichiers par défaut, il faut comprendre que tout traffic net -> $FW est bloqué par défaut, en &#8220;DROP info&#8221;, sauf une règle spéciale pour le ping en &#8220;DROP simple&#8221; &#8211; pour éviter de pourrir les logs. J&#8217;ai donc ajouté avant cette règle l&#8217;autorisation pour les machines de supervision OVH. Ca donne donc :</p>
<h2>/etc/shorewall/policy</h2>
<p>Inchangé dans cet exemple :</p>
<pre>#SOURCE         DEST            POLICY          LOG LEVEL       LIMIT:BURST
$FW             net             ACCEPT
net             $FW             DROP            info
net             all             DROP            info
# The FOLLOWING POLICY MUST BE LAST
all             all             REJECT          info
#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE</pre>
<h2>/etc/shorewall/rules</h2>
<pre>#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE         ORIGINAL RATE            USER/   MARK
#                                                       PORT    PORT(S)        DEST             LIMIT           GROUP

### PING
# ouverture pour monitoring OVH
ACCEPT          net:213.186.50.98       $FW     icmp    # proxy.ovh.net
ACCEPT          net:213.186.45.4        $FW     icmp    # proxy.p19.ovh.net
ACCEPT          net:213.251.184.9       $FW     icmp    # proxy.rbx.ovh.net
ACCEPT          net:213.186.33.13       $FW     icmp    # ping.ovh.net
ACCEPT          net:x.y.z.250       $FW     icmp    # specifique à mon IP : x.y.z.53
ACCEPT          net:x.y.z.249       $FW     icmp    # specifique à mon IP : x.y.z.53
ACCEPT          net:x.y.z.251       $FW     icmp    # specifique à mon IP : x.y.z.53
# des machines à moi :
ACCEPT          net:$une_machine     $FW     icmp
ACCEPT          net:$une_autre            $FW     icmp
#défaut :
Ping/DROP       net             $FW # le reste est en "DROP info". Là on va éviter des logs inutiles

### SSH
# moi, moi et moi :
ACCEPT          net:$une_machine     $FW     tcp     22
ACCEPT          net:$une_autre            $FW     tcp     22
# à la limite, eux :
ACCEPT          net:213.186.50.100      $FW     tcp 22  # cache.ovh.net, probablement inutile, pas de compte dans mon cas

### WEB, utiliser AllowWeb serait plus dans le coup non ?
ACCEPT          net                     $FW     tcp     80,443

### MAIL si besoin
ACCEPT          net                     $FW     tcp     25

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE</pre>
<h2>/etc/shorewall/params : exemple</h2>
<pre># blabla...
#               net     eth0            130.252.100.255 routefilter,norfc1918
#
###############################################################################
une_machine=a.b.c.d
une_autre=e.f.g.h
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE
</pre>
<h2>autres</h2>
<p>Dans cet exemple, les fichiers &#8220;interfaces&#8221;, &#8220;zones&#8221; etc sont bien tels quels.<br />
<strong>Pensez au restart de shorewall et au test afin d&#8217;être sûr de toujours pouvoir venir en SSH sur votre serveur.</strong></p>
<h1>Autres trucs à faire avant d&#8217;aller plus loin</h1>
<p>Je passe sur les softs que vous utiliserez ou non : postfix ou exim, snort, rkhunter&#8230;<br />
Pensez à cron-apt, apt-listbugs, ntp&#8230;</p>
<h1>Autre spécificité OVH</h1>
<p>Le script <code>/usr/local/rtm/bin/rtm</code> qu&#8217;on trouve dans <code>/etc/crontab</code>. Un outil maison de monitoring. Admettons. C&#8217;est expliqué là : <a href="http://guides.ovh.net/RealTimeMonitoring">http://guides.ovh.net/RealTimeMonitoring</a></p>
<p>A plus tard pour compléter ce retour d&#8217;expérience. En bien je l&#8217;espère <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/08/04/installer-un-serveur-ovh-avec-debian-lenny-nue/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Envoyer un mail après un commit sur un repository SVN</title>
		<link>http://michauko.org/blog/2009/08/04/envoyer-un-mail-apres-un-commit-sur-un-repository-svn/</link>
		<comments>http://michauko.org/blog/2009/08/04/envoyer-un-mail-apres-un-commit-sur-un-repository-svn/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 14:24:06 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[ligne de commande]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[commit]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=419</guid>
		<description><![CDATA[Voici la manip à faire, sauce Debian, où tout est prévu, tout est packagé Contexte Je suppose que vous avez un SVN qui tourne. Vous voulez qu&#8217;à chaque &#8220;commit&#8221;, un mail soit envoyé à une personne (ou une liste de personnes), contenant tout ce qu&#8217;on peut en attendre : message, fichiers impactés etc. Sur Internet, [...]]]></description>
			<content:encoded><![CDATA[<p>Voici la manip à faire, sauce Debian, où tout est prévu, tout est packagé <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h1>Contexte</h1>
<p>Je suppose que vous avez un SVN qui tourne. Vous voulez qu&#8217;à chaque &#8220;commit&#8221;, un mail soit envoyé à une personne (ou une liste de personnes), contenant tout ce qu&#8217;on peut en attendre : message, fichiers impactés etc.<br />
Sur Internet, tout le monde y va de son script en perl, ruby, bash etc. Debian propose un truc tout fait. J&#8217;aime bien <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Le principe est le suivant : l&#8217;outil SVN a déjà tout prévu. Il y a des &#8220;hooks&#8221; (grappin = bout de code appelable à un instant donné d&#8217;une commande SVN) qu&#8217;il suffit d&#8217;activer. Un tout petit peu de paramétrage et ça roule.<span id="more-419"></span></p>
<h1>Installez le script-qui-va-bien</h1>
<p>Le paquet <code>subversion-tools</code> vous apporte tout un tas de scripts pré-machés (voir <code>/usr/share/subversion/hook-scripts</code>), notamment un pour envoyer un mail bien propre.</p>
<h1>Activez le &#8220;hook&#8221;</h1>
<p>Il y a un modèle dans <code>/votre/repo/svn/hooks/</code>, nommé <code>post-commit.tmpl</code>. Copiez-le en <code>post-commit</code>, avec les bonnes permissions (idéalement via <code>cp post-commit.tmpl post-commit</code>).<br />
Editez-le, lisez le baratin et enfin adaptez la dernière ligne indiquant quelle adresse mail est destinatrice <em>(je considère que le serveur hébergeant SVN est capable d&#8217;envoyer des mails).</em><br />
Exemple :</p>
<pre>svnsrv:/svn/monrepo/hooks# tail post-commit
# the Subversion repository at
# http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/ and
# http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/

REPOS="$1"
REV="$2"

/usr/share/subversion/hook-scripts/commit-email.pl \
  "$REPOS" "$REV" <strong>mon.adresse@mail.com</strong>
</pre>
<p>Si votre serveur est capable d&#8217;envoyer des mails, vous n&#8217;avez rien à faire de plus, sinon, il faudra jouer avec la définition des variables $sendmail et $smtp_server (<strong>l&#8217;une ou l&#8217;autre</strong>, lisez les commentaires) dans le script <code>/usr/share/subversion/hook-scripts/commit-email.pl</code>.</p>
<p>Enfin, si vous voulez, la ligne de commande accepte plusieurs destinataires (au moins 2, je n&#8217;ai pas testé plus ni lu le code pour savoir).</p>
<h1>Testez</h1>
<p>Normalement, c&#8217;est tout. Faire un commit quelconque et voyez le résultat.<br />
J&#8217;utilise TortoiseSVN comme client, sous Windows ; ça marche nickel. Si vous vous plantez dans la configuration, Tortoise vous remonte l&#8217;erreur indiquant par exemple que le script <code>/usr/share/subversion/hook-scripts/commit-email.pl</code> est KO.</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/08/04/envoyer-un-mail-apres-un-commit-sur-un-repository-svn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Concept de &#8220;Port knocking&#8221;</title>
		<link>http://michauko.org/blog/2009/07/28/concept-de-port-knocking/</link>
		<comments>http://michauko.org/blog/2009/07/28/concept-de-port-knocking/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 16:02:39 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Ubuntu]]></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>

		<guid isPermaLink="false">http://michauko.org/blog/?p=411</guid>
		<description><![CDATA[Je ne vais pas plagier, je profite de ce qui est écrit là : http://www.commandlinefu.com/commands/view/2785/port-knocking pour résumer en quelques mots et surtout faire connaître ce site (www.commandlinefu.com) qui rassemble des commandes parfois bien sympathiques. On découvre des choses. A vos aggrégateurs RSS, voici son flux. Port knocking : - tant que votre poste client n&#8217;a [...]]]></description>
			<content:encoded><![CDATA[<p>Je ne vais pas plagier, je profite de ce qui est écrit là : <a href="http://www.commandlinefu.com/commands/view/2785/port-knocking">http://www.commandlinefu.com/commands/view/2785/port-knocking</a> pour résumer en quelques mots et surtout faire connaître ce site (<a href="http://www.commandlinefu.com/">www.commandlinefu.com</a>) qui rassemble des commandes parfois bien sympathiques. On découvre des choses.<br />
A vos aggrégateurs RSS, <a href="http://feeds2.feedburner.com/Command-line-fu">voici son flux</a>.</p>
<p>Port knocking :<br />
- tant que votre poste client n&#8217;a pas fait une bonne séquence au guichetier (knock-daemon <img src='http://michauko.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , tel ou tel service est bloqué pour votre IP, via iptables.<br />
- à la fin, vous jouez une séquence pour fermer, ou pas.</p>
<p>Bon j&#8217;avoue, je n&#8217;ai pas testé. M&#8217;enfin, ça doit marcher tout ça. A voir, comme avec le genre fail2ban, si ça ne peut pas être utilisé pour provoquer des dénis de service &#8211; le genre je fais bannir/fermer telle IP que je ne suis pas, évidemment.</p>
<p>Ca + du changement de port sur certains services (SSH notamment), et votre machine devrait être une tombe, normalement. Reste les services publics (http&#8230;) pour chercher une faille.</p>
<p>(et puis si vous adorez mon site, ce dont je ne doute pas, voici <a href="http://michauko.org/blog/feed/rss/">mon flux</a> &#8211; façon de parler ; mais je doute que vous aviez besoin de mon aide pour le trouver)</p>
<p>Bonnes vacances</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/07/28/concept-de-port-knocking/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
