The trashiest blog in the World...

Aller au contenu | Aller au menu | Aller à la recherche

chroot et SSH

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... :-D 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


Fatal error: Uncaught Error: [] operator not supported for strings in /var/www/svn_softs/dotclear_hg/inc/core/class.dc.postmedia.php:61 Stack trace: #0 /var/www/svn_softs/dotclear_hg/inc/core/class.dc.media.php(592): dcPostMedia->getPostMedia(Array) #1 /tmp/cbtpl/cd/17/cd17a781eadeb1772ccb06ad3a49b8f0.php(137): dcMedia->getPostMedia('89', NULL, 'attachment') #2 /var/www/svn_softs/dotclear_hg/inc/libs/clearbricks/template/class.template.php(268): include('/tmp/cbtpl/cd/1...') #3 /var/www/svn_softs/dotclear_hg/inc/public/class.dc.template.php(231): template->getData('post.html') #4 /var/www/svn_softs/dotclear_hg/inc/public/lib.urlhandlers.php(122): dcTemplate->getData('post.html') #5 /var/www/svn_softs/dotclear_hg/inc/public/lib.urlhandlers.php(523): dcUrlHandlers::serveDocument('post.html') #6 /var/www/svn_softs/dotclear_hg/inc/libs/clearbricks/url.handler/class.url.handler.php(166): dcUrlHandlers::post('28/10/2009/chro...') #7 /var/www/svn_softs/dotclear_hg/inc/public/lib.urlhandlers.php(187): urlHandler->callHandler('pos in /var/www/svn_softs/dotclear_hg/inc/core/class.dc.postmedia.php on line 61