hbIRCS : version 0.2.0-UNSTABLE-20090726

Comme je l’avais évoqué dans un billet précédent, le nouveau build de développement d’hbIRCS intègre une fonctionnalité majeure : le support des connexions sécurisées SSL/TLS. Le reste du travail a porté sur la réécriture du code existant avec comme objectif l’optimisation du temps d’exécution des cycles lecture/écriture, des algorithmes de parsing et un allocation optimisées des buffers.

hbIRCS-0.2.0-UNSTABLE-20090726
- support des connexions sécurisées SSL/TLS.
- optimisation de la gestion des buffers : allocation par pool, support des vues et des buffers systèmes.
- optimisation des algorithmes I/O : cycles de lecture/décodage/process et encodage/écriture.
- optimisation d’exécution des tâches planifiées.
- tuning des paramètres Listener, Connection, SSLEngine, AcceptExecutor/ReadExecutor & ThreadPool.
- fix bug commandes RESTART & DIE.
- fix bug socket bind.

Voici l’ensemble des options de configuration d’un écouteur réseau  :

<Listener>
   ListenAddress ::1
   ListenPort 9999
   ListenBackLog 128

   MaxConnections 256
   ACL local_client

   <Connection>
      UseSSLEngine true
      <SSLEngine>
         KeyStoreFile ./hbircs.keystore
         KeyStorePassword "my$ecret"
      </SSLEngine>
      ReadBufferSize 4096
      WriteBufferSize 4096
      UseDirectBuffers true
      UseBufferFactory true
      WriteRetryAttempts 2
      WriteRetryTimeout 250
   </Connection>

   <AcceptExecutor>
      SelectorTimeout 0
      QueueTaskSize 64
      TaskRecycle true        
      UseThreadPool true
      <ThreadPool>
         MaxTasks 64
         MinThreads 1
         MaxThreads 4
         ThreadIncrement 1
         ThreadPriority 5
         ThreadTimeout 60000
      </ThreadPool>        
   </AcceptExecutor>

   <ReadExecutor>
      Executors 1
      SelectorTimeout 0
      QueueTaskSize 1024
      TaskRecycle true        
      UseThreadPool true
      <ThreadPool>
         MaxTasks -1
         MinThreads 4
         MaxThreads 16
         ThreadIncrement 2
         ThreadPriority 5
         ThreadTimeout 60000
      </ThreadPool>
   </ReadExecutor>
</Listener>

Java : gestion des certificats SSL/TLS avec keytool

Java utilise ses propres outils pour générer et utiliser les certificats sécurisés. Tout se base sur un stockage propriétaire dans un fichier keystore, regroupant des certificats/clés accessibles par des alias. Un keystore est protégé par mot de passe. Si aucun keystore n’est spécifié, le keystore personnel de l’utilisateur est utilisé (~/.keystore). Il est bien sûr possible d’importer et exporter des certificats / clés pour les utiliser dans des applications Java ou non.

Je vous propose ici un mémo des commandes les plus utilisées :

Afficher le contenu du keystore personnel :

$ keytool -list

Afficher le contenu d’un fichier keystore :

$ keytool -list -keystore my.keystore

Générer un certificat X509  auto-signé et le nommer mycert dans le keystore :

$ keytool -genkey -keystore my.keystore -alias mycert -keyalg RSA

Supprimer un certificat d’un keystore :

$ keytool -delete -keystore my.keystore -alias mycert

Afficher le contenu d’un keystore :

$ keytool -list -keystore my.keystore

Exporter le certificat d’un keystore :

$ keytool -list -keystore my.keystore -export -alias mycert -rfc

Importer un certificat externe et le protéger par mot de passe :

$ keytool -import -keystore my.keystore -alias myimport -storepass mypass -file mycertif.crt

Documentation de keytool : http://java.sun.com/javase/6/docs/technotes/tools/windows/keytool.html

SpamAssassin : limiter la casse d'Outlook

Un petit mémo concernant la configuration du filtre antispam SpamAssassin, afin que celui-ci ne flag pas tous les mails générés par un Outlook en tant que SPAM.

# bugs Outlook
score FORGED_MUA_OUTLOOK 0
score MSGID_MULTIPLE_AT 0

Concernant l’histoire de la règle MSGID_MULTIPLE_AT, cela ne touche qu’Outlook 2007 et c’est expliqué ici : https://issues.apache.org/SpamAssassin/show_bug.cgi?id=5707

