Comment limiter un utilisateur SFTP à un seul répertoire ?
Utilisez ChrootDirectory d’OpenSSH avec son serveur SFTP interne sur un serveur que vous
administrez. Le compte restreint voit le répertoire qui lui est attribué comme
/, tandis qu’un sous-répertoire distinct reste accessible en écriture pour
les téléversements. Cela ne donne au compte aucun accès à un shell ni aux fonctions de redirection.
L’exemple Linux suivant suppose l’existence d’un compte dédié nommé transloadit,
d’un groupe principal nommé transloadit et d’un répertoire personnel situé à
/home/transloadit. Vérifiez d’abord que ce compte peut se connecter avec sa clé SSH
conformément à votre politique d’authentification actuelle. N’utilisez pas le compte d’un
administrateur. Ne définissez pas / comme répertoire personnel du compte
restreint.
Gardez une session d’administrateur ouverte pendant la modification des paramètres SSH et assurez-vous de disposer d’un autre moyen d’accéder au serveur si la nouvelle configuration est rejetée.
Préparer les répertoires
Créez la racine restreinte, une arborescence vide reproduisant le chemin du répertoire personnel du compte à l’intérieur de celle-ci, ainsi que le répertoire de téléversement. SSH lit toujours les clés autorisées existantes du compte avant d’entrer dans le système de fichiers restreint ; n’y copiez pas de clés privées.
sudo install -d -o root -g root -m 755 /srv/sftp/transloadit
sudo install -d -o root -g root -m 755 /srv/sftp/transloadit/home/transloadit
sudo install -d -o transloadit -g transloadit -m 750 /srv/sftp/transloadit/uploads
Chaque composant de /srv/sftp/transloadit, y compris /srv et
/srv/sftp, doit appartenir à root et ne doit pas être accessible en écriture aux
autres utilisateurs ou groupes. Seul le sous-répertoire uploads appartient au
compte restreint. Ne rendez pas la racine restreinte accessible en écriture pour corriger une erreur
de téléversement.
Restreindre le compte
Dans /etc/ssh/sshd_config, remplacez la ligne Subsystem sftp existante par la
ligne suivante. Conservez-la dans la section globale, avant tout bloc Match ;
n’ajoutez pas de deuxième déclaration de sous-système SFTP.
Subsystem sftp internal-sftp
Ajoutez ce bloc propre au compte à la fin de la configuration :
Match User transloadit
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp -d /uploads
DisableForwarding yes
PermitTunnel no
PermitTTY no
ForceCommand démarre SFTP dans /uploads au lieu d’accepter des
commandes shell. DisableForwarding bloque également la redirection SSH, ce qu’une commande
SFTP imposée ne suffit pas à empêcher. Les exigences d’authentification existantes du compte
continuent de s’appliquer. Adaptez le nom du compte et le chemin du répertoire personnel si les vôtres
sont différents, et vérifiez les règles précédentes qui s’appliquent au compte ainsi que les fichiers
de configuration inclus.
Valider avant de recharger
Vérifiez la syntaxe et la configuration effective du compte restreint :
sudo sshd -t
sudo sshd -T -C user=transloadit,host=localhost,addr=127.0.0.1
Dans la deuxième commande, utilisez l’adresse et le nom d’hôte réels du client si votre configuration
contient des règles propres à une adresse ou à un hôte. Vérifiez que les paramètres effectifs
comprennent bien les valeurs attendues pour chrootdirectory,
forcecommand, disableforwarding yes, permittunnel no et
permittty no. DisableForwarding prend le pas sur les options individuelles
de redirection qui peuvent encore apparaître activées dans cette sortie. Ne rechargez pas une
configuration qui échoue à la validation. Utilisez la commande de rechargement du service SSH indiquée
dans la documentation de votre système d’exploitation, puis vérifiez à la fois une nouvelle connexion
d’administrateur et une nouvelle connexion SFTP avant de fermer la session initiale.
Depuis votre client, connectez-vous avec sftp transloadit@your-server.example et vérifiez le répertoire :
sftp> pwd
Remote working directory: /uploads
sftp> cd /
sftp> pwd
Remote working directory: /
sftp> cd ..
sftp> pwd
Remote working directory: /
Téléversez un fichier de test inoffensif dans /uploads, puis téléchargez-le.
La création d’un fichier directement dans / doit échouer. Vérifiez
également qu’une commande shell et la redirection de ports sont rejetées. Le chemin SFTP
/uploads correspond à /srv/sftp/transloadit/uploads sur le serveur, et non au
chemin /uploads du serveur lui-même.
Utilisez ce compte avec /sftp/import ou /sftp/store, en suivant la documentation du Robot sur l’authentification et les chemins. Un chroot restreint l’accès au système de fichiers ; il ne remplace ni l’authentification du compte, ni les permissions du système de fichiers, ni la politique réseau. Consultez le manuel de configuration d’OpenSSH pour connaître la sémantique complète des directives, et la documentation de votre distribution pour la gestion des services.