Vos gentils technical-commercieux du consultanat veulent uploader des fichiers sur vos beaux Freebsd 6.1 ou 6.2, flambant en neuf?

Ne vous suicidez pas, j'ai le remède.

d'abord, il faut calmer les ardeurs des XPiens avec FTP, et leur montrer la puissance du coté obscure: le sftp ou le scp ( luc, écoutes ton père ! ).

en suite, un traditionnel make install clean dans /usr/ports/shells/rssh

et c'est parti:

le concept de chroot par rssh est assez strict. contrairement à scponly, lorsqu'on fait cd /, on tombe sur la / de chroot, et non celui du système. tout comme certains serveurs ftp, on peut faire en sorte de pouvoir y déposer des fichiers, sans pouvoir les récupérer, voire lister. Seule la lecture des fichiers par le système est possible. comme le jail, chroot de rssh a son propre environnement réduit à l'extrême. le principe est le suivant:

nous allons préparer le terrain, là, je suppose que /home/chrootbase est la racine du jail

# mkdir -p /home/chrootbase/dev
# echo "devfs_set_rulesets="/home/chrootbase/dev=devfsrules_jail" >> /etc/rc.conf
# ajouter none   /home/chrootbase/dev   devfs   rw   0   0 et 
# /home/chrootbase/home/sale /var/www        nullfs  rw      0 0 dans /etc/fstab
# mount_devfs devfs /home/chrootbase/dev
# /etc/rc.d/devfs restart

les fichiers sont donc dans /home/chrootbase/home/sale. on doit ensuite copier les fichiers. d'abord, une prise d'info

ldd `which sftp`
/usr/bin/sftp:
        libssh.so.3 => /usr/lib/libssh.so.3
        libcrypt.so.3 => /lib/libcrypt.so.3
        libcrypto.so.4 => /lib/libcrypto.so.4
        libz.so.3 => /lib/libz.so.3
        libedit.so.5 => /lib/libedit.so.5
        libc.so.6 => /lib/libc.so.6
        libgssapi.so.8 => /usr/lib/libgssapi.so.8
        libkrb5.so.8 => /usr/lib/libkrb5.so.8
        libasn1.so.8 => /usr/lib/libasn1.so.8
        libcom_err.so.3 => /usr/lib/libcom_err.so.3
        libmd.so.3 => /lib/libmd.so.3
        libroken.so.8 => /usr/lib/libroken.so.8
        libncurses.so.6 => /lib/libncurses.so.6
ldd `which sh`
/bin/sh:
        libedit.so.5 => /lib/libedit.so.5
        libncurses.so.6 => /lib/libncurses.so.6
        libc.so.6 => /lib/libc.so.6

on a une bonne idée des fichiers à copier, maintenant, il faut le faire

# mkdir -p /home/chrootbase/usr/local/libexec
# scp -p /usr/local/libexec/rssh_chroot_helper /home/chrootbase/usr/local/libexec
# mkdir -p /home/chrootbase/bin
# cp /bin/sh /home/chrootbase/bin/
# mkdir /home/chrootbase/lib
# cp /lib/libedit.so.5 /home/chrootbase/lib/
# cp /lib/libncurses.so.6 /home/chrootbase/lib/
# cp /lib/libc.so.6 /home/chrootbase/lib/
# mkdir /home/chrootbase/libexec
# cp /libexec/ld-elf.so.1 /home/chrootbase/libexec/
# mkdir -p /home/chrootbase/home/sale (notre user chroot est sale)
# mkdir -p /home/chrootbase/usr/libexec
# cp /usr/libexec/sftp-server /home/chrootbase/usr/libexec/
# mkdir -p /home/chrootbase/usr/lib
# cp /usr/lib/libssh.so.3 /home/chrootbase/usr/lib
# cp /lib/libcrypt.so.3 /home/chrootbase/lib
# cp /lib/libcrypto.so.4 /home/chrootbase/lib
# cp /lib/libz.so.3 /home/chrootbase/lib
# cp /lib/libc.so.6 /home/chrootbase/lib
# cp /usr/lib/libgssapi.so.8 /home/chrootbase/usr/lib
# cp /usr/lib/libkrb5.so.8 /home/chrootbase/usr/lib
# cp /usr/lib/libasn1.so.8 /home/chrootbase/usr/lib
# cp /usr/lib/libcom_err.so.3 /home/chrootbase/usr/lib
# cp /lib/libmd.so.3 /home/chrootbase/lib
# cp /usr/lib/libroken.so.8 /home/chrootbase/usr/lib
# mkdir /home/chrootbase/etc
# cp /etc/master.passwd /home/chrootbase/etc

les fichiers nécessaires sont copiés, il faut compiler la base d'authentification de freebsd dans le chroot. cette étape n'est pas décrite dans toutes les docs du net. si on ne le fait pas…ben, ca marche pas. Attention, si on se trompe de master.passwd avec cette commande, on explose la base d'authentification, et ne peut plus du tout se loger ! il vaut mieux backup le master.passwd de /etc dans un coin, ouvrir 2 ou 3 session root à coté, avoir un esclave technicien sous la main pour aller rajouter les lignes dans /etc/master.passwd.

Il faut d'abord que les users de chroot existent dans le système, ayant pour home, le chemin absolu de leur chroot respectif, et le shell, le chemin absolu de rssh, ce qui donne ca dans /etc/master.passwd:

sale:$1$blabla.:1006:1007:unicode:0:0:sal sale:/home/chrootbase/home/sale:/usr/local/bin/rssh

n'oubliez pas d'utiliser la force avec vous: vipw.

# cp /etc/master.passwd /home/chrootbase/etc
# vipw -d /home/chrootbase/etc
# virez tout le monde du fichier, et laissez que les users du chroot. mettez bien le home des user avec le chemin absolu du système
# 
sale:$1$blabla.:1006:1007:unicode:0:0:sal sale:/home/chrootbase/home/sale:/usr/local/bin/rssh
# ls /home/chrootbase/etc

vérifiez bien que les bases sont crées.

ajouter un groupe : rsshusers dans /etc/group, et mettez tous les chroot users dedans

# chown -R root:rsshusers /home/chrootbase/home
# chown -R crmstatic:rsshusers /home/chrootbase/home/sale

vous pouvez aussi vous amusez avec les flags…

abusez de ls -al partout, pour bien vérifier les mask et owner des fichiers critiques. adapter les mask si besoin. et enfin, on configure /usr/local/etc/rssh.conf: voici les lignes utiles

logfacility = LOG_USER
allowscp
allowsftp
umask = 022
chrootpath = "/home/chrootbase"

on peut aussi commenter les allow dans la section globales, et autoriser, sftp ou scp par user de façon très très précise.

#user=sale:011:00011:"/home/chrootbase"

signifie que sale peut faire du scp et sftp(listing des fichiers possible), son / de chroot est /home/chrootbase.

#mount /home/chrootbase/home/sale

et wouala !

c'est adapté à un simple dépot de fichiers. on ne peut même pas faire un ping. en effet, contrairement à un jail où on met les daemons, il n'y pas de world, aucune possibilité d'ouvrir un socket ou lancer un commande système. Un vrai chroot quoi. bon maintenant, le pays du consultanat mettra

diplômé de HEC à la centrale, je sais faire du sftp sous xp

sur son cv grâve à vous…

freebsd/un_vrai_chroot.txt · Last modified: 2010/01/12 13:29 (external edit)