Pour rebondir sur le futur d’Outlook, vous pouvez participer ici : http://fixoutlook.org/ contre çà : http://blogs.msdn.com/outlook/archive/2009/06/24/the-power-of-word-in-outlook.aspx.

Postfix : gérer une blacklist sender / recipient

Avec Postfix, il est possible de constituer une blacklist pour bloquer à l’envoi (sender) ou à la réception (recipient) une adresse électronique.

Il faut ajouter ces options dans le fichier de configuration main.cf :

smtpd_sender_restrictions =
     check_sender_access hash:/etc/postfix/block_sender
smtpd_recipient_restrictions =
     check_recipient_access hash:/etc/postfix/block_recipient

Les blacklists sont donc les fichiers block_sender et block_recipient auxquels seront associès leurs fichiers  hashtable (même nom de fichier mais avec l’extension .db) à générer et régénérer après chaque modification avec postmap :

# postmap /etc/postfix/db/block_sender
# postmap /etc/postfix/db/block_recipient

Au niveau du contenu des fichiers, il faut spécifier la valeur REJECT àprès chaque adresse sinon elle sera autorisée (par défaut valeur OK) :

# cat /etc/postfix/db/block.sender
someuser@somedomain.com REJECT

L’erreur de rejet par défaut sera envoyée, mais il est possible de s’amuser un peu en spécifiant une erreur et un message particulier :

# cat /etc/postfix/db/block.sender
someuser@somedomain.com 554 Désolé, j'ai piscine !

hbIRCS : support des connexions sécurisées SSL/TLS

Après 1 mois de travail laborieux, une javadoc bien trop légère sur le sujet, quasiment aucune aide Google (ce post fut tout de même déterminant), 3 implémentations différentes, pas loin d’une centaine de compilations et des sessions de debug interminables…  c’est fait : les connexions sécurisées SSL/TLS sont supportées par mon serveur IRC.

Évidemment, je n’utilise pas les sockets SSL de Java 1.4 – ce serait trop simple – mais le délicat SSLEngine de Java 5 qui apporte le support TLS/SSL aux sockets NIO, bref du TLS taillé pour des I/O non bloquantes en environnement multithreadé :

the SSLEngine can be used for a wide variety of I/O types, such as non-blocking I/O (polling), selectable non-blocking I/O, Socket and the traditional Input/OutputStreams, local ByteBuffers or byte arrays, future asynchronous I/O models , and so on.

Allez, si tout est stable, le code sera commité en fin de semaine.

[00:25:21]  * Looking up localhost
[00:25:21]  * Connecting to localhost (::1) port 9999...
[00:25:21]  * * Subject: /C=FR/ST=Ile-de-France/L=Paris/O=HBIRCS/OU=HBIRCS/CN=localhost
[00:25:21]  * * Issuer: /C=FR/ST=Ile-de-France/L=Paris/O=HBIRCS/OU=HBIRCS/CN=localhost
[00:25:21]  * * Subject: /C=FR/ST=Ile-de-France/L=Paris/O=HBIRCS/OU=HBIRCS/CN=localhost
[00:25:21]  * * Issuer: /C=FR/ST=Ile-de-France/L=Paris/O=HBIRCS/OU=HBIRCS/CN=localhost
[00:25:22]  * * Certification info:
[00:25:22]  *   Subject:
[00:25:22]  *     C=FR
[00:25:22]  *     ST=Ile-de-France
[00:25:22]  *     L=Paris
[00:25:22]  *     O=HBIRCS
[00:25:22]  *     OU=HBIRCS
[00:25:22]  *     CN=localhost
[00:25:22]  *   Issuer:
[00:25:22]  *     C=FR
[00:25:22]  *     ST=Ile-de-France
[00:25:22]  *     L=Paris
[00:25:22]  *     O=HBIRCS
[00:25:22]  *     OU=HBIRCS
[00:25:22]  *     CN=localhost
[00:25:22]  *   Public key algorithm: rsaEncryption (1024 bits)
[00:25:22]  *   Sign algorithm md5WithRSAEncryption
[00:25:22]  *   Valid since Jun  1 13:10:42 2009 GMT to Aug 30 13:10:42 2009 GMT
[00:25:22]  * * Cipher info:
[00:25:22]  *   Version: TLSv1/SSLv3, cipher DHE-RSA-AES256-SHA (256 bits)
[00:25:22]  * * Verify E: self signed certificate.? (18) -- Ignored
[00:25:22]  * Connected. Now logging in...
[00:25:22]  * Welcome to the hbIRCS IRC Network bhuisgen!bhuisgen@localhost
[00:25:22]  * Your host is irc.bhuisgen.fr, running version 0.2.0-UNSTABLE
[00:25:22]  * This server was created Tue Jun 30 00:24:22 CEST 2009
[00:25:22]  * irc.bhuisgen.fr 0.2.0-UNSTABLE aiwroOs abeiIklmnoOpqrstv
[00:25:22]  * NICKLEN=15 CHANNELLEN=50 TOPICLEN=4096 PREFIX=(ov)@+ CHANTYPES=#&+!
 CHANMODES=abeiIklmnoOpqrstv CASEMAPPING=UTF-8 NETWORK=hbIRCS IRC Network :are supported by this server
