Comment limiter l'accès des utilisateurs SSH à des répertoires spécifiques sous Ubuntu 24.04 (Guide Chroot SFTP)

Autoriser un prestataire à télécharger quelques fichiers ne devrait pas lui donner automatiquement accès à une session terminale avec une vue complète du serveur. Sous Ubuntu 24.04 LTS, OpenSSH permet de limiter un compte de transfert de fichiers à un répertoire spécifique grâce à une ChrootDirectoryrègle et au serveur intégré internal-sftp. Il est important de noter qu'il s'agit d'une restriction SFTP uniquement , et non d'un moyen simple de fournir un shell Bash pleinement fonctionnel mais isolé.

Ce guide explique ce que les paramètres protègent réellement, puis décrit une configuration réversible en huit étapes pour plusieurs comptes, chacun avec son propre répertoire. Les commandes utilisent un compte contractoret un hôte d' exempleserver.example.com ; remplacez-les par vos propres valeurs. Il s'agit d'exemples de configuration, et non de résultats de tests sur un serveur en production.

De quel type de restriction avez-vous réellement besoin ?

Trois mécanismes de contrôle sont souvent confondus. Les permissions Linux déterminent les fichiers qu'un compte peut lire ou modifier ; le répertoire personnel d'un compte définit son emplacement initial ; un chroot modifie la racine du système de fichiers présentée à un processus. Ces mécanismes ne sont pas interchangeables.

ObjectifPoint de départ appropriéLimitation importante
Téléversez et téléchargez uniquement dans un dossier désigné.ChrootDirectoryavecForceCommand internal-sftpNe fournit pas d'interface Linux interactive.
Autoriser un shell mais contrôler la lecture et l'écriturePropriété, groupes, ACL et principe du moindre privilège sous UnixUn utilisateur de shell ordinaire peut toujours emprunter d'autres chemins lisibles.
Fournir un environnement de ligne de commande isoléUn chroot soigneusement construit ou un conteneur/VM avec des contrôles de sécurité distinctsNécessite une préparation et un examen d'isolation considérablement plus poussés

Idée reçue : définir /home/contractorun répertoire personnel confine l’utilisateur à cet emplacement. C’est faux. Un utilisateur shell standard peut accéder à n’importe quel répertoire accessible sur le système de fichiers. Si l’échange de fichiers est indispensable, privilégiez la méthode SFTP décrite ci-dessous plutôt que de masquer les répertoires via l’invite de commande.

Les documents OpenSSH ChrootDirectory, Matchet ForceCommanddans le manuel officiel sshd_config d'Ubuntu 24.04 .

Configurer un répertoire jail SFTP uniquement en huit étapes

Avant de modifier SSH à distance, conservez votre session d'administrateur ouverte et assurez-vous de disposer d'un accès console ou de récupération. Utilisez un compte non privilégié distinct pour les transferts ; n'ajoutez pas votre compte d'administrateur au groupe restreint.

1. Vérifiez OpenSSH et maintenez une session de récupération

Sur le serveur, installez OpenSSH si nécessaire, vérifiez le service et enregistrez la configuration principale. La documentation officielle du serveur Ubuntu décrit ces procédures d'installation et de configuration.

sudo apt update
sudo apt install openssh-server
sudo systemctl status ssh
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.pre-sftp
Terminal Ubuntu affichant la commande systemctl status ssh et les détails du service SSH
Vue terminale de l'état du service SSH, utile pour vérifier la disponibilité d'OpenSSH avant de modifier les règles d'accès.

Si vous ne pouvez administrer la machine que via SSH, ne fermez pas la session en cours pendant les modifications ou les tests. Consultez le guide de configuration du serveur OpenSSH d'Ubuntu avant de modifier le démon.

2. Créez un utilisateur dédié et un groupe d'accès SFTP

