SFTP

De Wiki de Jordan LE NUFF
< Technique‎ | Linux‎ | SSH
Sauter à la navigation Sauter à la recherche
(Page créée avec « == 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 co… »)
 
 
(Une révision intermédiaire par le même utilisateur non affichée)
Ligne 6 : Ligne 6 :
  
 
== Restreindre un utilisateur à un dossier ==
 
== Restreindre un utilisateur à un dossier ==
Si ce n'est pas déjà fait, créer l'utilisateur en question sur le serveur. Pour se faire, s'aider de la page [[Technique/Linux/Créer_un_utilisateur|Créer un utilisateur]].
+
===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.
  
Pour restreindre cet utilisateur (exemple : <code>mysuer</code>) à un dossier (exemple : <code>/my/dir</code>), éditer le fichier <code>/etc/ssh/sshd_config</code> et ajouter les lignes suivantes :
+
Il faut donc créer/modifier l'utilisateur en tenant compte du nouvel emplacement du ''home directory''.
<syntaxhighlight lang="apache">
+
 
 +
'''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===
 +
<code>Chroot</code> 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 [https://fr.wikipedia.org/wiki/Sine_qua_non 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 : <code>mysuer</code>) à un dossier (exemple : <code>/my/dir</code>), éditer le fichier <code>/etc/ssh/sshd_config</code> et ajouter les lignes suivantes :
 +
<syntaxhighlight lang="python">
 
Match User mysuer
 
Match User mysuer
 
   ChrootDirectory /my/dir
 
   ChrootDirectory /my/dir
   ForceCommand internal-sftp
+
   ForceCommand internal-sftp -u 0006
 +
  AllowTcpForwarding no
 +
  X11Forwarding no
 +
</syntaxhighlight>
 +
 
 +
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 : <code>mygroup</code>) à un dossier (exemple : <code>/my/dir</code>), éditer le fichier <code>/etc/ssh/sshd_config</code> et ajouter les lignes suivantes :
 +
<syntaxhighlight lang="python">
 +
Match Group mysuer
 +
  ChrootDirectory %h
 +
  ForceCommand internal-sftp -u 0006
 
   AllowTcpForwarding no
 
   AllowTcpForwarding no
 
   X11Forwarding no
 
   X11Forwarding no
 
</syntaxhighlight>
 
</syntaxhighlight>
  
S'assurer également que le sous-système <code>sftp</code> soit configuré à '''<code>internal-sftp</code>''' avec la ligne suivante :
+
Explications :
Subsystem sftp internal-sftp
+
*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 <code>/usr/libexec/openssh/sftp-server</code> 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 : <code>internal-sftp</code>.
 +
 
 +
La grande différence entre <code>/usr/libexec/openssh/sftp-server</code> et <code>internal-sftp</code> est que <code>internal-sftp</code> embarque nativement tous les sous-dossiers de base nécessaires à la session interactive d'un utilisateur, comme un shell, par exemple <code>sh</code>, et des noeuds de base sous <code>/dev</code> tels <code>null</code>, <code>zero</code>, <code>stdin</code>, <code>stdout</code>, <code>stderr</code>, et les consoles <code>tty</code>. A l'inverse, avec <code>/usr/libexec/openssh/sftp-server</code>, il faudra fournir une à une toutes les ressources nécessaires à la session de l'utilisateur.
  
Redémarrer ensuite le service SSH :
+
====Prise en compte des modifications====
 +
Redémarrer le service SSH :
 
  systemctl restart sshd
 
  systemctl restart sshd

Version actuelle datée du 7 décembre 2020 à 18:16

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