Installer Mysql 4.1 (deb 3.1) en chroot

[size=200]TUTO: CHROOTER MYSQL[/size]

Mysql peut fonctionner dans un environnement chrooté, c’est-à-dire déporté dans une partie de l’arborescence. Comme Mysql fonctionne en tant qu’utilisateur, même en cas de faille de sécurité importante, le pirate ne peut pas accéder à la totalité du disque. Il reste cantonné à la nouvelle racine ainsi définie.

[size=150]Préparation[/size]

Assurez vous tout de même que mysql fonctionne normalement hors de la prison, avant de commencer. Dans un premier temps, il sera nécessaire de se munir d’un outils très pratique téléchargeable avec l’outil apt-get de la debian et arrêtez le service mysql:

# apt-get install makejail
# /etc/init.d/mysql stop

Ensuite cherchez et copiez l’ensemble des fichiers exemple « .py » fraîchement installé dans le répertoire /etc/makejail. Modifiez comme suit le fichier mysqld.py

chroot="/chroot/mysql"
testCommandsInsideJail=["safe_mysqld"]
sleepAfterStartCommand=5
processNames=["mysqld"]
testCommandsOutsideJail=["mysql --user=root --socket='/chroot/mysql/var/run/mysqld/mysqld.sock' --exec='show tables' mysql"]
preserve=["/var/lib/mysql",
                  "/var/log/mysql"]
users=["mysql"]
groups=["mysql"]
packages=["mysql-server-4.1", "mysql-common-4.1", "libmysqlclient12"]

Lancez deux fois d’affilé la commande suivante car la première foi elle stop a cause d’un ‘.’ Chemin non absolu… les tests finaux ne fonctionnent pas encore c’est normal, il manque bon nombre de chose.

# makejail /etc/makejail/mysqld.py

[size=150]Completer le travail de makejail[/size]

Si pas déjà fait, il faut rajouter les librairies de résolution de nom et autres dans la prison:

# cp /lib/libdl.so.2 /lib/libcrypt.so.1 /lib/libnsl.so.1 /lib/ld-linux.so.2 lib
# cp /lib/libpthread.so.0 /lib/libm.so.6 lib/
# cp /lib/libnss_compat.so.2 /lib/libnss_files.so.2 lib/
# cp /etc/localtime etc
# cp /etc/mysql/* /chroot/mysql/etc/mysql

Effectuez les opérations suivantes dans /chroot/mysql .

# cd /chroot/mysql
# mkdir -p var/run/mysqld etc tmp dev
# chmod 1777 tmp
# chmod 2750 var/log/mysql
# chown –R mysql:adm var/log/*
# chown –R mysql:mysql var/lib/mysql
# mknod dev/null c 1 3

Puis on y déplace les bases de données et on créer des liens sur les dossiers importants :frowning:attention n’écrasez pas les fichiers /etc/passwd et shadow originaux).

# Grep ‘mysql:‘ /etc/passwd > etc/passwd
# Grep ‘mysql:' /etc/shadow > etc/shadow
# Grep ‘mysql:‘ /etc/groups > etc/group
# mv  /var/lib/mysql /chroot/mysql/var/lib/
# ln -s /chroot/mysql/var/lib/mysql/ /var/lib/mysql
# mv /var/run/mysqld /chroot/mysql/var/run
# ln -s /chroot/mysql/var/run/mysqld/ /var/run/mysqld
# mv /var/log/mysql /chroot/mysql/var/log/
# ln –s /chroot/mysql/var/log/mysql /var/log/mysql
# cp –preserve=mode,ownership /var/log/mysql* chroot/mysql/var/log/

[size=150]Edition des fichiers de configuration[/size]

Sauvegardez les fichiers que vous allez modifier. Editons dès a présent le fichier /etc/init.d/mysql.

${DEBIAN_SCRIPT_DEBUG:+ set -v -x}
test -x /usr/sbin/mysqld || exit 0

