SysFailure

Imprimer

Restriction de connexions SSH

.

Il est souvent utile de pouvoir restreindre les possibilités d'un (ou de plusieurs) utilisateurs qui ont accès à un système via SSH. Le cas le plus courant est de n'autoriser que des transferts de fichiers, via scp ou sftp, et d'interdire toute connexion interactive. Il existe plusieurs outils pour cela, nous décrivons ici RSSH.

Principe de RSSH

Le principe sous-jacent à RSSH est simple : il s'agit d'un interpréteur de commandes, dont les fonctionnalités sont réduites à autoriser uniquement des transferts de fichiers (scp, sftp, cvs, rdist ou rsync). L'activation de RSSH se fait en le définissant comme interpréteur de commandes pour les utilisateurs concernés :

$ grep rssh /etc/passwd
restreint:x:1002:1003:Test Rssh:/home/restreint:/usr/bin/rssh

Il faut s'assurer que l'exécutable /usr/bin/rssh fait partie des interpréteurs de commandes autorisés pour les connexions à distance (si vous utilisez le module pam_shells ou équivalent) :

auth  required   pam_tally.so file=/var/log/faillog onerr=succeed
auth required pam_shells.so
auth required pam_nologin.so
auth include system-auth

Le fichier /etc/shells contient la liste des interpréteurs de commandes autorisés :

$ cat /etc/shells
# /etc/shells: valid login shells
/bin/bash
/bin/sh
# Pour RSSH
/usr/bin/rssh

Configuration de RSSH

Le fichier rssh.conf (souvent situé dans le répertoire /etc, mais cela dépend de votre configuration locale) permet de définir le comportement de RSSH sur une connexion entrante. Par défaut, toutes les connexions sont interdites :

$ cat /etc/rssh.conf
logfacility = LOG_USER

#allowscp
#allowsftp
#allowcvs
#allowrdist
#allowrsync

umask = 077

Dans une telle situation, toute tentative de connexion (ssh, scp, sftp ou autre) sur un compte dont l'interpréteur de commandes est rssh est vouée à l'échec :

$ ssh master.ba-cst.org -l restreint
Password:
This account is restricted by rssh.
This user is locked out.

If you believe this is in error, please contact your system administrator.
Connection to master.ba-cst.org closed.
$ sftp restreint @ master.ba-cst.org
Connecting to master.ba-cst.org
Password:
Couldn't read packet: Connection reset by peer
$ scp restreint @ master.ba-cst.org:fichier /tmp
Password:

This account is restricted by rssh.
This user is locked out.

If you believe this is in error, please contact your system administrator.

Pour autoriser un type de connexion, il suffit d'insérer la directive allowxyz appropriée dans le fichier rssh.conf (où xyz correspond au type de transferts de fichier que vous souhaitez autoriser) :

$ cat /etc/rssh.conf
logfacility = LOG_USER

#allowscp
allowsftp
#allowcvs
#allowrdist
#allowrsync

umask = 077

Dans l'exemple ci-dessus, seul sftp est autorisé.


Mise en cage des utilisateurs RSSH

Outre la restriction des possibilités de RSSH aux seuls transferts de fichiers, il peut se révéler pertinent d'empêcher les utilisateurs connectés de voir quoi que ce soit au-delà de leur répertoire de connexion. Cela se fait par la mise en cage des processus, afin de ne leur donner qu'une visibilité très partielle et limitée sur le système de fichiers du serveur.

Attention : afin de ne traiter qu'une seule difficulté à la fois, ne tentez une mise en cage de RSSH qu'après avoir vérifié que la restriction des connexions fonctionne correctement "hors cage".

Configuration de RSSH pour une mise en cage des processus

Il suffit d'ajouter une simple directive dans le fichier rssh.conf, pour indiquer le répertoire racine de la mise en cage :

chrootpath = /home/cages

La définition des utilisateurs doit indiquer le chemin vers les répertoires de connexion "hors cage" :

$ grep rssh /etc/passwd
restreint:x:1002:1003:Test Rssh:/home/cages/restreint:/usr/bin/rssh

Création et remplissage de la cage

Comme bien souvent, la construction de la cage se révèle la partie la plus délicate du travail. Il faut

  1. que tous les fichiers nécessaires soient présents dans la cage, et
  2. uniquement les fichiers nécessaires.

Voici le contenu complet d'une cage fonctionnelle pour RSSH (sous Linux Gentoo) :

