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

Commentaires

1. Le jeudi 29 octobre 2009, 20:36 par ld

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 !

2. Le jeudi 29 octobre 2009, 23:31 par Shnoulle

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+

3. Le vendredi 30 octobre 2009, 00:37 par PA

Ce sujet a très souvent été traite sur le net... Proposer un Shell chroote me semblerait beaucoup plus intéressant !

4. Le vendredi 30 octobre 2009, 12:11 par Pascal

MySecureShell fait pas ça tout seul ?
http://mysecureshell.sourceforge.ne...

5. Le vendredi 30 octobre 2009, 14:53 par trashy

@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 ;)