Salut à tous
Voilà un tuto sur la création d’un serveur sftp, dans lequel les utilisateurs seront “chrootés”, et munis d’un shell réduit.
J’ai fait ce tuto, car les 4 tutos trouvés sur le net ne fonctionnent pas lorsqu’ils sont pris séparément, et en font trop lorsqu’on les regroupe.
I Présentation
II Installation de openssh-server et rssh
- Configuration du serveur ssh
- Configuration de rssh
III Création du chroot
IV Création des utilisateurs
V Tests - en local
- en réseau
VI Les logs - syslog
- rsyslog
- conclusion
[size=150]I Présentation[/size]
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 couplerons 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 pourra 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).
[size=150]II Installation de openssh-server et rssh[/size]
On va tout simplement les installer avec aptitude, qui s’occupera d’installer les dépendances:
1. 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, et de rediriger le port si vous êtes derrière un routeur)
–> Dans la section authentification, on interdit la connection en tant que root:
–> Inutile dans notre cas d’activer le X11forwarding
–> On indique à sshd où se trouve sftp-server: sftp-server est appelé par sshd, et gère les requêtes sftp.
2. 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 lcd chgrp chmod chown help get lls ln lmkdir lpwd ls lumask mkdir put exit quit rename rmdir rm symlink version !command ! ?
Le fichier de configuration est /etc/rssh.conf Remplaçons celui créé lors de l’installation:
[code]# mv /etc/rssh.conf /etc/rssh.conf.old
echo “logfacility = LOG_USER” > /etc/rssh.conf
echo “allowsftp” >> /etc/rssh.conf
echo “umask = 066” >> /etc/rssh.conf
[/code]
[size=150]III Création du chroot [/size]
Nous allons “chrooter” nos futurs utilisateurs du serveur sftp dans un dossier, nous nous servirons dans notre cas de /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.
On va, pour ce faire, utiliser le script copie_binaire:
[quote=“copie_binaire”] #!/bin/bash
[size=85]#il prend en argument le chemin absolu de la commande à copier ($1), et le chemin absolu du dossier où il faut la copier ($2)[/size]
install -D $1 $2$1 [size=85] #copie de la commande dans le répertoire de destination (en y conservant l’arborescence)[/size]
for i in ldd $1 | grep -o '/[^[:space:]]*'
; do [size=85] #recherche des dépendances, et, pour chacune d’elles, n’en conserve que le chemin absolu (i)…[/size]
if [ ! -e $2$i ]; then install -D $i $2$i; fi [size=85] #…puis la copie dans le dossier destination (tjs en conservant l’arborescence)[/size]
done[/quote]
Ce script permet de copier un binaire et ses dépendances (et permet d’éviter de tout faire avec ldd et cp “à la main”).
On le rend au préalable executable: # chmod a+x ./copie_binaire
Copions donc sftp de la manière suivante:
Voila, sftp et ses dépendances sont dans /home/sftp.
Il faut en plus copier libnss-file.so.2:
–> Pour Wheezy, avec une archi 64 bits: #cp /lib/x86_64-linux-gnu/libnss_files.so.2 /home/sftp/lib/x86_64-linux-gnu/
–> Pour Wheezy, avec une archi 32 bits: #cp /lib/i386-linux-gnu/libnss_files.so.2 /home/sftp/lib/i386-linux-gnu/
–> Et pour les versions précédentes: #cp /lib/libnss_files.so.2 /home/sftp/lib
Il faut en plus copier /usr/lib/openssh/sftp-server dans le chroot (excepté si vous êtes sur une lenny/i386):
[code]# mkdir /home/sftp/usr/lib/openssh
cp /usr/lib/openssh/sftp-server /home/sftp/usr/lib/openssh/[/code]
–> 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:
[code]# cd /home/sftp
mkdir dev
#mknod dev/null c 1 3[/code] #chmod 666 dev/null
–> Placer le setuid sur le rssh_chroot_helper (et vérifier après chaque mise à jour de rssh qu’il y est toujours):
–> Ajouter ligne chrootpath /home/sftp dans rssh.conf
Bon, le chroot est prêt, ne manque plus que les clients…
[size=150]IV Création des utilisateurs[/size]
–> Créons l’utilisateur machin, futur client de notre serveur (en n’oubliant pas de lui donner comme shell 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
#mkdir /home/sftp/etc
#grep '^machin:' /etc/passwd >> /home/sftp/etc/passwd
–> et déclarons le comme utilisateur autorisé dans /etc/ssh/sshd_config:
#utilisateurs autorisés
AllowUsers machin
EDIT de Ricardo :
Ne pas oublier de mettre “machin” dans le groupe “sftp”
usermod -a -G sftp machin
[size=150]V Tests[/size]
Nous voilà presque prêt pour les tests. Il faut juste redémarrer sshd au préalable:
1. en local
Testons tout ça directement sur le serveur:
sur wheezy, squeeze:$ sftp -P 666 machin@localhost
sur lenny:$ sftp -oPort=666 machin@localhost
Après avoir entrer votre mot de passe, si tout va bien, vous devez avoir une invite de commande: >
2. en réseau
sur wheezy, squeeze:$ sftp -P 666 machin@IP_de_votre_serveur
sur lenny:$ sftp -oPort=666 machin@IP_de_votre_serveur
3. en cas de problèmes
- Vérifier la création du chroot (il manque peut être une librairie dans le chroot, vérification du passwd du chroot…)
- le port est-il ouvert sur le firewall ?
- les utilisateurs créés sont ils bien dans le passwd du chroot ?
[size=150]VI Les logs [/size]
Comme le dit man sftp-server:
[quote]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 (ou rsyslogd) (8)
establish a logging socket inside the chroot directory.[/quote]
2 cas vont se présenter: ou vous avez syslog pour gérer les logs, ou rsyslog.
[i][b]1. Syslog[/b][/i]
Comme le dit man syslogd:
[quote]-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.
[/quote]
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
(ça nous donnera les logs de sshd concernant les connexions )
et on rajoute -f LOCAL7 -l INFO à la ligne concernant le subsystem:
(ça nous donnera les logs de sftp-server concernant les transferts de fichiers)
On redémarre ssh: # /etc/init.d/ssh restart
Puis, éditer syslog.conf, pour y ajouter les lignes:
local7.info /var/log/sftp
local6.info /var/log/sshd
Puis on redémarre syslogd:
[i][b]2. rsyslog[/b][/i]
C’est la même procédure que pour syslog, mais pas la même syntaxe:
Ajouter $AddUnixListenSocket /home/sftp/dev/log dans /etc/rsyslog.conf (et vérifier que $ModLoad imuxsock est décommenté au début du fichier, sinon, le décommenter).
Redémarrer rsyslog et vérifier qu’il a bien créé /dev/log dans le chroot:
[code]#/etc/init.d/rsyslog restart
ls -al /home/sftp/dev/log
srw-rw-rw- 1 root root 0 7 sept. 11:34 /home/sftp/dev/log
[/code]
La suite de la procédure est identique au cas syslog:
Editer /etc/ssh/sshd_config , pour y faire apparaître les lignes
# Logging
SyslogFacility LOCAL6
LogLevel INFO
Rajouter -f LOCAL7 -l INFO à la ligne concernant le subsystem:
Redémarrer ssh: # /etc/init.d/ssh restart
Puis, éditer rsyslog.conf, pour y ajouter les lignes:
local7.info /var/log/sftp
local6.info /var/log/sshd
Puis on redémarre rsyslog:
3. Conclusion
Vous pouvez consulter les logs de transferts de fichiers dans /var/log/sftp, et les logs de connexions dans /var/log/sshd.