Outils du site


SFTP : Transférer des fichiers sur le serveur

Le protocole SFTP ressemble beaucoup au célèbre FTP qui sert surtout à transférer des fichiers, mais se base sur un tunnel SSH. À vrai dire, chaque utilisateur disposant d'un accès SSH peut envoyer et télécharger des données en SFTP avec ses identifiants habituels. Un des avantages intéressant est de pouvoir reprendre un chargement partiel là où il en était, très utile pour envoyer/recevoir des fichiers volumineux.

Si vous voulez déployer un serveur SFTP pour un plus grand nombre d'utilisateurs, la mise en place d'un “chroot” est conseillée. Cette procédure est décrite plus loin dans le document car un poil plus complexe.

Transferts en ligne de commande

Pour copier des fichiers, vous pouvez utiliser la commande sftp qui s'utilise ainsi :

sftp -P <port> utilisateur@chezmoi.tld

Si vous avez désactivé l'identification par mot de passe au profit des clés, indiquez quelle est votre clé privée ainsi :

sftp -P <port> -o IdentityFile=~/.ssh/clessh utilisateur@chezmoi.tld

Vous voilà alors devant une invite de commande.

Voici quelques commandes utiles :

  • put fichier : sert à envoyer un fichier.
  • get fichier : télécharge un fichier.
  • ls : liste les documents sur le serveur.
  • cd repertoire : se déplace dans un autre répertoire sur le serveur.
  • lcd repertoire : se déplace dans un autre répertoire sur l'ordinateur client.
  • mkdir : crée un dossier sur le serveur.
  • quit : ferme la session.
  • help : liste les commandes disponibles :).

Rien de bien compliqué finalement, mais vous préférerez peut-être un client graphique comme expliqué ci-dessous.

Transferts avec un client graphique

Avec Filezilla

Le logiciel Filezilla peut se télécharger ou s'installer directement via le gestionnaire de paquets de votre distribution. Vérifiez qu'il s'agit bien d'une version à jour.

Ouvrez Filezilla, puis cliquez sur la petite icône en haut à gauche “Gestionnaire de sites”. Une nouvelle fenêtre s'ouvre :

Cliquez sur “Nouveau Site”, puis remplissez les champs ainsi :

  • Hôte : chezmoi.tld
  • Port : 222 (à remplacer par le port SSH)
  • Protocole : SFTP - SSH File Transfert Protocol
  • Type d'authentification : Normale
  • Identifiant : votre identifiant
  • Mot de passe : votre mot de passe

Il ne vous reste plus qu'à cliquer sur Connexion. Sélectionnez les fichiers que vous souhaitez envoyer ou récupérer, puis faites un clic-droit pour les télécharger. La même chose est possible avec des glisser/déposer.

D'autres clients graphiques existent, on pourra notamment citer WinSCP disponible sous Windows.

Avec votre gestionnaire de fichiers

Selon votre système d'exploitation, il y a fort à parier que votre gestionnaire de fichiers (Dolphin sous KDE ou Nautilus sous Gnome par exemple) soit lui même capable d'ouvrir une session SFTP. Comme chemin vers le dossier, indiquez simplement :

sftp://utilisateur@chezmoi.tld:222

Remplacez 222 par le port ssh du serveur (22 si vous ne mettez rien). Bien sûr, “utilisateur” est aussi à remplacer (par exemple jean_eudes ou toto).

Cela donne sur Nautilus :

ou encore avec Thunar (XFCE) :

Avec sshfs

sshfs est un outil qui permet de monter un dossier disponible via SFTP comme s'il s'agissait d'un point de montage de votre système. Peu importe votre gestionnaire de fichiers, vous pourrez copier vos documents comme s'il s'agissait d'un dossier classique.

sshfs s'utilise tout simplement ainsi :

sshfs -d utilisateur@chezmoi.tld:/dossier/distant /mnt/sftp 

Ensuite, le dossier /mnt/sftp contiendra le contenu du dossier distant.

Dans le cas où vous utilisez une identification par clé uniquement, indiquez quelle clé privée utiliser ainsi :

