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

<channel>
	<title>Le blog de Michauko</title>
	<atom:link href="http://michauko.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://michauko.org/blog</link>
	<description>... des pingouins, et d'autres choses ...</description>
	<lastBuildDate>Tue, 23 Feb 2010 08:39:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OracleToolbox sous Linux, pour analyser vos perfs Oracle</title>
		<link>http://michauko.org/blog/2010/02/03/oracletoolbox-sous-linux-pour-analyser-vos-perfs-oracle/</link>
		<comments>http://michauko.org/blog/2010/02/03/oracletoolbox-sous-linux-pour-analyser-vos-perfs-oracle/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 17:19:56 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[autres outils]]></category>
		<category><![CDATA[planet-libre.org]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[oci8]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracletoolbox]]></category>
		<category><![CDATA[php]]></category>

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

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

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

		<guid isPermaLink="false">http://michauko.org/blog/?p=995</guid>
		<description><![CDATA[J&#8217;ai découvert par hasard ce plugin pour Wordpress : il s&#8217;agit d&#8217;un plugin modifiant à la volée le thème du site pour le rendre merveilleusement lisible sur un iPhone (le site dit Blackberry et Android aussi, mais je n&#8217;ai pas de terminal pour tester).
Ca se passe comme d&#8217;habitude pour un plugin bien fait sous Wordpress [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai découvert par hasard <a href="http://wordpress.org/extend/plugins/wptouch/" target="_blank">ce plugin </a>pour Wordpress : il s&#8217;agit d&#8217;un plugin modifiant à la volée le thème du site pour le rendre merveilleusement lisible sur un iPhone (le site dit Blackberry et Android aussi, mais je n&#8217;ai pas de terminal pour tester).</p>
<p>Ca se passe comme d&#8217;habitude pour un plugin bien fait sous Wordpress :<br />
- <a href="http://wordpress.org/extend/plugins/wptouch/" target="_blank">Téléchargez le zip</a> dans <code>/votre/serveur/wp-content/plugins/</code><br />
- Dézippez la chose, ça crée un sous-répertoire wptouch dans &#8220;plugins&#8221;<br />
- Rendez-vous dans la page d&#8217;administration de Wordpress, section plugins, pour l&#8217;activer. C&#8217;est-tout-ça-marche.</p>
<p>Il y a des options, notamment pour l&#8217;intégration de pubs Ad-Sense. Je n&#8217;ai pas cherché, les sites sur lesquels je l&#8217;ai activé s&#8217;en passeront très bien.</p>
<p>Un must !</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/12/14/wordpress-sur-un-iphone-blackberry-android-plugin-wptouch/feed/</wfw:commentRss>
		<slash:comments>1</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 avez désactivé l&#8217;alias [...]]]></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 d&#8217;écriture [...]]]></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>0</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 communs [...]]]></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 (&#8221;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 d&#8217;accès web [...]]]></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 virtuels, entendez par là [...]]]></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>17</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 tout, à [...]]]></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 Nagios [...]]]></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 d&#8217;intermédiaire.
Résultat : [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment, j&#8217;ai monté un forum FluxBB (version en cours 1.2.22).<br />
C&#8217;est un outil qui fait ce qu&#8217;il a à faire. Pas de fioriture. Bref, simple et ça marche.</p>
<p>MAIS : rien pour valider les inscriptions. Soit on les ferme, soit on demande confirmation de l&#8217;expéditeur (il reçoit un mail avec son pass et confirme). Pas d&#8217;intermédiaire.</p>
<p>Résultat : des robots un peu partout qui s&#8217;inscrivent. Aucun message derrière, ptet juste pour garder un compte pour le jour où telle faille est publiée. Je ne sais pas.<br />
Bon bref, <a href="http://www.punbb.fr/forums/viewtopic.php?id=2621" target="_blank">en suivant ce qui est expliqué là</a>, vous ajouterez sans mal une question lors de l&#8217;inscription. Question si possible assez balaise pour qu&#8217;un robot ne sache pas y répondre.<span id="more-685"></span></p>
<p><em>EDIT : il y avait des balises php, interprétées&#8230; :</em><br />
Modifiez donc le fichier &#8220;register.php&#8221; comme indiqué <a href='http://michauko.org/blog/wp-content/uploads/2009/10/diff.txt'>dans ce fichier</a> (ou sur le site).</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/10/05/fluxbb-confirmation-dinscription/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Disque USB &#8220;Mac&#8221; : la puissance du Commercial</title>
		<link>http://michauko.org/blog/2009/10/05/disque-usb-mac-la-puissance-du-commercial/</link>
		<comments>http://michauko.org/blog/2009/10/05/disque-usb-mac-la-puissance-du-commercial/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 10:05:23 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[coup de coeur]]></category>
		<category><![CDATA[hors sujet]]></category>
		<category><![CDATA[ext2ifs]]></category>
		<category><![CDATA[ext3]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=680</guid>
		<description><![CDATA[Et hop, un disque USB Western Digital &#8220;My Passport&#8221; de 500 GB dans la poche.
Une anecdote à ce sujet :

Dans une grande enseigne, on trouve la version &#8220;Mac &#038; PC&#8221; à environ 139 €, de tête ; vente Internet uniquement.
A côté, le même, pour &#8220;Mac&#8221;, 99€. Même taille, même couleur.

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

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

		<guid isPermaLink="false">http://michauko.org/blog/?p=663</guid>
		<description><![CDATA[Objectifs
Bon, j&#8217;avais fait quelques articles sur l&#8217;installation d&#8217;une UBUNTU sur PS3. Deux objectifs :

avoir un bureau en 1920*1080 sur une grosse TV avec option &#8220;web-mail-cul-dan-l-canap&#8221;
et surtout : pouvoir faire manger les formats vidéos inconnus par la PS3 (mkv par exemple ; les XVID passent maintenant)

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

		<guid isPermaLink="false">http://michauko.org/blog/?p=631</guid>
		<description><![CDATA[Mmmmm, j&#8217;angoissais à l&#8217;idée d&#8217;installer à nouveau un serveur OpenVPN en urgence (psychose de la grippe A-H1N1-truc oblige, &#8216;faut que le pékin lambda puisse bosser à distance&#8230;). En effet, la génération des certificats, ce genre de trucs, ça m&#8217;énerve, je ne me souviens jamais des lignes de commandes.
Renseignements pris, ça tombe bien, les choses ont [...]]]></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>Rien à foot&#8217; de la politique, mais là quand même, on parle d&#8217;informatique !!!</title>
		<link>http://michauko.org/blog/2009/09/16/rien-a-foot-de-la-politique-mais-la-quand-meme-on-parle-dinformatique/</link>
		<comments>http://michauko.org/blog/2009/09/16/rien-a-foot-de-la-politique-mais-la-quand-meme-on-parle-dinformatique/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 09:42:24 +0000</pubDate>
		<dc:creator>michauko</dc:creator>
				<category><![CDATA[coup de coeur]]></category>
		<category><![CDATA[hors sujet]]></category>

		<guid isPermaLink="false">http://michauko.org/blog/?p=620</guid>
		<description><![CDATA[Oua quand même, mon étonnitude en a prit un coup. La bacliterie manifeste du site est incroyable. Merditude, espérons qu&#8217;en politication, elle est mieux conseillée, on a failli l&#8217;élirement comme présitude de la France&#8230;
Après ça (http://www.20minutes.fr/article/347859/Politique-Desirs-d-avenir-fait-rire-la-Toile.php) et ça (excellent &#8211; http://www.youtube.com/watch?v=ZYKuRDeMRiA), j&#8217;ai tenté ma chance : il fallait que je vois cette merveille à 41 [...]]]></description>
			<content:encoded><![CDATA[<p>Oua quand même, mon étonnitude en a prit un coup. La bacliterie manifeste du site est incroyable. Merditude, espérons qu&#8217;en politication, elle est mieux conseillée, on a failli l&#8217;élirement comme présitude de la France&#8230;<span id="more-620"></span></p>
<p>Après ça (<a href="http://www.20minutes.fr/article/347859/Politique-Desirs-d-avenir-fait-rire-la-Toile.php">http://www.20minutes.fr/article/347859/Politique-Desirs-d-avenir-fait-rire-la-Toile.php</a>) et ça (excellent &#8211; <a href="http://www.youtube.com/watch?v=ZYKuRDeMRiA">http://www.youtube.com/watch?v=ZYKuRDeMRiA</a>), j&#8217;ai tenté ma chance : il fallait que je vois cette merveille à 41 k€, moi qui vient de pondre 3 sites wordpress gratos <em>(d&#8217;ailleurs, allez les voir, surtout si vous aimez la course à pied, en région parisienne (78 limite 91) : <a href="http://www.route4chateaux.com/">http://www.route4chateaux.com/</a>, <a href="http://www.traildeslavoirs.com">http://www.traildeslavoirs.com</a> et <a href="http://www.civchevreuse.fr/">http://www.civchevreuse.fr/</a>)</em></p>
<p>J&#8217;ai pas été déçu du voyage :<br />
<div id="attachment_621" class="wp-caption aligncenter" style="width: 446px"><img src="http://michauko.org/blog/wp-content/uploads/2009/09/20090916_112500.png" alt="desirsdavenir-ahahah" title="desirsdavenir-ahahah" width="436" height="231" class="size-full wp-image-621" /><p class="wp-caption-text">desirsdavenir-ahahah</p></div></p>
<p>Dommage qu&#8217;Hadopi ne vienne pas du même auteur, on serait tranquille&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://michauko.org/blog/2009/09/16/rien-a-foot-de-la-politique-mais-la-quand-meme-on-parle-dinformatique/feed/</wfw:commentRss>
		<slash:comments>10</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 [...]]]></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 d&#8217;OpenFire).
]]></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>
	</channel>
</rss>