$ find . -ls
drwxr-xr-x 7 root root 4096 May 12 22:22 .
drwxr-xr-x 4 root root 4096 May 12 19:17 ./usr
drwxr-xr-x 2 root root 4096 May 12 21:52 ./usr/bin
-rwxr-xr-x 1 root root 50820 May 12 21:52 ./usr/bin/scp
drwxr-xr-x 3 root root 4096 May 12 19:17 ./usr/lib
drwxr-xr-x 2 root root 4096 May 12 21:42 ./usr/lib/misc
-rwxr-xr-x 1 root root 50772 May 12 19:17 ./usr/lib/misc/sftp-server
drwxr-xr-x 2 root root 4096 May 12 21:49 ./lib
-r-xr-xr-x 1 root root 71296 May 12 19:14 ./lib/libresolv.so.2
-r-xr-xr-x 1 root root 286652 May 12 19:14 ./lib/libssl.so.0.9.8
-r-xr-xr-x 1 root root 1348028 May 12 19:14 ./lib/libcrypto.so.0.9.8
-r-xr-xr-x 1 root root 9604 May 12 19:14 ./lib/libdl.so.2
-r-xr-xr-x 1 root root 9612 May 12 19:14 ./lib/libutil.so.1
-r-xr-xr-x 1 root root 70600 May 12 19:14 ./lib/libz.so.1
-r-xr-xr-x 1 root root 79540 May 12 19:14 ./lib/libnsl.so.1
-r-xr-xr-x 1 root root 38224 May 12 19:14 ./lib/libcrypt.so.1
-r-xr-xr-x 1 root root 1315100 May 12 19:14 ./lib/libc.so.6
-r-xr-xr-x 1 root root 121292 May 12 19:14 ./lib/ld-linux.so.2
-r-xr-xr-x 1 root root 38332 May 12 21:41 ./lib/libnss_files.so.2
drwxr-xr-x 2 root root 4096 May 12 22:21 ./dev
crw-rw-rw- 1 root root May 12 19:15 ./dev/null
srw-rw-rw- 1 root root 0 May 12 19:47 ./dev/log
crw-rw-rw- 1 root root May 12 19:59 ./dev/zero
drwxr-xr-x 2 root root 4096 May 12 21:47 ./etc
-r--r--r-- 1 root root 2005 May 12 19:39 ./etc/passwd
-r--r--r-- 1 root root 485 May 12 20:41 ./etc/nsswitch.conf
-r--r--r-- 1 root root 983 May 12 19:39 ./etc/group
-r--r--r-- 1 root root 82507 May 12 19:42 ./etc/ld.so.cache
-r--r--r-- 1 root root 302 May 12 19:42 ./etc/ld.so.conf
-r--r--r-- 1 root root 41 May 12 19:50 ./etc/resolv.conf
-r--r--r-- 1 root root 2945 May 12 20:00 ./etc/localtime

Les fichiers dans le répertoire ./etc de la cage sont importants. Les deux fichiers passwd et group ne doivent bien entendu contenir que les informations associées aux utilisateurs de la cage. Il est à noter que les chemins d'accès et l'interpréteur de commandes peuvent être inexacts :

$ cat passwd
restreint:x:1002:1003:Test Rssh:/quelque-chose:/rien/du/tout
$ cat group
restreint:x:1003:

Le fichier ./etc/localtime est une copie de celui présent dans le véritable répertoire /etc. Il permet de s'assurer que la journalisation qui sera faite utilisera le même fuseau horaire que pour tous les processus hors cage du système. Le fichier nsswitch.conf doit être édulcoré :

$ cat nsswitch.conf
passwd: files
shadow: files
group: files

hosts: files dns
networks: files dns

Ce fichier nsswitch.conf impose indirectement la présente de libnss_files.so dans la cage. Pour les autres bibliothèques partagées à placer dans la cage, il suffit de faire (par exemple) :

$ ldd `which scp`
linux-gate.so.1 => (0xb808e000)
libresolv.so.2 => /lib/libresolv.so.2 (0xb8047000)
libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0xb8000000)
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0xb7eb4000)
libdl.so.2 => /lib/libdl.so.2 (0xb7eb0000)
libutil.so.1 => /lib/libutil.so.1 (0xb7eac000)
libz.so.1 => /lib/libz.so.1 (0xb7e9a000)
libnsl.so.1 => /lib/libnsl.so.1 (0xb7e82000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7e50000)
libc.so.6 => /lib/libc.so.6 (0xb7d0d000)
/lib/ld-linux.so.2 (0xb8072000)

Les deux fichiers ./dev/null et ./dev/zero sont nécessaires, et doivent être créés à l'aide de mknod :

# mknod null c 1 3
# mknod zero c 1 5

Le fichier ./dev/log est créé automatiquement par syslog (option -a) ou syslog-ng (directive src/unix-stream), selon l'outil dont vous vous servez pour la journalisation.

Protections entre utilisateurs

L'objectif de la mise en cage est d'éviter qu'un utilisateur ne puisse voir plus de fichiers que nécessaire : sa vision est limitée au contenu de la cage. Il est donc nécessaire de bien configurer les droits d'accès aux différents fichiers et répertoires présents dans la cage. Les répertoires des utilisateurs doivent donc être protégés (mode 0755 au minimum, 0700 si possible). Il en est de même pour les répertoires "techniques" de la cage (./dev, ./etc et autres), dont le contenu doit être lisible mais ne doit pas être modifiable : mode 0755 ou 0555 pour les répertoires, 0555 pour les exécutables, 0444 pour les fichiers de configuration.