Un groupe est utile lorsque vous prévoyez plusieurs comptes restreints. Cet exemple attribue à chaque membre un environnement chroot distinct utilisant le %ujeton, qu'OpenSSH convertit en nom d'utilisateur de connexion. Le /uploadrépertoire personnel est destiné à se trouver dans le futur chroot ; il est donc inutile de créer un /uploadrépertoire au niveau de l'hôte.

sudo groupadd sftpclients
sudo adduser --home /upload --no-create-home --shell /usr/sbin/nologin contractor
sudo usermod -aG sftpclients contractor
id contractor

Le adduserprocessus peut vous demander de définir un mot de passe. Sur les installations qui désactivent l'authentification par mot de passe SSH, créez et autorisez plutôt une clé publique ; n'activez pas globalement la connexion par mot de passe simplement pour suivre un exemple. L' nologininterface en ligne de commande constitue une autre protection, mais internal-sftpc'est la commande imposée qui rend cette configuration utilisable uniquement pour le transfert. Testez cette combinaison sur votre propre infrastructure d'authentification.

Terminal Ubuntu affichant la création du compte « contractor » avec le répertoire personnel défini sur « upload » lors de la commande « adduser ».
La commande de création de compte spécifie le compte restreint et un chemin d'accès personnel qui sera disponible après l'application du chroot.

3. Créer un répertoire chroot appartenant à root

C'est là que beaucoup de guides se trompent. OpenSSH exige que chaque élément du chemin chroot appartienne à root et ne soit pas accessible en écriture par d'autres utilisateurs ou groupes. Il ne faut jamais rendre le répertoire racine du chroot accessible en écriture par le compte SFTP.

sudo install -d -o root -g root -m 0755 /srv/sftp
sudo install -d -o root -g root -m 0755 /srv/sftp/contractor
namei -l /srv/sftp/contractor

Vérifiez également les composants existants/ ; /srvles commandes ci-dessus ne corrigent pas automatiquement les permissions parentes incorrectes. Si un composant est accessible en écriture par le groupe ou appartient à un utilisateur, corrigez son propriétaire et son mode uniquement après avoir vérifié si d’autres applications en dépendent.

Terminal Ubuntu affichant les répertoires /srv/sftp et /srv/sftp/contractor appartenant à root, avec leurs permissions.
Le répertoire de la prison et son parent sont affichés avec la propriété root, condition vérifiée par OpenSSH au démarrage de la session.

4. Ajoutez un sous-répertoire accessible en écriture à l'intérieur de la prison.

Le compte peut écrire dans un sous-répertoire sans être autorisé à modifier le répertoire racine chroot. Créez un /srv/sftp/contractor/uploadfichier pour les fichiers du compte ; depuis un serveur SFTP, il apparaîtra comme suit/upload : .

sudo install -d -o contractor -g contractor -m 0750 /srv/sftp/contractor/upload
sudo stat -c '%U:%G %a %n' /srv/sftp/contractor /srv/sftp/contractor/upload

La propriété attendue diffère délibérément : root:rootpour le répertoire racine de la prison et contractor:contractorpour le dossier de téléchargement accessible en écriture. Évitez d'utiliser chmod 777une propriété qui exposerait inutilement les ressources et serait rejetée si elle était appliquée au répertoire racine de la prison.

Terminal Ubuntu affichant un dossier de téléchargement distinct appartenant au prestataire, sous le jail SFTP appartenant à l'utilisateur root
Le sous-répertoire upload est accessible en écriture par le compte restreint tandis que le jail qui le contient reste la propriété de root.

5. Ajoutez une règle de correspondance à sshd_config

Ouvrez le fichier /etc/ssh/sshd_configet ajoutez le bloc suivant à la fin, après les directives et Matchblocs existants. Utilisez un éditeur de texte comme ` sudoeditopenssh` ou `openssh` sudo nano. Vérifiez d'abord les règles existantesMatch : si plusieurs blocs correspondants attribuent le même mot-clé, OpenSSH utilise la première occurrence applicable. Ubuntu traite également les fichiers situés sous `/etc/openssh` /etc/ssh/sshd_config.d/à partir d'un ancien répertoireInclude ; les règles qui s'y trouvent peuvent avoir une incidence sur la priorité.

