Blog de Thomas Martin

Gérer plusieurs instances de MySQL
19th June 2009

Voici un résumé de la mise en oeuvre de multiples instances MySQL sur un
serveur Debian, à l'aide de l'outil mysqld_multi. Cette solution permet par
exemple d'offrir un accès complet à MySQL dans le cadre d'un hébergement
mutualisé (l'utilisateur peut alors créer ses propres bases, gèrer ses
utilisateurs, etc). Cela peut être aussi utilisé pour cloisonner totalement les
bases de données de différentes applications, et ainsi d'ajuster finement des
paramètres tels que max_connections pour chacune d'elles.

Voici les étapes :

[mysqldN]
user = mysql-<instance>
port = 3307
socket = /var/run/mysqld-<instance>/mysqld.sock
pid-file = /var/run/mysqld-<instance>/mysqld.pid
datadir = /var/lib/mysql/<instance>

Si vous utilisez les options --log, --log-bin ou --log-error, il est
nécessaire de les redéfinir dans chaque configuration d'instances (voir
Running Multiple MySQL Servers on the Same Machine).

Note : pour faire tourner l'instance avec un utilisateur différent (comme dans
cette exemple) il est à priori nécessaire de commenter le paramètre user = mysql dans
la section [mysqld] du my.cnf, sinon mysqld_multi retourne une erreur :

Ignoring user change to 'mysql-<instance>' because the user was set to 'mysql'
earlier on the command line

Décommenter ce paramètre ne gène pas le lancement de l'instance initiale.

useradd -r mysql-<instance>

mysql_install_db --datadir=/var/lib/mysql/<instance>
chown -R mysql-<instance> /var/lib/mysql/<instance>
mkdir /var/run/mysqld-<instance>
chown mysql-<instance> /var/run/mysqld-<instance>

A noter que je place le datadir dans /var/lib/mysql/<instance>, j'ai donc
préalablement déplacé ailleurs les données de l'instance initiale. Libre à vous
de placer le datadir où bon vous semble.

mysqld_multi --verbose --no-log start N

Où N fait référence au numéro de l'instance.

Il est maintenant possible de s'y connecter en utilisant le numéro de port
TCP/IP spécifié plus haut, puis de modifier le mot de passe root :

mysql -h 127.0.0.1 --port=3307 -u root

Tags: evolix, mysql, sysadmin.
Mise en place de DSPAM comme agent de livraison pour Postfix
13st June 2009

DSPAM est un logiciel anti-spam pouvant aisément être utilisé comme agent
de livraison Postfix. Cela évite d'utiliser certains hacks, comme la
réinjection SMTP. Dans ce mode, DSPAM agit comme un relais qui accepte un mail
sur son entrée standard, le traite en fonction de votre configuration (ajout
d'en-têtes, préfixage de [SPAM] au sujet, etc), et le délivre à un agent de
livraison final (directive TrustedDeliveryAgent dans dspam.conf).

Pour cela il suffit d'ajouter une ligne de ce type à votre master.cf :


dspam unix - n n - 1 pipe flags=DORqhu user=dspam:mail argv=/usr/local/bin/dspam-wrapper --user ${recipient} --deliver=innocent,spam

Et de positionner ensuite une directive virtual_transport = dspam, dans le
cas de l'utilisation de comptes virtuels. Il est aussi possible de l'activer
seulement pour certains utilisateurs à l'aide de la table transport(5).

Toutefois, pour que cela reste fiable, il est nécessaire que DSPAM retourne un
code d'erreur 75 (tempfail) en cas de soucis, afin que Postfix conserve
celui-ci en file d'attente. Sur ce point, la version courante de DSPAM (3.8.0)
souffre d'un bug génant : si l'agent de livraison final retourne un code
d'erreur, DSPAM ne retournera pas ce même code (contrairement à ce qui est
indiqué dans la section EXIT VALUE de la page de man), mais 255. Ce qui
entraîne une perte pure et simple du mail !

En attendant, pour contourner ce problème, il est possible de mettre en place
un wrapper qui retournera le code 75 dans toutes les situations d'erreur.

Exemple d'un fichier dspam-wrapper :


#!/bin/sh
cat | /usr/local/bin/dspam $* || return 75

