« Serveur sftp +rssh+chroot » : différence entre les versions

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche
m (→‎Création du chroot : changé balise <code bash> en <pre>)
 
(24 versions intermédiaires par 6 utilisateurs non affichées)
Ligne 3 : Ligne 3 :
sftp est un programme similaire à ftp, mais au dessus d'un tunnel ssh. Il a donc toutes les fonctionnalités de ftp, mais avec la sécurité de ssh en plus (cryptage des logins, mots de passe et des transferts de données).<br>  
sftp est un programme similaire à ftp, mais au dessus d'un tunnel ssh. Il a donc toutes les fonctionnalités de ftp, mais avec la sécurité de ssh en plus (cryptage des logins, mots de passe et des transferts de données).<br>  


*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 pourront avoir de conséquences à l'extérieur de ce dossier.<br>  
*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 répertoire de notre serveur. Aucune de leurs actions ne pourront avoir de conséquences à l'extérieur de ce répertoire.<br>  
*Côté client:Afin d'utiliser un serveur sftp, le client doit avoir un client sftp (sftp en ligne de commande ou filezilla).<br>
*Côté client:Afin d'utiliser un serveur sftp, le client doit avoir un client sftp (sftp en ligne de commande ou filezilla).<br>


Ligne 10 : Ligne 10 :
On va tout simplement les installer avec aptitude, qui s'occupera d'installer les dépendances :  
On va tout simplement les installer avec aptitude, qui s'occupera d'installer les dépendances :  


  #aptitude install openssh-server rssh  
  # aptitude install openssh-server rssh  


=== Configuration du serveur ssh  ===
=== Configuration du serveur ssh  ===
Ligne 25 : Ligne 25 :
* Dans la section authentification, on interdit la connexion en tant que root :
* Dans la section authentification, on interdit la connexion en tant que root :


# PermitRootLogin no
  PermitRootLogin no


* Inutile dans notre cas d'activer le X11forwarding :
* Inutile dans notre cas d'activer le X11forwarding :


#X11Forwarding no
  X11Forwarding no
* On indique à sshd où se trouve sftp-server: sftp-server est appelé par sshd, et gère les requêtes sftp.
 
  Subsystem sftp /usr/lib/openssh/sftp-server


=== Configuration de rssh ===
=== Configuration de rssh ===
Ligne 71 : Ligne 74 :
= Création du chroot =
= 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:<br>  
Nous allons "chrooter" nos futurs utilisateurs du serveur sftp dans un répertoire, nous nous servirons dans notre cas de /home/sftp:<br>  


  #mkdir /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).<br>  
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).<br>  
Ligne 81 : Ligne 84 :
Il va donc falloir installer dans le chroot la commande sftp et ses dépendances, ainsi que sftp-server.<br> On va, pour ce faire, utiliser le script copie_binaire :  
Il va donc falloir installer dans le chroot la commande sftp et ses dépendances, ainsi que sftp-server.<br> On va, pour ce faire, utiliser le script copie_binaire :  


#!/bin/bash
<pre>
install -D $1 $2$1
#!/bin/bash
for i in `ldd $1 | grep -o '/[^[:space:]]*'`; do  
install -D $1 $2$1
        if [&nbsp;! -e $2$i ]; then install -D $i $2$i; fi
for i in `ldd $1 | grep -o '/[^[:space:]]*'`; do  
done
      if [ ! -e $2$i ]; then install -D $i $2$i; fi
done
</pre>