sshfs -d utilisateur@chezmoi.tld:/dossier/distant /mnt/sftp -o IdentityFile=/home/toto/.ssh/rqfdkj

SFTP avec chroot

L'idée ici est d'enfermer dans un dossier les utilisateurs appartenant au groupe sftpusers que l'on crée pour cette occasion afin de gérer finement les permissions. Cela leur évitera de copier n'importe où leurs documents, mais aussi de supprimer des éléments importants du serveur.

À titre d'exemple, nous allons mettre le chroot dans le dossier /var/sftp. Chaque utilisateur aura dans ce dernier un dossier qui lui sera propre. Il ne pourra pas en sortir. Les utilisateurs auront l'impression qu'il s'agit d'une nouvelle racine /. Un dossier “docs” leur permettra d'envoyer ses fichiers.

Créons de suite le groupe en question : groupadd sftpusers.

Éditez le fichier /etc/ssh/sshd_config puis ajoutez les lignes suivantes :

Match Group sftpusers
		ChrootDirectory /var/sftp/%u
		ForceCommand internal-sftp
		AllowTcpForwarding no

Pensez à bien modifier la ligne déjà existante qui contient Subsystem.

Si vous souhaitez ne permettre que l'identification par clé; précisez dans cette section :

PasswordAuthentication no

Ensuite, relancez SSH : rcctl reload sshd

Créez maintenant un dossier /sftp dans le dossier /var/ pour que les utilisateurs y soient automatiquement placés à leur connexion.

# mkdir -p /var/sftp

Modifiez les permissions pour assurer une sécurité supplémentaire :

# chown root:wheel /var/sftp
# chmod 700 /var/sftp

Chaque utilisateur du groupe sftpusers sera placé dans ce dossier dès qu'il se connectera au serveur. Notez que ces utilisateurs ne pourront qu'utiliser le protocole sftp, et donc la commande sftp (ou un client graphique), mais pas scp ou openrsync au travers d'un tunnel ssh.

Ajouter un compte SFTP

Ajouter un compte SFTP revient à créer un nouvel utilisateur et mettre ce dernier dans le groupe sftpusers.

Il faut quand même faire attention à plusieurs points :

  • L'utilisateur ne doit pouvoir faire que du SFTP. On va donc lui attribuer le shell “nologin” qui ne permet pas de lancer des commandes.
  • Il faut s'assurer que seul l'utilisateur a les droits d'écriture dans son dossier. On lui créera un dossier docs prévu à cet effet.

Voici la marche à suivre :

  • Création d'un groupe sftpusers si ce n'est pas déjà fait : groupadd sftpusers.
  • Ajout d'un utilisateur avec création du dossier personnel à l'endroit souhaité et ajout dans le groupe sftpusers : # useradd -G sftpusers -s /sbin/nologin -m utilisateur
  • On modifie le mot de passe avec passwd utilisateur .
  • On crée le dossier pour l'utilisateur : # mkdir -p /var/sftp/utilisateur
  • On crée le dossier dans lequel l'utilisateur aura le droit d'écrire :
# mkdir -p /var/sftp/utilisateur/docs
# chown utilisateur:sftpusers /var/sftp/utilisateur/docs

Finalement, personne d'autre ne doit pouvoir accéder à la racine de l'utilisateur :

# chown root:wheel $CHROOT/$user

L'utilisateur peut maintenant utiliser le protocole SFTP. Il sera enfermé dans son dossier précédemment créé.

Je vous invite à créer un script pour vous faciliter cette procédure :

#!/bin/sh
# addsftpuser.sh : 
	if [ $# -ne 1 ]; then
		echo "usage: $0 user"
		exit
	fi
    # CHANGE MOI
	CHROOT=/var/sftp/
	user="$1"
	mkdir -p "${CHROOT}"
	useradd -G sftpusers -s /sbin/nologin -m "${user}"
	mkdir -p "${CHROOT}/${user}/docs
	chown "${user}":sftpusers "${CHROOT}/${user}/docs"
	chown root:wheel "${CHROOT}/${user}"
exit

Si vous avez activé l'identification par clé, vous remplirez le fichier .ssh/authorized_keys dans le dossier personnel de l'utilisateur : celui placé dans /home.