Serveur sftp +rssh+chroot
Présentation
sftp est un programme similaire à ftp, mais au dessus d'un tunnel ssh. Il a donc toutes les fonctionnalité de ftp, mais avec la sécurité de ssh en plus (cryptage des logins, mots de passe et des transferts de données).
- Côté serveur: le serveur sftp est fourni par openssh-server.Pour plus de sécurité, nous le coupleront avec rssh, un shell réduit qui ne permettra aux clients connectés à notre serveur de ne faire que du sftp. De plus, nous allons créer un chroot, une technique qui va "enfermer" les clients dans un dossier de notre serveur. Aucune de leurs actions ne pourront avoir de conséquences à l'extérieur de ce dossier.
- Côté client:Afin d'utiliser un serveur sftp, le client doit avoir un client sftp (sftp en ligne de commande ou filezilla).
Installation de openssh-server et rssh
On va tout simplement les installer avec aptitude, qui s'occupera d'installer les dépendances:
#aptitude install openssh-server rssh
Configuration du serveur ssh
Le fichier de configuration est: /etc/ssh/sshd_config.
- Tout d'abord, changeons le port d'écoute par défaut (le 22), et mettons, par exemple, le 666. De cette manière, on évitera les robots qui scannent le net à la recherche de serveurs.
# What ports, IPs and protocols we listen for Port 666
(N'oubliez pas d'ouvrir le port dans votre firewall)
- Dans la section authentification, on interdit la connection en tant que root:
# PermitRootLogin no
- Inutile dans notre cas d'activer le X11forwarding
#X11Forwarding no
Configuration de rssh
L'intérêt de rssh est de donner à chaque utilisateur du serveur un shell réduit. Dans notre cas, ce shell sera réduit à sftp, c'est à dire à ttes les commandes dispensées par sftp :
cd path Change remote directory to 'path' lcd path Change local directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' help Display this help text get remote-path [local-path]Download file lls [ls-options [path]] Display local directory listing ln oldpath newpath Symlink remote file lmkdir path Create local directory lpwd Print local working directory ls [path] Display remote directory listing lumask umask Set local umask to 'umask' mkdir path Create remote directory put local-path [remote-path]Upload file pwd Display remote working directory exit Quit sftp quit Quit sftp rename oldpath newpath Rename remote file rmdir path Remove remote directory rm path Delete remote file symlink oldpath newpath Symlink remote file version Show SFTP version !command Execute 'command' in local shell ! Escape to local shell ? Synonym for help
Le fichier de configuration est /etc/rssh.conf Remplaçons celui créé lors de l'installation:
# mv rssh.conf rssh.conf.old # echo "logfacility = LOG_USER" > /etc/rssh.conf # echo "allowsftp" >> /etc/rssh.conf # echo "umask = 022" >> /etc/rssh.conf
Création du chroot
Nous allons "chrooter" nos futurs utilisateurs du serveur sftp dans un dossier, nous nous servirons dans notre cas de /home/sftp:
#mkdir /home/sftp
L'intérêt est que ces utilisateurs verront /home/sftp comme racine, et ne pourront agir que dans celui-là (et uniquement avec les commandes fournies par sftp, étant donné qu'on leur donnera comme shell rssh).
- copie des binaires et de leur dépendances
Il va donc falloir installer dans le chroot la commande sftp et ses dépendances, ainsi que sftp-server.
On va, pour ce faire, utiliser le script copie_binaire:
#!/bin/bash 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
Ce script permet de copier un binaire et ses dépendances (et permet d'éviter de tout faire avec ldd et cp "à la main").
Copions donc sftp de la manière suivante:
#./copie_binaire /usr/bin/sftp /home/sftp
Voila, sftp et ses dépendances sont dans /home/sftp (plus précisément dans /home/sftp/usr et /home/sftp/lib).
Il faut en plus copier libnss-file.so.2:
#cp /lib/libnss-file.so.2 /home/sftp/lib
- création de /dev/null dans le chroot
Pour le bon fonctionnement de sftp, il est nécessaire d'avoir un dev/null dans le chroot:
#mknod dev/null c 1 3 chmod 666 dev/null
- Placer le setuid sur le rssh_chroot_helper
#chmod u+s /usr/lib/rssh/rssh_chroot_helper
- Ajouter ligne chrootpath /home/sftp dans rssh.conf
# echo 'chrootpath = "/home/sftp"' >> /etc/rssh.conf
Bon, le chroot est prêt, ne manque plus que les clients...
Création des utilisateurs
- Créons l'utilisateur machin, futur client de notre serveur (en n'oubliant pas de lui donner comme shell rssh)
#adduser machin --shell /usr/bin/rssh
On vous demande un mot de passe pour cet utilisateur, mettez-en un "béton", sinon tout ce qui est fait côté "sécu" ne sert à rien.
- ajoutons cet utilisateur dans le fichier passwd du chroot
#grep machin /etc/passwd > /home/sftp/etc/passwd
Tests
en local
Testons tout ça directement sur le serveur:
$ sftp machin@localhost
Après avoir entrer votre mot de passe, si tout va bien, vous devez avoir une invite de commande :
sftp>
en réseau
$ sftp machin@IP_de_votre_serveur
en cas de problèmes
- Vérifier la création du chroot
- le port est-il ouvert sur le firewall ?
- les utilisateurs créés sont ils bien dans le passwd du chroot ?
Les logs
Comme le dit man sftp-server:
For logging to work, sftp-server must be able to access /dev/log. Use of sftp-server in a chroot configuation therefore requires that syslogd(8) establish a logging socket inside the chroot directory.
d'où, comme le dit man syslogd:
-a socket: Using this argument you can specify additional sockets from that syslogd has to listen to. This is needed if you're going to let some daemon run within a chroot() environment.
Conclusion: ajouter à /etc/defaut/syslog la ligne SYSLOGD="-a /home/sftp/dev" à /etc/defaut/syslog, puis redémarrer syslogd
#echo 'SYSLOGD="-a /home/sftp/dev"' >> /etc/defaut/syslog #/etc/init.d/sysklogd restart
Bon, c'est bon, on va avoir des logs, mais ils seront plus lisibles, si on créé un fichier de log pour sftp. Pour cela, on édite /etc/ssh/sshd_config , pour y faire apparaître les lignes
# Logging SyslogFacility LOCAL6 LogLevel INFO
et
Subsystem sftp /usr/lib/openssh/sftp-server -f LOCAL7 -l INFO
Puis, éditer syslog.conf, pour y ajouter les lignes:
local7.info /var/log/sftp local6.info /var/log/sftp_connexion
Et voila, vous pouvez consulter les logs de transferts de fichiers dans /var/log/sftp, et les logs de connexions dans /var/log/sftp_connexion.
Côté client: Filezilla
Configuration
A faire...
Utilisation
A faire...