chroot et SSH
Par trashy le jeudi 29 octobre 2009, 18:52 - PenguinLand - Lien permanent
Il arrive parfois que l'on souhaite avoir recours aux fonctionnalités du chroot sur un système...
Ce terme barbare désigne une façon de faire bien connue sous FTP ; qui consiste à modifier la racine du système pour que l'utilisateur soit restreint à son chroot.
Pour ceux d'entre vous qui utilisent mock, c'est d'ailleurs comme cela qu'il procède pour construire vos paquets : il installe un système Fedora en chroot sur votre disque. Le système installé devient totalement indépendant, et il est possible de l'utiliser pour lancer des commandes sans affecter le moins du monde votre système principal.
En SFTP, ce système n'existait pas avant la version 4.8 de OpenSSH.
Bon, voyons un exemple... Je souhaite créer un utilisateur 'pitivier', et lui donner un accès SFTP sur mon serveur. Accessoirement, je souhaite qu'il ne puisse se connecter qu'en SFTP, et pas accéder à un shell via une connexion SSH standard...
Je vais donc ajouter mon utilisateur ; son dossier personnel sera créé dans /home/pitivier. Déjà, il pourra se connecter en shell, mais là n'est pas le véritable problème ; car en se connectant en SFTP, l'utilisateur 'pitivier' pourra aussi accéder à d'autres fichiers et dossiers, un peu partout sur le système (en fonction des droits de ces derniers, bien évidemment).
En bref, l'utilisateur pourra lister tout ce qui se trouve sous /, /home/, /etc... Mais aussi consulter certains des fichiers (dans /etc par exemple), que 'pitivier' n'est pas censé voir, ou qui ne lui apportent strictement rien 
L'utilisation d'un système de chroot permet de re-définir la racine du système : si l'on chroot 'pitivier' dans son dossier utilisateur, ce dernier deviendra la racine pour 'pitivier' ! Prenons un exemple :
/home/pitivier/Documents
deviendra, une fois chrooté :
/Documents
Super, comment on fait ? On y arrive...
Configuration de sshd et préparation du système
Déjà, on utilisera Fedora, et pas sa petite soeur vieille fille...
En effet, sous CentOS5, l'actuelle version de OpenSSH est la 4.3 ; dans laquelle le système de chroot n'a pas encore été implémenté. Re-compilation ou google-age de RPM existants, à votre guise.
Fedora 11, pour sa part, embarque la version 5.2 de OpenSSH, et ne nous posera pas le moindre souci.
Créons dans un premier temps le dossier où tout sera chrooté (on y reviendra par la suite, ne vous inquiétez pas) :
# mkdir --parents /chroot/home
Il est possible de chrooter un ou plusieurs utilisateurs. Nous nous intéresserons ici au second cas de figure, et créerons un groupe dédié aux utilisateurs qui seront chrootés. Nommons-le 'sftponly' :
# groupadd sftponly
Configurons à présent le démon SSH. Éditez le fichier /etc/ssh/sshd_config, et modifiez comme suit :
#Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp
Nous allons maintenant configurer les options de connexion pour le groupe adéquat :
Match group sftponly
ChrootDirectory /chroot/home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Quelques explications :
ChrootDirectory: définit la racine de notre chroot. Ici, nous utiliserons /chroot/home/{nom_de_l_utilisateur}ForceCommand: force la commande sftp ici, ce qui interdit à l'utilisateur la "simple" connexion via SSH
Pour le reste des options disponibles, je vous laisse consulter à loisir la documentation de sshd_config.
À noter : le répertoire dans lequel le chroot sera effectif doit appartenir à l'utilisateur root. Dans le cas présent, pour l'utilisateur pitivier, /chroot/home/pitivier devra appartenir à root :
# chown root.root /chroot/home/pitivier
Dans le cas contraire, le log (/var/log/secure) ronchonnerait, vous informant que les droits ne seraient pas corrects.
Bien entendu, une fois le service sshd configuré, pensez à le relancer :
# service sshd restart
Ajout d'un utilisateur
Bon, désormais, le système est configuré, ajoutons notre utilisateur (avec le groupe adéquat, sinon ça ne sert pas à grand chose :-p) :
useradd pitivier -g sftponly
Par défaut sous Fedora, la précédente commande va créer le dossier /home/pitivier. Il va nous falloir le recopier au bon endroit, cet emplacement ne sera pas utilisé (beh non, puisque l'utilisateur sera chrooté ;-)) :
# mv /home/pitivier /chroot/home/ # chown root.root /chroot/home/pitivier
Note : si l'envie vous prenait de modifier le répertoire home de l'utilisateur, comme par exemple de la façon suivante :
# usermod --home /mon/repertoire/utilisateur/cool/pitivier
Il faudrait alors créer le répertoire /chroot/mon/repertoire/utilisateur/cool/pitivier
Conclusion
Désormais, l'utilisateur 'pitivier' ne peut plus se connecter qu'en SFTP, pas en SSH. De plus, il sera confiné à son répertoire personnel.
Un souci cependant avec cette technique : 'pitivier' n'a pas les droits d'écriture dans /chroot/home/pitivier... J'ai peut-être (voire même sûrement) loupé quelque chose, mais dans le cas pratique particulier qui m'a intéressé ce jour (et dont je vous fait « profiter »), c'était bien suffisant :-p
Commentaires
En fait, ChrootDirectory /chroot/home/%u dit que ssh sera chrooté dans /chroot/home/%u, qui doit appartenir uniquement à root (et pas accessible en écriture aux autres). Donc l'utilisateur n'y a pas accès en écriture.
Pour que l'utilisateur puisse avoir accès en écriture, le plus simple est sans doute d'utiliser :
ChrootDirectory /chroot/pitivier, qui lui doivent avoir les droits : root root drwxr-xr-x
Puis de créer le répertoire : /chroot/pitivier/home/ avec les droits root root drwxr-xr-x
Enfin le répertoire /chroot/pitivier/home/pitivier avec les droits pitivier sftponly drwxr-xr-x
A ce moment, l'utilisateur verra /home/pitivier, et rien d'autre (/ ne contiendra que home).
Et il aura accès à son compte en écriture.
En, si mes souvenirs sont bon !
Salut,
Perso je ne cré pas de répertoire /chroot/ , je root direct dans /home/%username%/
J'ai le même problème que toi pour les droits d'écriture, ce qui est cool, c'est que c'est rapide à faire, que ca permet aussi de partager des répertoire en utilisant bind et les ACLS (j'avais fait un poste la dessus : http://shnoulle.net/Chroot-sftp-sol...)).
Je pense qu'il est possible de faire un usermod -d /home/utilisateur utilisateur à la suite du commentaire de ld.
A+
Ce sujet a très souvent été traite sur le net... Proposer un Shell chroote me semblerait beaucoup plus intéressant !
MySecureShell fait pas ça tout seul ?
http://mysecureshell.sourceforge.ne...
@Id : effectivement, je n'avais pas pensé à ce genre de solution, merci
@Shnoulle : oui, j'avais primairement pensé le faire dans /home le chroot... Et j'ai finalement préféré séparer les utilisateurs chrootés des utilisateurs "normaux".
@PA : mon principal intérêt était justement de ne pas fournir d'accès shell à cet utilisateur ; chrooté ou pas ; éviter d'avoir à utiliser un serveur FTP en somme... Je me collerai certainement à faire un chroot "système" (si je puis m'exprimer ainsi), mais je n'en ai pas l'usage pour le moment.
@Pascal : beh ; openssh le fait... Je n'ai pas cherché à utiliser un autre logiciel en plus. En revanche, ça peut être intéressant si on ne peut/veut pas mettre à jour la version d'OpenSSH sur certaines machines