Sur mon serveur dédié, je voulais mettre en place un environnement chroot afin de pouvoir donner un accès limité à leur espace à des utilisateurs externes.
La mise en place d’un tel espace n’est pas complexe en soit, mais j’ai en revanche eu beaucoup plus de mal à activer la connexion par un jeu de clés SSH.
Nous allons partir du principe que le système est déjà configuré pour la connexion avec des clés SSH.
On crée notre utilisateur “utilisateur”
useradd utilisateur
Ici, on va donc appliquer notre prison à l’utilisateur “utilisateur”, partir du principe que son répertoire de chroot est /home/www/utilisateur (pour de l’hébergement par exemple).
Il faut modifier si besoin son répertoire d’accueil en /home/www/utilisateur si besoin, on vérifie avec:
nano /etc/passwd
Puis la ligne de notre utilisateur
utilisateur:x:1000:1000::/home/www/utilisateur:/usr/sbin/nologin
Notez la dernière partie, /usr/sbin/nologin pour empêcher le login en SSH.
On crée le répertoire utilisateur, qui appartient au root et n’est pas modifiable par l’utilisateur:
mkdir /home/www/utilisateur
chmod 755 /home/www/utilisateur
L’utilisateur aura accès en modification à un autre répertoire, contenu dans celui qu’on vient de créer:
mkdir /home/www/utilisateur/upload
chmod 755 /home/www/utilisateur/upload
chown utilisateur /home/www/utilisateur/upload
Dans /etc/ssh/sshd_config, rajouter à la fin:
Match User utilisateur
ChrootDirectory /home/www/utilisateur
ForceCommand internal-sftp
AllowTcpForwarding no
On force la connexion en SFTP avec le ForceCommand et on interdit le TcpForwarding.
Toujours dans le sshd_config, il faut changer le répertoire des clés SSH (et c’est là que les ressources sur internet commencent à se faire mince…).
On remplace AuthorizedKeysFile par:
AuthorizedKeysFile /etc/ssh/authorized_keys/%u/authorized_keys
On va donc avoir toutes nos clés dans un répertoire appartenant à root (très important) et en dehors du chroot (important aussi).
Création du dossier:
mkdir /etc/ssh/authorized_keys
Création des dossiers utilisateurs:
mkdir /etc/ssh/authorized_keys/root
mkdir /etc/ssh/authorized_keys/utilisateur
Il faut copier toutes les clés existantes dans ce nouveau répertoire:
cp /root/.ssh/authorized_keys /etc/ssh/authorized_keys/root
cp /utilisateur/.ssh/authorized_keys /etc/ssh/authorized_keys/utilisateur
La deuxième ligne est à ajuster si nécessaire pour l’emplacement du fichier de clés de l’utilisateur. L’important est de les copier dans le nouveau répertoire.
Enfin, point crucial : paramétrer les permissions correctement. Il faut que le répertoire de base /authorized_keys soit en 755 pour que le daemon SSH y accède sans problème, ainsi que le répertoire utilisateur. J’ai lu partout qu’il fallait être en 700… Or cela ne fonctionne pas !
Enfin, plus classiquement le fichier de clés doit être en 600 et appartenir à l’utilisateur.
chmod 755 /etc/ssh/authorized_keys
chmod 755 /etc/ssh/authorized_keys/utilisateur
chmod 600 /etc/ssh/authorized_keys/utilisateur/authorized_keys
chown utilisateur /etc/ssh/authorized_keys/utilisateur/authorized_keys
Et c’est bon! 🙂
Notre utilisateur peut désormais se connecter en SFTP seulement avec sa clé SSH, voir le répertoire /home/www/utilisateur en lecture seule et écrire dans /home/www/utilisateur/upload
Il est possible de généraliser cette méthode en l’appliquant non à un utilisateur mais un groupe.