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