Match Group sftpclients
    ChrootDirectory /srv/sftp/%u
    ForceCommand internal-sftp -d /upload
    PermitTTY no
    DisableForwarding yes

Match GroupCible les membres de sftpclients. ChrootDirectoryplace chaque utilisateur sous /srv/sftp/USERNAME. ForceCommand internal-sftp -d /uploadexécute un service SFTP en interne et démarre dans le répertoire accessible en écriture. PermitTTY noEmpêche l'allocation de terminal, tandis que DisableForwarding yesdésactive les fonctionnalités de transfert SSH pour les connexions correspondantes.

Conservez la Subsystem sftpdirective globale fournie par Ubuntu, sauf si vous avez une raison particulière de la modifier ; la commande SFTP interne forcée ne nécessite pas le remplacement de cette ligne globale. N'ajoutez pas de directive globale supplémentaire Match Allsimplement pour terminer un bloc sans en comprendre les conséquences.

L'éditeur GNU nano affiche une règle SFTP de groupe de correspondance avec les paramètres ChrootDirectory et ForceCommand.
Un bloc de configuration conditionnel OpenSSH regroupe la restriction de répertoire et la commande SFTP uniquement.

6. Vérifiez la syntaxe et les paramètres effectifs avant de recharger.

La réussite de l'analyse syntaxique ne prouve ni que les permissions de la prison sont correctes, ni que le compte visé correspond à la politique. Effectuez ces deux vérifications explicitement.

sudo /usr/sbin/sshd -t
sudo /usr/sbin/sshd -T -C user=contractor,host=localhost,addr=192.0.2.10 | grep -E '^(chrootdirectory|forcecommand|permittty|disableforwarding) '
namei -l /srv/sftp/contractor

La configuration effective doit indiquer le chemin chroot prévu, la commande SFTP forcée, l'allocation TTY désactivée et les restrictions de transfert. L'adresse donnée en exemple 192.0.2.10est uniquement à titre d'illustration ; si vous avez Matchdes règles dépendantes de l'adresse, remplacez-la par l'adresse source réelle du client. La -T -Csyntaxe est décrite dans le manuel sshd d'Ubuntu 24.04 .

En cas d'échec de la validation, corrigez la configuration avant de recharger SSH. Si les valeurs effectives sont inattendues, examinez les extraits de code inclus et l'ordre des blocs conditionnels existants, et pas seulement les dernières lignes modifiées.

7. Rechargez SSH et conservez votre accès administrateur

Après avoir effectué les vérifications, redémarrez le service SSH afin que les nouvelles connexions utilisent la stratégie modifiée. Maintenez la connexion administrateur active tout en ouvrant un second terminal pour vérifier que l'accès administrateur normal fonctionne toujours.

sudo systemctl reload ssh
sudo systemctl status ssh --no-pager
Terminal Ubuntu affichant les commandes de contrôle du service SSH et l'état actif du service SSH
La fenêtre de gestion du service SSH illustre la vérification de l'état du service après une modification de la configuration.

Un redémarrage complet peut également appliquer les modifications, mais un rechargement est préférable lorsqu'il est possible et que vous souhaitez éviter toute interruption inutile. L'affichage des commandes de service et les messages de journalisation varient selon l'hôte ; il est donc conseillé d'examiner le résultat réel plutôt que de supposer qu'un retour réussi à l'invite de commande garantit l'accès.

8. Test des transferts autorisés et de l'accès shell bloqué

