Ce guide explique comment configurer un accès SFTP chrooté pour deux utilisateurs sur Debian.\
Les utilisateurs pourront récupérer leurs fichiers via SFTP uniquement, sans accès SSH, et ne pourront pas naviguer en dehors de leur répertoire personnel.


📌 1. Création des utilisateurs

Nous allons créer deux utilisateurs (user1 et user2) sans accès shell :

sudo adduser --disabled-password --shell /bin/false user1
sudo adduser --disabled-password --shell /bin/false user2

Si les utilisateurs existent déjà, nous modifions leur shell :

sudo usermod -s /bin/false user1
sudo usermod -s /bin/false user2

📌 2. Création d’un groupe SFTP et ajout des utilisateurs

Nous allons créer un groupe sftp_users et y ajouter user1 et user2 :

sudo groupadd sftp_users
sudo usermod -aG sftp_users user1
sudo usermod -aG sftp_users user2

📌 3. Configuration des permissions des répertoires

Les répertoires /home/userX doivent appartenir à root:root et avoir des permissions strictes pour que le chroot fonctionne.

sudo chown root:root /home/user1
sudo chmod 755 /home/user1
sudo mkdir /home/user1/data
sudo chown user1:sftp_users /home/user1/data
sudo chmod 700 /home/user1/data

sudo chown root:root /home/user2
sudo chmod 755 /home/user2
sudo mkdir /home/user2/data
sudo chown user2:sftp_users /home/user2/data
sudo chmod 700 /home/user2/data

Explication des permissions :

  • /home/userX appartient à et est en 755 → L’utilisateur ne peut pas modifier ce dossier.
  • /home/userX/data appartient à l’utilisateur et est en 700 → L’utilisateur peut y lire/écrire ses fichiers.

📌 4. Configuration du serveur OpenSSH pour SFTP chrooté

Nous allons modifier la configuration d’OpenSSH pour forcer les utilisateurs à utiliser SFTP uniquement et les enfermer dans leur dossier (chroot).

Éditez le fichier de configuration SSH :

sudo nano /etc/ssh/sshd_config

Ajoutez (ou modifiez) ces lignes à la fin du fichier :

# Désactiver SSH pour les utilisateurs du groupe sftp_users
Match Group sftp_users
    ForceCommand internal-sftp
    ChrootDirectory %h
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no

Explication des options :

  • ForceCommand internal-sftp → Empêche toute autre commande que SFTP.
  • ChrootDirectory %h → Restreint chaque utilisateur à son dossier.
  • AllowTcpForwarding no & X11Forwarding no → Empêche les détournements de connexion.

Enregistrez (CTRL+X, puis Y et Entrée).


📌 5. Redémarrer le service SSH

Appliquez la nouvelle configuration en redémarrant OpenSSH :

sudo systemctl restart ssh

📌 6. Tester l’accès SFTP

Depuis un client SFTP, essayez de vous connecter :

sftp user1@IP_DU_SERVEUR

Ensuite, testez la navigation :

cd /
cd ..
ls

Vous constaterez que **l’utilisateur ne peut pas remonter plus haut que ** .\
Il pourra ajouter, modifier et récupérer ses fichiers dans . uniquement.


📌 7. (Optionnel) Ajouter un mot de passe aux utilisateurs

Si vous souhaitez que les utilisateurs se connectent avec un mot de passe :

sudo passwd user1
sudo passwd user2

💡 Alternative : Vous pouvez aussi configurer une connexion par clé SSH, en plaçant la clé publique de l’utilisateur dans /home/userX/.ssh/authorized_keys.


🎯 Résumé

✅ Les utilisateurs user1 et user2 peuvent uniquement utiliser SFTP.
✅ Ils ne peuvent pas remonter plus haut que leur .
✅ Ils n’ont pas d’accès SSH.
✅ Les permissions et le chroot garantissent la sécurité.

🚀 Votre serveur SFTP est prêt à l’emploi !

A tester, éprouver, corriger si besoin avant de le mettre dans la bonne catégorie xD

11 jours plus tard

Salut,
je viens d'essayer et j'ai une erreur :
client_loop: send disconnect: Broken pipe
Connection closed
Connection closed.

edit1
peut-être faut-il précisé aussi que dans sshd_config, il faut changer
Subsystem sftp /usr/lib/openssh/sftp-server
en
Subsystem sftp internal-sftp

edit2
le pb doit venir de moi je trouve le meme genre de tuto à divers endroit
je continu mon investigation de ce client_loop

Edit3:
j'ai fait un -vvv avant mon sftp
après avoir taper le mdp j'ai ça:

user@domaine password:
debug3: send packet: type 50
debug2: we sent a password packet, wait for reply
debug3: receive packet: type 52
Authenticated to domaine ([IP]:PORT) using "password".
debug2: fd 4 setting O_NONBLOCK
debug1: channel 0: new session [client-session] (inactive timeout: 0)
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug3: send packet: type 90
debug1: Requesting no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.
debug1: pledge: filesystem
debug3: client_repledge: enter
debug3: send packet: type 1
client_loop: send disconnect: Broken pipe
Connection closed.
Connection closed

et là pour moi c'est hors de mes compétances , je ne sais pas interpréter ce retour

    pachti Woups j'avais pas fais attention à ton retour :/
    Je regarde et te fais un retour.
    Matt

    [EDIT]
    Je viens de tester tel quel à grand coup de copier/coller ça fonctionne directement sans rien toucher 😅
    Tu es sur quel distribution ?
    [/EDIT]

    • pachti a répondu à ça.

      MattProd pas de soucis - moi aussi je ne suis pas h24 collé ici -

      ~# lsb_release -a
      No LSB modules are available.
      Distributor ID: Debian
      Description:    Debian GNU/Linux 12 (bookworm)
      Release:        12
      Codename:       bookworm

      edit :
      à l'origine c'est un OpenMediaVault
      récemment je l'ai dégagé parce que je trouvais plus simple de passer en ligne de commande que par l'interface.
      depuis mon système a des réactions étranges...

      je règle problème par problème 😅

      Répondre…