SFTP pour SSH File Transfer Protocol est un très bon moyen d’avoir un système de fichier en réseau avec une liaison chiffrée par SSH, donc avec un bon niveau de sécurité.
Ici on va comme d’habitude s’intéresser à la mise en place d’un tel système de fichier sur notre serveur. Afin de disposer d’une sauvegarde/stockage dans le « cloud » 😊.
Prérequis
- Un serveur avec un Linux récent installé et avoir les droits d’administration
- OpenSSH plus OpenSSH SFTP server installé sur la machine serveur
- OpenSSH installé sur la machine client
Si comme moi vous êtes sur une distribution basée sur Debian (Ubuntu, Mint, …) il faut lancer la commande suivante sur la machine serveur
sudo apt install openssh-client openssh-server openssh-sftp-server
Sur la machine client c’est la même commande sans les deux dernier paquets
Mise en place
Une fois tout ça installé on vérifie que le serveur SSH tourne correctement.
systemctl status sshd
Créer un utilisateur dédié
Maintenant que tout tourne correctement on va créer un utilisateur sur notre machine serveur. En tant que root entrez la commande
/usr/sbin/useradd -d /home/trans_opvpn -G olivier -s /sbin/nologin trans_opvpn
Cette commande crée un utilisateur nommé trans_opvpn lui attribue le répertoire par défaut /home/trans_opvpn l’ajoute au groupe olivier (bien entendu on utilise un groupe qui existe déjà) et surtout lui interdit d’utiliser un shell, ainsi cet utilisateur ne pourra pas se connecter avec SSH mais uniquement utiliser SFTP.
Par mesure de sécurité le répertoire qui va devenir le point d’entrée de la connexion doit appartenir à l’utilisateur root
chown root:root /home/trans_opvpn
Le fichier de configuration
Maintenant on doit éditer le fichier /etc/ssh/sshd_config
On vérifie que la ligne « Subsystem » correspond bien à ce qu’on voit ci-dessous.
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
Puis à la fin du fichier on ajoute
Match User trans_opvpn
ChrootDirectory /home/trans_opvpn/
ForceCommand internal-sftp
PasswordAuthentication yes
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
Dans le texte ci-dessus on voit la ligne Match User puis le nom de l’utilisateur (ici trans_opvpn) qui indique que seul cet utilisateur va pouvoir se connecter au serveur. Il est aussi possible d’écrire cette ligne Match Group , ainsi tous les utilisateur du groupe spécifié pourront avoir accès au serveur SFTP.
ChrootDirectory quant à lui indique le répertoire dans lequel on va arriver lors de la connexion, ici on lui indique le « home-dir » de l’utilisateur que l’on a défini lors de la création de ce dernier.
Il ne reste plus qu’à appliquer ces changements en restartant (oui je sais ça ce dit pas mais comme je suis un rebelle je le dis quand même) le processus sshd
systemctl restard sshd
Connexion au service
Bon tout ça c’est bien mignon mais il est temps de tester notre service, pour ça on a besoin d’un logiciel client capable de ce connecter à notre serveur. Il en existe plein, perso en mode graphique j’ai utilisé Filezilla à une époque, maintenant j’utilise directement le gestionnaire de fichier Caja de mon environnement de bureau (Mate). Pour ce qui est d’un client en ligne de commande pour faire des scripts j’aime beaucoup lftp car il est très complet.
Test du serveur
Maintenant pour tester si le serveur fonctionne on va se connecter à la boucle locale sur la machine serveur, en utilisant l’outil de base fourni avec .
sftp trans_opvpn@127.0.0.1
Après avoir entré le mot de passe de l’utilisateur trans_opvpn on arrive sur un shell.
Dans l’image ci-dessus on voit qu’après la connexion j’ai entré la commande help qui donne la liste des commandes possibles dans ce shell. On peut voir des commandes très classiques telles que cd, ls, rm, … mais aussi d’autres plus spécifiques comme put (pour uploader) ou encore get (pour downloader).
Bien ça fonctionne en local sur la machine serveur, et bien maintenant le principe est exactement le même sur la machine client sauf qu’à la place de 127.0.0.1 il faut mettre l’adresse IP du serveur 🙂
sftp trans_opvpn@<IP_machine_serveur>
Connexion en mode graphique
Comme je disais plus haut j’utilise « caja » mais je pense que tous les navigateurs de fichiers un tant soit peu moderne fonctionneront pareil (même sur windows 😁).
Ici on entre l’adresse du serveur directement dans la barre d’adresse du navigateur
Il est aussi possible de créer un raccourci (signet)
On choisi de se connecter à un serveur
Puis on renseigne les informations de connexion. Maintenant il sera très facile de se connecter au serveur en cliquant sur le raccourcis.
LFTP
C’est un puissant utilitaire pour se connecter aux serveurs FTP et SFTP, il peut aussi utiliser des protocoles comme HTTP, FTPS, Bittorrent, FISH, … Je pense même qu’en lui demandant poliment il peut même se connecter à la cafetière 😃
Pour l’installer rien de plus simple.
apt install lftp
Par défaut lftp tente de se connecter en ftp donc si on veut un protocole différent il faut le spécifier
lftp -u trans_opvpn sftp://<ip_machine_serveur>/
Une fois connecté, pour avoir la liste des commandes on entre « help »
Une des commandes que je trouve particulièrement pratique est « mirror », en effet elle permet de copier ou synchroniser récursivement le répertoire distant (sur lequel on est connecté en SFTP) et le répertoire local (là où on a lancé la commande pour se connecter), On note qu’il y a la possibilité de mettre l’option –reverse pour faire le « mirror » dans l’autre sens.
Script de sauvegarde
Ici on va analyser un script qui va sauvegarder des dossiers locaux sur le serveur SFTP
#!/bin/bash
HOST="sftp://mon_serveur_sftp.eu"
USER="freebox"
PASS="mot_de_passe"
PORT="61666"
DELETE="--delete"
#DELETE=""
dir_local="/home/olivier/"
dir_distant="Save"
dir_lst="images nextcloud projets wordpress archives"
# Make the mirror of a local directory on the FTP
# $1 the local directory
# $2 the SFTP directory
function sync_dir(){
date
echo "-------"
echo "SYNC DIR $1 TO $2"
echo "-------"
lftp -p $PORT -u $USER,$PASS -e "lcd $1; mkdir -pf $2; cd $2; mirror --reverse --verbose --no-perms $DELETE;" $HOST
}
for dir in $dir_lst; do
sync_dir "$dir_local/$dir" "$dir_distant/$dir"
done
Ce script va effectuer des sauvegardes de répertoires, il s’exécute à partir du serveur pour sauvegarder sur un stockage en réseau (ici une clé usb sur ma Freebox) qu’on l’appellera NAS.
Les premières lignes sont des variables donc rien de bien extraordinaire. On notera tout de même DELETE qui est sur 2 lignes, ainsi on peut soit activer l’une ou l’autre. Si c’est celle qui est vide qui est activée alors les fichiers supprimés sur le serveur ne le seront pas sur le NAS
Ensuite vient la fonction sync_dir qui va effectuer la sauvegarde du répertoire sur le serveur vers le NAS Les 4 premières lignes c’est juste de l’affichage pour les log. La ligne vraiment importante est celle qui utilise lftp
Alors bien évidemment les options -p et -u servent pour la connexion, le -e lui exécute une commande :
– lcd $1 pour ‘local change directory » change de répertoire là où est exécuté le script, ici sur le serveur.
– mkdir -pf $2 va créer le répertoire sur le NAS, si celui-ci existe déjà il ne fait rien
– cd $2 On entre dans le répertoire
– mirror –reverse on copie/met à jour le contenu du serveur vers le NAS
Voila qui devrait pas mal aider pour la mise en place d’un serveur SFTP.
0 commentaires