Ce script permet de copier un binaire et ses dépendances (et permet d'éviter de tout faire avec ldd et cp "à la main").<br> Copions donc sftp de la manière suivante :  
Ce script permet de copier un binaire et ses dépendances (et permet d'éviter de tout faire avec ldd et cp "à la main").<br>
On le rend au préalable executable:


  #./copie_binaire /usr/bin/sftp /home/sftp
# chmod a+x ./copie_binaire
 
Copions donc sftp et ses dépendances de la manière suivante :
 
  # ./copie_binaire /usr/bin/sftp /home/sftp


Voilà, sftp et ses dépendances sont dans /home/sftp (plus précisément dans /home/sftp/usr et /home/sftp/lib).<br>
Voilà, sftp et ses dépendances sont dans /home/sftp (plus précisément dans /home/sftp/usr et /home/sftp/lib).<br>
Il faut en plus copier libnss-file.so.2 :  
Il faut en plus copier libnss-file.so.2 :  


  #cp /lib/libnss-file.so.2 /home/sftp/lib
  # cp /lib/libnss_files.so.2 /home/sftp/lib
   
   
Excepté si vous êtes sur une lenny/i386 , il faut en plus copier /usr/lib/openssh/sftp-server dans le chroot (a faire donc si vous êtes sur lenny/amd64 ou squeeze):
Code:
# mkdir /home/sftp/usr/lib/openssh
# cp  /usr/lib/openssh/sftp-server /home/sftp/usr/lib/openssh/


* création de /dev/null dans le chroot
* création de /dev/null dans le chroot
Ligne 101 : Ligne 115 :
Pour le bon fonctionnement de sftp, il est nécessaire d'avoir un 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
# cd /home/sftp
# mkdir dev
  # mknod dev/null c 1 3
  # chmod 666 dev/null


* Placer le setuid sur le rssh_chroot_helper
* Placer le setuid sur le rssh_chroot_helper


  #chmod u+s /usr/lib/rssh/rssh_chroot_helper
  # chmod u+s /usr/lib/rssh/rssh_chroot_helper


* Ajouter ligne chrootpath /home/sftp dans rssh.conf
* Ajouter ligne chrootpath /home/sftp dans rssh.conf


  # echo 'chrootpath = "/home/sftp"' &gt;&gt; /etc/rssh.conf
  # echo 'chrootpath = "/home/sftp"' >> /etc/rssh.conf


Bon, le chroot est prêt, ne manquent plus que les clients...
Bon, le chroot est prêt, ne manquent plus que les clients...
Ligne 117 : Ligne 134 :
* créons l'utilisateur machin, futur client de notre serveur (en n'oubliant pas de lui donner comme shell rssh)
* 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
  # 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.  
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.  
Ligne 123 : Ligne 140 :
* ajoutons cet utilisateur dans le fichier passwd du chroot
* ajoutons cet utilisateur dans le fichier passwd du chroot


  #grep machin /etc/passwd &gt; /home/sftp/etc/passwd
# mkdir /home/sftp/etc
  # grep '^machin:' /etc/passwd >> /home/sftp/etc/passwd
 
* Déclarons le comme utilisateur autorisé dans /etc/ssh/sshd_config:
#utilisateurs autorisés
  AllowUsers machin


= Tests =
= Tests =
 
Nous voilà presque prêt pour les tests. Il faut juste redémarrer sshd au préalable:
# /etc/init.d/ssh restart
=== en local ===
=== en local ===


Testons tout ça directement sur le serveur :  
Testons tout ça directement sur le serveur :  


$ sftp machin@localhost
--> sur lenny:
 
  $ sftp -oPort=666 machin@localhost
 
--> sur squeeze:
 
  $ sftp -P 666 machin@localhost


Après avoir entré votre mot de passe, si tout va bien, vous devez avoir une invite de commande&nbsp;:  
Après avoir entré votre mot de passe, si tout va bien, vous devez avoir une invite de commande&nbsp;:  
Ligne 139 : Ligne 168 :
=== en réseau ===
=== en réseau ===


  $ sftp machin@IP_de_votre_serveur
--> sur lenny:
  $ sftp -oPort=666 machin@IP_de_votre_serveur
 
--> sur squeeze:
$ sftp -P 666 machin@IP_de_votre_serveur


=== en cas de problèmes ===
=== en cas de problèmes ===
Ligne 154 : Ligne 187 :
  establish a logging socket inside the chroot directory.
  establish a logging socket inside the chroot directory.


d'où, comme le dit man syslogd :


=== syslog ===
Comme le dit man syslogd :
  -a socket: Using this argument you can specify additional sockets from that syslogd has to listen to.
  -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.
             This is needed if you're going to let some  daemon  run within a chroot() environment.
Ligne 164 : Ligne 198 :
  #/etc/init.d/sysklogd restart
  #/etc/init.d/sysklogd restart


Bon, c'est bon, on va avoir des logs, mais ils seront plus lisibles, si on crée un fichier de log pour sftp. Pour cela, on édite /etc/ssh/sshd_config , pour y faire apparaître les lignes :
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
  # Logging
Ligne 170 : Ligne 204 :
  LogLevel INFO  
  LogLevel INFO  


et  
(ça nous donnera les logs de sshd concernant les connexions )
et on rajoute -f LOCAL7 -l INFO à la ligne concernant le subsystem:


  Subsystem sftp /usr/lib/openssh/sftp-server -f LOCAL7 -l INFO
  Subsystem sftp /usr/lib/openssh/sftp-server -f LOCAL7 -l INFO
Ligne 179 : Ligne 214 :
  local6.info /var/log/sftp_connexion
  local6.info /var/log/sftp_connexion


Et voilà, vous pouvez consulter les logs de transferts de fichiers dans /var/log/sftp, et les logs de connexions dans /var/log/sftp_connexion.
Puis on redémarre syslogd:
#/etc/init.d/sysklogd restart
 
=== rsyslog ===
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:
#/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
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:
Subsystem sftp /usr/lib/openssh/sftp-server -f LOCAL7 -l INFO
 
Redémarrer sshd:
# /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:
#/etc/init.d/rsyslog restart
 
=== Conclusion ===
Vous pouvez consulter les logs de transferts de fichiers dans /var/log/sftp, et les logs de connexions dans /var/log/sshd.
 
=Côté client: Filezilla=
=Côté client: Filezilla=
===Configuration===
===Configuration===

Dernière version du 13 février 2019 à 11:51

Présentation

sftp est un programme similaire à ftp, mais au dessus d'un tunnel ssh. Il a donc toutes les fonctionnalités 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 répertoire de notre serveur. Aucune de leurs actions ne pourront avoir de conséquences à l'extérieur de ce répertoire.
  • 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

Remarque: N'oubliez pas d'ouvrir le port dans votre firewall, et de rediriger le port de votre routeur (si vous êtes derrière un routeur) vers votre serveur.

  • Dans la section authentification, on interdit la connexion en tant que root :
 PermitRootLogin no
  • Inutile dans notre cas d'activer le X11forwarding :
 X11Forwarding no
  • On indique à sshd où se trouve sftp-server: sftp-server est appelé par sshd, et gère les requêtes sftp.
  Subsystem sftp /usr/lib/openssh/sftp-server

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 à toutes 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 répertoire, 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").
On le rend au préalable executable:

# chmod a+x ./copie_binaire

Copions donc sftp et ses dépendances de la manière suivante :

# ./copie_binaire /usr/bin/sftp /home/sftp

Voilà, 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_files.so.2 /home/sftp/lib

Excepté si vous êtes sur une lenny/i386 , il faut en plus copier /usr/lib/openssh/sftp-server dans le chroot (a faire donc si vous êtes sur lenny/amd64 ou squeeze): Code:

# mkdir /home/sftp/usr/lib/openssh
# cp  /usr/lib/openssh/sftp-server /home/sftp/usr/lib/openssh/
  • 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 :

# cd /home/sftp
# mkdir dev
# 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 manquent 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
# mkdir /home/sftp/etc
# grep '^machin:' /etc/passwd >> /home/sftp/etc/passwd
  • Déclarons le comme utilisateur autorisé dans /etc/ssh/sshd_config:
#utilisateurs autorisés
 AllowUsers machin

Tests

Nous voilà presque prêt pour les tests. Il faut juste redémarrer sshd au préalable:

# /etc/init.d/ssh restart

en local

Testons tout ça directement sur le serveur :

--> sur lenny:

  $ sftp -oPort=666 machin@localhost

--> sur squeeze:

  $ sftp -P 666 machin@localhost

Après avoir entré votre mot de passe, si tout va bien, vous devez avoir une invite de commande :

sftp>

en réseau

--> sur lenny:

$ sftp -oPort=666 machin@IP_de_votre_serveur

--> sur squeeze:

$ sftp -P 666 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.


syslog

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 

(ça nous donnera les logs de sshd concernant les connexions ) et on rajoute -f LOCAL7 -l INFO à la ligne concernant le subsystem:

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

Puis on redémarre syslogd:

#/etc/init.d/sysklogd restart

rsyslog

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:

#/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

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:

Subsystem sftp /usr/lib/openssh/sftp-server -f LOCAL7 -l INFO

Redémarrer sshd:

# /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:

#/etc/init.d/rsyslog restart

Conclusion

Vous pouvez consulter les logs de transferts de fichiers dans /var/log/sftp, et les logs de connexions dans /var/log/sshd.

Côté client: Filezilla

Configuration

A faire...

Utilisation

A faire...