summaryrefslogtreecommitdiff
path: root/content/Informatique/chroot.rst
diff options
context:
space:
mode:
Diffstat (limited to 'content/Informatique/chroot.rst')
-rw-r--r--content/Informatique/chroot.rst236
1 files changed, 0 insertions, 236 deletions
diff --git a/content/Informatique/chroot.rst b/content/Informatique/chroot.rst
deleted file mode 100644
index d126d99..0000000
--- a/content/Informatique/chroot.rst
+++ /dev/null
@@ -1,236 +0,0 @@
-.. -*- mode: rst -*-
-.. -*- coding: utf-8 -*-
-
-Mettre en place un environnement sftp chrooté
-#############################################
-
-:date: 2010-04-08
-:tags: Libre, Hébergement, sftp
-
-*Note* : Je propose une autre approche pour mettre en place cette
-solution :
-`mettre-en-place-un-environnement-sftp-chroote-2/ <|filename|sftp.rst>`_
-
-La demande
-~~~~~~~~~~
-
-Ma copine m'a demandé de trouver une solution simple pour échanger des
-fichiers avec sa sœur, msn posant des problèmes… J'ai pensé à mon serveur ssh
-et mettre en place une connexion sftp pour ça. Sur le principe cela a été
-adopté avec une petite présentation de filezilla (je ne sais pas s'il existe
-des clients sftp intégrés sous windows ?), j'ai donc commencé à mettre en place
-le système. De mon côté, la condition principale est de n'autoriser les
-connexions que par clef publique (pas de mot de passe), ma copine a tenu à ce
-que sa sœur ne puisse pas accéder aux documents présents dans son home, et du
-mien à ce que l'on ne puisse pas pour autant se promener dans l'arborescence du
-serveur : il va donc falloir chrooter l'environnement. Il existe pas mal de
-documentation la dessus sur internet, mais je me suis souvent retrouvé face à
-des exemples incorrects ou incompatible avec le fait de passer par une clef
-publique, je vais donc détailler les problèmes rencontrés.
-
-Le compte + clef publique
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-La première étape est de créer le compte, cela se fait assez simplement
-:
-
-::
-
- # adduser ${user}
-
-|Création de la clef ssh avec puttygen| et en répondant aux questions
-par défaut… Vient ensuite la clef publique : filezilla gère les clefs
-privés au format ppk (putty) et je n'ai pas trouvé d'outil pour les
-générer sous windows. Je suis donc passé par wine + puttygen pour créer
-la clef. Une fois celle-ci crée, on enregistre la partie publique et la
-partie privée de la clef. La clef publique va être enregistrée dans le
-fichier ${user}/.ssh/know\_host sur le serveur pour autoriser le client
-à s'y connecter. La clef privée sera enregistrée de son côté au format
-ppk pour être utilisée par filezilla (il est possible à partir de ce
-fichier de générer une clef privée de type openssh).
-
-|image1|
-
-Il faut ensuite intégrer la clef privée dans filezilla en passant par
-les paramètres : elle sera automatiquement lue à la connexion (il faut
-choisir «interactive» dans le type d'authentification). (Attention :
-sous windows j'ai rencontré des problèmes avec un répertoire contenant
-des accents, la clef semblait être lue, mais la connexion ne se faisait
-pas pour autant.)
-
-Chrooter l'environnement
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Aujourd'hui il est possible de chrooter nativement un environnement sftp
-avec openssh. Il faut pour cela mettre en place une condition sur
-l'utilisateur (ou le groupe) pour faire le chroot :
-
-::
-
- Match user ${user}
- ChrootDirectory /var/chroot/
- X11Forwarding no
- AllowTcpForwarding no
- ForceCommand internal-sftp
-
-Dans cet exemple le chemin /var/chroot sera utilisé comme racine lors
-des connexions sftp. Ce répertoire doit être détenu par root:root et
-avoir les droits 755. Cela veut dire que si notre utilisateur à pour
-répertoire home /home/${user}, il se retrouvera dans
-/var/chroot/home/${user} lors des connexions sftp. Il est nécessaire de
-conserver le répertoire home de l'utilisateur pour que ssh accepte une
-connexion par clef. En effet, lorsque l'utilisateur va se connecter, ssh
-va lire dans son répertoire personnel pour lire le fichier
-.ssh/know\_host et autoriser ou non la clef qui se présente. Ce qui
-signifie que si l'on modifie le répertoire personnel, il faut aussi
-déplacer cette arborescence (hors de question dans ce cas de mettre /
-comme racine de l'utilisateur). À noter : j'ai préféré faire le match
-sur le nom de l'utilisateur plutôt que sur son groupe (le groupe sera
-utilisé par ailleurs). Dans le cas où nous avons plusieurs
-utilisateurs, il est possible de les mettre à la suite (séparés par des
-virgules). J'ai vu de nombreux tutoriaux qui indiquent comme répertoire
-de chroot « /home/%u » (le répertoire de l'utilisateur standard), et
-qui demandent de changer le répertoire de login de l'utilisateur par « /
-». Je pense que c'est une très mauvaise idée : d'une part parce que cela
-oblige à déposer les clefs à la racine du serveur, mais aussi à cause de
-la contrainte d'openssh demandant à ce que le répertoire root soit
-détenu par root : cela veut dire que l'utilisateur n'a pas le droit de
-déposer de fichiers ou de créer de répertoires dans son propre home ! Le
-plus simple est donc de prendre un autre répertoire pour l'échange, et
-laisser le home de l'utilisateur pour la configuration. (Cela permet
-aussi d'être sûr que le répertoire .ssh ne sera pas effacé par erreur
-par l'utilisateur…) J'ai donc mis un lien symbolique pour lier le /home
-de l'utilisateur avec son répertoire d'échange :
-
-.. code-block:: console
-
- # mkdir /home/${user}/echanges
- # ln -s /var/chroot/home/${user} /home/${user}/echanges
-
-On retrouvera ainsi la possibilité de voir les fichiers déposés en
-passant par le /home de l'utilisateur (même si ce dernier ne pourra pas
-y aller…)
-
-Isoler l'environnement
-~~~~~~~~~~~~~~~~~~~~~~
-
-Maintenant que nous avons empêché l'utilisateur de se balader sur
-l'ordinateur, nous allons l'empêcher de se balader dans les autres
-répertoires des utilisateurs : cela se fait en une ligne de commande
-(pour chacun des répertoires que nous allons ouvrir en sftp :)
-
-.. code-block:: console
-
- # for fichier in /var/chroot/home/* ; do chmod o-r ${fichier}; done
-
-Et voilà ! Les utilisateurs peuvent voir qu'il existe d'autres comptes
-que le leur, mais ne peuvent pas y accéder.
-
-Autoriser le partage
-~~~~~~~~~~~~~~~~~~~~
-
-Maintenant que nous avons fermé les droits de manière générale il nous
-reste à autoriser le partage des fichiers (après tout c'était le but de
-la demande !) de manière plus fine. Cela implique pour moi deux choses :
-
-#. permettre à un autre utilisateur d'accéder aux données présentes
-#. permettre à un autre utilisateur de déposer (ou de supprimer des
- données)
-
-Pour le premier point, c'est facile il suffit d'ajouter l'utilisateur A
-au groupe de l'utilisateur B :
-
-.. code-block:: console
-
- # usermod -a -G ${user} ${un_autre_utilisateur}
-
-Et l'utilsateur un\_autre\_utilisateur pourra donc accéder à l'ensemble
-des fichiers pour les lire (et éventuellement les rapatrier chez lui).
-Pour le second point (possibilité d'écrire et modifier) c'est un peu
-plus compliqué; en gros nous voulons que les fichiers déposés par sftp
-dans le répertoire de l'utilisateur ait comme groupe d'appartenance
-celui du propriétaire du répertoire (quel que soit l'utilisateur qui
-dépose) et qu'ils soient modifiable par le groupe (g+w) du
-propriétaire. Par exemple : l'utilisateur A dépose un fichier dans le
-répertoire d'échange de l'utilisateur B. Il faut que les droits de ce
-fichier se présentent ainsi une fois le transfert terminé :
-
-.. code-block:: console
-
- $ ls -l fichier
- -rw-rw---- 1 utilisateurA utilisateurB
-
-(ainsi l'un et l'autre pourront supprimer le fichier). Pour cela nous
-allons utiliser une « bidouille » de l'os : le sgid bit. Derrière ce nom
-barbare se trouve un marqueur qui permet de fixer le droit de tous les
-fichiers qui seront créés dans le répertoire (plus d'info
-`ici <http://en.wikipedia.org/wiki/Setuid>`_). Pour le déterminer on
-passe par chmod :
-
-.. code-block:: console
-
- # chmod g+s /var/chroot/${user}
-
-|image2|
-
-Cela détermine bien quel est le groupe qui sera propriétaire du fichier,
-mais cela ne donne pas à ce groupe le droit de le modifier pour autant !
-Sous linux, c'est la commande umask qui permet de déterminer les droits
-des fichiers. Le problème est qu'il s'agit d'une commande liés à
-l'environnement de l'utilisateur, et non pas aux répertoires sur
-lesquels nous travaillons (à moins de passer par les ACLs mais cela est
-déjà assez compliqué comme ça…). Ici, nous sommes dans un environnement
-sftp, sans shell de login, donc sans possibilité d'exécuter la commande
-directement, il faut que ce soit le serveur sftp qui le configure. J'ai
-trouvé énormément de documentations (la plupart des bidouillages) pour
-contourner le problème, mais la solution la plus simple vient de la
-dernière version d'OpenSSH (5.4) sortie le 8 mars dernier.
-
-
-Une nouvelle option sur le serveur sftp permet d'indiquer quel est
-l'umask qui sera appliqué (dans notre cas 002) : dans le
-fichier/etc/ssh/sshd\_config nous allons configurer les paramètres par
-défaut du serveur sftp : Remplacer :
-
-::
-
- Subsystem sftp /usr/lib/openssh/sftp-server.sh
-
-par :
-
-::
-
- Subsystem sftp /usr/lib/openssh/sftp-server -u 002
-
-Pour définir les droits umask qui seront appliqués par défaut pour
-toutes les connexions sftp par défaut. Ce paramétrage est à redéfinir
-pour les paramétrages personnalisés (bloc Match) :
-
-::
-
- ForceCommand internal-sftp -u 002
-
-Conclusion
-~~~~~~~~~~
-
-Nous avons un environnement bien hermétique, pouvant gérer
-l'augmentation du nombre de compte (il suffit de refaire les chmod dans
-notre environnement chrooté à la création du compte), et hermétique. Le
-paramétrage côté serveur est effectivement assez lourd au début, mais je
-pense que la mise à jour ne demande pas trop de travail, et on gère les
-droits de manière assez fine (en passant par les groupes ce qui me
-semble être dans la mentalité unix). Pour le client, il n'y a pas grand
-chose à paramétrer (récupérer la clef et l'intégrer), et il n'y a
-aucun risque que celui-ci vienne casser son paramétrage. On peut même
-sauvegarder sa clef privée dans son home (le vrai), au cas où il
-perdrait le fichier.
-
-.. |Création de la clef ssh avec puttygen| image:: |filename|../images/puttygen-300x276.jpg
- :class: floatleft
-
-
-.. |image1| image:: |filename|../images/filezilla-300x140.jpg
- :class: floatright
-
-.. |image2| image:: |filename|../images/conf-300x175.jpg
- :class: floatleft