[00:25:22]  * There are 1 users and 0 invisible on 1 servers
[00:25:22]  * 0 :operator(s) online
[00:25:22]  * 0 :channels formed
[00:25:22]  * I have 1 clients and 0 servers.
[00:25:22]  * Current local users: 1 Max: 1
[00:25:22]  * Current global users: 1 Max: 1
[00:25:22]  * - irc.bhuisgen.fr Message of the Day -
[00:25:22]  * -
[00:25:22]  * -     _/        _/        _/_/_/  _/_/_/      _/_/_/    _/_/_/
[00:25:22]  * -    _/_/_/    _/_/_/      _/    _/    _/  _/        _/
[00:25:22]  * -   _/    _/  _/    _/    _/    _/_/_/    _/          _/_/
[00:25:22]  * -  _/    _/  _/    _/    _/    _/    _/  _/              _/
[00:25:22]  * - _/    _/  _/_/_/    _/_/_/  _/    _/    _/_/_/  _/_/_/
[00:25:22]  * -
[00:25:22]  * -                 Welcome on hbIRCS IRC server !
[00:25:22]  * End of /MOTD command
[00:25:22]  * Found your IP: [127.0.0.1]
[00:25:22]  * irc.bhuisgen.fr sets mode +w bhuisgen
[00:25:22]  * irc.bhuisgen.fr sets mode +i bhuisgen
[00:25:22]  * irc.bhuisgen.fr sets mode +s bhuisgen
[00:25:37]  * You are now an IRC operator

Exim : refuser la réception de mails selon l'adresse d'expédition

Sous Exim, pour refuser l’envoi de SPAM, il est possible de constituer une liste sous la forme d’un fichier texte contenant les emails des expéditeurs à refuser.

Pour ce faire, dans le fichier de configuration, on déclare l’ACL qui va être appellée au moment de la vérification du sender, puis on la définit :

######################################################################  
#                    MAIN CONFIGURATION SETTINGS                     #
######################################################################

acl_smtp_mail = acl_check_sender

[...]

######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

begin acl

# This access control list is used to check every MAIL FROM in an incoming
# SMTP message. The tests are run in order until the address is either
# accepted or denied.

acl_check_sender:
 deny    senders = /etc/exim/sender_reject.list
 accept

Chaque email à bloquer devra être ajoutée dans le fichier sender_reject.list (une adresse par ligne). Pour valider la nouvelle configuration du serveur SMTP, rien de tel qu’un :

exim -C /etc/exim/exim.conf -bV

En pratique, lors de l’envoi d’un mail par un expéditeur bloqué, il se produit une erreur 550, comme le montre cette session telnet :

220 smtp.mailserver.fr ESMTP Exim 4.69 Mon, 20 Jun 2009 20:03:58 +0200
EHLO test
250-smtp.mailserver.fr Hello test [127.0.0.1]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
MAIL FROM:<someuser@somedomain.com>
550 Administrative prohibition

BackupPC : lancement de tâches en ligne de commande

Il est parfois utile de piloter les tâches de BackupPC par la ligne de commande. Par exemple, lancer l’archivage d’un ou plusieurs clients ou plus simplement une backup incrémentale. Je vous fais donc part d’un récapitulatif des commandes que j’ai pu utiliser.

Lancer une backup incrémentale du client client.my.domain d’adresse IP 192.168.0.1 :

BackupPC_serverMesg backup 192.168.0.1 client.my.domain backuppc 0

Lancer une backup full d’un client client.my.domain (l’hôte étant résolvable) :

BackupPC_serverMesg backup client.my.domain client.my.domain backuppc 1

Empécher ou délayer la sauvegarde du client client.my.domain pour une heure :

BackupPC_serverMesg stop client.my.domain backuppc 1

Mettre en queue la sauvegarde de tous les clients :

BackupPC_serverMesg backup all

Créer une archive de client.my.domain sur le serveur d’archivage localhost :

BackupPC_archiveStart localhost backuppc client.my.domain

Note : la compression de l’archive sera à effectuer manuellement (cf forum).

Afficher toutes les tâches en cours :

BackupPC_serverMesg status jobs

Le reste des commandes est détaillée dans la documentation officielle.

Mac OS X : launchd et détection des périphériques amovibles

Le système launchd de Mac OS X (10.4 et +) permet de détecter le branchement d’un volume amovible (clé USB, disque dur, etc). Un script particulier peut donc être lancé suite à cette détection, telle qu’une copie de vos documents ou  le lancement d’une sauvegarde (rsync ou autre). La détection s’appuie sur le nom du volume : /Volumes/<NOM>

Un exemple de script launchd qui lance automatiquement le script shell usb-hotplug au branchement du volume « USB » :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
 <string>fr.hbis.usb-hotplug</string>
 <key>Program</key>
 <string>/Users/bhuisgen/Library/Scripts/usb-hotplug</string>
 <key>ProgramArguments</key>
 <array>
 <string>usb-hotplug</string>
 </array>
 <key>WatchPaths</key>
 <array>
 <string>/Volumes/USB</string>
 </array>
</dict>
</plist>

Comme toujours pour lancer un script launchd :

$ launchctl load -w fr.hbis.usb-hotplug

FreeBSD 7 : identificateurs d'objets SNMP

Les identificateurs d’objects OID SNMP sous FreeBSD 7 ont changé.

Voici la liste des plus utilisés :

CPU / User : .1.3.6.1.4.1.2021.11.50.0
CPU / Nice : .1.3.6.1.4.1.2021.11.51.0
CPU / System : .1.3.6.1.4.1.2021.11.52.0
Load / 1 min : .1.3.6.1.4.1.2021.10.1.3.1
Load / 5 min : .1.3.6.1.4.1.2021.10.1.3.2
Load / 15 min : .1.3.6.1.4.1.2021.10.1.3.3
Memory / Buffers : .1.3.6.1.4.1.2021.4.14.0
Memory / Cache : .1.3.6.1.4.1.2021.4.15.0
Memory / Free : .1.3.6.1.4.1.2021.4.6.0
Network / All : .1.3.6.1.2.1.31.1.1.1

Gentoo : portage et collision de fichiers

Parfois, portage peut signaler une collision de fichiers et refuser la poursuite de l’installation d’un package :

>>> Installing sys-libs/timezone-data-2009c
* checking 1712 files for package collisions
1000 files checked ...
* This package will overwrite one or more files that may belong to other
* packages (see list below). You can use a command such as `portageq
* owners / <filename>` to identify the installed package that owns a
* file. If portageq reports that only one package owns a file then do
* NOT file a bug report. A bug report is only useful if it identifies at
* least two or more packages that are known to install the same file(s).
* If a collision occurs and you can not explain where the file came from
* then you should simply ignore the collision since there is not enough
* information to determine if a real problem exists. Please do NOT file
* a bug report at http://bugs.gentoo.org unless you report exactly which
* two packages install the same file(s). Once again, please do NOT file
* a bug report unless you have completely understood the above message.
*
* Detected file collision(s):
*
*     /usr/bin/tzselect
*     /usr/sbin/zic
*     /usr/sbin/zdump
*     /usr/share/zoneinfo/GB
*
* Package 'sys-libs/timezone-data-2009c' NOT merged due to file
* collisions. If necessary, refer to your elog messages for the whole
* content of the above message.

Les fichiers en collision ont été installés par un autre package; il refuse donc de les supprimer. Si cela est nécessaire, il est possible de le débloquer :

# COLLISION_IGNORE="/usr" emerge -av timezone-data
Haut de page