Depuis un autre ordinateur, connectez-vous en tant qu'utilisateur restreint. Utilisez le nom d'hôte réel du serveur et un fichier de test approprié. Le premier répertoire SFTP devrait être `/etc/sfp` /upload, et la racine du chroot devrait apparaître comme `/etc/sfp` /plutôt que le chemin de l'hôte /srv/sftp/contractor.

sftp contractor@server.example.com
sftp> pwd
sftp> cd /
sftp> ls
sftp> cd /upload
sftp> put sample.txt
sftp> cd /etc
sftp> exit

Le chargement d'un fichier de test inoffensif devrait être autorisé /upload. L'accès au répertoire racine réel de l'hôte /etcne devrait pas être possible : le chroot définit une racine différente et /etcne serait accessible que si vous aviez délibérément créé ou exposé un tel répertoire à l'intérieur de l'environnement chrooté. Le texte exact de l'erreur du client n'est pas important.

Session de terminal SFTP affichant un répertoire racine virtuel, un dossier d'uploads et une tentative de navigation
L'invite de commande SFTP illustre la navigation dans un système de fichiers restreint plutôt que dans le système de fichiers hôte.
ssh contractor@server.example.com

Il est impératif d'empêcher l'ouverture d'un shell SSH interactif classique pour ce compte. La connexion peut se fermer ou afficher un message relatif au protocole ; ne vous fiez pas à la formulation exacte. Si un shell s'ouvre, considérez la configuration comme non sécurisée et vérifiez l'appartenance au groupe, Matchla priorité des commandes et les paramètres sshd -T -Cde sortie avant d'utiliser ce compte.

Terminal Ubuntu affichant une tentative de connexion SSH qui se ferme au lieu d'afficher un shell interactif
Une tentative de connexion au terminal illustre la vérification d'accès au shell effectuée après l'activation des restrictions SFTP uniquement.

Et si vous utilisiez des clés publiques SSH ?

/uploadL'authentification par clé publique fonctionne avec un environnement chroot SFTP, mais le fait de placer le répertoire personnel de l'utilisateur à un emplacement spécifique ~/.ssh/authorized_keyspeut empêcher l'existence du chemin par défaut en dehors de cet environnement. Une alternative pratique consiste à autoriser SSH à lire un fichier de clés contrôlé par l'utilisateur root avant de démarrer le chroot. Ajoutez ceci dans le même Match Group sftpclientsbloc si vous optez pour un stockage centralisé des clés :

    AuthorizedKeysFile /etc/ssh/authorized_keys/%u

Créez ensuite un /etc/ssh/authorized_keys/contractorfichier contenant la clé publique autorisée du contractant, avec les droits d'administrateur et sans autorisation d'écriture pour le groupe ou les autres utilisateurs. Par exemple, après avoir copié en toute sécurité un fichier de clé publique vérifié nommé contractor.pubdans un répertoire de transit administratif :

sudo install -d -o root -g root -m 0755 /etc/ssh/authorized_keys
sudo install -o root -g root -m 0644 contractor.pub /etc/ssh/authorized_keys/contractor
sudo /usr/sbin/sshd -t

Ne copiez pas la clé privée sur le serveur. La configuration du chemin d'accès aux clés, les paramètres d'authentification par défaut et les vérifications de compte dépendent de votre politique SSH existante ; vérifiez l'accès par clé publique avant de désactiver une méthode d'authentification déjà fonctionnelle.

Les défaillances courantes et leur signification