SELF=$(cd $(dirname $0); pwd -P)/$(basename $0)
CONF=/etc/mysql/my.cnf
CHROOT=/chroot/mysql
MYADMIN="/usr/sbin/chroot $CHROOT /usr/bin/mysqladmin --defaults-file=/etc/mysq$

Et voila, il ne reste plus qu’à modifier le fichier /etc/my.cnf de la façon suivante (remplacez ou ajoutez les entrées , ne supprimez pas le reste):

[client]
port            = 3306
socket          = /chroot/mysql/var/run/mysqld/mysqld.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
skip-external-locking
safe_show_database

# * Security Features
chroot=/chroot/mysql

[size=150]Test[/size]

Normalement la prison est maintenant prête avec l’arborescence. Testez le lancement chrooté de mysqld dans la prison avec la commande suivante, et copiez les librairies manquantes si il y en a, dans le répertoire ‘/lib’ de la prison. evntuellement copiez les fichiers de conf modifié dans la prison. mais bon…

# /usr/sbin/chroot /chroot/mysql /usr/bin/mysqld_safe &

Ou encore

# /etc/init.d/mysql start

[size=150] Sécurité supplementaire [/size]
etant donné que en cas de piratage, le hackker est(devrait) être cantoné dasn l’arborescence, cela ne devrais pas l’empecher de causer des dommages dans cette meê arborescence. configurez cron pour quil fasse des sauvegrades complete du repertoire au moin une foi par jour, par le biais d’un script qui:
[ul]
-> test le bon fonctionnement de mysql par des requêtes de maintenance au choix.
-> dans le cas ou la requette echoue il ne sauvegardera pas cette version eroné (et pourrait retablir la version fonctionelle, mais mieux vaux le faire a la main car il se peut que le service soit encore actif ). on peut aussi mettre en place des sauvegardes journalière, recylé toute les semaines, ca laisse le temps de se retourner avant que les sauvegardes de la semaine passé soient réécrasés.

-> en cas de bon fonctionnement hop une sauvegarde.
[/ul]

[size=150]Problèmes rencontrés[/size]

Manque libXXXXXXX.so.6:
il manque donc, dans le repertoire lib/ de la prison, des librairies indispensable au fonctionnement de mysqld. Copiez les tout simplement.

Impossible de trouver le socket :
Si mysql démarre, mais que mysqladmin ne trouve pas le socket c’est par se qu’il le cherche en dehors de la prison et que le lien symbolique vers les répertoires déplacé ci avant, (ex : /chroot/mysql/var/run/mysqld) n’existe pas. Une autre possibilité consisterait en le montage de ses répertoires vitaux emprisoné dans les répertoires standard hors de la prison, fichiers pid et socket, base de données, logs. Mais c’est lourd, vu qu’un simple lien symbolique de répertoire suffit.

Par exemple ajouter dans le fichier init.d/mysql

#apres le start et avant le demarrage du service mysql :
mount –o bind [rep destination] [repertoire de montage]
….
#et après le stop, après l’arrêt du service :
umount [repertoire de montage]
….

!!!Attention!!!, comme la fait remarqué un admin du forum, le point de montage peut être a l’exterieur de la prison, mais le repertoire source ne doit en aucun cas être hors de la prison. vous pouvez ouvrir un passage de l’exterieur vers l’interieur, mais jammais de l’interieur de la prison vers l’exterieur. question de logique de sécurité

Impossible de trouver mysql-bin.X :
Vérifiez les droits d’accès au dossier dans la prison : var/log, voyez plus haut dans completer le travail de make jail.

Perte du mot de passe de l’administrateur
En cas de perte du mot de passe administrateur, relancer mysqld avec l’option --skip-grant-tables. Aucun mot de passe n’est alors nécessaire, et aucune vérification des droits n’est active. Il ne vous reste plus qu’à changer le mot de passe ou restaurer les paramètres défectueux.


mp en cas de desir de modifs sauf si admins le peuvent
-----------------------------------------------------------------[/list]

maj