Serveur sftp, shell réduit (rssh) et chroot

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

  1. Configuration du serveur ssh
  2. Configuration de rssh
    III Création du chroot
    IV Création des utilisateurs
    V Tests
  3. en local
  4. en réseau
    VI Les logs
  5. syslog
  6. rsyslog
  7. 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.

woaw quel tuto, super pour moi.

Merci. Essaye le si tu as le temps. Ce tuto est la transcription de notes qui datent un peu (qques mois), et j’ai peut-être zappé qques trucs (même s’il me semble que non, mais on n’est jamais sûr de rien…).

Que penses-tu de ce script.

viewtopic.php?f=1&t=27384

Ce n’est pas de moi.

À moins que ça aie changé depuis que j’ai essayé, tu dois indiquer dans rssh.conf que tu veux chrooter ! Soit (d’après trustonme.net/didactels/318.html) en ajoutant chrootpath=/chemin/vers/dossier, soit (d’après mon vieux script) en ajoutant une entrée par utilisateur indiquant le dossier de chroot.

Ceci expliquerait que tu n’aie pas eu besoin de copier sftp-server.
En revanche, comme je l’ai écrit quand j’ai publié le script, j’ai vu des tutos dans lesquels on copiait scp et sftp. Je n’ai pas eu besoin de le faire…

@kna: Pour scp, si je ne copie pas cette commande, c’est simplement dû au fait que je fais vraiment du ftp : mes utilisateurs (qui ont filezilla pour la plupart), ne se servent en fin de compte que de cd, get et put.
Après suivant l’usage de ce serveur, tu peux copier scp.
J’ai regardé ton script, et j’avais rencontré cette galère du /lib/libnss_files.so.2, qui effectivement n’apparait pas dans les dépendances de sftp.
C’est vrai que l’idée d’automatiser l’installation par un script est intéressante. Si tu dois faire plein d’install, c’est trés utile.
Le tuto de trustonme fait partie des tutos que j’ai consulté, mais dans celui-ci, nulle part il ne parle de /dev/null pour le chroot. Et sans ça, pas de ssh fonctionnel dans le chroot.

@kna: je viens de relire ton script, et tu dis:[quote]Dans les différents tutos que j’ai lu, ils copiaient aussi scp et sftp (ainsi que leurs libs). Mais apparement pas besoin.
[/quote]
Tu veux dire que ta remarque pour sftp-server le serait aussi pour sftp: l’ajout de chroot-path permet aussi de ne pas copier sftp dans le chroot ?

[edit]: bah apparemment oui: pas besoin de copier sftp dans le chroot: j’ai renommé /home/sftp/usr/bin/sftp en /home/sftp/usr/bin/sftp.old, et le serveur fonctionne nickel. Bon, je modifierai le tuto si ça se confirme (pas le temps maintenant) [/edit]

Alors, qques tests plus tard…
lorsqu’on utilise le script copie_binaire, il copie la commande, et ses dépendances. Apparemment, seul la copie des librairies dont dépend sftp est nécessaire (et pas sftp).
En faisant #./copie_binaire /usr/bin/sftp /home/sftp, on créé dans /home/sftp:
/home/sftp/usr (avec dans usr, les dossiers bin et lib)
/home/sftp/lib
Rmq: dans /home/sftp/usr n’apparaît que la commande sftp, et dans les autres les librairies dont dépend sftp.

Les tests:
mv /home/sftp/usr/bin /home/sftp/usr/bin.old --> serveur ok
mv /home/sftp/usr/lib /home/sftp/usr/lib.old --> serveur out
mv /home/sftp/lib /home/sftp/lib.old --> serveur out

Conclusion: seule la copie deslibrairies a l’air nécessaire.

Bon, c’est carrément empirique tout ça, ça demande plus de réflexions…

[quote=“yanlolot”]…
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 = 022” >> /etc/rssh.conf

[/quote]

022 ou 666 ?

[quote=“yanlolot”]
([i]Mes questions:

  • dans certains tuto, il est dit de copier dans le chroot sftp-server. Cela marche très bien chez moi sans cela. Quid ?
  • tjs à propos du chroot: j’ai mis mes utilisateurs dans certains groupes, et suivant les dossiers présents dans /home/sftp, ils ont ou non les droits. Tout se passe bien, mais je m’étonne de ne pas avoir eu à copier /etc/group dans le chroot.[/i])[/quote]
    Ben, quand il se connecte,le chrooté est déjà passé par la case /etc, sans le savoir et son pseudo est déjà connu comme faisant partie des groupes qui vont bien, non ?