SymptômeCause la plus probableProchaine vérification
La connexion SFTP se coupe immédiatement après l'authentification.Un élément du chemin chroot est accessible en écriture ou n'appartient pas à l'utilisateur root ; il se peut également que le répertoire de démarrage requis soit absent.Exécutez namei -l /srv/sftp/contractor, vérifiez /uploadet examinez les journaux de service.
L'utilisateur se connecte mais ne peut pas télécharger.Le répertoire enfant accessible en écriture a un propriétaire ou un mode incorrect.Vérifiez statle contenu du sous-répertoire d'upload ; ne modifiez pas le répertoire racine de la prison pour qu'il appartienne à l'utilisateur.
L'interface SSH s'ouvre toujours.Incompatibilité de groupe ou règle SSH antérieurement applicableCourir id contractoretsshd -T -C
L'authentification par clé publique a été refusée.Le fichier de clés autorisées ne se trouve pas à l'emplacement configuré ou ses permissions ne sont pas validées.Inspectez AuthorizedKeysFilel'emplacement des clés, la propriété des fichiers et le journal SSH.
Un client SCP plus ancien échoueIl s'attend à l'utilisation du protocole SCP hérité, qui nécessite un shell distant.Utilisez SFTP ou un client SCP qui utilise SFTP, et non pas SFTP.scp -O

Consultez les journaux avec ` sudo journalctl -u ssh -n 80 --no-pagerscp`. L'erreur exacte dépend des paramètres PAM, de la configuration SSH, de l'accès au système de fichiers et de la méthode d'authentification. OpenSSH 9.0 et versions ultérieures utilisent SFTP pour scples transferts standard par défaut, tandis que le mode hérité nécessite un shell, comme expliqué dans le manuel scp d'Ubuntu 24.04 .

Est-il possible de limiter un shell SSH interactif à un seul dossier ?

Pas avec un simple changement de répertoire personnel ni avec l'exemple SFTP ci-dessus. OpenSSH ChrootDirectorypeut également être utilisé pour les sessions shell, mais l'environnement d'exécution doit inclure un shell fonctionnel, ses bibliothèques partagées, les nœuds de périphériques requis et toutes les dépendances de commandes. Créer un tel environnement de manière sécurisée ne se limite pas à ajouter une ligne de configuration sshd_config. Il est facile de créer une configuration fragile ou trompeuse, surtout avec des commandes shell ou des points de montage arbitraires.

Si un utilisateur a réellement besoin de commandes interactives, il convient de spécifier précisément les commandes et les fichiers requis. Pour un ensemble de commandes restreint, utilisez des commandes distantes à portée limitée ou un point de terminaison d'application dédié. Pour des environnements indépendants plus étendus, envisagez un conteneur ou une machine virtuelle avec des montages de systèmes de fichiers explicites, des contrôles de privilèges et des restrictions réseau. Un environnement chroot seul ne remplace pas l'isolation complète du système, et ni chroot ni les permissions de fichiers Unix ne protègent contre un utilisateur privilégié capable de modifier le système sous-jacent.

Liste de vérification de sécurité avant d'accorder l'accès

  • Le compte de transfert n'est pas un compte administrateur et appartient uniquement aux groupes nécessaires.
  • Chaque composant menant à la prison est la propriété de la racine et n'est pas accessible en écriture au groupe ou au monde entier.
  • L'emplacement de téléchargement accessible en écriture se trouve à l'intérieur de la prison, et non à la racine de la prison elle-même.
  • L'utilisateur visé correspond à ChrootDirectory, ForceCommand internal-sftp, et le transfert a été désactivé dans la configuration effective.
  • Un véritable transfert SFTP réussit, une tentative d'accès aux fichiers réservés à l'hôte échoue et l'accès normal au shell SSH est bloqué.
  • La sauvegarde, la conservation, les quotas, la surveillance et la révocation des comptes sont gérés séparément ; un système de stockage de répertoires n’applique pas automatiquement ces politiques.

Pour plus de détails techniques, consultez la documentation de configuration d'OpenSSH pour Ubuntu 24.04 et le manuel du serveur SFTP d'Ubuntu . Ces instructions concernent Ubuntu 24.04 LTS ; les versions compilées des paquets et les extraits de code SSH existants peuvent modifier le comportement effectif. Par conséquent, seule la configuration et les tests de connexion effectués sur votre propre machine font foi.

Laisser un commentaire

