Archives pour août, 2010

Mac OS X : normalisation UTF-8 des noms de fichiers

L’encodage UTF-8 n’a pas dit son dernier mot ! La normalisation UTF-8 des noms de fichiers/répertoires est différente entre les systèmes d’exploitation. Mac OS X utilise ainsi la forme D (NFD) alors que les autres systèmes dont Linux utilisent la forme C (NFC).

Bref, la commande magique s’appelle convmv et elle permet de convertir la normalisation NFC en NFD (et inversement) suite à une copie de fichiers entre les deux systèmes.

Exemple d’utilisation :

# convmv -r -i -f utf8 -t utf8 --nfc --notest .

Pour convertir de Linux vers Mac OS, cela donne donc :

# convmv -r -i -f utf8 -t utf8 --nfd --notest .

Pour effectuer un test et confirmer le format de conversion, vous pouvez omettre l’option –notest.

Man page : http://www.j3e.de/linux/convmv/man/
Download : http://www.j3e.de/linux/convmv/

Plus d’infos sur la normalisation UTF-8 : http://www.unicode.org/reports/tr15/

Zabbix : script de notification d’alertes XMPP / Jabber

Zabbix intégre le support de notifications par protocole XMPP / Jabber. Pour autant, en fonction du serveur XMPP, les notifications peuvent ne pas fonctionner. Ceci a été mon cas, probablement car le serveur jabber utilisé n’accepte que les connexions sécurisées. Ne pouvant pas le changer (la gestion par LDAP étant nécessaire), j’ai donc dû testé différentes librairies Perl, Python, etc pour en arriver à celle qui marche : xmpphp. Je vous fait part de cette configuration et des scripts nécessaires.

L’installation des scripts se fait dans le répertoire spécifié par l’option de configuration AlertScriptsPath de Zabbix. Ici, il s’agit de mon côté /etc/zabbix/alertscripts/. Je débute par xmpphp :

# cd /tmp/
# wget http://xmpphp.googlecode.com/files/xmpphp-0.1rc2-r77.tgz
# tar xzf xmpphp-0.1rc2-r77.tgz
# mv xmpphp-0.1rc2-r77/XMPPHP /etc/zabbix/alertscripts/

Puis les deux scripts à mettre en place, le script PHP et le script shell appelé par Zabbix (celui-ci ne peut appeler que des scripts shell) :

# more /etc/zabbix/alertscripts/sendxmpp.php
<?php
include 'XMPPHP/XMPP.php';

if ($_SERVER[argc] < 3)
 die ("Not enough arguments.");

$sendto = $_SERVER[argv][1];
$subject = $_SERVER[argv][2];
$message = $_SERVER[argv][3];

// TODO: change your server settings and IM sender
$conn = new XMPPHP_XMPP('jabber.my.domain', 5222, 'zabbix', 'mot_de_passe',
 'xmpphp', 'my.domain', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);

try
{
 $conn->connect();
 $conn->processUntil('session_start');
 $conn->presence();
 $conn->message($sendto, $message);
 $conn->disconnect();
}
catch(XMPPHP_Exception $e)
{
 die($e->getMessage());
}
# more /etc/zabbix/alertscripts/sendxmpp.sh
#!/bin/sh
/usr/bin/php /etc/zabbix/alertscripts/sendxmpp.php "$1" "$2" "$3"

Au niveau de la configuration du serveur Zabbix, un nouveau média doit être créé. Il doit être de type script et pointer sur /etc/zabbix/alertscripts/sendxmpp.sh :


Je vous laisse le soin de l’associer à une action. Voici ce que j’obtiens comme notification sur mon poste avec Growl :

FreeBSD : activer le ping dans vos jails

Par défaut, les jails FreeBSD ne peuvent pas créer de sockets de type RAW. Celles-ci sont pourtant utilisées par certains logiciels (sniffeur réseau et cie) à commencer par la commande rudimentaire ping.

Pour pouvoir autoriser la création de telles sockets, il faut modifier un paramètre système :

# sysctl security.jail.allow_raw_sockets=1
security.jail.allow_raw_sockets: 0 -> 1

Les jails devront être redémarrés pour que cela soit effectif. Pour affiner la configuration et  limiter l’impact de sécurité octroyé, il reste votre parefeu pour limiter les flux entrants/sortants des jails concernées.

FreeBSD : configuration réseau des jails

Lorsqu’une seule IP publique est disponible, la configuration réseau des jails doit s’appuyer sur un réseau privé où chaque jail possède son IP tout comme l’hôte réél (eh oui). Ainsi, une nouvelle interface loopback doit être créée, en y attribuant l’adresse IP dédiée à l’hôte :

# ifconfig lo1 create
# ifconfig lo1 inet 172.16.0.254 netmask 255.255.255.0

Ici, l’interface loopback lo1 est créée et l’hôte réel y est associée par l’IP 172.16.0.254. Ensuite, les alias réseaux peuvent être ajoutés de cette façon :

# ifconfig lo1 alias 172.16.0.1 netmask 255.255.255.0

La première jail aura donc l’IP 172.16.0.1. Cette commande est évidemment à répéter pour chaque jail, en y affectant une autre IP. Une fois l’ensemble des alias créés, les jails pourront enfin être démarrées.

Pour recréer la configuration réseau au démarrage, il faut modifier rc.conf :

# network_interfaces="lo0 re0 lo1"
# ifconfig_lo1="inet 172.16.0.254 netmask 255.255.255.0 broadcast 172.16.0.255"
# ifconfig_lo1_alias0="inet 172.16.0.1 netmask 255.255.255.0 broadcast 172.16.0.255"

Puis, créer le fichier start_if.lo1 :

# echo '/sbin/ifconfig lo1 create' > /etc/start_if.lo1

Au niveau de votre parefeu, il faudra évidemment effectuer les redirections de port sur l’IP de la jail pour rendre le service accessible. Par exemple avec PF :

rdr pass on $ext_if proto tcp from any to port 80 -> 172.16.0.1 port 80

Eclipse : utiliser votre script Ant depuis l’IDE

Pour utiliser votre script Ant depuis l’interface d’Eclipse, vous pouvez ajouter un Ant Builder à votre projet afin de remplacer le builder par défaut Java Builder. Une fois votre build.xml écrit, il faut configurer le builder Ant afin de faire correspondre les cibles aux actions de l’interface graphique : Build Project, Clean, Build Automatically

Pour ce faire, éditez les propriétés de votre projet et sélectionner la rubrique Builders. Ajoutez un builder de type Ant Builder et choisissez un nom lié au projet en cours (afin de pouvoir travailler sur plusieurs projets par la suite).

  • La première étape de configuration consiste à sélectionner votre fichier build.xml et son répertoire de travail.

  • Le second onglet permet de configurer le rafraîchissement du projet et de la vue Project Explorer, suite aux nouveaux fichiers  générés durant le build.

  • Les différents évènements de l’interface sont configurés dans l’onglet Targets :
    • After clean correspond au premier évènement de build lancé suite à un nettoyage par Build / Clean… La cible normale de compilation convient à cet usage.
    • Manual Build est levé par Build / Build Project. Si aucun évènement ne s’est produit suite au nettoyage, ce ne sera pas cet évènement qui sera levé mais After clean.
    • Auto-build correspond à l’évènement lancé par l’IDE lorsqu’une modification est détectée dans les sources (ou comment ruiner son disque dur rapidement). Vous pouvez le désactiver en ne spécifiant aucune cible ou le faire par l’interface en décochant Build / Build Automatically.
    • Clean correspond à la cible exécutée par Build / Clean…

Vous pouvez spécifier plusieurs cibles par évènement. Elles seront toutes exécutées par  ordre. Si  vos cibles ont des dépendances, elles seront également exécutées. Dans un tel cas, seule la dernière cible de la chaîne est nécessaire. Si aucune cible n’est sélectionnée, l’interface d’Eclipse ne répondra pas.

  • Dernier point, il faut désactiver le builder d’Eclipse Java Builder et confirmer l’avertissement.

Si vous souhaitez avoir un accès rapide à vos cibles secondaires, vous pouvez faire appel à la vue Ant et y ajouter vos scripts.

PHP : gestion FastCGI avec PHP-FPM

Le port de PHP 5.3.3 est disponible ! Au programme de cette nouvelle version, l’intégration de PHP-FPM, un gestionnaire de processus PHP/FastCGI.