Tags: dspam, oopss, postfix, sysadmin.
Importer un mot de passe MD5 dans un champ userPassword d'OpenLDAP
6 November 2008 20:45

J'ai eu récemment l'occasion de migrer des comptes stockés dans une base de
données PostgreSQL vers OpenLDAP. Les mots de passe étaient stockés sous forme
de hash MD5 au format hexadécimal. f71dbe52628a3f83a77ab494817525c6 par
exemple.

Ma première approche a été d'importer directement cette valeur dans le champ
userPassword en les préfixant de {MD5}. En effet OpenLDAP gère de
manière transparente de nombreux formats de mot de passe.

Malheureusement ceci ne marche pas. Les MD5 doivent être stockés sous forme
hexadécimal dans OpenLDAP. Voici le bout de code Perl permettant la conversion,
que j'ai mis un certain temps à écrire :


use MIME::Base64;
my $md5_hexa = "f71dbe52628a3f83a77ab494817525c6";
my $md5_base64 = "{MD5}".encode_base64(pack("H*", $md5_hexa), "");

Tags: evolix, ldap, oopss.
Abook et Nokia N95
12 October 2008 21:00

Depuis plusieurs mois je voulais importer dans mon Nokia N95 mes contacts
stockés dans le logiciel Abook (compagnon idéal de Mutt).
C'est aujourd'hui chose faite à l'aide de la solution de Grégory Colpart.

En résumé :


abook --convert --infile ~/.abook/addressbook --outformat gcrd

Et voila, tous vos contacts sont importés, et la plupart des champs de Abook
(adresse postale, site web, etc) sont normalement pris en compte.

P.S. : Pour ceux qui utilisent encore la version fournie par leur opérateur du système
d'exploitation du N95 (comme moi jusqu'à aujourd'hui), je leur conseille vivement
(mais toutefois à leurs risques et périls) de consulter cette page
et d'utiliser la version 1.0.38.14 de Nemesis (les version précédentes n'ayant
pas fonctionné pour moi).

Tags: oopss, phone.
DHCPD et PF
8 October 2008 12:30

Le serveur dhcpd(8) d'OpenBSD dispose d'une fonctionnalitée permettant
d'alimenter des tables pf(4) lorsque certains évènements se produisent : bail
DHCP établi, adresse IP «abandonnée», changement d'adresse MAC.

Cela peut permettre par exemple de bloquer l'accès à un routeur à des machines
n'ayant pas obtenu leurs adresses IP par DHCP.

Lors d'une tentative de mettre ça en place il y a quelques mois je ne parvenais
pas du tout à le faire marcher : les tables n'étaient jamais remplies !
J'ai découvert il y a peu la réponse : cela ne fonctionne pas pour des machines
dont l'adresse IP est fixée à l'aide d'une directive fixed-address dans
dhcpd.conf. Et de plus le fichier dhcpd.leases n'est pas non plus alimenté
pour ces machines.

Tags: evolix, oopss, openbsd, security.
/etc/fstab, udev et UUID
11th Aug 2008 15:00

Le fichier /etc/fstab après une installation standard de Debian utilise
directement des noms de partitions sous la forme /dev/sda2 par exemple.

Or, la connexion d'un périphérique (clé USB, baie de disque, etc.), peut
potentiellement décaler votre disque principal en /dev/sdb, le périphérique
fraîchement connecté utilisant /dev/sda. Ceci rend alors votre système
impossible à démarrer correctement.

Une solution est alors d'utiliser le nommage UUID fourni par udev(7).
Chaque partition dispose dans /dev/disk/by-uuid d'un lien symbolique
pointant vers elle-même :


/dev/disk/by-uuid/1351bbd0-e931-47a0-b528-be33d135d35a -> ../../sda2

Udev fourni par défaut une notation raccourcie permettant de spécifier des
entrées dans /etc/fstab de la forme :


UUID=1351bbd0-e931-47a0-b528-be33d135d35a / ext3 ...