Chiffrer le DNS amont de Pi-hole sur un serveur Ubuntu 24.04

Chiffrer le DNS amont de Pi-hole sur un serveur Ubuntu 24.04

Configurez dnscrypt-proxy comme pont DoH local de Pi-hole sur Ubuntu 24.04, avec un écouteur localhost uniquement, une sélection de résolveur et des vérifications avant de changer de DNS.

Faire fonctionner les gestes du pavé tactile sous Ubuntu 24.04 avec Wayland

Faire fonctionner les gestes du pavé tactile sous Ubuntu 24.04 avec Wayland

Vérifiez les paramètres du pavé tactile d'Ubuntu, confirmez la présence de Wayland et testez les balayages intégrés de GNOME avant de procéder au dépannage des applications ou du matériel.

Créer un miroir RAID 1 Debian 12 avec mdadm

Créer un miroir RAID 1 Debian 12 avec mdadm

Créez et vérifiez une grappe de données RAID 1 Debian 12 à deux disques, formatez-la en toute sécurité et configurez-la pour qu'elle s'assemble et se monte après le redémarrage.

Chiffrez le swap Debian 12 avec une nouvelle clé à chaque démarrage.

Chiffrez le swap Debian 12 avec une nouvelle clé à chaque démarrage.

Configurez le chiffrement à clé aléatoire pour une partition swap Debian 12 existante, vérifiez le mappage dm-crypt actif et comprenez le compromis lié à l'hibernation.

Comment limiter l'accès des utilisateurs SSH à des répertoires spécifiques sous Ubuntu 24.04 (Guide Chroot SFTP)

Comment limiter l'accès des utilisateurs SSH à des répertoires spécifiques sous Ubuntu 24.04 (Guide Chroot SFTP)

Limiter les comptes SSH d'Ubuntu 24.04 à des dossiers SFTP désignés avec chroot, permissions appropriées, règles de correspondance et tests de sécurité, sans accorder d'accès shell.

Déverrouillez APT d'Ubuntu en toute sécurité et terminez la mise à jour.

Déverrouillez APT d'Ubuntu en toute sécurité et terminez la mise à jour.

Identifiez le processus qui détient le verrou frontal dpkg d'Ubuntu, laissez le travail du paquet se terminer et réparez les installations interrompues sans supprimer les fichiers de verrouillage.

Comment configurer des instantanés Btrfs automatisés sur un ordinateur Ubuntu

Comment configurer des instantanés Btrfs automatisés sur un ordinateur Ubuntu

Configurez des instantanés système Btrfs planifiés sur Ubuntu Desktop avec Timeshift, vérifiez la disposition des sous-volumes Ubuntu, choisissez la durée de conservation et comprenez ce que les instantanés ne peuvent pas protéger.

Comment migrer de Debian 12 vers Testing sans casser les dépendances

Comment migrer de Debian 12 vers Testing sans casser les dépendances

Planifiez une migration plus sûre de Debian 12 vers Testing : mettez à niveau via Stable, sauvegardez, nettoyez les sources APT, simulez les changements de dépendances et vérifiez ce qui a changé.

Démarrage d'Ubuntu Server en mode d'urgence : Guide de dépannage étape par étape

Démarrage d'Ubuntu Server en mode d'urgence : Guide de dépannage étape par étape

Diagnostiquez en toute sécurité le mode d'urgence d'Ubuntu Server. Consultez les journaux de démarrage, vérifiez les points de montage racine et fstab, réparez une unité défaillante, gérez les erreurs du système de fichiers et assurez-vous d'un redémarrage correct.

Comment configurer un VPN point à site WireGuard sous Debian 12

Comment configurer un VPN point à site WireGuard sous Debian 12

Configurez un serveur VPN WireGuard sous Debian 12 pour un client distant. Configurez les clés, le transfert IPv4, la NAT nftables, l'accès au pare-feu et les vérifications de connexion.