PHP-FPM permet de gérer plusieurs pools de processus, chacun possédant ses propres règles : gestion statique/dynamique (pour s’adapter à la charge du serveur), limites mini/maxi de processus actifs/en attente, type d’écoute par socket Unix ou TCP/IP (pour déporter l’exécution sur un serveur distinct), nombre maxi de requêtes par processus avant extinction. Le redémarrage complet du pool est également supporté en cas de crash suite à une fuite mémoire. Le recours à un outil équivalent mais limité en option, tel que spawn-fcgi n’est donc plus nécessaire (référez-vous à mes articles à son sujet : ici et ici). J’oubliais l’utilisation d’un cache de code PHP tel que APC ou Xcache est possible vu que les processus php-fpm ne sont pas détruits après chaque requête.

Je vous fais part des étapes nécessaires à sa mise en place, effectuées ici sous FreeBSD 8.1 & Nginx.

  • Configuration de PHP

Il faut s’assurer d’activer le flag de compilation de PHP-FPM :

# cd /usr/ports/lang/php5
# make config
# make install

On oublie pas l’extension de sécurité suhosin et le cache APC :

# cd /usr/ports/security/php-suhosin
# make install
# cd /usr/ports/www/pecl-APC
# make install

Une petite vérification de routine :

# php -v
PHP 5.3.3 with Suhosin-Patch (cli) (built: Aug  9 2010 21:34:21)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
 with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH
  • Configuration de PHP-FPM

Le module dispose de son propre fichier de configuration /usr/local/etc/php-fpm.conf :

[global]
pid = /var/run/php-fpm.pid
;error_log = /var/log/php-fpm.log
[www]
# socket
listen = /tmp/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0666
# user ID/GID
user = www
group = www
# pool
pm = dynamic
pm.max_children = 20
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 8

Est configuré un pool de processus dynamique avec un maximum de 20 processus PHP, avec écoute par socket UNIX, le tout limité au compte utilisateur du serveur web www. Le démon peut à présent être lancé :

# echo "php_fpm_enable="YES" >> /etc/rc.conf
# /usr/local/etc/rc.d/php-fpm start
Starting php_fpm.

Le pool PHP devrait être en exécution :

# su -m www
www# ps aux|grep php
www  68220  0.6  2.3 110152 48216  ??  SJ   11:56PM   0:00.95 /usr/local/sbin/php-fpm
www  68219  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68221  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68222  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68223  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68224  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68225  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68226  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68402  0.0  0.1  9092  1172   1  R+J  12:00AM   0:00.00 grep php
  • Configuration de Nginx

Le module FastCGI doit être configuré pour utiliser le pool. J’utilise pour ce faire un fragment de configuration que j’inclue dans chaque vhost où PHP est nécessaire :

# cd /usr/local/etc/nginx/
# more fragments/php.conf
fastcgi_pass   unix:/tmp/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME    $request_filename;
include        fastcgi_params;

Le nom et le type de socket doit correspondre ici à ce qui a été déclaré dans la configuration de PHP-FPM.

# more vhosts/site_fr.conf
server {
 listen 172.16.0.5:80;
 server_name www.site.fr;
 root /usr/local/www/site.fr/www/html;
 index index.php;

 location ~ \.php$ {
  include fragments/php.conf;
 }
}

Nginx peut enfin être redémarré  :

# /usr/local/etc/rc.d/nginx restart
Performing sanity check on nginx configuration:
the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx/nginx.conf test is successful
Stopping nginx.
Waiting for PIDS: 89603.
Performing sanity check on nginx configuration:
the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.

L’exécution des scripts PHP est à présent assurée par le pool PHP-FPM.

OpenVPN : installation console sous Mac OS X (sans GUI)

OpenVPN est un logiciel client/serveur permettant d’interconnecter des réseaux privés distants (VPN) de manière sûre et sécurisée par le protocole SSL/TLS. Il est disponible pour la plupart des OS, pour peu que ceux-ci possèdent les drivers réseaux virtuels nécessaires : les drivers TUN/TAP.

Sous Mac OS X, le plus simple est d’utiliser le logiciel Tunnelblick qui est un package contenant OpenVPN, une interface graphique et les modules noyaux pour le réseau. Cela convient parfaitement pour une utilisation client, mais aucunement dans le cas d’une configuration serveur. Les scripts de création des certificats utilisateur ne sont d’ailleurs pas fournis. De plus, dans le cas d’une utilisation à distance par console SSH, l’interface graphique n’est pas disponible.

Ce billet vous détaille les étapes principales de l’installation console d’OpenVPN sous Mac OS X.

  • Installation des drivers réseaux :

Rendez-vous sur le site des drivers TUN/TAP pour Mac OS : http://tuntaposx.sourceforge.net/. Téléchargez et installez le package. N’oubliez pas de redémarrer votre système pour que les modules noyaux soient chargés automatiquement. Pour le vérifier, lancez cette commande et contrôlez sa sortie :

$ kextstat

Si les drivers ne sont pas chargés, vous pouvez le faire manuellement :

$ sudo kextload /Library/Extensions/tun.kext
$ sudo kextload /Library/Extensions/tap.kext

Les périphériques réseaux doivent être présents dans /dev :

$ ls /dev/tun* /dev/tap*
/dev/tun0  /dev/tun1  /dev/tun10 /dev/tun11 /dev/tun12 /dev/tun13 /dev/tun14 /dev/tun15 /dev/tun2  /dev/tun3  /dev/tun4  /dev/tun5  /dev/tun6  /dev/tun7  /dev/tun8  /dev/tun9

Un de ces périphériques sera spécifié dans le fichier de configuration de votre connexion VPN.

  • Installation d’OpenVPN :

Je l’installe par le biais de MacPorts :

$ sudo port install openvpn2
--->  Computing dependencies for openvpn2
--->  Dependencies to be installed: lzo2
--->  Fetching lzo2
--->  Attempting to fetch lzo-2.03.tar.gz from http://www.oberhumer.com/opensource/lzo/download/
--->  Verifying checksum(s) for lzo2
--->  Extracting lzo2
--->  Configuring lzo2
--->  Building lzo2
--->  Staging lzo2 into destroot
--->  Installing lzo2 @2.03_2
--->  Activating lzo2 @2.03_2
--->  Cleaning lzo2
--->  Fetching openvpn2
--->  Attempting to fetch openvpn-2.1.1.tar.gz from http://lil.fr.distfiles.macports.org/openvpn2
--->  Verifying checksum(s) for openvpn2
--->  Extracting openvpn2
--->  Configuring openvpn2
--->  Building openvpn2
--->  Staging openvpn2 into destroot
--->  Installing openvpn2 @2.1.1_2
--->  Activating openvpn2 @2.1.1_2
--->  Cleaning openvpn2

Je vous renvoie à la documentation d’OpenVPN pour configurer votre connexion VPN. Pour ma part, j’ai créé le répertoire /opt/local/etc/openvpn2 pour y stocker les fichiers de configuration.

Pour lancer une connexion VPN, rien de plus simple :