Toutefois si vous utilisez Debian Etch et l'option user du fichier fstab,
vous allez certainement rencontrer des problèmes au démontage de vos partitions
avec un utilisateur non privilégié (#466775).
La solution est alors d'utiliser le chemin complet :


/dev/disk/by-uuid/1351bbd0-e931-47a0-b528-be33d135d35a / ext3 ...

Ce qui après tout est plus UNIX.

Note : Si les périphériques swap n'apparaissent pas dans /dev/disk/by-uuid il
faut les reformater. Par exemple pour la partition swap /dev/sda7 :


swapoff /dev/sda7
mkswap /dev/sda7
blkid /dev/sda 7   # retourne l'UUID

Tags: debian, evolix.
Tips avec dhclient(8) sous OpenBSD
27 June 2008 10:30

La commande dhclient(8) dispose d'un fichier de configuration : dhclient.conf(5).

Celui-ci permet notamment de configurer la requête DHCP envoyée au serveur, par exemple la directive
send dhcp-requested-address 10.0.1.1 permet de demander cette adresse IP au serveur, qui nous
l'affectera si elle est disponible.

Autre possibilité intéressante, celle de spécifier un autre dhclient-script(8). Ce script est invoqué par dhclient
pour effectuer la configuration réseau de la machine après avoir interrogé le serveur DHCP. Il est alors
possible à des fins de débuggage de modifier la fonction add_new_address() afin d'afficher l'adresse IP qui
aurait été affecté, sans l'affecter rééllement.

Tags: evolix, openbsd.
Faille OpenSSL/Debian
13st May 2008 22:00

En réponse à la faille critique DSA-1571 parue aujourd'hui :

Voici un résumé rapide de certaines opérations urgentes à effectuer ( liste non exhaustive ).
Pour plus d'informations vous pouvez consulter la page dédiée sur wiki.debian.org.

Mettre à jour le système


aptitude update && aptitude upgrade

Regénerer la clé du serveur OpenSSH


ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
/etc/init.d/ssh restart

Regénerer vos propres clés

A faire sur un système à jour bien sur.

Supprimer les clés utilisateurs impactées

Un script fourni par Debian permet de les détecter : http://security.debian.org/project/extra/dowkd.
Attention l'auteur signale que celui-ci peut donner des faux positifs ou des faux négatifs.

Ensuite vous pouvez lancer par exemple :


for i in /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys; do perl ./dowkd.pl file $i; done

Regénerer vos certificats SSL

Pour votre serveur mail, web, VPN,...

Tags: debian, evolix, oopss, security, sysadmin.
Installation de la bibliothèque tomcat-native
5th May 2008 18:30

J'ai eu récemment à installer la bibliothèque tomcat-native à la demande d'un client d'Evolix.
N'étant pas expert Java/Tomcat je sais juste ce que la page officielle décrit : gain de performance,
une meilleure génération des ID de sessions et certaines fonctionnalités de monitoring.

De plus cela fait disparaitre le message suivant au démarrage de Tomcat :
catalina_2008-04-18.log:INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/lib/jvm/java-1.5.0...

Voici une copie brute de mes notes d'installation sur un système Debian Etch :


 $ cd $HOME/tmp
 $ sudo aptitude install libapr1-dev autoconf
 $ wget http://tomcat.heanet.ie/native/1.1.9/source/tomcat-native-1.1.9-src.tar.gz
 $ tar zxvf tomcat-native-1.1.9-src.tar.gz
 $ cd tomcat-native-1.1.9-src/jni/native/
 $ apt-get source libapr1
 $ sh buildconf --with-apr=./apr-1.2.7/
 $ ./configure --with-apr=/usr/bin/apr-config --with-ssl=/usr/include/openssl --with-java-home=/usr/lib/jvm/java-1.5.0-sun
 $ make
 $ sudo cp .libs/libtcnative-1.so.0.1.3 /usr/lib/jvm/java-1.5.0-sun-1.5.0.14/jre/lib/i386/libtcnative-1.so
 $ sudo /etc/init.d/tomcat5.5 restart

Note : l'installation d'une version <1.1.4 avec la version de Tomcat de Debian Etch provoque un message d'erreur.

Il ne me reste plus qu'à en faire un package afin de pouvoir installer ça proprement.

Tags: debian, evolix, sysadmin.
Quelques soucis avec portupgrade
3rd May 2008 23:00

J'ai rencontré quelques soucis ces jours-ci après des mises à jour de ports FreeBSD. J'ai utilisé comme à mon habitude la commande portupgrade -arRe.

Reste à trouver comment cela aurait pu être évité.

Tags: evolix, freebsd, oopss.

RSS feed

Created by Chronicle v3.5