Product SiteDocumentation Site

B.7. Environnement de chroot pour SSH

Créer un environnement restreint pour SSH est un travail difficile à cause de ses dépendances et du fait que, à la différence d'autres serveurs, SSH fournit un interpréteur de commande distant pour les utilisateurs. C'est pourquoi vous devrez également considérer les applications que les utilisateurs auront le droit d'utiliser dans l'environnement.
Deux options existent pour configurer une invite de commande à distance restreinte :
  • chrooter les utilisateurs SSH, en configurant correctement le démon SSH pour chrooter un utilisateur après l'authentification juste avant de lui fournir une invite de commande. Chaque utilisateur peut avoir son propre environnement ;
  • chrooter le serveur SSH, puisque l'application SSH est elle même chrootée, tous les utilisateurs sont chrootés dans l'environnement défini.
La première option a l'avantage de permettre d'avoir à la fois des utilisateurs chrootés ou non, en absence d'application setuid dans les chroots de l'utilisateur, il est plus difficile de s'en échapper. Cependant, vous pourriez configurer des chroots spécifiques à chaque utilisateur ce qui est plus délicat (car cela nécessite une coopération de la part du serveur SSH). La seconde option est plus facile à configurer, et protège d'une exploitation du serveur SH lui-même (puisqu'il est également dans le chroot) mais il sera limité de telle sorte que tous les utilisateurs partageront le même environnement chroot (impossible de configurer un environnement chroot par utilisateur).

B.7.1. Chrooter les utilisateur SSH

Le serveur SSH peut être configuré pour chrooter un ensemble d'utilisateurs définis dans une invite de commande possédant un jeu d'applications disponibles limité.

B.7.1.1. Utilisation de libpam-chroot

La façon probablement la plus facile est d'utiliser le paquet libpam_chroot fourni dans Debian. Une fois que vous l'avez installé, vous devez :
  • modifier /etc/pam.d/ssh pour utiliser ce module PAM, ajouter cette ligne à la fin du fichier[89] :
    session    required   pam_chroot.so
  • configurer un environnement de chroot correct. Vous pouvez essayer d'utiliser les scripts disponibles en /usr/share/doc/libpam-chroot/examples/, utiliser le programme makejail[90] ou mettre en place un environnement Debian minimal avec debootstrap. Assurez-vous que l'environnement contient les périphériques nécessaires[91].
  • configurer /etc/security/chroot.conf pour que les utilisateurs que vous déterminez soient chrootés dans le répertoire que vous avez mis en place auparavant. Vous pouvez vouloir ajouter des répertoires indépendants pour différents utilisateurs afin qu'ils ne puissent voir ni le système complet, ni les uns les autres ;
  • configurer SSH : suivant la version d'OpenSSH, l'environnement chroot pourrait fonctionner directement sans effort, ou non. Depuis 3.6.1p2 la fonction do_pam_session() est appelée après que sshd ait abandonné ses droits, mais puisque chroot() a besoin des droits du superutilisateur, il ne fonctionnera pas avec la séparation de droits activés. Dans les versions plus récentes d'OpenSSH, cependant, le code PAM a été modifié et do_pam_session est appelé avant l'abandon des droits donc il fonctionnera même avec la séparation de droits activée. Si vous devez le désactiver, modifiez /etc/ssh/sshd_config ce cette façon :
    UsePrivilegeSeparation no
    Notez que cela réduira la sécurité de votre système car le serveur OpenSSH fonctionnera avec l'utilisateur root. Cela veut dire que si une attaque à distance est trouvée sur OpenSSH, un attaquant obtiendra les droits de root au lieu de ceux de sshd, ce qui compromettra le système en entier. [92]
Sans désactiver la séparation de droits, un /etc/passwd qui intègre l'UID de l'utilisateur dans le chroot sera nécessaire pour faire fonctionner correctement la séparation de droits.
Si la séparation de droits est définie à yes est que la version d'OpenSSH ne se comporte pas correctement, il faudra la désactiver. Si non, les utilisateurs qui essayent de se connecter au serveur et en étant chrootés par ce module verront ceci :
$ ssh -l user server
user@server's password:
Connection to server closed by remote host.
Connection to server closed.
C'est parce que le démon SSH, qui est exécuté en tant que « sshd », n'est pas capable de faire l'appel système chroot(). Pour désactiver la séparation de droits, il faut modifier les fichier de configuration /etc/ssh/sshd_config comme décrit précédemment.
Remarquez qu'en absence d'un des éléments suivants, les utilisateurs ne pourront pas se connecter au chroot :
  • le système de fichiers /proc doit être monté dans le chroot des utilisateurs ;
  • les périphériques /dev/pts/ nécessaires doivent exister. Si les fichiers sont créés automatiquement par le noyau utilisé, il faut les créer vous-même dans le /dev/ du chroot ;
  • le répertoire personnel de l'utilisateur doit exister dans le chroot, sinon le démon SSH s'arrêtera.
Tous ses problèmes peuvent être débogués en utilisant le mot-clef debug dans la définition PAM de /etc/pam.d/ssh. En cas de problème, il peut être utile d'activer aussi le mode de débogage sur le client.
Note : ces renseignements sont également disponibles (et peut-être plus à jour) dans /usr/share/doc/libpam-chroot/README.Debian.gz, veuillez consulter ce fichier pour obtenir des renseignements à jour avant d'entreprendre les étapes ci-dessus.

B.7.1.2. Appliquer des correctifs au serveur SSH

Le serveur sshd de Debian ne vous autorisera pas à restreindre les mouvements des utilisateurs par le serveur étant donné que celui-ci est dépourvu de la fonction chroot que le programme commerciale sshd2 possède (utilisation de « ChrootGroups » ou « ChrootUsers », consultez sshd2_config(5)). Toutefois, un correctif est disponible pour le faire sur le http://bugs.debian.org/139047. Il sera peut-être appliquée au paquet OpenSSH dans le futur. Emmanuel Lacour dispose de paquets Debian ssh pour Sarge avec cette fonctionnalité. Ils sont disponibles à http://debian.home-dn.net/sarge/ssh/. Notez que ceux-ci peuvent ne pas être à jour, effectuer l'étape de compilation est donc recommandé.
Après avoir appliqué le correctif, modifiez /etc/passwd en changeant le chemin du répertoire des utilisateurs (avec l'indicateur spécial /./) :
  utilisateurjean:x:1099:1099:Jean Dupont Utilisateur:/home/michel/./:/bin/bash
Cela restreindra à la fois les accès distants au shell, ainsi que la copie par le tunnel ssh.
Assurez-vous que tous les programmes et bibliothèques sont bien présents dans le chemin chrooté pour les utilisateurs. Ces fichiers devraient appartenir à root pour éviter les fraudes de l'utilisateur (tel la sortie d'une prison chrooté). Un échantillon pourrait inclure ceci :
./bin:
total 660
drwxr-xr-x    2 root     root         4096 mars  18 13:36 .
drwxr-xr-x    8 guest    guest        4096 mars  15 16:53 ..
-r-xr-xr-x    1 root     root       531160 févr. 6 22:36 bash
-r-xr-xr-x    1 root     root        43916 nov.  29 13:19 ls
-r-xr-xr-x    1 root     root        16684 nov.  29 13:19 mkdir
-rwxr-xr-x    1 root     root        23960 mars  18 13:36 more
-r-xr-xr-x    1 root     root         9916 juil. 26  2001 pwd
-r-xr-xr-x    1 root     root        24780 nov.  29 13:19 rm
lrwxrwxrwx    1 root     root            4 mars  30 16:29 sh -> bash
./etc:
total 24
drwxr-xr-x    2 root     root         4096 mars  15 16:13 .
drwxr-xr-x    8 guest    guest        4096 mars  15 16:53 ..
-rw-r--r--    1 root     root           54 mars  15 13:23 group
-rw-r--r--    1 root     root          428 mars  15 15:56 hosts
-rw-r--r--    1 root     root           44 mars  15 15:53 passwd
-rw-r--r--    1 root     root           52 mars  15 13:23 shells
./lib:
total 1848
drwxr-xr-x    2 root     root         4096 mars  18 13:37 .
drwxr-xr-x    8 guest    guest        4096 mars  15 16:53 ..
-rwxr-xr-x    1 root     root        92511 mars  15 12:49 ld-linux.so.2
-rwxr-xr-x    1 root     root      1170812 mars  15 12:49 libc.so.6
-rw-r--r--    1 root     root        20900 mars  15 13:01 libcrypt.so.1
-rw-r--r--    1 root     root         9436 mars  15 12:49 libdl.so.2
-rw-r--r--    1 root     root       248132 mars  15 12:48 libncurses.so.5
-rw-r--r--    1 root     root        71332 mars  15 13:00 libnsl.so.1
-rw-r--r--    1 root     root        34144 mars  15 16:10 libnss_files.so.2
-rw-r--r--    1 root     root        29420 mars  15 12:57 libpam.so.0
-rw-r--r--    1 root     root       105498 mars  15 12:51 libpthread.so.0
-rw-r--r--    1 root     root        25596 mars  15 12:51 librt.so.1
-rw-r--r--    1 root     root         7760 mars  15 12:59 libutil.so.1
-rw-r--r--    1 root     root        24328 mars  15 12:57 libwrap.so.0
./usr:
total 16
drwxr-xr-x    4 root     root         4096 mars  15 13:00 .
drwxr-xr-x    8 guest    guest        4096 mars  15 16:53 ..
drwxr-xr-x    2 root     root         4096 mars  15 15:55 bin
drwxr-xr-x    2 root     root         4096 mars  15 15:37 lib
./usr/bin:
total 340
drwxr-xr-x    2 root     root         4096 mars  15 15:55 .
drwxr-xr-x    4 root     root         4096 mars  15 13:00 ..
-rwxr-xr-x    1 root     root        10332 mars  15 15:55 env
-rwxr-xr-x    1 root     root        13052 mars  15 13:13 id
-r-xr-xr-x    1 root     root        25432 mars  15 12:40 scp
-rwxr-xr-x    1 root     root        43768 mars  15 15:15 sftp
-r-sr-xr-x    1 root     root       218456 mars  15 12:40 ssh
-rwxr-xr-x    1 root     root         9692 mars  15 13:17 tty
./usr/lib:
total 852
drwxr-xr-x    2 root     root         4096 mars  15 15:37 .
drwxr-xr-x    4 root     root         4096 mars  15 13:00 ..
-rw-r--r--    1 root     root       771088 mars  15 13:01 libcrypto.so.0.9.6
-rw-r--r--    1 root     root        54548 mars  15 13:00 libz.so.1
-rwxr-xr-x    1 root     root        23096 mars  15 15:37 sftp-server

B.7.2. Chrooter le serveur SSH

Si un chroot est créé pour inclure les fichiers du serveur SSH, par exemple /var/chroot/ssh, le serveur SSH chrooté serait démarré avec cette commande :
  # chroot /var/chroot/ssh /sbin/sshd -f /etc/sshd_config
Cela ferait démarrer le démon sshd dans le chroot. Pour faire cela, il faut d'abord préparer le contenu du répertoire /var/chroot/ssh pour inclure à la fois le serveur SSH et tous les utilitaires dont les utilisateurs se connectant à ce serveur pourraient avoir besoin. Dans ce cas, vous devez vous assurer qu'OpenSSH utilise la séparation de droits (ce qui est le cas par défaut) en ayant la ligne suivante dans le fichier de configuration /etc/ssh/sshd_config :
UsePrivilegeSeparation yes
De cette façon, le démon distant fera aussi peu de choses que possible de même que le superutilisateur donc même en cas de bogue, le chroot ne sera pas compromis. Remarquez que, contrairement au cas de la configuration d'un chroot par utilisateur, le démon SSH est exécuté dans le même chroot que les utilisateurs, donc il y a au moins un processus potentiel exécuté en tant que superutilisateur qui pourrait s'échapper du chroot.
Remarquez aussi que pour permettre à SSH de fonctionner à cet endroit, la partition où le répertoire du chroot existe ne doit pas être montée avec l'option nodev. Avec cette option, l'erreur suivante se produira : PRNG is not seeded car /dev/urandom ne fonctionne pas dans le chroot.

B.7.2.1. Configuration d'un système minimal (la manière vraiment simple)

Utilisez debootstrap pour configurer un environnement minimal qui n'inclut que le serveur SSH. Pour faire cela, il suffit de créer un chroot comme décrit dans la http://www.debian.org/doc/manuals/reference/ch09#_chroot_system. Cette méthode est sûre de fonctionner (tous les composants nécessaires seront dans le chroot) mais coûtera de l'espace disque (une installation minimale de Debian représente plusieurs milliers de mégaoctets). Ce système minimal pourrait aussi intégrer des fichiers setuid qu'un utilisateur dans le chroot pourrait utiliser pour s'en échapper si l'un d'entre eux peut être utiliser pour une augmentation de droits.

B.7.2.2. Créer l'environnement automatiquement (la manière simple)

Vous pouvez facilement créer un environnement restreint avec le paquet makejail puisqu'il prend automatiquement soin de tracer le démon serveur (avec strace), et l'exécute dans l'environnement restreint.
L'avantage de programmes qui génèrent automatiquement l'environnement de chroot est qu'ils sont capables de copier tout paquet vers l'environnement de chroot (en suivant même les dépendances de paquet et en s'assurant qu'il est complet). Fournir les applications aux utilisateurs est donc plus facile.
Pour mettre en place l'environnement en utilisant les exemples fournis par makejail, créez simplement /var/chroot/sshd et exécutez la commande suivante :
  # makejail /usr/share/doc/makejail/examples/sshd.py
Cela configurera la chroot dans le répertoire /var/chroot/sshd. Remarquez que ce chroot ne sera pas complètement fonctionnel avant de :
  • monter le système de fichiers procfs dans /var/chroot/sshd/proc. makejail le montera tout seul, mais si le système redémarre, il faudra le remonter en exécutant :
    # mount -t proc proc /var/chroot/sshd/proc
    Il peut aussi être monté automatiquement en modifiant /etc/fstab pour ajouter cette ligne :
    proc-ssh /var/chroot/sshd/proc  proc none 0 0
  • faire écouter syslog sur le périphérique /dev/log dans le chroot. Pour faire cela, il faut modifier /etc/default/syslogd pour ajouter -a /var/chroot/sshd/dev/log à la définition de la variable SYSLOGD.
Consultez le fichier d'exemple pour savoir quels autres modifications doivent être réalisées dans l'environnement. Certaines de ces modifications, comme la copie des répertoires personnels des utilisateurs, ne peuvent être réalisés automatiquement. Limitez également l'exposition des informations sensibles en ne copiant que les données d'un nombre donné d'utilisateurs des fichiers /etc/shadow ou /etc/group. Remarquez qu'en utilisant la séparation de droits, l'utilisateur sshd doit exister dans ces fichiers.
L'environnement d'exemple suivant a été (légèrement) testé dans Debian 3.0 et est construit avec le fichier de configuration fourni par le paquet et inclut le paquet fileutils :
|-- bin
|   |-- ash
|   |-- bash
|   |-- chgrp
|   |-- chmod
|   |-- chown
|   |-- cp
|   |-- csh -> /etc/alternatives/csh
|   |-- dd
|   |-- df
|   |-- dir
|   |-- fdflush
|   |-- ksh
|   |-- ln
|   |-- ls
|   |-- mkdir
|   |-- mknod
|   |-- mv
|   |-- rbash -> bash
|   |-- rm
|   |-- rmdir
|   |-- sh -> bash
|   |-- sync
|   |-- tcsh
|   |-- touch
|   |-- vdir
|   |-- zsh -> /etc/alternatives/zsh
|   `-- zsh4
|-- dev
|   |-- null
|   |-- ptmx
|   |-- pts
|   |-- ptya0
(...)
|   |-- tty
|   |-- tty0
(...)
|   `-- urandom
|-- etc
|   |-- alternatives
|   |   |-- csh -> /bin/tcsh
|   |   `-- zsh -> /bin/zsh4
|   |-- environment
|   |-- hosts
|   |-- hosts.allow
|   |-- hosts.deny
|   |-- ld.so.conf
|   |-- localtime -> /usr/share/zoneinfo/Europe/Madrid
|   |-- motd
|   |-- nsswitch.conf
|   |-- pam.conf
|   |-- pam.d
|   |   |-- other
|   |   `-- ssh
|   |-- passwd
|   |-- resolv.conf
|   |-- security
|   |   |-- access.conf
|   |   |-- chroot.conf
|   |   |-- group.conf
|   |   |-- limits.conf
|   |   |-- pam_env.conf
|   |   `-- time.conf
|   |-- shadow
|   |-- shells
|   `-- ssh
|       |-- moduli
|       |-- ssh_host_dsa_key
|       |-- ssh_host_dsa_key.pub
|       |-- ssh_host_rsa_key
|       |-- ssh_host_rsa_key.pub
|       `-- sshd_config
|-- home
|   `-- userX
|-- lib
|   |-- ld-2.2.5.so
|   |-- ld-linux.so.2 -> ld-2.2.5.so
|   |-- libc-2.2.5.so
|   |-- libc.so.6 -> libc-2.2.5.so
|   |-- libcap.so.1 -> libcap.so.1.10
|   |-- libcap.so.1.10
|   |-- libcrypt-2.2.5.so
|   |-- libcrypt.so.1 -> libcrypt-2.2.5.so
|   |-- libdl-2.2.5.so
|   |-- libdl.so.2 -> libdl-2.2.5.so
|   |-- libm-2.2.5.so
|   |-- libm.so.6 -> libm-2.2.5.so
|   |-- libncurses.so.5 -> libncurses.so.5.2
|   |-- libncurses.so.5.2
|   |-- libnsl-2.2.5.so
|   |-- libnsl.so.1 -> libnsl-2.2.5.so
|   |-- libnss_compat-2.2.5.so
|   |-- libnss_compat.so.2 -> libnss_compat-2.2.5.so
|   |-- libnss_db-2.2.so
|   |-- libnss_db.so.2 -> libnss_db-2.2.so
|   |-- libnss_dns-2.2.5.so
|   |-- libnss_dns.so.2 -> libnss_dns-2.2.5.so
|   |-- libnss_files-2.2.5.so
|   |-- libnss_files.so.2 -> libnss_files-2.2.5.so
|   |-- libnss_hesiod-2.2.5.so
|   |-- libnss_hesiod.so.2 -> libnss_hesiod-2.2.5.so
|   |-- libnss_nis-2.2.5.so
|   |-- libnss_nis.so.2 -> libnss_nis-2.2.5.so
|   |-- libnss_nisplus-2.2.5.so
|   |-- libnss_nisplus.so.2 -> libnss_nisplus-2.2.5.so
|   |-- libpam.so.0 -> libpam.so.0.72
|   |-- libpam.so.0.72
|   |-- libpthread-0.9.so
|   |-- libpthread.so.0 -> libpthread-0.9.so
|   |-- libresolv-2.2.5.so
|   |-- libresolv.so.2 -> libresolv-2.2.5.so
|   |-- librt-2.2.5.so
|   |-- librt.so.1 -> librt-2.2.5.so
|   |-- libutil-2.2.5.so
|   |-- libutil.so.1 -> libutil-2.2.5.so
|   |-- libwrap.so.0 -> libwrap.so.0.7.6
|   |-- libwrap.so.0.7.6
|   `-- security
|       |-- pam_access.so
|       |-- pam_chroot.so
|       |-- pam_deny.so
|       |-- pam_env.so
|       |-- pam_filter.so
|       |-- pam_ftp.so
|       |-- pam_group.so
|       |-- pam_issue.so
|       |-- pam_lastlog.so
|       |-- pam_limits.so
|       |-- pam_listfile.so
|       |-- pam_mail.so
|       |-- pam_mkhomedir.so
|       |-- pam_motd.so
|       |-- pam_nologin.so
|       |-- pam_permit.so
|       |-- pam_rhosts_auth.so
|       |-- pam_rootok.so
|       |-- pam_securetty.so
|       |-- pam_shells.so
|       |-- pam_stress.so
|       |-- pam_tally.so
|       |-- pam_time.so
|       |-- pam_unix.so
|       |-- pam_unix_acct.so -> pam_unix.so
|       |-- pam_unix_auth.so -> pam_unix.so
|       |-- pam_unix_passwd.so -> pam_unix.so
|       |-- pam_unix_session.so -> pam_unix.so
|       |-- pam_userdb.so
|       |-- pam_warn.so
|       `-- pam_wheel.so
|-- sbin
|   `-- start-stop-daemon
|-- usr
|   |-- bin
|   |   |-- dircolors
|   |   |-- du
|   |   |-- install
|   |   |-- link
|   |   |-- mkfifo
|   |   |-- shred
|   |   |-- touch -> /bin/touch
|   |   `-- unlink
|   |-- lib
|   |   |-- libcrypto.so.0.9.6
|   |   |-- libdb3.so.3 -> libdb3.so.3.0.2
|   |   |-- libdb3.so.3.0.2
|   |   |-- libz.so.1 -> libz.so.1.1.4
|   |   `-- libz.so.1.1.4
|   |-- sbin
|   |   `-- sshd
|   `-- share
|       |-- locale
|       |   `-- es
|       |       |-- LC_MESSAGES
|       |       |   |-- fileutils.mo
|       |       |   |-- libc.mo
|       |       |   `-- sh-utils.mo
|       |       `-- LC_TIME -> LC_MESSAGES
|       `-- zoneinfo
|           `-- Europe
|               `-- Madrid
`-- var
    `-- run
        |-- sshd
        `-- sshd.pid

27 répertoire, 733 fichiers
Avec Debian 3.1, il faut s'assurer que l'environnement inclus aussi les fichiers communs pour PAM. Les fichiers suivants doivent être copiés dans le chroot si makejail ne l'a pas fait:
$ ls /etc/pam.d/common-*
/etc/pam.d/common-account  /etc/pam.d/common-password
/etc/pam.d/common-auth     /etc/pam.d/common-session

B.7.2.3. Créer soi-même l'environnement (la manière difficile)

Il est possible de créer un environnement, en utilisant une méthode d'essai-et-d'erreur, en surveillant les traces du serveur sshd et les fichiers journaux pour déterminer les fichiers nécessaires. L'environnement suivant, fourni par José Luis Ledesma, est un listing exemple des fichiers dans un environnement de chroot pour ssh dans Debian Woody (3.0) : [93]
total 36
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ./
drwxr-xr-x 11 root root 4096 Jun 3 13:43 ../
drwxr-xr-x 2 root root 4096 Jun 4 12:13 bin/
drwxr-xr-x 2 root root 4096 Jun 4 12:16 dev/
drwxr-xr-x 4 root root 4096 Jun 4 12:35 etc/
drwxr-xr-x 3 root root 4096 Jun 4 12:13 lib/
drwxr-xr-x 2 root root 4096 Jun 4 12:35 sbin/
drwxr-xr-x 2 root root 4096 Jun 4 12:32 tmp/
drwxr-xr-x 2 root root 4096 Jun 4 12:16 usr/
./bin:
total 8368
drwxr-xr-x 2 root root 4096 Jun 4 12:13 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rwxr-xr-x 1 root root 109855 Jun 3 13:45 a2p*
-rwxr-xr-x 1 root root 387764 Jun 3 13:45 bash*
-rwxr-xr-x 1 root root 36365 Jun 3 13:45 c2ph*
-rwxr-xr-x 1 root root 20629 Jun 3 13:45 dprofpp*
-rwxr-xr-x 1 root root 6956 Jun 3 13:46 env*
-rwxr-xr-x 1 root root 158116 Jun 3 13:45 fax2ps*
-rwxr-xr-x 1 root root 104008 Jun 3 13:45 faxalter*
-rwxr-xr-x 1 root root 89340 Jun 3 13:45 faxcover*
-rwxr-xr-x 1 root root 441584 Jun 3 13:45 faxmail*
-rwxr-xr-x 1 root root 96036 Jun 3 13:45 faxrm*
-rwxr-xr-x 1 root root 107000 Jun 3 13:45 faxstat*
-rwxr-xr-x 1 root root 77832 Jun 4 11:46 grep*
-rwxr-xr-x 1 root root 19597 Jun 3 13:45 h2ph*
-rwxr-xr-x 1 root root 46979 Jun 3 13:45 h2xs*
-rwxr-xr-x 1 root root 10420 Jun 3 13:46 id*
-rwxr-xr-x 1 root root 4528 Jun 3 13:46 ldd*
-rwxr-xr-x 1 root root 111386 Jun 4 11:46 less*
-r-xr-xr-x 1 root root 26168 Jun 3 13:45 login*
-rwxr-xr-x 1 root root 49164 Jun 3 13:45 ls*
-rwxr-xr-x 1 root root 11600 Jun 3 13:45 mkdir*
-rwxr-xr-x 1 root root 24780 Jun 3 13:45 more*
-rwxr-xr-x 1 root root 154980 Jun 3 13:45 pal2rgb*
-rwxr-xr-x 1 root root 27920 Jun 3 13:46 passwd*
-rwxr-xr-x 1 root root 4241 Jun 3 13:45 pl2pm*
-rwxr-xr-x 1 root root 2350 Jun 3 13:45 pod2html*
-rwxr-xr-x 1 root root 7875 Jun 3 13:45 pod2latex*
-rwxr-xr-x 1 root root 17587 Jun 3 13:45 pod2man*
-rwxr-xr-x 1 root root 6877 Jun 3 13:45 pod2text*
-rwxr-xr-x 1 root root 3300 Jun 3 13:45 pod2usage*
-rwxr-xr-x 1 root root 3341 Jun 3 13:45 podchecker*
-rwxr-xr-x 1 root root 2483 Jun 3 13:45 podselect*
-r-xr-xr-x 1 root root 82412 Jun 4 11:46 ps*
-rwxr-xr-x 1 root root 36365 Jun 3 13:45 pstruct*
-rwxr-xr-x 1 root root 7120 Jun 3 13:45 pwd*
-rwxr-xr-x 1 root root 179884 Jun 3 13:45 rgb2ycbcr*
-rwxr-xr-x 1 root root 20532 Jun 3 13:45 rm*
-rwxr-xr-x 1 root root 6720 Jun 4 10:15 rmdir*
-rwxr-xr-x 1 root root 14705 Jun 3 13:45 s2p*
-rwxr-xr-x 1 root root 28764 Jun 3 13:46 scp*
-rwxr-xr-x 1 root root 385000 Jun 3 13:45 sendfax*
-rwxr-xr-x 1 root root 67548 Jun 3 13:45 sendpage*
-rwxr-xr-x 1 root root 88632 Jun 3 13:46 sftp*
-rwxr-xr-x 1 root root 387764 Jun 3 13:45 sh*
-rws--x--x 1 root root 744500 Jun 3 13:46 slogin*
-rwxr-xr-x 1 root root 14523 Jun 3 13:46 splain*
-rws--x--x 1 root root 744500 Jun 3 13:46 ssh*
-rwxr-xr-x 1 root root 570960 Jun 3 13:46 ssh-add*
-rwxr-xr-x 1 root root 502952 Jun 3 13:46 ssh-agent*
-rwxr-xr-x 1 root root 575740 Jun 3 13:46 ssh-keygen*
-rwxr-xr-x 1 root root 383480 Jun 3 13:46 ssh-keyscan*
-rwxr-xr-x 1 root root 39 Jun 3 13:46 ssh_europa*
-rwxr-xr-x 1 root root 107252 Jun 4 10:14 strace*
-rwxr-xr-x 1 root root 8323 Jun 4 10:14 strace-graph*
-rwxr-xr-x 1 root root 158088 Jun 3 13:46 thumbnail*
-rwxr-xr-x 1 root root 6312 Jun 3 13:46 tty*
-rwxr-xr-x 1 root root 55904 Jun 4 11:46 useradd*
-rwxr-xr-x 1 root root 585656 Jun 4 11:47 vi*
-rwxr-xr-x 1 root root 6444 Jun 4 11:45 whoami*
./dev:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:16 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
crw-r--r-- 1 root root 1, 9 Jun 3 13:43 urandom
./etc:
total 208
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rw------- 1 root root 0 Jun 4 11:46 .pwd.lock
-rw-r--r-- 1 root root 653 Jun 3 13:46 group
-rw-r--r-- 1 root root 242 Jun 4 11:33 host.conf
-rw-r--r-- 1 root root 857 Jun 4 12:04 hosts
-rw-r--r-- 1 root root 1050 Jun 4 11:29 ld.so.cache
-rw-r--r-- 1 root root 304 Jun 4 11:28 ld.so.conf
-rw-r--r-- 1 root root 235 Jun 4 11:27 ld.so.conf~
-rw-r--r-- 1 root root 88039 Jun 3 13:46 moduli
-rw-r--r-- 1 root root 1342 Jun 4 11:34 nsswitch.conf
drwxr-xr-x 2 root root 4096 Jun 4 12:02 pam.d/
-rw-r--r-- 1 root root 28 Jun 4 12:00 pam_smb.conf
-rw-r--r-- 1 root root 2520 Jun 4 11:57 passwd
-rw-r--r-- 1 root root 7228 Jun 3 13:48 profile
-rw-r--r-- 1 root root 1339 Jun 4 11:33 protocols
-rw-r--r-- 1 root root 274 Jun 4 11:44 resolv.conf
drwxr-xr-x 2 root root 4096 Jun 3 13:43 security/
-rw-r----- 1 root root 1178 Jun 4 11:51 shadow
-rw------- 1 root root 80 Jun 4 11:45 shadow-
-rw-r----- 1 root root 1178 Jun 4 11:48 shadow.old
-rw-r--r-- 1 root root 161 Jun 3 13:46 shells
-rw-r--r-- 1 root root 1144 Jun 3 13:46 ssh_config
-rw------- 1 root root 668 Jun 3 13:46 ssh_host_dsa_key
-rw-r--r-- 1 root root 602 Jun 3 13:46 ssh_host_dsa_key.pub
-rw------- 1 root root 527 Jun 3 13:46 ssh_host_key
-rw-r--r-- 1 root root 331 Jun 3 13:46 ssh_host_key.pub
-rw------- 1 root root 883 Jun 3 13:46 ssh_host_rsa_key
-rw-r--r-- 1 root root 222 Jun 3 13:46 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 2471 Jun 4 12:15 sshd_config
./etc/pam.d:
total 24
drwxr-xr-x 2 root root 4096 Jun 4 12:02 ./
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ../
lrwxrwxrwx 1 root root 4 Jun 4 12:02 other -> sshd
-rw-r--r-- 1 root root 318 Jun 3 13:46 passwd
-rw-r--r-- 1 root root 546 Jun 4 11:36 ssh
-rw-r--r-- 1 root root 479 Jun 4 12:02 sshd
-rw-r--r-- 1 root root 370 Jun 3 13:46 su
./etc/security:
total 32
drwxr-xr-x 2 root root 4096 Jun 3 13:43 ./
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ../
-rw-r--r-- 1 root root 1971 Jun 3 13:46 access.conf
-rw-r--r-- 1 root root 184 Jun 3 13:46 chroot.conf
-rw-r--r-- 1 root root 2145 Jun 3 13:46 group.conf
-rw-r--r-- 1 root root 1356 Jun 3 13:46 limits.conf
-rw-r--r-- 1 root root 2858 Jun 3 13:46 pam_env.conf
-rw-r--r-- 1 root root 2154 Jun 3 13:46 time.conf
./lib:
total 8316
drwxr-xr-x 3 root root 4096 Jun 4 12:13 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rw-r--r-- 1 root root 1024 Jun 4 11:51 cracklib_dict.hwm
-rw-r--r-- 1 root root 214324 Jun 4 11:51 cracklib_dict.pwd
-rw-r--r-- 1 root root 11360 Jun 4 11:51 cracklib_dict.pwi
-rwxr-xr-x 1 root root 342427 Jun 3 13:46 ld-linux.so.2*
-rwxr-xr-x 1 root root 4061504 Jun 3 13:46 libc.so.6*
lrwxrwxrwx 1 root root 15 Jun 4 12:11 libcrack.so -> libcrack.so.2.7*
lrwxrwxrwx 1 root root 15 Jun 4 12:11 libcrack.so.2 -> libcrack.so.2.7*
-rwxr-xr-x 1 root root 33291 Jun 4 11:39 libcrack.so.2.7*
-rwxr-xr-x 1 root root 60988 Jun 3 13:46 libcrypt.so.1*
-rwxr-xr-x 1 root root 71846 Jun 3 13:46 libdl.so.2*
-rwxr-xr-x 1 root root 27762 Jun 3 13:46 libhistory.so.4.0*
lrwxrwxrwx 1 root root 17 Jun 4 12:12 libncurses.so.4 -> libncurses.so.4.2*
-rwxr-xr-x 1 root root 503903 Jun 3 13:46 libncurses.so.4.2*
lrwxrwxrwx 1 root root 17 Jun 4 12:12 libncurses.so.5 -> libncurses.so.5.0*
-rwxr-xr-x 1 root root 549429 Jun 3 13:46 libncurses.so.5.0*
-rwxr-xr-x 1 root root 369801 Jun 3 13:46 libnsl.so.1*
-rwxr-xr-x 1 root root 142563 Jun 4 11:49 libnss_compat.so.1*
-rwxr-xr-x 1 root root 215569 Jun 4 11:49 libnss_compat.so.2*
-rwxr-xr-x 1 root root 61648 Jun 4 11:34 libnss_dns.so.1*
-rwxr-xr-x 1 root root 63453 Jun 4 11:34 libnss_dns.so.2*
-rwxr-xr-x 1 root root 63782 Jun 4 11:34 libnss_dns6.so.2*
-rwxr-xr-x 1 root root 205715 Jun 3 13:46 libnss_files.so.1*
-rwxr-xr-x 1 root root 235932 Jun 3 13:49 libnss_files.so.2*
-rwxr-xr-x 1 root root 204383 Jun 4 11:33 libnss_nis.so.1*
-rwxr-xr-x 1 root root 254023 Jun 4 11:33 libnss_nis.so.2*
-rwxr-xr-x 1 root root 256465 Jun 4 11:33 libnss_nisplus.so.2*
lrwxrwxrwx 1 root root 14 Jun 4 12:12 libpam.so.0 -> libpam.so.0.72*
-rwxr-xr-x 1 root root 31449 Jun 3 13:46 libpam.so.0.72*
lrwxrwxrwx 1 root root 19 Jun 4 12:12 libpam_misc.so.0 ->
libpam_misc.so.0.72*
-rwxr-xr-x 1 root root 8125 Jun 3 13:46 libpam_misc.so.0.72*
lrwxrwxrwx 1 root root 15 Jun 4 12:12 libpamc.so.0 -> libpamc.so.0.72*
-rwxr-xr-x 1 root root 10499 Jun 3 13:46 libpamc.so.0.72*
-rwxr-xr-x 1 root root 176427 Jun 3 13:46 libreadline.so.4.0*
-rwxr-xr-x 1 root root 44729 Jun 3 13:46 libutil.so.1*
-rwxr-xr-x 1 root root 70254 Jun 3 13:46 libz.a*
lrwxrwxrwx 1 root root 13 Jun 4 12:13 libz.so -> libz.so.1.1.3*
lrwxrwxrwx 1 root root 13 Jun 4 12:13 libz.so.1 -> libz.so.1.1.3*
-rwxr-xr-x 1 root root 63312 Jun 3 13:46 libz.so.1.1.3*
drwxr-xr-x 2 root root 4096 Jun 4 12:00 security/
./lib/security:
total 668
drwxr-xr-x 2 root root 4096 Jun 4 12:00 ./
drwxr-xr-x 3 root root 4096 Jun 4 12:13 ../
-rwxr-xr-x 1 root root 10067 Jun 3 13:46 pam_access.so*
-rwxr-xr-x 1 root root 8300 Jun 3 13:46 pam_chroot.so*
-rwxr-xr-x 1 root root 14397 Jun 3 13:46 pam_cracklib.so*
-rwxr-xr-x 1 root root 5082 Jun 3 13:46 pam_deny.so*
-rwxr-xr-x 1 root root 13153 Jun 3 13:46 pam_env.so*
-rwxr-xr-x 1 root root 13371 Jun 3 13:46 pam_filter.so*
-rwxr-xr-x 1 root root 7957 Jun 3 13:46 pam_ftp.so*
-rwxr-xr-x 1 root root 12771 Jun 3 13:46 pam_group.so*
-rwxr-xr-x 1 root root 10174 Jun 3 13:46 pam_issue.so*
-rwxr-xr-x 1 root root 9774 Jun 3 13:46 pam_lastlog.so*
-rwxr-xr-x 1 root root 13591 Jun 3 13:46 pam_limits.so*
-rwxr-xr-x 1 root root 11268 Jun 3 13:46 pam_listfile.so*
-rwxr-xr-x 1 root root 11182 Jun 3 13:46 pam_mail.so*
-rwxr-xr-x 1 root root 5923 Jun 3 13:46 pam_nologin.so*
-rwxr-xr-x 1 root root 5460 Jun 3 13:46 pam_permit.so*
-rwxr-xr-x 1 root root 18226 Jun 3 13:46 pam_pwcheck.so*
-rwxr-xr-x 1 root root 12590 Jun 3 13:46 pam_rhosts_auth.so*
-rwxr-xr-x 1 root root 5551 Jun 3 13:46 pam_rootok.so*
-rwxr-xr-x 1 root root 7239 Jun 3 13:46 pam_securetty.so*
-rwxr-xr-x 1 root root 6551 Jun 3 13:46 pam_shells.so*
-rwxr-xr-x 1 root root 55925 Jun 4 12:00 pam_smb_auth.so*
-rwxr-xr-x 1 root root 12678 Jun 3 13:46 pam_stress.so*
-rwxr-xr-x 1 root root 11170 Jun 3 13:46 pam_tally.so*
-rwxr-xr-x 1 root root 11124 Jun 3 13:46 pam_time.so*
-rwxr-xr-x 1 root root 45703 Jun 3 13:46 pam_unix.so*
-rwxr-xr-x 1 root root 45703 Jun 3 13:46 pam_unix2.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_acct.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_auth.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_passwd.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_session.so*
-rwxr-xr-x 1 root root 9726 Jun 3 13:46 pam_userdb.so*
-rwxr-xr-x 1 root root 6424 Jun 3 13:46 pam_warn.so*
-rwxr-xr-x 1 root root 7460 Jun 3 13:46 pam_wheel.so*
./sbin:
total 3132
drwxr-xr-x 2 root root 4096 Jun 4 12:35 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rwxr-xr-x 1 root root 178256 Jun 3 13:46 choptest*
-rwxr-xr-x 1 root root 184032 Jun 3 13:46 cqtest*
-rwxr-xr-x 1 root root 81096 Jun 3 13:46 dialtest*
-rwxr-xr-x 1 root root 1142128 Jun 4 11:28 ldconfig*
-rwxr-xr-x 1 root root 2868 Jun 3 13:46 lockname*
-rwxr-xr-x 1 root root 3340 Jun 3 13:46 ondelay*
-rwxr-xr-x 1 root root 376796 Jun 3 13:46 pagesend*
-rwxr-xr-x 1 root root 13950 Jun 3 13:46 probemodem*
-rwxr-xr-x 1 root root 9234 Jun 3 13:46 recvstats*
-rwxr-xr-x 1 root root 64480 Jun 3 13:46 sftp-server*
-rwxr-xr-x 1 root root 744412 Jun 3 13:46 sshd*
-rwxr-xr-x 1 root root 30750 Jun 4 11:46 su*
-rwxr-xr-x 1 root root 194632 Jun 3 13:46 tagtest*
-rwxr-xr-x 1 root root 69892 Jun 3 13:46 tsitest*
-rwxr-xr-x 1 root root 43792 Jun 3 13:46 typetest*
./tmp:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:32 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
./usr:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:16 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
lrwxrwxrwx 1 root root 7 Jun 4 12:14 bin -> ../bin//
lrwxrwxrwx 1 root root 7 Jun 4 11:33 lib -> ../lib//
lrwxrwxrwx 1 root root 8 Jun 4 12:13 sbin -> ../sbin//

B.7.3. Environnement de chroot pour Apache

B.7.3.1. Introduction

L'utilitaire chroot est souvent utilisé pour emprisonner un démon dans une arborescence restreint. Vous pouvez l'utiliser pour isoler des services d'autres services, pour que les problèmes de sécurité d'un paquet logiciel ne mettent pas en péril le serveur tout entier. Quand vous utiliser le script makejail, mettre en place et mettre à jour l'arborescence chrooté est beaucoup plus facile.
FIXME : Apache peut aussi être chrooté en utilisant http://www.modsecurity.org qui est disponible dans libapache-mod-security (pour Apache 1.x) et libapache2-mod-security (pour Apache 2.x).
B.7.3.1.1. Licence
Ce document est copyright 2002 Alexandre Ratti. Il est publié sous une double licence, la GPL version 2 (GNU General Public License) et la GNU-FDL 1.2 (GNU Free Documentation Licence) et est inclus dans ce manuel avec sa permission explicite (depuis le http://www.gabuzomeu.net/alex/doc/apache/index-en.html).

B.7.3.2. Installer le serveur

Cette procédure a été testée sur Debian GNU/Linux 3.0 (Woody) avec makejail 0.0.4-1 (de Debian/testing).
  • Connectez-vous en tant que root et créez le nouveau répertoire prison :
    $ mkdir -p /var/chroot/apache
  • Créez un nouvel utilisateur et un nouveau groupe. Le serveur Apache chrooté fonctionnera sous cet utilisateur et groupe, qui n'est utilisé pour rien d'autre sur le système. Dans cet exemple, l'utilisateur et le groupe sont appelés chrapach.
     
     $ adduser --home /var/chroot/apache --shell /bin/false \
     --no-create-home --system --group chrapach
    FIXME : Est-ce qu'un nouvel utilisateur est nécessaire ? (Apache fonctionne déjà sous l'utilisateur apache)
  • Installez Apache comme d'habitude sous Debian : apt-get install apache
  • Configurez Apache (par exemple définissez les sous-domaines, etc.). Dans le fichier de configuration /etc/apache/httpd.conf, positionnez les options Group et User à chrapach. Redémarrez Apache et assurez-vous que le serveur fonctionne correctement. Maintenant, stoppez le démon Apache.
  • Installez makejail (disponible dans Debian/testing actuellement). Vous devriez également installer wget et lynx car ils sont utilisés par makejail pour tester le serveur chrooté : apt-get install makejail wget lynx
  • Copiez le fichier de configuration exemple pour Apache dans le répertoire /etc/makejail :
     
     # cp /usr/share/doc/makejail/examples/apache.py /etc/makejail/
  • Éditez /etc/makejail/apache.py. Vous devez changer les options chroot, users et groups. Pour exécuter cette version de makejail, vous pouvez également ajouter une option packages. Consultez la http://www.floc.net/makejail/current/doc/. Un exemple est fourni ici :
    chroot="/var/chroot/apache"
    testCommandsInsideJail=["/usr/sbin/apachectl start"]
    processNames=["apache"]
    testCommandsOutsideJail=["wget -r --spider http://localhost/",
                             "lynx --source https://localhost/"]
    preserve=["/var/www",
              "/var/log/apache",
              "/dev/log"]
    users=["chrapach"]
    groups=["chrapach"]
    packages=["apache", "apache-common"]
    userFiles=["/etc/password",
               "/etc/shadow"]
    groupFiles=["/etc/group",
                "/etc/gshadow"]
    forceCopy=["/etc/hosts",
               "/etc/mime.types"]
    FIXME : Certaines options semblent ne pas fonctionner correctement. Par exemple, /etc/shadow et /etc/gshadow ne sont pas copiés, alors que /etc/password et /etc/group sont intégralement copiés au lieu d'être filtrés.
  • Créez l'arborescence de chroot : makejail /etc/makejail/apache.py
  • Si les fichiers /etc/password et /etc/group ont été intégralement copiés, entrez :
          $ grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd
          $ grep chrapach /etc/group > /var/chroot/apache/etc/group
    pour les remplacer avec des copies filtrées.
  • Copiez les pages du site web et les journaux dans la prison. Ces fichiers ne sont pas copiés automatiquement (consultez l'option preserve du fichier de configuration de makejail).
          # cp -Rp /var/www /var/chroot/apache/var
          # cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
  • Éditez le script de démarrage pour le démon de journaux système pour qu'il écoute également sur la socket /var/chroot/apache/dev/log. Dans /etc/default/syslogd, remplacez : SYSLOGD="" par SYSLOGD=" -a /var/chroot/apache/dev/log" et redémarrez le démon (/etc/init.d/sysklogd restart).
  • Éditez le script de démarrage d'Apache (/etc/init.d/apache). Vous pouvez avoir besoin d'effectuer certaines changements au script de démarrage par défaut pour qu'il fonctionne correctement dans une arborescence chrooté. Comme :
    • configurer une nouvelle variable CHRDIR au début du fichier ;
    • éditer les sections start, stop, reload, etc. ;
    • ajouter une ligne pour monter et démonter le système de fichiers /proc dans la prison.
    #! /bin/bash
    #
    # apache        Start the apache HTTP server.
    #
    
    CHRDIR=/var/chroot/apache
    
    NAME=apache
    PATH=/bin:/usr/bin:/sbin:/usr/sbin
    DAEMON=/usr/sbin/apache
    SUEXEC=/usr/lib/apache/suexec
    PIDFILE=/var/run/$NAME.pid
    CONF=/etc/apache/httpd.conf
    APACHECTL=/usr/sbin/apachectl 
    
    trap "" 1
    export LANG=C
    export PATH
    
    test -f $DAEMON || exit 0
    test -f $APACHECTL || exit 0
    
    # ensure we don't leak environment vars into apachectl
    APACHECTL="env -i LANG=${LANG} PATH=${PATH} chroot $CHRDIR $APACHECTL"
    
    if egrep -q -i "^[[:space:]]*ServerType[[:space:]]+inet" $CONF
    then
        exit 0
    fi
    
    case "$1" in
      start)
        echo -n "Starting web server: $NAME"
        mount -t proc proc /var/chroot/apache/proc
        start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON \
          --chroot $CHRDIR
        ;;
    
      stop)
        echo -n "Stopping web server: $NAME"
        start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo
        umount /var/chroot/apache/proc
        ;;
    
      reload)
        echo -n "Reloading $NAME configuration"
        start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" \
          --signal USR1 --startas $DAEMON --chroot $CHRDIR
        ;;
    
      reload-modules)
        echo -n "Reloading $NAME modules"
        start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo \
          --retry 30
        start-stop-daemon --start --pidfile $PIDFILE \
          --exec $DAEMON --chroot $CHRDIR
        ;;
    
      restart)
        $0 reload-modules
        exit $?
        ;;
    
      force-reload)
        $0 reload-modules
        exit $?
        ;;
    
      *)
        echo "Usage: /etc/init.d/$NAME {start|stop|reload|reload-modules|force-reload|restart}"
        exit 1
        ;;
    esac
    
    if [ $? == 0 ]; then
      echo .
      exit 0
    else
      echo failed
      exit 1
    fi
    FIXME : Est-ce que le premier processus Apache devrait être lancé avec un autre utilisateur que root (c'est-à-dire ajouter --chuid chrapach:chrapach) ? Désavantage : chrapach devra avoir un accès en écriture aux journaux, ce qui est étrange.
  • Remplacez dans /etc/logrotate.d/apache /var/log/apache/*.log par /var/chroot/apache/var/log/apache/*.log
  • Démarrez Apache (/etc/init.d/apache start) et vérifiez ce qui est indiqué dans les journaux de la prison (/var/chroot/apache/var/log/apache/error.log). Si votre configuration est plus complexe (e.g. si vous utilisez également PHP et MySQL), des fichiers seront probablement manquants. Si certains fichiers ne sont pas copiés automatiquement par makejail, vous pouvez les indiquer dans les options forceCopy (pour copier les fichiers directement) ou packages (pour copier les paquets en entier et leurs dépendances) du fichier de configuration /etc/makejail/apache.py.
  • Entrez ps aux | grep apache pour vous assurer qu'Apache fonctionne. Vous devriez voir quelque chose comme :
          root 180 0.0 1.1 2936 1436 ? S 04:03 0:00 /usr/sbin/apache
          chrapach 189 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
          chrapach 190 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
          chrapach 191 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
          chrapach 192 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
          chrapach 193 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
  • Assurez-vous que les processus Apache fonctionnent bien dans le chroot en observant le système de fichiers /proc : ls -la /proc/numero_processus/root/.numero_processus est l'un des numéros de PID de la liste ci-dessus (2e colonne ; 189 par exemple). La liste des entrées pour une arborescence restreinte devraient être ainsi :
        drwxr-sr-x 10 root staff 240 Dec 2 16:06 .
        drwxrwsr-x 4 root staff 72 Dec 2 08:07 ..
        drwxr-xr-x 2 root root 144 Dec 2 16:05 bin
        drwxr-xr-x 2 root root 120 Dec 3 04:03 dev
        drwxr-xr-x 5 root root 408 Dec 3 04:03 etc
        drwxr-xr-x 2 root root 800 Dec 2 16:06 lib
        dr-xr-xr-x 43 root root 0 Dec 3 05:03 proc
        drwxr-xr-x 2 root root 48 Dec 2 16:06 sbin
        drwxr-xr-x 6 root root 144 Dec 2 16:04 usr
        drwxr-xr-x 7 root root 168 Dec 2 16:06 var
    Pour automatiser ce test, vous pouvez entrer :ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/.
    FIXME : Ajouter d'autres tests qui peuvent être exécuter pour s'assurer que la prison est fermées ?
La raison pour laquelle j'aime cela est que la mise en place d'une prison n'est pas très difficile et que le serveur peut être mis à jour avec seulement deux lignes :
apt-get update && apt-get install apache
makejail /etc/makejail/apache.py

B.7.4. Consultez également

Si vous recherchez plus d'informations, vous pouvez envisager ces sources d'informations sur lesquelles les informations présentées sont basées :http://www.floc.net/makejail/, ce programme a été écrit par Alain Tesio


[89] L'option debug permet d'envoyer la progression du module à la facilité authpriv.notice.
[90] Vous pouvez créer un environnement bash très limité avc les définitions Python suivante pour makejail, en créant simplement le répertoire /var/chroots/users/truc et un fichier bash.py avec le contenu suivant :
chroot="/var/chroots/users/truc" cleanJailFirst=1 testCommandsInsideJail=["bash ls"]
Exécuter ensuite makejail bash.py pour créer l'environnement de l'utilisateur en /var/chroots/users/truc. Pour tester l'environnement, exécuter :
# chroot /var/chroots/users/truc/ ls bin dev etc lib proc sbin usr
.
[91] Dans certains cas, les périphériques /dev/ptmx et /dev/pty* et le sous-répertoire /dev/pts/. Exécuter MAKEDEV dans le répertoire /dev de l'environnement chrooté devrait suffire pour les créer s'ils n'existent pas. Avec les noyaux (version 2.6) qui créent dynamiquement les fichiers de périphérique, vous devrez créer les fichiers /dev/pts/ vous-même et leur attribuer les droits nécessaires.
[92] Si vous utilisez un noyau implémentant le contrôle d'accès obligatoire (« Mandatory Access Control » ou MAC) (RSBAC/SElinux), vous pouvez éviter de changer cette configuration en autorisant simplement l'utilisateur sshd à exécuter l'appel système chroot().
[93] Remarquez qu'il n'y a pas de fichiers SETUID. Cela rend plus difficile pour les utilisateurs distants de s'échapper de l'environnement de chroot. Cependant, il empêche également les utilisateurs de changer leurs mots de passe, car le programme passwd ne peut pas modifier les fichiers /etc/passwd ou /etc/shadow.