SFTP - SSHFS

De Wiki info-lab.fr
Aller à : Navigation, rechercher

Sommaire

Présentation

SFTP est un service de transfert de fichiers type FTP encapsulé par SSH (voir OpenSSh).SFTP est en général utilisé pour le transfert de fichiers au travers d'un réseau non sûr, en remplacement de FTP. SSHFS utilise SFTP pour se connecter de manière sécurisée à un point de montage distant.
SFTP (FTP à travers SSH) ne doit pas être confondu avec FTPS (FTP à travers TLS/SSL).

Installation du serveur SFTP MySecureShell

"MySecureShell", projet de serveur SFTP s'appuyant sur OpenSSH :

  • Récupération de l'archive DEB sur le site du projet (hébergé par SourceForge), version 1.30 au 07/12/2012 : mysecureshell_1.30.deb ou l'équivalent 64 bits mysecureshell_1.30_amd64.deb.
  • Installation :
# dpkg -i /chemin/mysecureshell_1.30_amd64.deb

L'installation se termine par un message annonçant que le service est lancé.

  • Création de comptes spécifiques :
# adduser comptesftp 
.....
  • Modification du compte spécifique :
# vim /etc/passwd
modifier  comptesftp:x:1010:1010:comptesftp,,,:/home/comptesftp:/bin/bash
en        comptesftp:x:1010:1010:comptesftp,,,:/home/comptesftp:/bin/MySecureShell

Configuration de MySecureShell

Edition du fichier de configuration pour y apporter d'éventuelles modifications. Ce fichier est découpé en différentes sections, le section <Default> étant obligatoire (même si elle ne comporte aucune règle) : c'est la section qui contient les règles s'appliquant à tous les utilisateurs.

# vim /etc/ssh/sftp_config
<Default>
GlobalDownload             500k       # Débit maximum en téléchargement de l'ensemble des clients 
GlobalUpload               0          # Idem en téléversement (0 = illimité).
Download                   100k       # Débit maximum en téléchargement pour chaque connexion.
Download                   100k       # Débit maximum en téléversement pour chaque connexion.
StayAtHome                 true       # limite chaque client à son répertoire personnel (limite l'accès)
VirtualChroot              true       # Arborescence "chrootée" des répertoires personnels (limite la visibilité) 
LimitConnection            10         # maximum 10 connexions simultannées pour le serveur. 
LimitConnectionByUser      10         # maximum 10 connexions simultannées pour chaque compte
LimitConnectionByIp         2         # maximum 2 connexions simultannées pour chaque compte sur la même adresse IP
Home                       /home/$USER  # Définition du répertoire personnel
IdleTimeOut                5m         # délai d'inactivité avant déconnexion du client
........
</Default>                 
<User comptesftp>
........                              # règles spécifiques à cet utilisateur             
</comptesftp>
<Group fichiers_distants>
........                              # règles spécifiques à ce groupe d'utilisateurs
</fichiers_distants>

Les règles sont interprétées et appliquées dans cet ordre :

  1. restrictions sur l'utilisateur (règle spécifique)
  2. restrictions sur les groupes auquel appartient l'utilisateur
  3. restrictions qui s'appliquent à tous les groupes et tous les utilisateurs
  4. restrictions apparaissant dans Default.

NOTA: Les valeurs boléennes true et false peuvent être remplacées par des valeurs binaires :

  • 1 représente "true"
  • 2 représente "false"

Les options StayAtHome et VirtualChroot étant potentiellement contournables, la mise en place d'un chroot peut être nécessaire.

Gestion du service

Lecture des logs dans :

/var/log/sftp-server.log

Lancement du service :

# /etc/init.d/mysecureshell start

Vérification du service :

# sftp-verif
###Verifing file existance ###
/bin/MySecureShell                  [OK]
...................
### All tests dones ###

Etat du serveur :

# sftp-state
Server is up

Interdire de nouvelles connexions

# sftp-state stop        (shutdown est identique à stop)
Do you want to kill all users ? [YES/no]

Interdire de nouvelles connexions, tuer les connexions en cours et vider les tampons mémoire :

# sftp-state fullstop 

Accepter les connexions :

# sftp-state start       (active est identique à start)
Server is now online

Répondre automatiquement à la question qui sera posée :

# sftp-state -yes stop        

Savoir qui est connecté ?

# sftp-who
--- 0 / 10 clients ---

Déconnecter un utilisateur :

# sftp-kill toto

Déconnecter tous les utilisateurs :

# sftp-kill all

Gérer les utilisateurs :

# sftp-user list
toto
tata
comptesftp
# sftp-user create titi /home/titi            (création du compte titi et de son répertoire de base)
# sftp-user delete tata               (suppression du compte tata)

Sécuriser SFTP

Comme tout service SFTP doit être protégé.

Chroot du répertoire d'accueil