$ cd /opt/local/etc/openvpn2
$ sudo openvpn2 --config vpn-sample.conf
Mon Aug  9 09:51:52 2010 OpenVPN 2.1.1 i386-apple-darwin10.4.0 [SSL] [LZO2] built on Aug  9 2010
Mon Aug  9 09:51:52 2010 NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
Enter Private Key Password:
Mon Aug  9 09:51:55 2010 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Mon Aug  9 09:51:55 2010 Control Channel Authentication: using 'interact.lu/ta.key' as a OpenVPN static key file
Mon Aug  9 09:51:55 2010 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Aug  9 09:51:55 2010 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Aug  9 09:51:55 2010 LZO compression initialized
Mon Aug  9 09:51:55 2010 Control Channel MTU parms [ L:1542 D:166 EF:66 EB:0 ET:0 EL:0 ]
Mon Aug  9 09:51:55 2010 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Mon Aug  9 09:51:55 2010 Local Options hash (VER=V4): '504e774e'
Mon Aug  9 09:51:55 2010 Expected Remote Options hash (VER=V4): '14168603'
Mon Aug  9 09:51:55 2010 Socket Buffers: R=[42080->65536] S=[9216->65536]
Mon Aug  9 09:51:55 2010 UDPv4 link local: [undef]
Mon Aug  9 09:51:55 2010 UDPv4 link remote: 80.80.80.80:1194
Mon Aug  9 09:51:55 2010 TLS: Initial packet from 80.80.80.80:1194, sid=750c51a1 be4999e0
Mon Aug  9 09:51:56 2010 VERIFY OK: depth=1, /C=FR/ST=FR/L=France/O=Sample/CN=Sample_CA/emailAddress=admin@sample.fr
Mon Aug  9 09:51:56 2010 VERIFY OK: nsCertType=SERVER
Mon Aug  9 09:51:56 2010 VERIFY OK: depth=0, /C=FR/ST=FR/L=France/O=Sample/CN=Sample_CA/emailAddress=admin@sample.fr
Mon Aug  9 09:51:57 2010 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Aug  9 09:51:57 2010 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Aug  9 09:51:57 2010 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Aug  9 09:51:57 2010 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Aug  9 09:51:57 2010 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Mon Aug  9 09:51:57 2010 [server] Peer Connection Initiated with 80.80.80.80:1194
Mon Aug  9 09:51:59 2010 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
Mon Aug  9 09:51:59 2010 PUSH: Received control message: 'PUSH_REPLY,route 192.168.201.0 255.255.255.0,ping 10,ping-restart 120,dhcp-option DNS 192.168.100.254,route 192.168.1.0 255.255.255.0,route 192.168.2.0 255.255.255.0,route 192.168.100.0 255.255.255.0,ifconfig 192.168.201.1 192.168.201.2'
Mon Aug  9 09:51:59 2010 OPTIONS IMPORT: timers and/or timeouts modified
Mon Aug  9 09:51:59 2010 OPTIONS IMPORT: --ifconfig/up options modified
Mon Aug  9 09:51:59 2010 OPTIONS IMPORT: route options modified
Mon Aug  9 09:51:59 2010 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Mon Aug  9 09:51:59 2010 ROUTE default_gateway=0.0.0.0
Mon Aug  9 09:51:59 2010 TUN/TAP device /dev/tun0 opened
Mon Aug  9 09:51:59 2010 /sbin/ifconfig tun0 delete
Mon Aug  9 09:51:59 2010 /sbin/ifconfig tun0 192.168.201.1 192.168.201.2 mtu 1500 netmask 255.255.255.255 up
Mon Aug  9 09:51:59 2010 /sbin/route add -net 192.168.201.0 192.168.201.2 255.255.255.0
add net 192.168.201.0: gateway 192.168.201.2
Mon Aug  9 09:51:59 2010 /sbin/route add -net 192.168.1.0 192.168.201.2 255.255.255.0
add net 192.168.1.0: gateway 192.168.201.2
Mon Aug  9 09:51:59 2010 /sbin/route add -net 192.168.2.0 192.168.201.2 255.255.255.0
add net 192.168.2.0: gateway 192.168.201.2
Mon Aug  9 09:51:59 2010 /sbin/route add -net 192.168.100.0 192.168.201.2 255.255.255.0
add net 192.168.100.0: gateway 192.168.201.2
Mon Aug  9 09:51:59 2010 Initialization Sequence Completed

Si vous obtenez à la place l’erreur suivante :

Mon Aug  9 09:49:02 2010 Cannot allocate TUN/TAP dev dynamically
Mon Aug  9 09:49:02 2010 Exiting

Cela signifie que les modules noyaux ne sont pas chargés. Reportez-vous à l’étape précédente pour y remédier.

Si vous devez utiliser un serveur DNS différent de votre connexion Internet, créez une nouvelle configuration réseau  dans Préférences Systèmes / Réseau et utilisez les commandes suivantes pour la changer :

$ networksetup -listlocations
Automatic
Sample VPN
$ sudo networksetup -switchtolocation 'Sample VPN'
found it!
$ sudo networksetup -getcurrentlocation
Sample VPN

Au revoir Tunnelblick !

Fichier de configuration client : [Téléchargement introuvable]

BackupPC : sauvegarder le serveur localhost

Si vous souhaitez sauvegarder les données locales de votre serveur BackupPC (localhost), il faut effectuer une configuration spécifique afin d’éviter le chiffrement inutile par SSH. Je vous fais part des paramètres que j’ai spécifié sur mon serveur BackupPC (qui est également mon poste de travail) :

$Conf{ClientNameAlias} = '127.0.0.1';
$Conf{XferMethod} = 'rsync';
$Conf{RsyncClientCmd} = '$rsyncPath $argList+';
$Conf{RsyncClientRestoreCmd} = '$rsyncPath $argList+';
$Conf{RsyncShareName} = [
  '/Users/bhuisgen/'
];

Les temps de sauvegarde/restauration devraient d’ailleurs être améliorés.

Haut de page