Serveur FTP Sécurisé dans une cage

Afin d'éviter la saturation du système hôte, on va
allouer une cage d'environ 700Mo.
Plutôt que de travailler avec une partition dédiée,
on va utiliser un fichier...
su
-
cd /home/
dd if=/dev/zero of=jail.img bs=1M count=700
losetup -f && losetup -f jail.img
mkfs.ext2 /dev/loopX # X est renvoyé par la
commande précédente
mkdir jail/
mount /dev/loopX jail/
echo '/home/jail.img /home/jail/ ext2
loop 0 0' >> /etc/fstab
Maintenant le script jailer qui lancera le chroot...
Chroot devant être lancé en tant que root, la commande
sudo sera utilisée.
Le fichier /etc/sudoers sera adapté en conséquence.
Pour être un interpréteur valide, le script doit
être ajouté à la liste /etc/shells.
echo
'#!/bin/bash' > jailer
echo
'sudo chroot /home/jail su -
Bill' >> jailer
chmod +x jailer
echo '/home/jailer' >> /etc/shells
echo 'Bill ALL=NOPASSWD:/usr/sbin/chroot'
>> /etc/sudoers
Maintenant on s'occupe de l'utilisateur Bill qui utilisera ce serveur...
Son interpréteur doit être /home/jailer.
useradd
-d /home/jail/ -s /home/jailer Bill
passwd Bill
Ensuite, on aménage la cage...
Dans la cage, se trouveront:
- le dossier bin qui contiendra le minimum vital: sftp-server, su et
false;
- le dossier etc qui identifiera root et Bill;
- le dossier lib qui sera peuplé par les librairies
nécessaires au fonctionnement des binaires;
- le dossier target qui accueuillera les transferts ftp.
mkdir
-m 771 jail/{bin/,etc/,lib/}
mkdir -m 777 jail/target/
grep root /etc/passwd > jail/etc/passwd
grep Bill /etc/passwd >> jail/etc/passwd
grep root /etc/group > jail/etc/group
sed -i 's:home/jailer:bin/sftp-server:g'
jail/etc/passwd
sed -i 's:home/jail:target:g'
jail/etc/passwd
sed -i 's:bash:false:g'
jail/etc/passwd
whereis false
cp /xxx/false
jail/bin/ # /xxx/ est le
chemin renvoyé par la commande précédente
whereis sftp-server
cp /xxx/sftp-server
jail/bin/ # /xxx/ est le
chemin renvoyé par la commande précédente
Le fichier jail/etc/passwd devrait contenir deux lignes (root:x:0:0:root:/root:/bin/false
Bill:x:1004:100::/target:/bin/sftp-server) et jail/etc/group une
(root:x:0:).
La commande ldd est utilisée pour déterminer les
librairies utilisées par les binaires...
Le petit bout de code Bash ci-dessous devrait faire l'affaire.
Une fois exécuté, vérifier que le dossier jail/lib
contient les librairies listées* par la commande ldd.
Dans le cas contraire, les copier manuellement.
* linux-gate.so.1 est une
librairie virtuelle (virtual DSO): le fichier n'existe donc pas.
oldIFS=$IFS;
IFS=$'\n'
ldd jail/bin/sftp-server
for library in ` ldd jail/bin/sftp-server
| cut -f 2 | cut -d '=' -f 1
| cut -d ' ' -f 1 `
do
cp $library /lib/$library
/usr/lib/$library jail/lib/ &>
/dev/null
done
IFS=$oldIFS; oldIFS=
Au tour maintenant de la commande switch-user su...
Contrairement à sftp-server et false qui ont été
simplement copiés, su doit être compilé pour eviter
l'utilisation de pam.
Télécharger les sources de coreutils correspondant
à celui installé sur le système hôte.
Compiler les puis copier le binaire su.
tar
xvfz coreutils_x.y.z.tgz
# x.y.z dépendent des sources que
vous aurez récupéré
cd coreutils_x.y.z
./configure
make
cd -
cp coreutils_x.y.z/src/su
jail/bin/
Maintenant que su est copié, même opération que
précédement avec la commande ldd...
oldIFS=$IFS;
IFS=$'\n'
ldd jail/bin/su
for library in ` ldd jail/bin/su
| cut -f 2 | cut -d '=' -f 1
| cut -d ' ' -f 1 `
do
cp $library /lib/$library
/usr/lib/$library jail/lib/ &>
/dev/null
done
IFS=$oldIFS; oldIFS=
Copier également les deux librairies /lib/libnss_files.so.2 et
/lib/libnss_compat.so.2 dans la cage...
cp
/lib/libnss_files.so.2 /lib/libnss_compat.so.2 jail/lib/
Il ne reste plus qu'à essayer...
A l'aide de WinScp sous Window$, Nautilus sous
Linux, Fugu
sous Mac ou autre, connecter le serveur en tant que Bill (sftp://Bill@server).
Une approche "groupe d'utilisateurs" pourra être
privilégiée.
Pascal dot Parent at free dot fr