La partie de cet article concernant le chroot de SFTP est très largement issue d'un très instructif fil de discussion posté sur le forum Debian-FR.org.

chroot (Change root, littéralement modifier la racine) est une commande Unix présente dans core-utils permettant d'isoler un processus à un niveau de l'arborescence tout en lui faisant croire qu'il est bien à la racine du système. SFTP permettant de créer, supprimer, renommer, déplacer, et modifier les permissions des fichiers et répertoires d'un système de fichier distant, il est plus que conseillé de restreindre l'arborescence visible et utilisable par ce processus. Pour cela :

  • Installation d'un shell alternatif, très réduit, possédant juste les commandes indispensables à SFTP, et sauvegarde d'une copie de son fichier de configuration, avant son édition :
# aptitude install rssh
# cp /etc/rssh.conf  /etc/rssh.conf.old
# vim /etc/rssh.conf
 logfacility = LOG_USER
 allowsftp
 umask = 066
 :wq
#

  • Création du répertoire racine pour SFTP :
# mkdir /home/sftp/
  • Copie des fichiers nécessaires à SFTP pour les déposer au niveau du chroot :
# vim copie-fichiers.sh
 install -D $1 $2$1
 for i in `ldd $1 | grep -o '/[^[:space:]]*'`; do
  if [ ! -e $2$i ]
  then install -D $i $2$i
  fi
 done
:wq
# chmod 744 copie-fichiers.sh
# ./copie-fichiers.sh /usr/bin/sftp /home/sftp
# cp /lib/x86_64-linux-gnu/libnss_files.so.2 /home/sftp/lib/x86_64-linux-gnu/ 

(sur une architecture 32 bits, même commande an remplaçant x86_64 par i386)
Copie du binaire SFTP dans le chroot et création d'un /dev/null :

# mkdir /home/sftp/usr/lib/openssh
# cp /usr/lib/openssh/sftp-server /home/sftp/usr/lib/openssh/
# cd /home/sftp
# mkdir dev
# mknod dev/null c 1 3
# chmod 666 dev/null
# chmod 4755 /usr/lib/rssh/rssh_chroot_helper

Le setUid placé sur rssh_chroot_helper devra être vérifié et remis éventuellement en place à chacune des mises à jour du paquet rssh.

Modifier le fichier de configuration de rssh pour y signifier la nouvelle racine du service SFTP (ajouter la ligne mauve):

# vim /etc/rssh.conf
 logfacility = LOG_USER
 allowsftp
 umask = 066
 chrootpath = "/home/sftp"
 :wq
#
  • Création d'un utilisateur pour SFTP :
# adduser toto --shell /usr/bin/rssh
# mkdir /home/sftp/etc
# grep '^toto:' /etc/passwd >> /home/sftp/etc/passwd

L'autoriser à se connecter au serveur SSh :

# vim /etc/ssh/sshd_config
 ............................
 #utilisateurs autorisés
 AllowUsers marcel arthur toto
 ...........
:wq
# service ssh restart
  • Créer un répertoire pour que l'utilisateur puisse y déposer/prendre des fichiers :
# mkdir /home/sftp/reptoto/
# chown -R toto:toto /home/sftp/reptoto/
  • L'utilisateur peut maintenant se connecter à distance au serveur SFTP avec un client compatible :
$ sftp -P 9022 -i .ssh/cle-sftp toto@82.66.233.19:reptoto
Enter the passphrase :
Connected to 82.66.233.19.
Changing to :/reptoto
sftp> ? 
Available commands:
bye
cd path
.........
.........
sftp>

Protection par NETFILTER

iptables -t filter -A INPUT -s 82.66.233.0/24 -d 84.30.6.2 -p tcp --sport 1024:65535 --dport 22 --state NEW --syn -j ACCEPT

84.30.6.2 est l'adresse IP du serveur SFTP. Si le port TCP par défaut 22 a été changé, il faut modifier --dport en conséquence.

Protection au niveau de PAM

Protection par FAIL2BAN

# vim /etc/fail2ban/jail.conf
...............
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 900        # (900 secondes)
...............
[ssh]
enable = true
port = ssh,sftp
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

SSHFS

SSHFS utilise SFTP pour se connecter de manière sécurisée à un point de montage distant ; La machine hébergeant le point de montage distant devra donc héberger un serveur SSH, la machine cliente devra posséder les paquets FUSE et SSHFS et l'utilisateur doit appartenir au groupe fuse.
Connexion au point de montage distant :

$ mkdir distantSSH
$ sshfs compteDistant@hôte: distantSSH 
Mot de passe :
$ mount
compteDistant@hôte: on /home/compteLocal/distantSSH type fuse.sshfs (rw,nosuid,nodev,max_read=65536,user=compteLocal) 

Démonter le point de montage :

$ fusermount -u distantSSH
Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils