Yakati.com - Traductions https://www.yakati.com/cat/traductions.html fr Réseau - Web - GNU/Linux Fri, 05 Jun 2020 14:08:00 +0200 PluXml Installation d'imapsync sur Debian ou Ubuntu https://www.yakati.com/art/installation-d-imapsync-sur-debian-ou-ubuntu.html https://www.yakati.com/art/installation-d-imapsync-sur-debian-ou-ubuntu.html <blockquote class="traduc"> <p>Cette page est une adaptation de <a href="https://tecadmin.net/use-imapsync-on-ubuntu/" target="_blank">https://tecadmin.net/use-imapsync-on-ubuntu/</a></p> <p>&nbsp;</p> </blockquote> <p><samp>Imapsync</samp> est un outil de transfert <samp>IMAP</samp> utilisé pour copier des courriers électroniques d'un serveur <samp>IMAP</samp> à un autre serveur IMAP. Cet article vous aidera à installer imapsync sur les systèmes Ubuntu, Debian et LinuxMint et à transférer toutes vos boîtes aux lettres et vos courriels entre deux serveurs <samp>IMAP</samp>. La page d'imapsync est indiquée en fin de ce document.</p> <blockquote class="info"> <p>Si vous désirez pouvoir installer votre propre serveur de mail sur debian, voyez le lien ci-dessous qui est une traduction du site de Chritoph Haas, workaround.org.</p> <ul> <li><a href="/page/ispmail-mail-facon-fai.html">Installation d'un serveur de mail complet</a>.</li> </ul> </blockquote><h3>Étape&nbsp;1 – Installation des prérequis</h3> <p>Commençons par l'installation des paquets nécessaires pour imapsync. Voici une longue liste de bibliothèques Perl et d'autres paquets à installer sur votre système&nbsp;en utilisateur root ou avec sudo&nbsp;:</p> <pre> apt-get install git rcs make makepasswd cpanminus apt-get install libauthen-ntlm-perl \ libclass-load-perl libcrypt-ssleay-perl liburi-perl \ libdata-uniqid-perl libdigest-hmac-perl libdist-checkconflicts-perl \ libfile-copy-recursive-perl libio-compress-perl libio-socket-inet6-perl \ libio-socket-ssl-perl libio-tee-perl libmail-imapclient-perl \ libmodule-scandeps-perl libnet-ssleay-perl libpar-packer-perl \ libreadonly-perl libsys-meminfo-perl libterm-readkey-perl \ libtest-fatal-perl libtest-mock-guard-perl libtest-pod-perl \ libtest-requires-perl libtest-simple-perl libunicode-string-perl </pre> <p>Installez également en user root ou avec sudo les modules Perl nécessaires en utilisant <samp>CPAN</samp>&nbsp;:</p> <pre> cpanm Mail::IMAPClient JSON::WebToken Test::MockObject cpanm Unicode::String Data::Uniqid cpanm Encode::IMAPUTF7 File::Tail Regexp::Common Test::Deep </pre> <h3>ÉTAPE&nbsp;2 – Installation d'imapsync</h3> <p>Après avoir terminé l'installation des paquets requis. Téléchargez le dernier code d'imapsync depuis le dépôt officiel de git sur votre système local&nbsp;:</p> <pre> git clone https://github.com/imapsync/imapsync.git </pre> <p>Rendez-vous dans le dépôt nouvellement cloné et installez-l'application sur votre système avec les commandes suivantes&nbsp;:</p> <pre> cd imapsync sudo make install </pre> <p>En principe l'archive contient un répertoire&nbsp;<code>dist</code> qui est un lien symbolique vers&nbsp;un répertoire <code>dist2</code>. Si le répertoire n'existait pas crééz-le :&nbsp;</p> <pre> mkdir -p dist</pre> <blockquote class="warning"> <p>Il est possible que quelques modues perl soient manquants et que vous voyez s'afficher quelque chose comme :&nbsp;</p> <pre> Ok: Found cpanm cpanm (App::cpanminus) version 1.7043 (/usr/bin/cpanm) Makefile:99: recipe for target 'testp' failed make: *** [testp] Error 1 </pre> <p>Il faut dans ce cas remonter dans les lignes qui se sont affichées pour trouver la liste des modules manquants&nbsp;indiquées par des lignes de type&nbsp;:&nbsp;</p> <pre> Failure: Not found Perl module Type::NOMMODULE</pre> <p>Il faudra alors ajouter tous ces modules :</p> <pre> cpanm Type::NOMMODULE</pre> </blockquote> <p>À ce stade, votre système est prêt à migrer toutes les données d'un compte de courrier électronique à un autre en utilisant <samp>IMAP</samp>.</p> <h3>Étape 3 – Transférer des mails via IMAP</h3> <p>Vous êtes donc prêt à migrer. Avant la migration, assurez-vous que les deux comptes sont équipés d'IMAP et qu'ils sont accessibles depuis votre système. Après cela, utilisez la syntaxe de commande suivante&nbsp;:</p> <pre> imapsync --host1 imap.source.example.com \ --user1 user@example.com \ --password1 S0urcePassw0rd \ --ssl1 \ --host2 imap.dest.example.com \ --user2 user@example.com \ --password2 Dest1nat10NPassw0rd \ --ssl2 </pre> <p>La commande prendra d'autant plus de temps à s'exécuter que&nbsp;la taille de votre boîte aux lettres source sera importante. Après avoir terminé tout le processus, vous verrez une longue liste de résultats&nbsp;qui par défaut sont enregistrés dans un dossier de log. Vérifiez la sortie pour voir si une erreur s'est produite pendant le transfert. Vous trouverez ci-dessous&nbsp;un exemple de sortie de ce processus.</p> <pre> Transfer started at Thu May 11 11:45:37 2017 PID is 4969 ... ... ... Total bytes transferred : 78373 (76.536 KiB) Total bytes duplicate host1 : 0 (0.000 KiB) Total bytes duplicate host2 : 0 (0.000 KiB) Total bytes skipped : 0 (0.000 KiB) Total bytes error : 0 (0.000 KiB) Message rate : 0.1 messages/s Average bandwidth rate : 3.0 KiB/s Memory consumption : 217.0 MiB Biggest message : 57947 bytes (56.589 KiB) Memory/biggest message ratio : 3927.0 Start difference host2 - host1 : -2 messages, -78373 bytes (-76.536 KiB) Final difference host2 - host1 : 0 messages, 0 bytes (0.000 KiB) Detected 0 errors </pre> <p>L'installation d'imapsync contient beaucoup de documentation et des scripts d'exemple si vous avez par exemple de nombreuses boîtes à migrer en utilisant un fichier <samp>csv</samp> ayant cette structure :</p> <pre> IPserveursource;user;password;IPserveurcible;user;password;</pre> <p>Dans le répertoire example on trouve par exemple ce script pour les machines unix/linux&nbsp;qui utilise un tel fichier <samp>csv</samp> :&nbsp;</p> <pre> #!/bin/sh # # $Id: sync_loop_unix.sh,v 1.8 2018/02/12 21:53:40 gilles Exp gilles $ # Example for imapsync massive migration on Unix systems. # See also http://imapsync.lamiral.info/FAQ.d/FAQ.Massive.txt # # Data is supposed to be in file.txt in the following format: # host001_1;user001_1;password001_1;host001_2;user001_2;password001_2; # ... # Separator is character semi-colon ";" it can be changed by any character changing IFS=';' # in the while loop below. # # Each line contains 6 columns, columns are parameter values for # --host1 --user1 --password1 --host2 --user2 --password2 # and a trailing empty fake column to avoid CR LF part going # in the 6th parameter password2. <strong>Don't forget the last semicolon.</strong> # # You can add extra options after the variable "$@" # Use character backslash \ at the end of each supplementary line, except for the last one. # You can also pass extra options via the parameters of this script since # they will be in "$@" # The credentials filename "file.txt" used for the loop can be renamed # by changing "file.txt" below. echo Looping on account credentials found in file.txt echo { while IFS=';' read h1 u1 p1 h2 u2 p2 fake do { echo "$h1" | tr -d '\r' | egrep '^#|^ *$' ; } &gt; /dev/null &amp;&amp; continue # this skip commented lines in file.txt echo "==== Starting imapsync from host1 $h1 user1 $u1 to host2 $h2 user2 $u2 ====" imapsync --host1 "$h1" --user1 "$u1" --password1 "$p1" \ --host2 "$h2" --user2 "$u2" --password2 "$p2" \ "$@" echo "==== Ended imapsync from host1 $h1 user1 $u1 to host2 $h2 user2 $u2 ====" echo done } &lt; file.txt </pre> <p>(ne pas oublier le dernier <code>;</code> comme indiqué dans la documentation).</p> <blockquote class="ressources"> <ul> <li><a href="https://tecadmin.net/use-imapsync-on-ubuntu/" target="_blank">https://tecadmin.net/use-imapsync-on-ubuntu/</a></li> </ul> <p><strong>Reference:</strong></p> <ul> <li><a href="https://imapsync.lamiral.info/#install" rel="noopener noreferrer" target="_blank">https://imapsync.lamiral.info/</a></li> <li><a href="https://github.com/imapsync/imapsync" rel="noopener noreferrer" target="_blank">https://github.com/imapsync/imapsync</a></li> </ul> </blockquote> Fri, 05 Jun 2020 14:08:00 +0200 Marc GUILLAUME Découper la configuration d'Haproxy en plusieurs fichiers https://www.yakati.com/art/decouper-la-configuration-d-haproxy-en-plusieurs-fichiers.html https://www.yakati.com/art/decouper-la-configuration-d-haproxy-en-plusieurs-fichiers.html <blockquote class="traduc"> <p><strong>Traduction (avec quelques adaptations) de :</strong> <a href="https://lazic.info/josip/post/splitting-haproxy-config/" lang="en" target="_blank" title="Splitting monolithic HAProxy configuration into more manageable form">https://lazic.info/josip/post/splitting-haproxy-config/</a></p> </blockquote> <p>Dès que vous avez plus d'un frontend, un backend et des directives d'écoute dans votre configuration HAProxy, vous vous retrouvez encombré avec son seul fichier monolithique. Il y a peu de solutions possibles à ce «&nbsp;problème&nbsp;», il existait <s><a href="http://github.com/finnlabs/haproxy" target="_blank">cette solution python</a></s> (plus en ligne), ou peut-être l'utilisation de plusieurs fichiers de configuration et leur spécification avec <samp>-f</samp> au démarrage d'haproxy (voirl la page <samp>man haproxy</samp>).</p><p>Bien qu'il n'y ait rien à redire à la solution ci-dessus, je pense qu'existe une meilleure approche avec un script qui vérifierait si la nouvelle configuration est valide avant de redémarrer HAProxy. Le script ci-dessous suppose que vous avez <samp>colordiff</samp>, et <samp><a href="http://etckeeper.branchable.com/" lang="en" target="_blank">etckeeper</a></samp> installés et configurés. Si ce n'est pas le cas, vous devriez penser à le faire et utiliser <samp>etckeeper</samp>, cela pourra vous éviter bien des problèmes lorsque vous devrez annuler certains changements dans le répertoire <code>/etc</code>.</p> <p>Commencez par créer le répertoire <code>/etc/haproxy/conf.d/</code> et divisez votre fichier <samp>haproxy.cfg</samp> en plusieurs fichiers préfixés par des chiffres dans l'ordre dans lequel vous souhaitez les voir apparaître dans la configuration finale.</p> <p>Par exemple dans un fichier <samp>00-global.cfg</samp> mettez les options globales que vous souhaitez voir apparaître tout en haut du fichier, et dans <samp>99-global.cfg</samp> mettez tout ce que vous voulez voir à la toute fin du fichier de configuration final de HAProxy. Ensuite vous pouvez créer des fichiers de site, de ssl, ou de backend etc.</p> <p>Si vous avez besoin de désactiver un de ces fichiers, par exemple <samp>11-site1.cfg</samp>, renommez-le simplement en <samp>11-site1.cfg.disabled</samp>, il ne sera plus pris en compte par le script. Il ne vous reste plus qu'à lancer le script ci-dessous dont l'original se trouve ici : <a href="https://gist.github.com/jlazic/e65f5bda141ffaed5640" target="_blank">https://gist.github.com/jlazic/e65f5bda141ffaed5640</a>.</p> <p>J'ai légèrement modifé le script original, notamment le test d'identité des fichiers et appelé directement <samp>colordiff</samp> qui renvoit <strong>1</strong> quand il y a des différences et <strong>0</strong> quand les fichiers sont identiques alors que si l'on pipe vers colordiff on obtient toujours <strong>0</strong> en valeur de sortie. Le test devait être soit :</p> <pre> if [ $? -ne 1 ]; then</pre> <p>ou bien</p> <pre> if [ $? -eq 0 ]; then</pre> <p>J'ai choisi le première solution.</p> <p>J'ai également placé la mise à jour dans une fonction et rajouté la possibilité de passer un paramètre. Le script peut ainsi soit, par défaut comme l'original, être interactif et demander une validation de l'utilisateur, soit avec l'option <samp>-a</samp> effectuer la mise à jour automatiquement pour pouvoir l'utiliser via un autre script. La fonction permet de factoriser le code de mise à jour qui est le même que l'on valide en automatique ou via confirmation.</p> <p>Il va recomposer un fichier <samp>haproxy.cfg</samp> à partir des divers fichiers actifs dans l'ordre de leurs numéros, voir si les fichiers sont différents et si ils le sont tester la syntaxe de ce fichier puis, si tout est bon demander de remplacer l'actuel fichier de configuration par ce nouveau fichier, faire un commit dans git, puis recharger haproxy. Le script figure ci-dessous.</p> <!--<pre> #!/bin/bash #Requirements: etckeeper, diffcolor # script origin : https://lazic.info/josip/post/splitting-haproxy-config/ # 10 April 2020 : some modifications by Marc marc[at]yakati.com #This script concatenates multiple files of haproxy configuration into #one file, and than checks if monolithic config contains errors. If everything is #OK with new config script will write new config to ${currentcfg} and reload haproxy #Also, script will commit changes to etckeeper, if you don't use etckeeper you #should start using it. #Script assumes following directory structure: #/etc/haproxy/conf.d/ #├── 00-global.cfg #├── 15-lazic.cfg #├── 16-togs.cfg #├── 17-svartberg.cfg #├── 18-home1.cfg.disabled #└── 99-globalend.cfg #Every site has it's own file, so you can disable site by changing #it's file extension, or appending .disabled, like I do. currentcfg=/etc/haproxy/haproxy.cfg newcfg=/tmp/haproxy.cfg.tmp configdir=/etc/haproxy/conf.d timestamp=$(date "+%F %T") printf "%s\n" "Compiling *.cfg files from ${configdir}" ls ${configdir}/*.cfg cat ${configdir}/*.cfg &gt; ${newcfg} printf "%s\n" "Differences between current and new config" diff -s -U 3 ${currentcfg} ${newcfg} | colordiff if [ $? -ne 1 ]; then printf "%s\n" "You should make some changes first :)" rm -f ${newcfg} exit 1 #Exit if old and new configuration are the same fi printf "%s\n" "Checking if new config is valid..." haproxy -c -f ${newcfg} if [ $? -eq 0 ]; then printf "\t%s\n" "Check if there are some warnings in new configuration." read -p "Should I copy new configuration to ${currentcfg} and reload haproxy? [y/N]" -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then printf "%s\n" " " printf "%s\n" "Working..." cat /etc/haproxy/conf.d/*.cfg &gt; ${currentcfg} etckeeper commit -m "${timestamp} Updating haproxy configuration" if [ "$?" -eq "0" ]; then printf "\t%s\n" "* Updating haproxy configuration"; else printf "\t%s\n" "* /!\WARNING : a problem occured updating haproxy configuration"; exit 1; fi printf "%s\n" "Reloading haproxy..." service haproxy reload if [ "$?" -eq "0" ]; then printf "\t%s\n" "* Haproxy reloaded"; else printf "\t%s\n" " */!\WARNING : a problem occured reloading haproxy"; exit 1; fi fi else printf "%s\n" "There are errors in new configuration, please fix them and try again." exit 1 fi</pre>--> <pre style="color:#cfcfc2;background-color:#232629;"> <span style="color:#7a7c7d;">#!/bin/bash</span> <span style="color:#7a7c7d;">#Requirements: etckeeper, diffcolor</span> <span style="color:#7a7c7d;"># script origin : https://lazic.info/josip/post/splitting-haproxy-config/</span> <span style="color:#7a7c7d;"># 10 April 2020 : some modifications by Marc marc[at]yakati.com</span> <span style="color:#7a7c7d;">#This script concatenates multiple files of haproxy configuration into</span> <span style="color:#7a7c7d;">#one file, and than checks if monolithic config contains errors. If everything is</span> <span style="color:#7a7c7d;">#OK with new config script will write new config to ${currentcfg} and reload haproxy</span> <span style="color:#7a7c7d;">#Also, script will commit changes to etckeeper, if you don't use etckeeper you</span> <span style="color:#7a7c7d;">#should start using it.</span> <span style="color:#7a7c7d;">#Script assumes following directory structure:</span> <span style="color:#7a7c7d;">#/etc/haproxy/conf.d/</span> <span style="color:#7a7c7d;">#├── 00-global.cfg</span> <span style="color:#7a7c7d;">#├── 15-lazic.cfg</span> <span style="color:#7a7c7d;">#├── 16-togs.cfg</span> <span style="color:#7a7c7d;">#├── 17-svartberg.cfg</span> <span style="color:#7a7c7d;">#├── 18-home1.cfg.disabled</span> <span style="color:#7a7c7d;">#└── 99-globalend.cfg</span> <span style="color:#7a7c7d;">#Every site has it's own file, so you can disable site by changing</span> <span style="color:#7a7c7d;">#it's file extension, or appending .disabled, like I do.</span> <span style="color:#27aeae;">currentcfg=</span>/etc/haproxy/haproxy.cfg <span style="color:#27aeae;">newcfg=</span>/tmp/haproxy.cfg.tmp <span style="color:#27aeae;">configdir=</span>/etc/haproxy/conf.d <span style="color:#27aeae;">timestamp=$(</span><span style="color:#8e44ad;">date</span> <span style="color:#f44f4f;">"+%F %T"</span><span style="color:#27aeae;">)</span> <span style="color:#27aeae;">noninteractive=</span><span style="color:#f44f4f;">'false'</span> <span style="color:#7a7c7d;"># If option -a</span> <b>if</b><span style="color:#7f8c8d;"> [</span> <span style="color:#f44f4f;">"</span><span style="color:#27aeae;">$1</span><span style="color:#f44f4f;">"</span> <span style="color:#27ae60;">=</span> <span style="color:#27ae60;">-a</span><span style="color:#7f8c8d;"> ]</span>; <b>then</b> <span style="color:#27aeae;">noninteractive=</span><span style="color:#f44f4f;">'true'</span>; <b>fi</b> <span style="color:#7a7c7d;">###~~~~~~~~~~~~~~</span> <span style="color:#7a7c7d;"># Update function</span> <span style="color:#7a7c7d;">#</span> <span style="color:#8e44ad;">UpdateConfig()</span> <b>{</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">" "</span> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">"Working..."</span> <span style="color:#8e44ad;">cat</span> /etc/haproxy/conf.d/*.cfg &gt; <span style="color:#27aeae;">${currentcfg}</span> <b>if</b><span style="color:#7f8c8d;"> [</span> <span style="color:#f44f4f;">"</span><span style="color:#27aeae;">$?</span><span style="color:#f44f4f;">"</span> <span style="color:#27ae60;">-eq</span> <span style="color:#f44f4f;">"0"</span><span style="color:#7f8c8d;"> ]</span>; <b>then</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"\t%s\n"</span> <span style="color:#f44f4f;">"* Updating haproxy configuration"</span><b>;</b> <b>else</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"\t%s\n"</span> <span style="color:#f44f4f;">"* /!\WARNING : a problem occured updating haproxy configuration"</span><b>;</b> <span style="color:#7f8c8d;">exit</span> 1<b>;</b> <b>fi</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">"Running etckeeper..."</span> <span style="color:#0099ff;">etckeeper</span> commit -m <span style="color:#f44f4f;">"</span><span style="color:#27aeae;">${timestamp}</span><span style="color:#f44f4f;"> Updating haproxy configuration"</span> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">"Reloading haproxy..."</span> <span style="color:#0099ff;">service</span> haproxy reload <b>if</b><span style="color:#7f8c8d;"> [</span> <span style="color:#f44f4f;">"</span><span style="color:#27aeae;">$?</span><span style="color:#f44f4f;">"</span> <span style="color:#27ae60;">-eq</span> <span style="color:#f44f4f;">"0"</span><span style="color:#7f8c8d;"> ]</span>; <b>then</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"\t%s\n"</span> <span style="color:#f44f4f;">"* Haproxy reloaded"</span><b>;</b> <b>else</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"\t%s\n"</span> <span style="color:#f44f4f;">" */!\WARNING : a problem occured reloading haproxy"</span><b>;</b> <span style="color:#7f8c8d;">exit</span> 1<b>;</b> <b>fi</b> <b>}</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">"Compiling *.cfg files from </span><span style="color:#27aeae;">${configdir}</span><span style="color:#f44f4f;">"</span> <span style="color:#8e44ad;">ls</span> <span style="color:#27aeae;">${configdir}</span>/*.cfg <span style="color:#8e44ad;">cat</span> <span style="color:#27aeae;">${configdir}</span>/*.cfg &gt; <span style="color:#27aeae;">${newcfg}</span> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">"Differences between current and new config"</span> <span style="color:#0099ff;">colordiff</span> -s -U 3 <span style="color:#27aeae;">${currentcfg}</span> <span style="color:#27aeae;">${newcfg}</span> <b>if</b><span style="color:#7f8c8d;"> [</span> <span style="color:#27aeae;">$?</span> <span style="color:#27ae60;">-ne</span> 1<span style="color:#7f8c8d;"> ]</span>; <b>then</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">"You should make some changes first :)"</span> <span style="color:#8e44ad;">rm</span> -f <span style="color:#27aeae;">${newcfg}</span> <span style="color:#7f8c8d;">exit</span> 1 <span style="color:#7a7c7d;">#Exit if old and new configuration are the same</span> <b>fi</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">"Checking if new config is valid..."</span> <span style="color:#0099ff;">haproxy</span> -c -f <span style="color:#27aeae;">${newcfg}</span> <b>if</b><span style="color:#7f8c8d;"> [</span> <span style="color:#27aeae;">$?</span> <span style="color:#27ae60;">-eq</span> 0<span style="color:#7f8c8d;"> ]</span>; <b>then</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"\t%s\n"</span> <span style="color:#f44f4f;">"Check if there are some warnings in new configuration."</span> <b>if</b><span style="color:#7f8c8d;"> [</span> <span style="color:#f44f4f;">"</span><span style="color:#27aeae;">${noninteractive}</span><span style="color:#f44f4f;">"</span> <span style="color:#27ae60;">!=</span> <span style="color:#f44f4f;">'true'</span><span style="color:#7f8c8d;"> ]</span>; <b>then</b> <span style="color:#7f8c8d;">read</span> -p <span style="color:#f44f4f;">"Should I copy new configuration to </span><span style="color:#27aeae;">${currentcfg}</span><span style="color:#f44f4f;"> and reload haproxy? [y/N]"</span> -n 1 -r <b>if</b><b> [[</b> <span style="color:#27aeae;">$REPLY</span> =~ ^[Yy]$<b> ]]</b>; <b>then</b> <span style="color:#0099ff;">UpdateConfig</span> <span style="color:#8e44ad;">rm</span> -f <span style="color:#27aeae;">${newcfg}</span> <span style="color:#7f8c8d;">exit</span> 0 <b>fi</b> <b>else</b> <span style="color:#0099ff;">UpdateConfig</span> <span style="color:#8e44ad;">rm</span> -f <span style="color:#27aeae;">${newcfg}</span> <span style="color:#7f8c8d;">exit</span> 0 <b>fi</b> <b>else</b> <span style="color:#7f8c8d;">printf</span> <span style="color:#f44f4f;">"%s\n"</span> <span style="color:#f44f4f;">"There are errors in new configuration, please fix them and try again."</span> <span style="color:#8e44ad;">rm</span> -f <span style="color:#27aeae;">${newcfg}</span> <span style="color:#7f8c8d;">exit</span> 1 <b>fi</b> </pre> Fri, 10 Apr 2020 14:51:00 +0200 Marc GUILLAUME Comment augmenter l'entropie sur un serveur avec havaged https://www.yakati.com/art/comment-augmenter-l-entropie-sur-un-serveur-avec-havaged.html https://www.yakati.com/art/comment-augmenter-l-entropie-sur-un-serveur-avec-havaged.html <blockquote class="traduc"> <p><strong>Traduction de&nbsp;:</strong> <a href="https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged" target="_blank" title="How to Setup Additional Entropy for Cloud Servers Using Haveged">https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged</a></p> </blockquote> <blockquote class="info"> <p><strong>ATTENTION&nbsp;:</strong> si havaged est commode, il n'est pas prouvé que son utilisation, notamment sur des machines virtuelles, soit parfaitement sécurisée. La question de la génération de nombres pseudo-aléatoires est complexe et délicate, car liée à la sécurité en général. Vous pouvez à ce sujet consulter avec profit cet article&nbsp;: <a href="https://www.deltasight.fr/entropie-linux-generation-nombres-aleatoires/" target="_blank">https://www.deltasight.fr/entropie-linux-generation-nombres-aleatoires/</a></p> </blockquote><h3>Brève introduction à l'entropie et au hasard</h3> <p>Le générateur de nombres pseudo-aléatoires (PRNG) de Linux est un dispositif spécial qui génère des nombres aléatoires à partir d'interruptions matérielles (clavier, souris, E/S disque ou réseau) et d'autres événements du système d'exploitation. Ce caractère aléatoire est surtout utilisé pour le chiffrement comme <samp>SSL/TLS</samp>, mais a aussi de nombreuses autres utilisations. Même quelque chose d'aussi simple qu'un programme pour lancer une paire de dés virtuels dépend de l'entropie pour obtenir des nombres alléatoires de bonne qualité (c'est à dire non prédictibles à partir des précédents nombres générés).</p> <h3>Lorsque le réservoir d'entropie se vide</h3> <p>Il y a deux dispositifs de génération de nombres aléatoires sous Linux : <code>/dev/random</code> et <code>/dev/urandom</code>. Les nombres les plus aléatoires proviennent de <code>/dev/random</code>, puisque ce périphérique se bloque chaque fois que sa réserve d'entropie devient insuffisante et qu'il attendra qu'une entropie suffisante soit de nouveau disponible pour continuer à fournir une sortie. En supposant que votre entropie soit suffisante, vous devriez avoir la même qualité de caractère aléatoire dans <code>/dev/urandom</code> ; cependant, comme c'est un périphérique non bloquant, il continuera à produire des données «&nbsp;aléatoires&nbsp;», même lorsque le réservoir d'entropie sera épuisé. Cela peut conduire à générer des données aléatoires de moindre qualité, car les répétitions de données précédentes sont beaucoup plus probables. Une faible disponibilité d'entropie sur un serveur en production peut conduire à de gros ennuis, en particulier lorsque ce serveur exécute des calculs cryptographiques. Par exemple, si vous disposez d'un serveur cloud qui exécute les démons suivants (tous utilisant SSL/TLS ou des chiffrages par blocs)&nbsp;:</p> <ul> <li>Serveur Web</li> <li>Serveur de courrier entrant et sortant</li> <li>SSH/SFTP</li> </ul> <p>Si l'un de ces démons nécessite un caractère aléatoire alors que toute l'entropie disponible a été épuisée, ils est possible qu'il s'arrête pour en attendre d'autres, ce qui peut entraîner des ralentissements excessifs dans votre application. Pire encore, puisque la plupart des applications modernes vont soit utiliser leur propre nombre aléatoire créé à l'initialisation du programme, soit utiliser <code>/dev/urandom</code> pour éviter le blocage, vos applications vont pâtir de données aléatoires de moindre qualité. Cela peut affecter l'intégrité de vos communications sécurisées, et peut augmenter les chances de cryptanalyse sur vos données privées.</p> <h3>Alimenter sa source d'entropie dans l'espace utilisateur</h3> <p>Linux obtient des données aléatoires de très bonne qualité à partir des sources matérielles mentionnées plus haut, mais comme un serveur n'a généralement ni clavier ni souris, il génère beaucoup moins d'entropie qu'un poste de travail. Les E/S disque et réseau représentent la majorité des sources d'entropie pour ces machines, et ces sources produisent de très faibles quantités d'entropie. Dans la mesure où très peu de serveurs, dédiés ou cloud ou de machines virtuelles disposent d'une source d'entropie (RNG) matérielle spécialement dédiée à cet usage, il existe plusieurs solutions en mode utilisateur pour générer une entropie supplémentaire en utilisant des interruptions matérielles provenant de périphériques qui sont plus «&nbsp;bruyants&nbsp;» que les disques durs, comme les cartes vidéo, les cartes son, etc. Mais cela ne règle pas le problème des serveurs malheureusement, car ils ne contiennent généralement ni l'un ni l'autre. C'est ici que <samp>haveged</samp> entre en jeu.</p> <p>Basé sur le principe de <a href="https://www.irisa.fr/caps/projects/hipsor/" target="_blank">HAVEGE</a>, et basé sur sa bibliothèque associée, haveged permet de générer du hasard en fonction des variations du temps d'exécution du code sur un processeur. Comme il est presque impossible qu'un morceau de code prenne exactement le même temps pour s'exécuter, même dans le même environnement sur le même matériel, le temps d'exécution d'un ou de plusieurs programmes devrait convenir pour alimenter une source aléatoire. L'implémentation <samp>haveged</samp> alimente la source aléatoire de votre système (habituellement <code>/dev/random</code>) en utilisant les valeurs du compteur d'horodatage (TSC) de votre processeur après l'exécution d'une boucle de façon répétée. Bien que cela semble devoir finir par créer des données prévisibles, vous serez peut-être surpris de voir les résultats du test FIPS au bas de cet article.</p> <h3>Installation de haveged sur Debian/Ubuntu</h3> <p>Vous pouvez facilement installer <samp>haveged</samp> sur Debian et Ubuntu en exécutant la commande suivante:</p> <pre> # apt-get install haveged</pre> <p>Si ce paquet n'est pas disponible dans vos dépôts par défaut, vous devrez compiler à partir des sources (voir ci-dessous)</p> <p>Une fois le paquetage installé, vous pouvez simplement éditer le fichier de configuration situé dans <code>/etc/default/haveged</code>, en vous assurant que les options suivantes sont définies (ce sont généralement déjà les options par défaut):</p> <pre> DAEMON_ARGS="-w 1024"</pre> <p>Enfin, assurez-vous qu'il est configuré pour démarrer au boot:</p> <pre> # update-rc.d haveged defaults</pre> <h3>Installation de haveged sur RHEL/CentOS/Fedora</h3> <p>Pour installer haveged sur RHEL/CentOS (passez cette étape pour Fedora), vous devez d'abord ajouter le dépôt EPEL en suivant les instructions sur le <a href="https://fedoraproject.org/wiki/EPEL/FAQ#How_can_I_install_the_packages_from_the_EPEL_software_repository.3F" target="_blank">site officiel</a>.</p> <p>Une fois que vous avez installé et activé le repo EPEL (sur RHEL/CentOS), vous pouvez installer <samp>haveged</samp> en exécutant la commande suivante:</p> <pre> # yum install haveged</pre> <p>Les utilisateurs de Fedora peuvent exécuter la commande <samp>yum install</samp> ci-dessus sans modifier le référentiel. Les options par défaut sont généralement correctes, puis assurez-vous qu'il soit configuré pour démarrer au boot&nbsp;:</p> <pre> # chkconfig haveged on</pre> <h3>Installation à partir des sources</h3> <p>Sur les systèmes où il n'y a tout simplement pas de binaire pré-packagé disponible pour <samp>haveged</samp>, vous devrez le construire à partir de l'archive source. C'est en fait beaucoup plus facile que ce à quoi vous pouvez vous attendre. Tout d'abord, vous visiterez la page de téléchargement <a href="https://www.issihosts.com/haveged/downloads.html" target="_blank">et choisirez la dernière version de l'archive</a> (1.7a au moment de l'écriture de ce document). Après avoir téléchargé l'archive, décompressez la dans votre répertoire de travail actuel:</p> <pre> # tar zxvf /path/to/haveged-x.x.tar.gz</pre> <p>Maintenant vous compilez et installez:</p> <pre> # cd /path/to/haveged-x.x # ./configure # make # make install </pre> <p>Par défaut, ceci s'installera avec un préfixe <code>/usr/local</code>, donc vous devrez ajouter quelque chose de similaire à ce qui suit à <code>/etc/rc.local</code> (ou l'équivalent sur votre système, si par exemple il utilise <samp>systemd</samp>) pour le lancer automatiquement au démarrage (vous ajusterez bien entendu le chemin si nécessaire):</p> <pre> # Autostart haveged /usr/local/sbin/haveged -w 1024 </pre> <p>Lancez cette&nbsp;commande manuellement (en tant que root) pour démarrer le démon sans avoir à rebooter la machine, ou rebootez si vous avez pris cette habitude avec Windows.</p> <h3>Test de la disponibilité de l'entropie, de son amplification et qualité des données aléatoires</h3> <p>Après un minimum de travail d'installation/configuration, vous devriez maintenant avoir une installation fonctionnelle de <samp>haveged</samp>, et il devrait déjà commencer à remplir la réserve d'entropie de votre système. La sécurité ne serait pas de la sécurité si vous faisiez aveuglément confiance aux autres et à leurs prétentions d'efficacité, alors pourquoi ne pas tester vos données aléatoires en utilisant un test standard&nbsp;? Pour ce test, nous utiliserons la méthode FIPS-140 utilisée par <samp>rngtest</samp>, disponible vraisemblablement dans toutes les distributions Linux majeures sous divers noms de paquetages comme <samp>rng-tools</samp>&nbsp;:</p> <pre> # cat /dev/random | rngtest -c 1000</pre> <p>Vous devriez voir une sortie similaire à la suivante :</p> <pre> rngtest 2-unofficial-mt.14 Copyright (c) 2004 by Henrique de Moraes Holschuh This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. rngtest: starting FIPS tests... rngtest: bits received from input: 20000032 rngtest: FIPS 140-2 successes: 999 rngtest: FIPS 140-2 failures: 1 rngtest: FIPS 140-2(2001-10-10) Monobit: 0 rngtest: FIPS 140-2(2001-10-10) Poker: 0 rngtest: FIPS 140-2(2001-10-10) Runs: 1 rngtest: FIPS 140-2(2001-10-10) Long run: 0 rngtest: FIPS 140-2(2001-10-10) Continuous run: 0 rngtest: input channel speed: (min=1.139; avg=22.274; max=19073.486)Mibits/s rngtest: FIPS tests speed: (min=19.827; avg=110.859; max=115.597)Mibits/s rngtest: Program run time: 1028784 microseconds </pre> <p>Une très petite quantité d'échecs est acceptable dans tout générateur de nombres aléatoires, mais vous pouvez vous attendre à voir souvent des valeurs autour de 998-1000 comme résultat affichés sur la ligne «&nbsp;successes ».</p> <p>Pour tester la quantité d'entropie disponible, vous pouvez exécuter la commande suivante :</p> <pre> # cat /proc/sys/kernel/random/entropy_avail</pre> <p>L'idée d'<samp>haveged</samp> est de remplir ce pool à chaque fois que le nombre de bits disponibles s'approche de 1024. Ainsi, bien que ce nombre fluctue, il ne devrait pas descendre en dessous d'environ 1000, à moins que vous n'exigiez beaucoup de hasard (comme lors de la génération de clé SSH par exemple).</p> Mon, 06 Jan 2020 13:07:00 +0100 Marc GUILLAUME Quelques succès - Debian 9.0 Stretch https://www.yakati.com/art/quelques-succes-debian-9-0-stretch.html https://www.yakati.com/art/quelques-succes-debian-9-0-stretch.html <blockquote class="traduc"> <p>Traduction de la page : <a href="https://workaround.org/ispmail/stretch/success-stories" target="_blank">https://workaround.org/ispmail/stretch/success-stories</a></p> </blockquote><p>J'apprécierais que vous laissiez un commentaire afin d'expliquer aux autres utilisateurs si votre serveur de mail fonctionne. Peut-être un mot sur l'utilisation de ce serveur et sur le nombre d'utilisateurs. Cela permettra aux autres aspirants administrateur de voir que le temps qu'ils vont passer à configurer un serveur de mail est bien employé et aboutit à un serveur fonctionnel. Merci pour vos retours.</p> <blockquote class="traduc"> <h2>Note du traducteur</h2> <p>Il est préférable de laisser un message <a href="https://workaround.org/ispmail/stretch/success-stories" target="_blank">sur le site de Christoph</a>, mais si vous utilisez ma traduction c'est peut-être que vous ne vous sentez pas très à l'aise pour laisser un commentaire sur son site en anglais. Vous pouvez alors laisser un commentaire ici, et je tâcherai de le transmettre sur workaround (sans garantie de délais&nbsp;! 🙂)</p> <p><strong>Très important&nbsp;:</strong> N'oubliez pas, si ce travail vous a été utile et si vous voulez aider à ce qu'il se poursuive pour les versions à venir de Debian, si vous en avez la possibilité, d'envisager de <strong>faire un petit don à Christophe Haas</strong> sur <a href="https://www.paypal.me/workaroundorg" target="_blank">son compte Paypal</a>. 🙂</p> </blockquote> Fri, 16 Feb 2018 22:56:00 +0100 Marc GUILLAUME Utiliser un compte extérieur avec fetchmail - Debian 9.0 Stretch https://www.yakati.com/art/utiliser-un-compte-exterieur-avec-fetchmail-debian-9-0-stretch.html https://www.yakati.com/art/utiliser-un-compte-exterieur-avec-fetchmail-debian-9-0-stretch.html <blockquote> <p>Cet aspect n'est pas traité dans le document de Christophe Haas, mais peut être utile.</p> </blockquote><h3>Qu'est-ce que fetchmail&nbsp;?</h3> <p><samp>fetchmail</samp>est un programme déjà ancien, écrit à l'origine par Eric S. Raymond. Il sert, comme son nom l'indique, à relever des mails sur une machine (serveur ou poste de travail) depuis différents comptes extérieurs, soit à la demande, soit à intervalle régulier en tournant en mode démon. A l'origine ce programme était destiné à être utilisé avec les connexions non permanentes à Internet, telles qu'on les connaissait majoritairement jusqu'à la fin des années 1990. Il n'a cessé d'évoluer et offre une panoplie de fonctionnalités assez impressionnante, pouvant aller jusqu'à pratiquement remplacer un mta.</p> <p>L'utilisation que nous allons voir ici correspond à un besoin très précis et ne fera appel qu'à une infime partie des possibilités de <samp>fetchmail</samp>.</p> <p>Il se trouve que je possède une adresse mail sur un domaine hébergé chez un opérateur depuis une vingtaine d'années, que j'utilise encore cette adresse et que je ne veux pas la ramener sur mon serveur de courrier. En effet, en cas de problème avec mon serveur de mail, j'entends avoir encore quelques adresses externes pour pouvoir, au minimum pouvoir communiquer avec OVH chez qui se trouvent mes serveurs. Il en est de même avec l'adresse chez mon FAI attachée à ma connexion Internet.</p> <p>Mais l'hébergement mail que je possède correspond à une offre très ancienne, qui est très peu honnéreuse mais n'a pas évolué avec le temps (je soupçonne même que je dois être un des derniers, voir le dernier à utiliser encore cette offre qui a disparu de leur catalogue depuis plus de dix ans). Cet hébergement à l'ancienne ne propose que des connexions pop3. J'ai peu d'espace disque ce qui m'oblige à effacer les mails au fur et à mesure de mes consultations. J'ai donc décidé de les transférer sur mon serveur IMAP, où j'ai beacoup de place et qui est sauvegardé automatiquement quotidiennement. Pour cela j'utilise donc le programme <samp>fetchmail</samp>.</p> <h3>Installation de fetchmail</h3> <p>Aucune difficulté :</p> <pre> apt install fetchmail</pre> <h3>Configuration de fetchmail</h3> <p><samp>fetchmail</samp> se configure par deux fichiers <code>/etc/default/fetchmail</code> et <code>/etc/fetchmailrc</code>. Le premier fichier sert à definir si <samp>fetchmail</samp> doit être lancé en mode démon ou pas. Le second contient les informations qui lui sont nécessaires pour relever les comptes distants.</p> <h4>/etc/default/fetchmail</h4> <p>Ce fichier sert à définir le mode de fonctionnement de fetchmail, soit par un appel explicite, soit en mode démon pour aller automatiquement chercher le courrier à intervalle donné. Si l'on ne le lance pas comme un démon, on peut, par exemple, avec une tâche cron lancer la relève du courrier à des intervalles différents selon différents critères, par exemple toutes les 10 minutes de 9h00 à 19h00 les jours de semaine et toutes les heures en dehors de ces plages de temps et le week-end. On utilise alors les connexions à la demande. Si l'on veut en permanence aller consulter sa ou ses boîtes, par exemple tous les quart d'heure le mode démon est tout à fait approprié. Je l'utilise en mode démon et donc mon fichier <code>/etc/default/fetchmail</code> contient simplement&nbsp;:</p> <pre> # Declare here if we want to start fetchmail. 'yes' or 'no' START_DAEMON=yes</pre> <h4>/etc/fetchmailrc</h4> <p>Ce fichier n'est pas créé par défaut lors de l'installation de fetchmail. Mais il existe un fichier exemple dans <samp>/usr/share/doc/fetchmail/examples/fetchmailrc.example</samp> qui peut servir de base à la création de votre fichier <samp>fetchmailrc</samp>&nbsp;:</p> <pre> cp /usr/share/doc/fetchmail/examples/fetchmailrc.example /etc/fetchmailrc</pre> <p>La configuration pour relever un compte imap est aussi simple que celle figurant ci-dessous ;</p> <pre> set daemon 600 set no bouncemail set syslog set invisible set postmaster postmaster@example.org # The --invisible option (keyword: set invisible) tries to make fetchmail invisible. Normally, fetchmail behaves like any other MTA would # it generates a Received header into each message describing its place in the chain of transmission, and tells the MTA it forwards to # that the mail came from the machine fetchmail itself is running on. If the invisible option is on, the Received header is suppressed # and fetchmail tries to spoof the MTA it forwards to into thinking it came directly from the mailserver host. # mda "/usr/lib/dovecot/dovecot-lda -f %F -d %T" poll pop.monhebergeur.com proto pop3 user "pop2546" pass "BjUiop" no keep sslcertck is "marc@mondomaine.org"</pre> <h5>Description des options</h5> <dl> <dt>set daemon 600</dt> <dd>Indique l'intervalle de chaque connexion pour relever le courrier. Ici 600 secondes, soit 10 minutes.</dd> <dt>set no bouncemail</dt> <dd>Pas de mail de bounce (envoyé en cas d'erreur).</dd> <dt>set syslog</dt> <dd>Utiliser syslog pour les logs de l'application</dd> <dt>set invisible</dt> <dd>Supprime l'entête annonçant au serveur distant qu'il a affaire à fetchmail</dd> <dt>set postmaster postmaster@example.org</dt> <dd>Indique l'adresse mail à qui envoyer des messages d'alerte.</dd> <dt>poll pop.monhebergeur.com</dt> <dd>L'option poll indique quel serveur pop ou imap interroger</dd> <dt>proto pop3</dt> <dd>Indique quel protocole utiliser (ce pourrait être imap, etern etc.)</dd> <dt>user "pop2546"</dt> <dd>Nom d'utilisateur pour s'identifier auprès du serveur interrogé</dd> <dt>pass "BjUiop"</dt> <dd>Mot de passe de l'utilisateur ci-dessus</dd> <dt>no keep</dt> <dd>Indique de ne pas conserver de copie du mail sur le serveur. keep fait l'inverse. Ici comme le serveur a très peu d'espace disponible, c'est l'option importante.</dd> <dt>sslcertck</dt> <dd>Vérifie le certificat ssl du serveur.</dd> <dt>is "marc@mondomaine.org"</dt> <dd>La boîte mail dans laquelle distribuer le courrier.</dd> </dl> <p>Il suffit de définir un tel bloc de données pour chaque adresse mail que l'on veut relever. On pourrait par exemple utiliser le protocole <samp>imap</samp> au lieu de <samp>pop</samp>.</p> <h3>Choisir l'adresse de destination</h3> <p>Dans ce cas précis, j'ai créé dans la base de données de mon serveur mon domaine de courrier (ici dans l'exemple <em>mondomaine.org</em>) et l'adresse que je veux relever. Comme en réalité ce n'est pas mon serveur qui est <samp>MX</samp> pour ce domaine mais que c'est <em>pop.monhebergeur.com</em>, cela entraîne quelques obligations et présente un effet de bord non négligeable signalé ci-dessous.</p> <p>Comme mon hébergeur a mis en place une signature <samp>dkim</samp> et un enregistrement <samp>spf</samp> et <samp>dmark</samp> je suis obligé de configurer mes clients de mail pour utiliser le serveur smtp fourni par mon hébergeur. Je peux donc envoyer des courriers depuis mon client de mail via ce serveur sous cette identité. Si je le faisais depuis mon propre serveur je pourrais être considéré comme un usurpateur d'identité à cause des contrôles <samp>dkim</samp> et <samp>spf</samp>.</p> <blockquote class="info"> <p>Un effet de bord possible est que si un utilisateur dont le domaine et l'adresse sont hébergés sur mon serveur et qui voudrait m'écrire sur mondomaine.org, ne va pas passer par le serveur de mon hébergeur puisque Postfix va voir qu'il possède ce domaine dans sa table de virtual_domains. Le chemin sera plus court, mais je recevrai le mail.</p> <p>Par contre il ne pourra pas écrire à toute autre adresse sur ce domaine qui ne figurerait pas dans virtual_users. En effet Postfix lui dirait que cet utilisateur n'est pas un utilisateur virtuel connu pour ce domaine dont il croit être responsable. C'est donc une technique à manier avec précaution.</p> <p>Ce problème peut-être évité si vous utilisez une adresse existante d'un autre domaine, comme si l'adresse que vous relevez était un alias de cette adresse.</p> </blockquote> Wed, 14 Feb 2018 23:00:00 +0100 Marc GUILLAUME Lutter contre les attaques par force brute - Debian 9.0 Stretch https://www.yakati.com/art/lutter-contre-les-attaques-par-force-brute-debian-9-0-stretch.html https://www.yakati.com/art/lutter-contre-les-attaques-par-force-brute-debian-9-0-stretch.html <blockquote class="traduc"> <p>Traduction de la page : <a href="https://workaround.org/ispmail/stretch/fighting-brute-force-attacks/" target="_blank">https://workaround.org/ispmail/stretch/fighting-brute-force-attacks/</a></p> </blockquote><p>Il y a tant de méchants partout. Paranoïa dites-vous&nbsp;? Bien, jetez un oeil à vos logs de mail. Pendant la préparation de ce guide je pouvais à peine les suivre. Le serveur de mail que j'utilisais pour les tests était loin d'être prêt, et j'avais déjà la visite de bandes d'adresses IP chinoises cherchant à deviner les identifiants des comptes mail de ses utilisateurs. Des canailles parcourent constamment Internet à la recherche de serveurs de mail et inlassablement essayent de trouver un moyen d'en abuser. Faisons donc quelque chose contre ça avant qu'ils ne réussissent à deviner les comptes existants.</p> <h3>Les formes des attaques dans les logs</h3> <p>Il y avait un type d'attaque qui m'a sauté aux yeux&nbsp;:</p> <pre> Jan 24 23:59:34 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] Jan 24 23:59:35 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] Jan 24 23:59:36 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] Jan 24 23:59:37 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] Jan 24 23:59:38 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] </pre> <p>Un système chinois est en train d'essayer de s'identifier sur mon Postfix encore et encore. Et croyez-moi ou pas, il faisait cela pendant des jours. Mon fichier de log est monté jusqu'à 500 Mo par jour à cause de ces abrutis. Il fallait mettre fin à cela.</p> <h3>Installation</h3> <p>Un logiciel classique que j'installe sur les serveurs pour lutter contre cela est <samp>fail2ban</samp>. Installez-le sur votre serveur de mail&nbsp;:</p> <pre> apt install fail2ban</pre> <p>Il connaît un grand nombre de structures dans vos fichiers de log qui traduisent quelque chose de nuisible. Le programme tourne en arrière plan et analyse les différents fichiers de log. Chaque nouvelle ligne dans les logs est comparée avec des expressions rationnelles (<em>regular expressions</em> en anglais). Si une correspondance est trouvée il bloque l'adresse IP qui figurait dans les logs.</p> <h3>Ajouter un filtre</h3> <p>Comme <samp>fail2ban</samp> ne sait pas que la forme «&nbsp;<samp>lost connection after AUTH</samp>&nbsp;» marque un échec de connexion il faut lui apprendre cette forme. Créez un nouveau fichier <samp>/etc/fail2ban/filter.d/postfix-ispmail.conf</samp> contenant ceci&nbsp;:</p> <pre> [INCLUDES] before = common.conf [Definition] _daemon = postfix(-\w+)?/(?:submission/|smtps/)?smtp[ds] failregex = ^%(__prefix_line)slost connection after AUTH from \S+\[&lt;HOST&gt;\]$&lt; ignoreregex = [Init] journalmatch = _SYSTEMD_UNIT=postfix.service</pre> <p>Ceci définit un nouveau filtre appelé «&nbsp;postfix-ispmail&nbsp;». La ligne importante est la ligne <samp>failregex</samp>. Elle décrit une <a href="https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re" target="_blank">expression rationnelle</a> qui est une description compréhensible par la machine de ce que vous recherchez. «&nbsp;<samp>%(…)s</samp> étend une variable. Et «&nbsp;<samp>_prefix_line</samp>&nbsp;» est une forme décrivant la partie de chaque ligne de log&nbsp;: <samp>Jan 25 00:32:01 jen postfix/smtpd[32600]:</samp>. la partie <samp>postfix/smtpd</samp> est définie par la variable «&nbsp;<samp>_daemon</samp>&nbsp;». «&nbsp;<samp>\S+</samp>&nbsp;» indique qu'à cet endroit vous attendez un ou plusieurs caractères qui ne soient pas un espace. Les crochets doivent être échappés avec un anti-slash car ils ont une signification particulière dans les expressions rationnelles. Et «&nbsp;<samp>&lt;HOST&gt;</samp>&nbsp;» est une forme spécifique de fail2ban qui représente un adresse IP. Vous devriez vous familier avec les expressions rationnelles, même si elles peuvent vous effrayer dans un premier temps. Elles sont beaucoup plus puissantes qu'effrayantes en réalité. 🙂</p> <h3>Ajouter un bannissement</h3> <p><samp>fail2ban</samp> peut maintenant trouver la forme que nous cherchons. Mais où la rechercher&nbsp;? Et que faire si nous trouvons une correspondance&nbsp;? C'est notre prochain travail. Créez un autre fichier <samp>/etc/fail2ban/jail.d/postfix-ispmail.conf</samp> contenant&nbsp;:</p> <pre> [postfix-ispmail] logpath = %(syslog_mail)s enabled = true port = smtp,submission</pre> <p>La première ligne fait référence au nom du filtre. Nous avons appelé le filtre «&nbsp;<samp>postfix-ispmail.conf</samp>&nbsp;» c'est donc le nom du filtre (on ignore le <samp>.conf</samp>). Le fichier de log que nous voulons suivre est défini dans la variable <samp>syslog_mail</samp> qui est définie ailleurs (dans le fichier <samp>paths-debian.conf</samp>). Il pointe sur le fichier <samp>/var/log/mail.log</samp>. Nous voulons activer ce bannissement qui est désactivé par défaut dans le fichier <samp>/etc/fail2ban/jail.conf</samp>. Et finalement nous définissons sur quels <samp>ports réseau</samp> nous voulons bloquer l'attaquant.</p> <h3>Allons-y</h3> <p>Passons à l'action. Redémarrez <samp>fail2ban</samp> pour charger les changements de configuration&nbsp;:</p> <pre> service fail2ban restart</pre> <p>Pour savoir ce que <samp>fail2ban</samp> a fait, regardez le fichier <samp>/var/log/fail2ban.log</samp>. Dans mon exemple il a noté&nbsp;:</p> <pre> 2018-01-24 23:59:34,443 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:35,430 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:36,434 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:37,427 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:38,413 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:38,781 fail2ban.actions [32003]: NOTICE [postfix-ispmail] Ban 122.231.43.242</pre> <p>Il a trouvé la ligne «&nbsp;<em>lost connection after AUTH</em>&nbsp;» mentionnant cette adresse IP chinoise et a décidé de le bannir. La raison figure dans le fichier de configuration <samp>/etc/fail2ban/jail.conf</samp>&nbsp;:</p> <pre> # “bantime” est le nombre de secondes pendant lesquelles l'hôte est banni. bantime = 600 # Un hôte est banni si il a généré “maxretry” pendant les dernières “findtime” # seconds. findtime = 600 # “maxretry” est le nombre d'échec avant qu'un hôte soit banni. maxretry = 5</pre> <p>Donc par défaut si une telle phrase apparaît au moins <em>maxretry</em> fois dans un délais de <em>findtime</em> secondes, l'IP sera bannie pour <em>bantime</em> secondes. Vous pouvez personnaliser ces valeurs, mais surtout n'éditez pas le fichier <samp>jail.conf</samp>. À la place créer un fichier <samp>jail.local</samp> comme décrit dans la page <samp>man 5 jail.conf</samp>.</p> <h3>La magie du bannissement</h3> <p>Vous demandez-vous comment le bannissement fonctionne en pratique&nbsp;? <samp>fail2ban</samp> ajoute une nouvelle rêgle dans votre pare-feu de votre serveur en utilisant <samp><a href="https://fr.wikipedia.org/wiki/Iptables" target="_blank">iptables</a></samp>. La liste des règles iptables actives peut ête visualisée avec…</p> <pre> iptables -nvL</pre> <p>Cela va afficher vos règles de pare-feu. <samp>fail2ban</samp> crée une nouvelle chaîne pour chaque bannisement que vous configurez. J'ai appelé mon filtre ispmail-postfix donc ma règle apparaît sous cette forme&nbsp;:</p> <pre> Chain f2b-postfix-ispmail (1 references) pkts bytes target prot opt in out source destination 3 152 REJECT all -- * * 125.106.22.171 … 22 972 REJECT all -- * * 115.213.146.75 … 3 152 REJECT all -- * * 1.195.252.154 … 837 39050 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0</pre> <p>Mais il existe un affichage plus agréable pour visualiser l'état actuel d'une règle de bannissement&nbsp;:</p> <pre> fail2ban-client status postfix-ispmail</pre> <p>Qui va afficher quelque chose comme ça&nbsp;:</p> <pre> Status for the jail: postfix-ispmail |- Filter | |- Currently failed: 1 | |- Total failed: 168 | `- File list: /var/log/mail.log `- Actions |- Currently banned: 14 |- Total banned: 36 `- Banned IP list: 1.199.191.44 125.106.250.51 115.213.233.184 …</pre> <h3>Ajouter d'autres règles de bannissement</h3> <p>Vous pouvez parcourir les filtres prédéfinis soit dans <samp>/etc/fail2ban/jail.conf</samp> soit en regardant tous les fichiers dans <samp>/etc/fail2ban/filter.d/</samp>. Par défaut seul le filtre sshd est activé dans le fichier <samp>/etc/fail2ban/jail.d/defaults-debian.conf</samp>. Mais libre à vous d'activer de nouvelles règles…</p> <ul> <li>dovecot</li> <li>postfix</li> <li>postfix-sasl</li> <li>roundcube-auth</li> </ul> <p>Tout cela mettra fin aux attaques par force brute et définitivement. Détail amusant… deux jours après avoir écrit cela j'avais déjà banni 1645 adresses IP.</p> <p>(Si vous trouvez d'autres informations dans les logs que <samp>fail2ban</samp> ne connaît pas encore, je les ajouterai. En avez-vous trouvé une&nbsp;?)</p> Wed, 14 Feb 2018 22:19:00 +0100 Marc GUILLAUME Diagnostic des pannes de votre serveur de courrier - Debian 9.0 Stretch https://www.yakati.com/art/diagnostic-des-pannes-de-votre-serveur-de-courrier-debian-9-0-stretch.html https://www.yakati.com/art/diagnostic-des-pannes-de-votre-serveur-de-courrier-debian-9-0-stretch.html <blockquote class="traduc"> <p>Traduction de la page : <a href="https://workaround.org/ispmail/stretch/troubleshooting" target="_blank">https://workaround.org/ispmail/stretch/troubleshooting</a></p> </blockquote><h3>Conseils généraux pour effectuer le diagnostique</h3> <ul> <li>Lancez <samp>postfix check</samp> pour faire rechercher à Postfix les erreurs de configuration les plus évidentes. Si il ne renvoit aucun résultat c'est qu'il n'a trouvé aucun problème.</li> <li>Lisez votre fichier <samp>/var/log/mail.log</samp> à la recherche des warnings (alertes) et errors (erreurs).</li> </ul> <h3>Postfix garde des mails indésirables dans la file d'attente</h3> <p>Vérifiez que vous n'avez pas laissé l'option <samp>soft_bounce</samp> activée. Si <samp>postconf soft_bounce</samp> renvoit «&nbsp;yes&nbsp;» alors lancez la commande&nbsp;:</p> <pre> postconf soft_bounce=no</pre> <p>Pour purger tous les mails de la queue (attention c'est un peu dangereux) lancez la commande&nbsp;:</p> <pre> postsuper -d ALL</pre> <h3>Je lis «&nbsp;Permission denied&nbsp;» envoyé par Dovecot dans le fichier mail.log</h3> <p>Vous n'avez pas fixé les bonnes permissions. Lancez la commande&nbsp;:</p> <pre> chown&nbsp;-R vmail:vmail /var/vmail</pre> <h3>Postfix dit&nbsp;: «&nbsp;Mail loops back to myself&nbsp;»</h3> <p>Postfix tente d'envoyer un mail sur Internet parce qu'il ne pense pas être responsable du domaine destinataire. Pourtant les enregistrements DNS pointent vers lui. Soit votre enregistrement DNS pour ce domaine est faux (peu probable) soit votre Postfix refuse de recevoir des mails pour le domaine en question (très probable). Vérifiez que le domaine destinataire est bien listé dans la table <samp>virtual_domains</samp> de la base MySQL. Et vérifiez que vos fichiers de configuration fonctionnent correctement.</p> Wed, 14 Feb 2018 22:04:00 +0100 Marc GUILLAUME Administration des utilisateurs, des alias et des domaines - Debian 9.0 Stretch https://www.yakati.com/art/administration-des-utilisateurs-des-alias-et-des-domaines-debian-9-0-stretch.html https://www.yakati.com/art/administration-des-utilisateurs-des-alias-et-des-domaines-debian-9-0-stretch.html <blockquote class="traduc"> <p>Traduction de la page : <a href="https://workaround.org/ispmail/stretch/managing-users-aliases-domains" target="_blank">https://workaround.org/ispmail/stretch/managing-users-aliases-domains</a></p> </blockquote><p>Peut-être savez-vous déjà ce que vous avez à faire pour créer des domaines de mail et des utilisateurs. Après-tout j'ai essayé d'expliquer le schéma de la base de données sur la page traitant de la <a href="https://www.yakati.com/?art/preparation-de-la-base-de-donnees-debian-9-0-stretch.html">préparation de la base de données</a>. Mais si ce n'était pas assez clair, laissez-moi vous expliquer ce que vous avez à faire pour gérer vos comptes.</p> <h3>Interfaces Web</h3> <p>Si vous n'aimez pas utiliser des requêtes SQL pour gérer votre serveur mail vous pouvez installer une application web de gestion de votre serveur. Plusieurs développeurs <a href="https://www.yakati.com/?art/administrer-les-domaines-les-comptes-utilisateurs-et-les-redirections-debian-7-0-wheezy.html">ont créé des interfaces web pour des versions précédentes de ce guide</a> et elles fonctionnent probablement toujours car le shéma de base de données n'a pas changé, elles vont simplement créer des hachage de mots de passe faibles. Avec un peu d'expérience dans le développement web vous devriez être capables de développer votre propre système de gestion. J'explique plus bas quelques requêtes SQL de base.</p> <p>Ces interfaces web vous sont fournies par d'autres mains diligentes&nbsp; :</p> <h4>ISPmail Admin</h4> <p>La page du projet&nbsp;: <a href="http://ima.jungclaussen.com/" target="_blank">http://ima.jungclaussen.com/</a><br /> Une page de démonstration&nbsp;: <a href="http://ima.jungclaussen.com/demo/" target="_blank">http://ima.jungclaussen.com/demo/</a></p> <p><img alt="ima_screenshot" height="604" src="https://www.yakati.com/data/medias/images/ispmail/jessie/ima_screenshot.jpg" width="747" /></p> <h4>Gestionnaire de mails virtuels GRSoft</h4> <p>Peter Gutwein a mis à jour son interface web en Php pour ajouter les hachages de mots de passe forts recommandés dans ce guide. Elle est traduite en anglais, allemand, espagnol, français, italien, russe et suédois.</p> <p>Page du projet -&gt;&nbsp;<a href="http://www.grs-service.ch/pub/grs_mminstallation.html" target="_blank">http://www.grs-service.ch/pub/grs_mminstallation.html</a></p> <p>Quelques copies d'écran de l'application en fonctinnement&nbsp;:</p> <p><img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot1-150x150.png" style="display: inline;" width="150" /> <img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot2-150x150.png" style="display: inline;" width="150" /> <img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot3-150x150.png" style="display: inline;" width="150" /> <img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot4-150x150.png" style="display: inline;" width="150" /> <img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot5-150x150.png" style="display: inline;" width="150" /> <img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot6-150x150.png" style="display: inline;" width="150" /> <img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot7-150x150.png" style="display: inline;" width="150" /> <img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot8-150x150.png" style="display: inline;" width="150" /> <img alt="grsoft-vmm-screenshot1" height="150" src="https://www.yakati.com/data/medias/images/ispmail/jessie/grsoft-vmm-screenshot9-150x150.png" style="display: inline;" width="150" /></p> <h3>Administrer directement dans la base de données</h3> <h4>Les tâches courantes avec PHPMyAdmin</h4> <p>Ce tableau détaille les modifications devant être apportées à la base de données en utilisation quotidienne. Vous pouvez parcourir PhpMyAdmin en suivant les instructions de ce tableau&nbsp;:</p> <table> <tbody> <tr> <td>Créer un domaine de courrier</td> <td>Insérer une nouvelle ligne dans la table <samp>virtual_domains</samp> en mettant le nom du nouveau domaine dans le champ <samp>name</samp>.</td> </tr> <tr> <td>Effacer un domaine de courrier</td> <td>Effacer la ligne de la table <samp>virtual_domains</samp> qui correspond à ce nom de domaine. Toutes les redirections et les utilisateurs seront automatiquement effacés en cascade. Cependant les boîtes aux lettres vont rester sur le disque dans <samp>/var/vmail/…</samp> et vous devrez les effacer à la main.</td> </tr> <tr> <td>Créer un compte mail</td> <td>Chercher l'identifiant du domaine dans la table <samp>virtual_domains</samp>. Insérez une ligne dans la table <samp>virtual_users</samp>. Mettez comme <samp>domain_id</samp> la valeur que vous venez de chercher dans la table <samp>virtual_domain</samp>. Mettez dans le champ <samp>email</samp> l'adresse mail complète du nouvel utilisateur. Créez un nouveau mot de passe dans une console terminal shell avec la commande «&nbsp;<samp>dovecot pw -s SHA256-CRYPT</samp>&nbsp;» et copiez le résultat dans le champ <samp>password</samp>.</td> </tr> <tr> <td>Changer le mot de passe d'un utilisateur</td> <td>Trouvez la bonne ligne dans la table <samp>virtual_users</samp> en cherchant la bonne valeur dans le champ <samp>email</samp>. Créez un nouveau mot de passe dans une console terminal shell avec la commande «&nbsp;<samp>dovecot pw -s SHA256-CRYPT</samp>&nbsp;» et copiez le résultat dans le champ <samp>password</samp>.</td> </tr> <tr> <td>Supprimer un utilisateur de mail</td> <td>Trouvez la bonne ligne dans la table <samp>virtual_users</samp> en cherchant la bonne valeur dans le champ <samp>email</samp> et effacez-la. La boîte mail reste sur le disque dans <samp>/var/vmail/…</samp> et il vous faudra l'effacer à la main.</td> </tr> <tr> <td>Créer une redirection de mail</td> <td>Vous pouvez rediriger les mails depuis une adresse mail (la source) vers d'autres adresses mail (les destinations) et même vers des adresses extérieures à votre serveur de mail. Cherchez l'identifiant du bon domaine (la partie après l'arobase (<samp>@</samp>) de l'adresse source) dans la table <samp>virtual_domains</samp>. Créez une nouvelle ligne dans la table <samp>virtual_aliases</samp> pour chaque destination (si vous avez plusieurs adresses de destination). Placez dans le champ <samp>source</samp> l'adresse email source complète. Et dans le champ <samp>destination</samp> mettez l'adresse complète de destination.</td> </tr> <tr> <td>Supprimer une redirection de mail</td> <td>Recherchez toutes les lignes dans la table <samp>virtual_aliases</samp> qui contiennent dans le champ <samp>source</samp> la bonne adresse mail. Supprimez toutes les lignes parmi celle-ci qui contiennent dans le champ <samp>destination</samp> une adresse à laquelle vous ne voulez plus transférer de mails.</td> </tr> </tbody> </table> <h4>Les requêtes SQL</h4> <table> <tbody> <tr> <td>Créer un domaine de mail</td> <td> <pre style="color:#1f1c1b;"> INSERT <strong>INTO</strong> virtual_domains (name) <strong>VALUES</strong> (“example<span style="color:#924c9d;">.</span>org”);</pre> </td> </tr> <tr> <td>Supprimer un domaine de mail</td> <td> <pre style="color:#1f1c1b;"> <strong>DELETE</strong> <strong>FROM</strong> virtual_domains <strong>where</strong> name=’example<span style="color:#924c9d;">.</span>org’;</pre> </td> </tr> <tr> <td>Créer un utilisateur de mail</td> <td> <pre style="color:#1f1c1b;"> <strong>INSERT</strong> <strong>INTO</strong> virtual_users (domain_id, email, <span style="color:#644a9b;">password</span>) <strong>VALUES</strong> ( (<strong>SELECT</strong> id <strong>FROM</strong> virtual_domains <strong>WHERE</strong> name=’example<span style="color:#924c9d;">.</span>org’), ‘john@example<span style="color:#924c9d;">.</span>org’, <span style="color:#644a9b;">CONCAT</span>(‘{SHA256-CRYPT}’, <span style="color:#644a9b;">ENCRYPT</span> (‘new password’, <span style="color:#644a9b;">CONCAT</span>(‘$5$’, <span style="color:#644a9b;">SUBSTRING</span>(<span style="color:#644a9b;">SHA</span>(<span style="color:#644a9b;">RAND</span>()), -<span style="color:#b08000;">16</span>)) ) ) );</pre> </td> </tr> <tr> <td>Changer le mot de passe d'un utilisateur</td> <td> <pre style="color:#1f1c1b;"> <strong>UPDATE</strong> virtual_users <strong>SET</strong> password=CONCAT(‘{SHA256-CRYPT}’, <span style="color:#644a9b;">ENCRYPT</span> (‘new password’, <span style="color:#644a9b;">CONCAT</span>(‘$5$’, <span style="color:#644a9b;">SUBSTRING</span>(<span style="color:#644a9b;">SHA</span>(<span style="color:#644a9b;">RAND</span>()), -<span style="color:#b08000;">16</span>)))) <strong>WHERE</strong> email=’email@address’;</pre> </td> </tr> <tr> <td>Supprimer un utilisateur</td> <td> <pre style="color:#1f1c1b;"> <strong>DELETE</strong> <strong>FROM</strong> virtual_users <strong>WHERE</strong> email=’john@example<span style="color:#924c9d;">.</span>org’;</pre> </td> </tr> <tr> <td>Créer une redirection de mail</td> <td> <pre style="color:#1f1c1b;"> <strong>INSERT</strong> <strong>INTO</strong> virtual_aliases ( domain_id, source, destination ) <strong>VALUES</strong> ( (<strong>SELECT</strong> id <strong>FROM</strong> virtual_domains <strong>WHERE</strong> name=’example<span style="color:#924c9d;">.</span>org’), ‘melissa@example<span style="color:#924c9d;">.</span>org’, ‘juila@example<span style="color:#924c9d;">.</span>net’ );</pre> </td> </tr> <tr> <td>Supprimer une redirection de mail</td> <td> <pre style="color:#1f1c1b;"> <strong>DELETE</strong> <strong>FROM</strong> virtual_aliases <strong>WHERE</strong> source=’melissa@example<span style="color:#924c9d;">.</span>org’;</pre> </td> </tr> </tbody> </table> Wed, 14 Feb 2018 21:20:00 +0100 Marc GUILLAUME