Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
freebsd:un_vrai_chroot [2006/10/19 11:15]
robert
freebsd:un_vrai_chroot [2010/01/12 13:29] (current)
Line 1: Line 1:
 +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:
 +
 +    * on y met les exécutables nécessaires pour avoir un serveur sftp, un sh, et celui de rssh
 +    * on y met les libs nécessaires
 +    * on y met une base d'​authentification
 +    * on exécute des choses telles que chown -R et chmod -R dont les options sont judicieusement choisies
 +    * on met en place un nullfs pour mount les fichiers de rssh dans un autre répertoire.
 +
 +nous allons préparer le terrain, là, je suppose que /​home/​chrootbase est la racine du jail
 +
 +<​code>​
 +# 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
 +</​code>​
 +les fichiers sont donc dans /​home/​chrootbase/​home/​sale. on doit ensuite copier les fichiers. d'​abord,​ une prise d'info
 +<​code>​
 +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
 +</​code>​
 +on a une bonne idée des fichiers à copier, maintenant, il faut le faire
 +<​code>​
 +# 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
 +</​code>​
 +
 +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: ​
 +<​code>​
 +sale:​$1$blabla.:​1006:​1007:​unicode:​0:​0:​sal sale:/​home/​chrootbase/​home/​sale:/​usr/​local/​bin/​rssh
 +</​code>​
 +
 +n'​oubliez pas d'​utiliser la force avec vous: vipw. 
 +
 +<​code>​
 +# 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
 +</​code>​
 +vérifiez bien que les bases sont crées.
 +
 +ajouter un groupe : rsshusers dans /etc/group, et mettez tous les chroot users dedans
 +
 +<​code>​
 +# chown -R root:​rsshusers /​home/​chrootbase/​home
 +# chown -R crmstatic:​rsshusers /​home/​chrootbase/​home/​sale
 +</​code>​
 +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 ​
 +
 +<​code>​
 +logfacility = LOG_USER
 +allowscp
 +allowsftp
 +umask = 022
 +chrootpath = "/​home/​chrootbase"​
 +</​code>​
 +
 +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.
 +<​code>​
 +#​user=sale:​011:​00011:"/​home/​chrootbase"​
 +</​code>​
 +signifie que sale peut faire du scp et sftp(listing des fichiers possible), son / de chroot est /​home/​chrootbase.
 +
 +<​code>​
 +#mount /​home/​chrootbase/​home/​sale
 +</​code>​
 +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
 +<​code>​
 +diplômé de HEC à la centrale, je sais faire du sftp sous xp
 +</​code>​
 +sur son cv grâve à vous...
freebsd/un_vrai_chroot.txt · Last modified: 2010/01/12 13:29 (external edit)