Sinon, je trouve ce tuto très bien fait et je le testerai sitôt que possible.

Salut Ricardo
T’as raison pour le umask, autant être plus restricif: umask=066 (et peut être mettre une petite explication dans le tuto).
Qt au chroot, j’ai encore du mal a bien comprendre le fonctionnement: pourquoi ne rapatrier que les librairies, et pas la commande elle-même ? Pourquoi ne pas rappatrier /etc/group ? J’imagine le chroot comme un espace indépendant, autonome, et donc, pour moi, il est nécessaire d’y rapatrier tout ce qu’il faut pour que ça marche. Et apparemment, dans le “tout ce qu’il faut”, j’en mets de trop, et je ne comprends pas encore bien pourquoi.

Tu sais que venant de toi ça me fait trés plaisir ça…si, si j’t’assure :wink: :smiley:

[edit]Bon, dans la page de manuel de rssh, ils disent de lire le document CHROOT qui se trouve dans les soures de rssh. J’ai téléchargé ces sources, et commencé à lire ce doc. Ils redisent encore dedans:

[quote=“CHROOT”]Presumably, rssh detected the scp and sftp-server binaries in those locations,
and will be looking for them in those locations, RELATIVE TO THE ROOT OF THE
CHROOT JAIL. So you will need to copy these files into the chroot jail:

cp /usr/bin/scp /usr/chroot/usr/bin/scp

cp /usr/libexec/openssh/sftp-server /usr/chroot/usr/libexec/openssh/sftp-server

cp /usr/local/bin/rssh_chroot_helper /usr/chroot/usr/local/bin/rssh_chroot_helper

[/quote]
Ce que je ne fais pas dans le tuto…bizarre qd même non ? Bon, je vais lire ça avec plus d’attention, et je vous tiens au courant.[/edit]

J’ai plein de défauts, mais je sais reconnaître la valeur d’une chose, même si celle-ci vient de quelqu’un avec lequel je peux avoir des différends pour d’autres raisons.
À mon avis, seuls les imbéciles sont bornés et mélangent les genres.
Or, j’ai une bien trop grande estime de moi-même pour me croire imbécile :mrgreen: :mrgreen: :mrgreen:

Bon, j’ai apporté une correction au tuto: dans le II 1) conf de ssh: ajout de subsystem (je ne la mettais qu’en fin de tuto pour les logs).
Mes critiques sur mon tuto:
je suis convaincu que je n’effectue pas un véritable chroot des utilisateurs:
pour moi, avec un véritable chroot, non seulement les utilsateurs voient le répertoire “chrooté” (ici /home/sftp) comme racine (ça c’est ok), mais ttes les commandes qu’ils utilisent doivent être dans le chroot, et pas ailleurs (ça, c’est pas ok).
Lorsque je mets tout le nécessaire dans le chroot (commandes sftp, sftp-server et leurs dpdces…c’est ce qui est conseillé par les dev de rssh dans le doc CHROOT des sources de rssh), et que je renomme en .old ces mêmes commandes qui ne sont pas dans le chroot (histoire d’être sûr), je me fais envoyer promener par mon serveur (bon, ces temps ci, j’ai n pris l’habitude de me faire envoyer sur les roses :mrgreen: ). Je pense que c’est un pb de librairie que je n’ai pas rappatriée, je cherche encore…
Mais bon, pour l’instant ce tuto permet qd même d’avoir un sftp fonctionnel, mais un peu bancal je trouve…
A suivre…

[edit 1]Bon, voila où j’en suis:
je raptrie dans le chroot (avec les dpdces): sftp, sftp-server, rssh_chroot_helper, ssh.
indique à sshd où se trouve sftp-server: Subsystem sftp /home/sftp/usr/lib/openssh/sftp-server , redémarre sshd.
Je mets bien le setuid sur sftp-server et rssh_chroot_helper.
Je monte le nvx de log de sshd à debug,essaye le serveur: marche pô.Et voilà ce que me sort les logs de sshd:

[quote="/var/log/sftp_connexion"]May 19 16:05:06 bouzin sshd[12263]: Connection from 127.0.0.1 port 43809
May 19 16:05:06 bouzin sshd[12263]: Failed none for xxxxxx from 127.0.0.1 port 43809 ssh2
May 19 16:05:11 bouzin sshd[12263]: Accepted password for xxxxxx from 127.0.0.1 port 43809 ssh2
May 19 16:05:11 bouzin sshd[12263]: User child is on pid 12266
May 19 16:05:11 bouzin sshd[12266]: subsystem request for sftp
May 19 16:05:11 bouzin sshd[12266]: Connection closed by 127.0.0.1

May 19 16:05:11 bouzin sshd[12266]: Transferred: sent 1960, received 1424 bytes
May 19 16:05:11 bouzin sshd[12266]: Closing connection to 127.0.0.1 port 43809[/quote]
le mot de passe est accepté, et dès que sshd appelle sftp-server, la connection est fermée.
C’est sftp-server qui m’emmer$%@## (ou une de ses dpdces).
[/edit]

[edit 2]Bon, ça avance un peu: un strace sur sftp-server m’a donné qques trucs qu’il ouvre et qui ne font pas partie de ces dépendances ex: /etc/nsswitch.conf. Y en a qques uns (pas des caisses) comme ça. Vais rappatrier ça dans le chroot, pour voir.
A suivre…[/edit]

[edit 3]Bon, bah ça a pas suffit…Je ferais le même truc pour sftp, etc…mais pas maintenant…[/edit]

Juste qques mises à jours concernant squeeze:

  • ajout d’une librairie indispensable dans le chroot: /usr/lib/openssh/sftp-server
  • la gestion des log est passée de syslog (lenny) à rsyslog (squeeze), d’où quelques adaptations …

Bonjour,

J’ai réalisé ce tuto avec syslog-ng et j’ai un problème mes logs ont un décalage de deux heures.

J’utilise OpenNTPD pour le réglage de l’heure. Quand je fais un “date” tout est nickel. Mes logs “classiques” sont à la bonne heure.

Mais les logs du sftp sont décalés de deux heures…

Que faire ?

OS Debian Lenny

J’ai trouvé il faut copier /etc/localtime dans le chroot /chroot/etc/localtime !

Merci beaucoup pour ce tuto, je profite de la réinstall" de ma sid pour utiliser ce procéder sftp

Il est préférable de suivre ton tuto sur le wiki peut être??

@M3t4linux: non, il faut suivre ce tuto. Celui du wiki est plein de petites erreurs, pas à jour, et moins complet.
@Gervais: merci pour ta contribution. Je ne connaissais pas syslog-ng. Peux-tu indiquer ce que tu as dû faire pour avoir les logs avec syslog-ng (à part /etc/localtime dans le chroot /chroot/etc/localtime). Je le rajouterais dans le tuto (qd j’aurais le temps…)

Bon, j’ai suivis ton tuto est résultat : j’ai foutu man config’ sid en l’air!!! :imp:

Voici ce que j’ai en prompt :

Le user n’apparaît plus.

En tty, j’ai des messages d’erreurs notemment de fetchmail :

[quote]0:02 @localhost ~% fetchmail
fetchmail: You don’t exist. Go away.[/quote]

Comment revenir en arrière??

J’ai dû planter les fichiers passwd et group peut être???

Déjà, j’ai dû renommer le passwd à partir d’un live CD
Il avait été renommé en passwd~

De l’aide svp :010

Envoie nous le contenu de /etc/passwd.

[quote]root:x:0:0:root:/root:/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
Debian-exim:x:101:103::/var/spool/exim4:/bin/false
statd:x:102:65534::/var/lib/nfs:/bin/false
genpashiro:x:1000:1000:genpashiro,:/home/genpashiro:/bin/zsh
messagebus:x:103:106::/var/run/dbus:/bin/false
gdm:x:105:108:Gnome Display Manager:/var/lib/gdm:/bin/false
usbmux:x:106:46:usbmux daemon,:/home/usbmux:/bin/false
haldaemon:x:107:109:Hardware abstraction layer,:/var/run/hald:/bin/false
logcheck:x:108:111:logcheck system account,:/var/lib/logcheck:/bin/false
fetchmail:x:104:65534::/var/lib/fetchmail:/bin/false
sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
jerome:x:1001:1001::/home/jerome:/usr/bin/rssh[/quote]

Mon login est genpashiro