SFTP

De Wiki de Jordan LE NUFF
< Technique‎ | Linux‎ | SSH
Sauter à la navigation Sauter à la recherche

Présentation

Cette page a pour objet de décrire certains gestes techniques liés à l'utilisation du protocole SFTP.

Description

SFTP est un protocole de communication fonctionnant sur SSH pour transférer et gérer des fichiers à distance.

Restreindre un utilisateur à un dossier

Créer/modifier l'utilisateur chrooté

Il faut s'assurer que le home directory de l'utilisateur chrooté soit bien dans l'arborescence du dossier chrooté. Le home directory peut correspondre au dossier chrooté ou bien il peut en être un sous-dossier.

Il faut donc créer/modifier l'utilisateur en tenant compte du nouvel emplacement du home directory.

Dans la pratique, on définit le home directory afin qu'il corresponde au dossier chrooté. Cela permet une configuration simple au niveau de SSH (voir plus bas).

Attribuer les bons droits

Chroot signifiant littéralement changer la racine (Change root), il faut donc l'attribuer à l'utilisateur root, la racine d'un système Linux appartenant toujours à root.

Il faut donc, au minimum, définir l'utilisateur root en tant que propriétaire du dossier qui sera la nouvelle racine de l'utilisateur qui sera chrooté :

chown root /my/chrooted/dir

Dans la pratique, on définira également le groupe root propriétaire du dossier chrooté :

chown root:root /my/chrooted/dir

De plus, la condition sine qua non pour que le chrootage fonctionne est l'attribution des permissions suivantes au dossier chrooté :

  • Utilisateur propriétaire (root)
    • 7 ou rwx
    • Il est obligatoire que root ait tous les droits sur le dossier chrooté afin d'exécuter les processus de l'utilisateur chrooté
  • Groupe propriétaire
    • 0 ou ---, 1 ou --x, 4 ou r--, 5 ou r-x
    • Le droit d'écriture est strictement interdit
    • Le groupe propriétaire peut-être n'importe lequel selon les besoins
    • Dans la pratique, on donne le droit 5 ou r-x
  • Les autres utilisateurs
    • 0 ou ---, 1 ou --x, 4 ou r--, 5 ou r-x
    • Le droit d'écriture est strictement interdit
    • Dans la pratique, on donne le droit 1 ou --x ou le droit 5 ou r-x

Configuration SSH

Restriction par utilisateur

Pour restreindre un utilisateur (exemple : mysuer) à un dossier (exemple : /my/dir), éditer le fichier /etc/ssh/sshd_config et ajouter les lignes suivantes :

Match User mysuer
  ChrootDirectory /my/dir
  ForceCommand internal-sftp -u 0006
  AllowTcpForwarding no
  X11Forwarding no

Explications :

  • Match User mysuer
    • Match : condition à respecter
    • User : condition de type utilisateur
    • myuser : l'utilisateur qui doit correspondre est myuser (pour plusieurs utilisateurs : myuser1,myuser2,myuser3, ...)
  • ChrootDirectory /my/dir
    • Le dossier qui sera chrooté
  • ForceCommand internal-sftp -u 0006
    • ForceCommand : restriction de l'utilisation de SSH à une commande (plusieurs restrictions sont possibles)
    • internal-sftp : utilise le système SFTP interne à SSH
    • -u 0006 : force le umask de l'utilisateur chrooté à 0006
  • AllowTcpForwarding no
    • Empêche le port forwarding (sécurité)
  • X11Forwarding no
    • Empêche l'exécution de programmes X sur le poste client

Restriction par groupe

Pour restreindre un groupe d'utilisateurs (exemple : mygroup) à un dossier (exemple : /my/dir), éditer le fichier /etc/ssh/sshd_config et ajouter les lignes suivantes :

Match Group mysuer
  ChrootDirectory %h
  ForceCommand internal-sftp -u 0006
  AllowTcpForwarding no
  X11Forwarding no

Explications :

  • Match Group mygroup
    • Match : condition à respecter
    • Group: condition de type groupe
    • mygroup : le groupe l'utilisateur qui doit correspondre est mygroup (pour plusieurs groupes : mygroup1,mygroup1,mygroup1, ...)
  • ChrootDirectory %h
    • Le dossier qui sera chrooté
    • La variable %h correspond au home directory de l'utilisateur. Ce paramètre apporte une grande flexibilité et permet ainsi une gestion dynamique des dossiers chrootés
  • ForceCommand internal-sftp -u 0006
    • ForceCommand : restriction de l'utilisation de SSH à une commande (plusieurs restrictions sont possibles)
    • internal-sftp : utilise le système SFTP interne à SSH
    • -u 0006 : force le umask de l'utilisateur chrooté à 0006
  • AllowTcpForwarding no
    • Empêche le port forwarding (sécurité)
  • X11Forwarding no
    • Empêche l'exécution de programmes X sur le poste client

Différences entre sous-sytèmes sftp

Par défaut, dans la configuration du démon SSH, c'est le sous-système /usr/libexec/openssh/sftp-server qui est défini. Ce paramètre est historique et fait appel à un binaire externe à SSH pour activer le SFTP.

Désormais, SSH embarque nativement un sous-système SFTP : internal-sftp.

La grande différence entre /usr/libexec/openssh/sftp-server et internal-sftp est que internal-sftp embarque nativement tous les sous-dossiers de base nécessaires à la session interactive d'un utilisateur, comme un shell, par exemple sh, et des noeuds de base sous /dev tels null, zero, stdin, stdout, stderr, et les consoles tty. A l'inverse, avec /usr/libexec/openssh/sftp-server, il faudra fournir une à une toutes les ressources nécessaires à la session de l'utilisateur.

Prise en compte des modifications

Redémarrer le service SSH :

systemctl restart sshd