[ précédent ] [ Table des matières ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ suivant ]


Securing Debian Manual
Chapitre 4 - Après l'installation


Une fois que le système est installé, vous pouvez encore en faire plus pour sécuriser le système ; certaines des étapes décrites ci-dessous peuvent être effectuées. Bien sûr, cela dépend vraiment de la configuration, mais pour prévenir un accès physique, vous devriez consulter Changer le BIOS (à nouveau), Section 4.3, Attribuer un mot de passe à LILO ou GRUB, Section 4.4, Enlever l'invite superutilisateur du noyau, Section 4.6, Restreindre les accès aux consoles, Section 4.7 et Restreindre les redémarrages système depuis la console, Section 4.8.

Avant de vous connecter à tout réseau, particulièrement s'il s'agit d'un réseau public, vous devriez, au minimum, faire une mise à jour de sécurité (consultez Faire une mise à jour de sécurité, Section 4.2). Vous pourriez facultativement faire un instantané du système (consultez Prendre un instantané (« snapshot ») du système, Section 4.18).


4.1 S'abonner à la liste de diffusion Debian Security Announce

Pour recevoir des informations sur les mises à jour de sécurité disponibles, vous devriez vous abonner à la liste de diffusion debian-security-announce pour recevoir les bulletins de sécurité de Debian[9]. Consultez L'équipe de sécurité Debian, Section 7.1 pour plus d'informations sur le fonctionnement de l'équipe en charge de la sécurité Debian. Pour des informations sur l'inscription aux listes de diffusion Debian, consultez http://lists.debian.org.

Les DSA sont signées avec la clef de l'équipe de sécurité Debian qui peut être récupérée sur http://security.debian.org.

Vous devriez également envisager de vous abonner à la liste de diffusion debian-security pour des discussions générales sur les problèmes de sécurité dans le système d'exploitation Debian. Vous pourrez entrer en contact avec d'autres administrateurs système ainsi qu'avec des développeurs Debian et des développeurs amont d'outils de sécurité qui pourront répondre à vos questions et proposer leurs conseils.

FIXME : Ajouter la clef ici également ?


4.2 Faire une mise à jour de sécurité

Dès que de nouveaux bogues de sécurité sont décelés dans les paquets, les responsables Debian et les auteurs amont les corrigent généralement dans les journées ou les heures suivantes. Une fois le bogue résolu, un nouveau paquet est fourni sur http://security.debian.org.

Si vous installez une version de Debian, vous devez prendre en compte le fait qu'il a pu y avoir des mises à jour de sécurité depuis la parution, à chaque fois qu'une vulnérabilité a été découverte dans un paquet. Ainsi, des révisions mineures (il y en a eu quatre dans la version Debian 3.0 Sarge) incluent ces mises à jour de paquets.

Pendant l'installation, les mises à jour de sécurité sont configurées sur le système, et les mises à jour en attente sont téléchargées et appliquées, sauf indication contraire ou si le système n'est pas connecté à Internet. Les mises à jour sont appliquées avant même le premier démarrage, de telle sorte que le nouveau système commence sa vie aussi à jour que possible.

Pour mettre à jour vous-même le système, ajoutez la ligne suivante dans le sources.list et vous recevrez les mises à jour de sécurité automatiquement quand vous mettrez à jour le système. Remplacez [NOM] par le nom de la version, par exemple squeeze.

       deb http://security.debian.org/ [NOM]/updates main contrib non-free

Remarque : si vous utilisez la distribution testing, utilisez les source du miroir de sécurité de testing conformément à Suivi en sécurité de la branche testing, Section 10.1.4.

Après avoir fait cela, plusieurs outils vous permettent de mettre à niveau le système. S'il s'agit d'un ordinateur de bureau, une application appelée update-notifier[10] permet de vérifier facilement si de nouvelles mises à niveau sont disponibles. En choisissant cela, vous pouvez faire les mises à niveau depuis le bureau (en utilisant update-manager). Pour obtenir plus de renseignements, veuillez consulter Vérification de mises à jour sur station de travail, Section 10.1.2.2. Dans les environnements de bureau, vous pouvez aussi utiliser synaptic (GNOME), kpackage ou adept (KDE) pour des interfaces plus avancées. Si le système ne possède qu'un terminal texte, vous pouvez utiliser aptitude, apt ou dselect (obsolète) pour mettre à niveau.

Si vous le voulez, vous pouvez ajouter également les lignes deb-src à /etc/apt/sources.list. Consultez apt(8) pour plus de détails.


4.2.1 Mise à jour de sécurité des bibliothèques

Une fois que vous avez exécuté une mise à jour de sécurité, il se peut que vous deviez redémarrer certains des services système. Si vous ne faites pas cela, certains services pourraient encore être vulnérables après une mise à jour de sécurité. La raison pour cela est que les démons qui fonctionnent avec une mise à jour peuvent encore utiliser les anciennes bibliothèques après la mise à jour[11]. Pour détecter quels démons peuvent devoir être redémarrés, vous pouvez utiliser le programme checkrestart (disponible dans le paquet debian-goodies) ou utiliser cette ligne de commande[12] (en tant que superutilisateur) :

     # lsof | grep <la_bibliothèque_mise_à_niveau> \
            | awk '{print $1, $9}' | uniq | sort -k 1

Certains paquets (comme libc6) feront cette vérification dans la phase de postinstallation pour un nombre limité de services, en particulier car une mise à jour de bibliothèques essentielles peut casser certaines applications (avant leur redémarrage)[13].

Faire passer le système en niveau d'exécution 1 (utilisateur seul), puis ensuite au niveau d'exécution 3 (multiutilisateur) devrait entraîner le redémarrage de la plupart (si ce n'est tous) des services système. Mais cela n'est pas envisageable si vous exécutez la mise à jour de sécurité depuis une connexion distante (comme SSH) car celle-ci serait alors interrompue.

Apportez le plus grand soin lors des mises à jour de sécurité si vous les réalisez depuis une connexion à distance comme SSH. Une procédure suggérée pour une mise à jour de sécurité qui implique un redémarrage de services est de redémarrer le démon SSH, puis immédiatement de tenter une nouvelle connexion SSH sans interrompre la précédente. Si la connexion échoue, annulez la mise à jour et analysez le problème.


4.2.2 Mise à jour de sécurité du noyau

Assurez-vous tout d'abord que le noyau est géré par le système de gestion des paquets. Si vous l'avez installé en utilisant le système d'installation de Debian 3.0 ou de versions précédentes, le noyau n'est pas intégré dans le système de gestion des paquets et pourrait être obsolète. Vous pouvez facilement confirmer cela en exécutant :

     $ dpkg -S `readlink -f /vmlinuz`
     linux-image-2.6.18-4-686: /boot/vmlinuz-2.6.18-4-686

Si le noyau n'est pas géré, vous verrez un message indiquant que le gestionnaire de paquets n'a pas trouvé le fichier associé à un paquet au lieu du message ci-dessus, qui dit que le fichier associé au noyau actuellement en fonctionnement est fourni par le paquet linux-image-2.6.18-4-686. Dans le premier cas, vous devrez installer manuellement un paquet d'image de noyau. L'image exacte du noyau que vous devez installer dépend de l'architecture et de la version de noyau préférée. Une fois fait, vous pourrez gérer les mises à jour de sécurité du noyau comme pour tout autre paquet. Dans tous les cas, notez que les mises à jour du noyau ne seront faites que pour la même version du noyau que celui que vous utilisez, c'est-à-dire que apt ne va pas mettre à jour automatiquement le noyau de la version 2.4 à la version 2.6 (ou de la version 2.4.26 à la version 2.4.27[14]).

Le système d'installation des dernières versions de Debian gérera le noyau sélectionné comme partie du système de gestion des paquets. Vous pouvez vérifier quels noyaux sont installés en exécutant :

     $ COLUMNS=150 dpkg -l 'linux-image*' | awk '$1 ~ /ii/ { print $0 }'

Pour voir si le noyau doit être mis à jour, exécutez :

     $ kernfile=`readlink -f /vmlinuz`
     $ kernel=`dpkg -S $kernfile | awk -F : '{print $1}'`
     $ apt-cache policy $kernel
     linux-image-2.6.32-5-686:
       Installé : 2.6.32-35
       Candidat : 2.6.32-35
       Table de version :
      *** 2.6.32-35
             100 /var/lib/dpkg/status

Si vous effectuez une mise à jour de sécurité incluant l'image du noyau, vous devez redémarrer le système pour que la mise à jour de sécurité soit utile. Sinon, vous utiliserez encore l'ancienne image de noyau (vulnérable).

Si vous devez effectuer un redémarrage du système (à cause d'une mise à jour du noyau), vous devriez vous assurer que le noyau démarrera correctement et que la connectivité réseau sera restaurée, particulièrement si la mise à jour de sécurité est réalisée depuis une connexion à distance comme SSH. Pour le premier point, vous pouvez configurer le chargeur d'amorçage pour redémarrer l'ancien noyau en cas d'échec (pour des informations plus détaillées, veuillez consulter (en anglais) Remotely rebooting Debian GNU/Linux machines). Pour le second point, vous devez introduire un script de test de connectivité réseau qui vérifiera si le noyau a lancé le sous-système réseau correctement et qui redémarrera le système si ce n'est pas le cas[15]. Cela devrait éviter des surprises désagréables comme une mise à jour du noyau en réalisant après un redémarrage qu'il n'a pas détecté ou configuré le matériel réseau correctement et que vous devez parcourir une longue distance pour relancer à nouveau le système. Bien sûr, avoir la console série[16] du système connectée à une console ou un serveur de terminal devrait également aider à déboguer à distance les problèmes de redémarrage.


4.3 Changer le BIOS (à nouveau)

Vous vous souvenez de Choisir un mot de passe pour le BIOS, Section 3.1 ? Et bien, vous devriez maintenant, une fois que vous n'avez plus besoin de démarrer à partir d'un support amovible, changer la configuration par défaut du BIOS pour qu'il ne puisse démarrer que depuis le disque dur. Assurez-vous de ne pas perdre le mot de passe BIOS, sinon, en cas de défaillance du disque dur, vous ne pourrez pas retourner dans le BIOS et modifier la configuration pour le récupérer en utilisant, par exemple, un CD.

Un autre moyen moins sécurisé, mais plus pratique est de changer la configuration pour que le système s'amorce depuis le disque dur et, si cela échoue, d'essayer un support amovible. À propos, c'est ainsi fait parce que la plupart des personnes n'utilisent pas le mot de passe BIOS très souvent ; il est facilement oublié.


4.4 Attribuer un mot de passe à LILO ou GRUB

N'importe qui peut obtenir facilement une invite de commandes superutilisateur et changer les mots de passe en entrant à l'invite d'amorçage <nom-de-l-image-d-amorçage> init=/bin/sh. Après le changement du mot de passe et le redémarrage du système, la personne a un accès superutilisateur illimité et peut faire tout ce qu'elle veut sur le système. Après cela, vous n'aurez plus d'accès supertilisateur sur la machine, étant donné que vous ne connaîtrez pas le mot de passe.

Pour être sûr que cela ne puisse pas se produire, vous devriez attribuer un mot de passe au démarrage. Vous avez le choix entre un mot de passe global et un mot de passe par image.

Pour LILO, vous avez besoin d'éditer le fichier /etc/lilo.conf et ajouter les lignes password ainsi que restricted comme dans l'exemple suivant.

       image=/boot/2.2.14-vmlinuz
          label=Linux
          read-only
          password=piratemoi
          restricted

Puis, assurez-vous que le fichier de configuration n'est pas lisible par tout le monde pour empêcher des utilisateurs locaux de lire le mot de passe. Une fois terminé, relancez lilo. Omettre la ligne restricted entraîne une attente de mot de passe, en dépit des paramètres passés à LILO. Les permissions par défaut pour le fichier /etc/lilo.conf accordent au superutilisateur les droits de lecture et d'écriture et permettent un accès en lecture seule pour le groupe de configuration de lilo.conf, à savoir root.

Si vous utilisez GRUB plutôt que LILO, éditez /boot/grub/menu.lst et ajoutez les deux lignes suivantes en début (en remplaçant, bien sûr, piratemoi par le mot de passe désiré). Cela empêche les utilisateurs d'éditer les options de démarrage. timeout 3 indique un délai de 3 secondes avant que grub démarre l'option par défaut.

       timeout 3
       password piratemoi

Pour aller plus loin dans le durcissement de l'intégrité du mot de passe, vous pourriez entreposer le mot de passe sous une forme chiffrée. L'utilitaire grub-md5-crypt génère un hachage de mot de passe qui est compatible avec l'algorithme du mot de passe GRUB (MD5). Pour indiquer à grub qu'un mot de passe au format MD5 va être utilisé, utilisez la directive suivante :

       timeout 3
       password --md5 $1$T/vfEWUQ$t8xoW.5kp3nbqc1zOwa3W1

Le paramètre --md5 a été ajouté pour informer grub d'effectuer la procédure d'authentification md5. Le mot de passe fourni est la version MD5 chiffrée de piratemoi. L'utilisation de la méthode MD5 pour le mot de passe est préférable à la méthode précédente dont le mot de passe est en clair. Plus d'informations concernant les mots de passe grub sont disponibles dans le paquet grub-doc.


4.5 Désactivation de l'invite superutilisateur de l'initramfs

Note : cela s'applique aux noyaux fournis par défaut après Debian 3.1.

Les noyaux Linux 2.6 fournissent un moyen d'accéder à une invite de commande de superutilisateur lors de l'amorçage et qui sera présentée pendant le chargement de l'initramfs en cas d'erreur. C'est pratique pour permettre à l'administrateur d'entrer une invite de commande de secours avec des droits du superutilisateur. Cette invite de commande peut être utilisée pour charger vous-même des modules quand la détection automatique échoue. Ce comportement est celui par défaut pour les initramfs créés par initramfs-tools. Le message suivant apparaîtra :

       "ALERT!  /dev/sda1 does not exist.  Dropping to a shell!

Afin de supprimer ce comportement, vous devez configurer l'argument d'amorçage suivant : panic=0. Ajoutez-le soit à la section kopt de /boot/grub/menu.lst et exécutez update-grub, soit à la section append de /etc/lilo.conf.


4.6 Enlever l'invite superutilisateur du noyau

Note : cela ne s'applique pas aux noyaux fournis par Debian 3.1, car le temps d'attente du noyau a été modifié à 0.

Les noyaux Linux 2.4 fournissent un moyen d'accéder à une invite de commandes superutilisateur lors de l'amorçage et qui sera présenté juste après le chargement du système de fichiers cramfs. Un message apparaîtra pour permettre à l'administrateur d'obtenir une invite de commandes interactive avec des droits du superutilisateur, cette invite de commandes peut être utilisée pour charger manuellement des modules quand la détection automatique échoue. Ce comportement est celui par défaut pour linuxrc de l'initrd. Le message suivant apparaîtra :

       Press ENTER to obtain a shell (waits 5 seconds)

Pour supprimer ce comportement, vous devez changer /etc/mkinitrd/mkinitrd.conf et positionner :

       # DELAY  Le temps, en seconde que le script linuxrc doit
       # attendre pour permettre à l'utilisateur de l'interrompre
       # avant que le système ne soit lancé
       DELAY=0

Puis, régénérez l'image de ramdisk. Vous pouvez faire cela ainsi, par exemple :

       # cd /boot
       # mkinitrd -o initrd.img-2.4.18-k7 /lib/modules/2.4.18-k7

ou (de préférence) :

       # dpkg-reconfigure -plow kernel-image-2.4.x-yz

4.7 Restreindre les accès aux consoles

Certaines règles de sécurité peuvent forcer les administrateurs à se connecter au système sur une console avec leur identifiant et mot de passe puis devenir superutilisateur (avec su ou sudo). Cette règle est appliquée sous Debian en éditant les fichiers /etc/login.defs ou /etc/securetty lors de l'utilisation de PAM. Dans :

En cas d'utilisation de PAM d'autres changements au processus de login, qui peuvent inclure des restrictions aux utilisateurs et groupes à certains moments, peuvent être configurés dans /etc/pam.d/login. Une fonctionnalité intéressante qui peut être désactivée est la possibilité de se connecter avec des mots de passe nuls (vides). Cette fonctionnalité peut être limitée en enlevant nullok de la ligne :

       auth       required   pam_unix.so nullok

4.8 Restreindre les redémarrages système depuis la console

Si le système dispose d'un clavier attaché, n'importe qui (oui, vraiment n'importe qui) peut redémarrer le système avec celui-ci sans se connecter au système. Cela peut être en conformité ou non avec vos règles de sécurité. Si vous désirez restreindre cela, vous devez vérifier le fichier /etc/inittab pour que la ligne incluant ctrlaltdel appelle shutdown avec le paramètre -a (rappelez-vous d'exécuter init q après avoir fait un changement à ce fichier. La valeur par défaut dans Debian inclut ce paramètre :

       ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

Puis, pour permettre à certains utilisateurs d'arrêter le système, comme décrit dans la page de manuel shutdown(8), vous devez créer le fichier /etc/shutdown.allow et inclure le nom des utilisateurs qui peuvent redémarrer le système. Quand le salut à trois doigts (ou Ctrl+Alt+Suppr) est exécuté, le programme va vérifier si l'un des utilisateurs de ce fichier est connecté. Si aucun d'entre eux ne l'est, shutdown ne va pas redémarrer le système.


4.9 Monter correctement les partitions

Lorsque vous montez un système de fichiers ext2 or ext3, vous avez différentes options additionnelles pour l'appel mount ou pour le fichier /etc/fstab. Par exemple, ceci est mon entrée pour la partition /tmp :

       /dev/hda7   /tmp   ext2   defaults,nosuid,noexec,nodev   0   2

Vous voyez la différence dans la section des options. L'option nosuid ignore complètement les bits setuid et setgid, tandis que noexec interdit l'exécution de tout programme sur ce point de montage et nodev ignore les fichiers de périphériques. Cela semble bon mais :

L'option noexec évite aux binaires d'être exécutés directement mais c'était facilement contournable dans les premières versions du noyau :

       alex@joker:/tmp# mount | grep tmp
       /dev/hda7 on /tmp type ext2 (rw,noexec,nosuid,nodev)
       alex@joker:/tmp# ./date
       bash: ./date: Permission non accordée
       alex@joker:/tmp# /lib/ld-linux.so.2 ./date
       dimanche 3 décembre 2000, 17:49:23 (UTC+0100)

Les versions plus récentes du noyau gèrent cependant l'option noexec correctement :

       angrist:/tmp# mount | grep /tmp
       /dev/hda3 on /tmp type ext3 (rw,noexec,nosuid,nodev)
       angrist:/tmp# ./date
       bash: ./tmp: Permission non accordée
       angrist:/tmp# /lib/ld-linux.so.2 ./date 
       ./date: error while loading shared libraries: ./date: failed to map segment 
       from shared object: Operation not permitted

Toutefois, de nombreux pirates en herbe utilisent des failles qui essayent de créer et d'exécuter des fichiers dans /tmp. S'ils ne sont pas futés, ils tomberont sur un pépin. En d'autres termes, un utilisateur ne peut être abusé en exécutant un binaire compromis (genre cheval de Troie) dans /tmp lorsqu'il a accidentellement ajouté /tmp dans son PATH.

Soyez aussi vigilant, certains scripts peuvent dépendre du fait que /tmp devienne exécutable. Notamment Debconf qui a (avait ?) quelques problèmes concernant cela, pour plus d'informations consultez le bogue nº 116448.

Ce qui suit est un exemple un plus peu poussé. Prenez note que, bien que /var peut être mis à noexec, certains logiciels[22] conservent leurs programmes dans /var. Les mêmes conditions peuvent être appliquées à l'option nosuid.

     /dev/sda6   /usr          ext3    defaults,ro,nodev       0       2
     /dev/sda12  /usr/share    ext3    defaults,ro,nodev,nosuid        0       2
     /dev/sda7   /var          ext3    defaults,nodev,usrquota,grpquota 0      2
     /dev/sda8   /tmp          ext3    defaults,nodev,nosuid,noexec,usrquota,grpquota    0       2
     /dev/sda9   /var/tmp      ext3    defaults,nodev,nosuid,noexec,usrquota,grpquota    0       2
     /dev/sda10  /var/log      ext3    defaults,nodev,nosuid,noexec    0       2
     /dev/sda11  /var/account  ext3    defaults,nodev,nosuid,noexec    0       2
     /dev/sda13  /home         ext3    rw,nosuid,nodev,exec,auto,nouser,async,usrquota,grpquota                0       2
     /dev/fd0    /mnt/fd0      ext3    defaults,users,nodev,nosuid,noexec      0       0
     /dev/fd0    /mnt/floppy   vfat    defaults,users,nodev,nosuid,noexec      0       0
     /dev/hda    /mnt/cdrom    iso9660 ro,users,nodev,nosuid,noexec            0       0

4.9.1 Paramétrer /tmp en noexec

Soyez vigilant si vous mettez /tmp en noexec et que vous voulez installer de nouveaux logiciels étant donné que certains peuvent l'utiliser pendant l'installation. apt est un programme de ce genre (consultez http://bugs.debian.org/116448) si APT::ExtractTemplates::TempDir n'est pas configuré correctement (consultez apt-extracttemplates(1)). Vous pouvez paramétrer cette variable dans le fichier /etc/apt/apt.conf vers un autre répertoire que /tmp et qui aura les droits d'exécution.


4.9.2 Paramétrer /usr en lecture seule

Si vous mettez /usr en lecture seule, vous serez dans l'incapacité d'installer de nouveaux paquets sur le système Debian GNU/Linux. Vous devrez, avant tout, la remonter en lecture/écriture, puis installer les nouveaux paquets et enfin la remonter en lecture seule. apt peut être configuré pour lancer des commandes avant et après l'installation de paquets, ainsi vous pouvez avoir envie de le configurer correctement.

Pour réaliser cela, modifiez le fichier /etc/apt/apt.conf et ajoutez :

       DPkg
       {
           Pre-Invoke  { "mount /usr -o remount,rw" };
           Post-Invoke { "mount /usr -o remount,ro" };
       };

Notez que le Post-Invoke peut échouer avec un message d'erreur « /usr busy ». Cela survient principalement lorsque vous utilisez des fichiers lors de la mise à jour et que ces fichiers sont justement mis à jour. Vous pouvez trouver ces programmes en exécutant

     # lsof +L1

Arrêtez ou relancez ces programmes et exécutez la commande de Post-Invoke vous-même. Attention ! Cela veut dire que vous devrez probablement redémarrer la session X (si vous en faites fonctionner une) à chaque fois que vous faites une mise à jour majeure du système. Vous pourriez aussi vous redemander si paramétrer /usr en lecture seule est adapté au système. Consultez également cette discussion sur debian-devel à propos de /usr en lecture seule.


4.10 Fournir des accès sécurisés aux utilisateurs


4.10.1 Authentification utilisateur : PAM

PAM (Pluggable Authentication Modules) permet aux administrateurs système de choisir comment les applications authentifient les utilisateurs. Remarquez que PAM ne peut rien faire tant qu'une application n'a pas été compilée avec la prise en charge pour PAM. La plupart des applications livrées dans Debian ont cette prise en charge intégrée (Debian n'avait pas de prise en charge pour PAM avant la version 2.2). La configuration actuelle par défaut pour tout service activé avec PAM est d'émuler l'authentification UNIX (consultez /usr/share/doc/libpam0g/Debian-PAM-MiniPolicy.gz pour plus d'informations sur la façon dont les services devraient fonctionner dans Debian).

Chaque application avec la prise en charge de PAM fournit un fichier de configuration dans /etc/pam.d qui peut être utilisé pour modifier son comportement :

La description qui suit est loin d'être complète, pour plus d'informations vous pouvez regarder le The Linux-PAM System Administrator's Guide (sur le site primaire de distribution de PAM). Ce document est également fourni dans le paquet Debian libpam-doc.

PAM vous offre la possibilité de passer en revue plusieurs étapes d'authentification en une seule fois, à l'insu de l'utilisateur. Vous pouvez vous authentifier à une base de données Berkeley et à un fichier passwd normal, ainsi l'utilisateur pourra se connecter seulement si l'authentification est correcte des deux côtés. Vous pouvez restreindre beaucoup de choses avec PAM comme vous pouvez laisser libre accès au système. Donc soyez prudent. Une ligne de configuration typique a un champ de contrôle comme deuxième élément. Généralement, il devrait être paramétré sur requisite qui retourne un échec de connexion si un module échoue.

La première chose que j'aime faire est d'ajouter la prise en charge de MD5 aux applications PAM, étant donné que cela protège le système contre les tentatives d'attaques par dictionnaire (les mots de passe peuvent être plus long en utilisant MD5). Les deux lignes suivantes devraient être ajoutées à tous les fichiers de /etc/pam.d/ qui permettent d'allouer l'accès à la machine, comme login et sshd.

       # Vérifier que libpam-cracklib soit installé avant sinon vous ne
       # pourrez pas vous connecter.
       password   required     pam_cracklib.so retry=3 minlen=12 difok=3
       password   required     pam_unix.so use_authtok nullok md5

Que fait cette formule magique ? La première ligne charge le module PAM cracklib qui fournit la vérification de la longueur des mots de passe, attend un nouveau mot de passe avec au minimum 12 caractères, une différence d'au moins 3 caractères par rapport à l'ancien et autorise 3 essais. cracklib dépend d'une liste de mots (comme wenglish, wfrench, wbritish, etc.), assurez-vous donc d'en avoir installé une adaptée à votre langue, sinon, cela peut être sans aucune utilité. [23] La seconde ligne introduit le module d'authentification standard avec MD5 et autorise un mot de passe nul. La directive use_authok est nécessaire pour passer le mot de passe du module précédent.

Afin d'être sûr que le superutilisateur peut se connecter uniquement à partir des terminaux locaux, la ligne suivante doit être activée dans /etc/pam.d/login :

       auth     requisite  pam_securetty.so

Puis, vous devez modifier la liste des terminaux sur lesquels la connexion du superutilisateur est autorisée dans le fichier /etc/securetty. Vous pouvez sinon activer le module pam_access et modifier /etc/security/access.conf qui permet un contrôle plus général et affiné, mais à qui il manque (malheureusement) des messages de journalisation décents (la journalisation dans PAM n'est pas standard et est un problème particulièrement peu gratifiant à traiter). Nous reviendrons au fichier access.conf un peu plus tard.

Enfin, la ligne suivante devrait être activée dans /etc/pam.d/login pour mettre en place des limites de ressource utilisateur.

       session  required   pam_limits.so

Cela restreint les ressources du système auxquelles les utilisateurs sont autorisées (consultez ci-après Restreindre l'utilisation des ressources : le fichier limits.conf, Section 4.10.2). Par exemple, vous pouvez restreindre le nombre de connexions (d'un groupe d'utilisateurs donné ou tout le système), le nombre de processus, la taille de la mémoire, etc.

Maintenant, éditez /etc/pam.d/passwd et changez la première ligne. Vous devriez ajouter l'option « md5 » pour utiliser les mots de passe MD5, modifiez la longueur minimale du mot de passe de 4 à 6 (ou plus) et fixez une longueur maximale si vous le désirez. La ligne devrait ressembler à quelque chose comme ceci :

       password   required   pam_unix.so nullok obscure min=6 max=11 md5

Si vous voulez protéger su, pour que seules quelques personnes puissent l'utiliser pour devenir superutilisateur sur le système, vous avez besoin de créer un nouveau groupe « wheel » (c'est la meilleure façon, étant donné qu'aucun fichier n'a ces permissions d'attribuées). Ajoutez root et les autres utilisateurs, qui auront la possibilité d'utiliser su pour devenir superutilisateur, à ce groupe. Ensuite, ajoutez la ligne suivante dans /etc/pam.d/su :

       auth        requisite   pam_wheel.so group=wheel debug

Cela permet d'être sûr que seules les personnes du groupe « wheel » pourront utiliser su pour devenir superutilisateur. Les autres utilisateurs ne seront pas capables de le devenir. En fait, ils recevront un message de refus s'ils essayent de devenir superutilisateur.

Si vous désirez que seulement certains utilisateurs s'authentifient à un service PAM, il suffit d'utiliser les fichiers où sont stockés les utilisateurs autorisés (ou pas) à se connecter. Imaginons que vous ne vouliez autoriser que l'utilisateur « ref » à se connecter avec ssh. Vous le mettez dans /etc/sshusers-allowed et écrivez ce qui suit dans /etc/pam.d/ssh:

       auth        required    pam_listfile.so item=user sense=allow file=/etc/sshusers-allowed onerr=fail

Puisqu'il y eu de nombreuses vulnérabilités dites de fichier temporaire non sécurisé, dont thttpd est un exemple (consultez DSA-883-1), libpam-tmpdir est un bon paquet à installer. Tout ce que vous avez à faire est d'ajouter ceci à /etc/pam.d/common-session :

      session    optional     pam_tmpdir.so

Une discussion a eu lieu à propos de l'ajout par défaut dans Etch. Consultez http://lists.debian.org/debian-devel/2005/11/msg00297.html pour obtenir plus de renseignements.

La dernière étape, mais pas la moindre, est de créer le fichier /etc/pam.d/other et d'ajouter les lignes suivantes :

       auth     required       pam_securetty.so
       auth     required       pam_unix_auth.so
       auth     required       pam_warn.so
       auth     required       pam_deny.so
       account  required       pam_unix_acct.so
       account  required       pam_warn.so
       account  required       pam_deny.so
       password required       pam_unix_passwd.so
       password required       pam_warn.so
       password required       pam_deny.so
       session  required       pam_unix_session.so
       session  required       pam_warn.so
       session  required       pam_deny.so

Ces lignes vont fournir une bonne configuration par défaut pour toutes les applications qui gèrent PAM (accès refusé par défaut).


4.10.2 Restreindre l'utilisation des ressources : le fichier limits.conf

Vous devriez vraiment jeter un sérieux coup d'œil à ce fichier. Vous pouvez y définir les limites des ressources par utilisateur. Dans d'anciennes versions, ce fichier de configuration était /etc/limits.conf, mais dans les nouvelles versions (avec PAM), le fichier de configuration à utiliser devrait être /etc/security/limits.conf.

Si vous ne désirez pas restreindre l'utilisation des ressources, n'importe quel utilisateur ayant une invite de commandes valable sur le système (ou même un intrus qui aurait compromis le système par un service ou un démon devenu fou) pourra utiliser autant de CPU, de mémoire, de pile, etc. que le système pourra fournir. Ce problème d'épuisement de ressources peut être réglé par l'utilisation de PAM.

Il existe un moyen d'ajouter des limites de ressources pour certains interpréteurs de commandes (par exemple, bash a ulimit, consultez bash(1)), mais comme ils ne fournissent pas tous les mêmes limites et qu'un utilisateur peut changer d'interpréteur (consultez chsh(1)), il est préférable de placer ces limites dans les modules PAM ainsi elles s'appliqueront quel que soit l'interpréteur de commandes utilisé et également aux modules PAM qui ne sont pas orientés interpréteur.

Les limites de ressources sont imposées par le noyau, mais elles doivent être configurées par le fichier limits.conf et la configuration PAM des différents services doit charger le module PAM approprié. Vous pouvez vérifier quels services imposent des limites en exécutant :

     $ find /etc/pam.d/ \! -name "*.dpkg*" | xargs -- grep limits |grep -v ":#"

Habituellement, login, ssh et les gestionnaires de session graphique (gdm, kdm ou xdm) devraient imposer des limites aux utilisateurs, mais vous pouvez vouloir faire cela dans d'autres fichiers de configuration de PAM, comme cron, pour empêcher les démons système d'accaparer toutes les ressources système..

Les paramètres de limites spécifiques que vous pouvez vouloir imposer dépendent des ressources du système, c'est l'une des principales raisons pour lesquelles aucune limite n'est imposée dans l'installation par défaut.

Par exemple, l'exemple de configuration ci-dessous impose une limite de 100 processus par utilisateur (pour empêcher les bombes de fork) ainsi qu'une limite de 10 Mo de mémoire par processus et une limite de 10 connexions simultanées. Les utilisateurs du groupe adm ont des limites supérieures et peuvent créer des fichiers core s'ils le désirent (c'est simplement une limite douce (soft)).

     *              soft    core            0
     *              hard    core            0
     *              hard    rss             1000
     *              hard    memlock         1000
     *              hard    nproc           100
     *              -       maxlogins       1
     *              hard    data            102400
     *              hard    fsize           2048
     @adm           hard    core            100000
     @adm           hard    rss             100000
     @adm           soft    nproc           2000
     @adm           hard    nproc           3000
     @adm           hard    fsize           100000
     @adm           -       maxlogins       10

Voici les limites qu'un utilisateur standard (y compris les démons système) aurait :

     $ ulimit -a
     core file size        (blocks, -c) 0
     data seg size         (kbytes, -d) 102400
     file size             (blocks, -f) 2048
     max locked memory     (kbytes, -l) 10000
     max memory size       (kbytes, -m) 10000
     open files                    (-n) 1024
     pipe size          (512 bytes, -p) 8
     stack size            (kbytes, -s) 8192
     cpu time             (seconds, -t) unlimited
     max user processes            (-u) 100
     virtual memory        (kbytes, -v) unlimited

Et voici les limites d'un utilisateur administratif :

     $ ulimit -a
     core file size        (blocks, -c) 0
     data seg size         (kbytes, -d) 102400
     file size             (blocks, -f) 100000
     max locked memory     (kbytes, -l) 100000
     max memory size       (kbytes, -m) 100000
     open files                    (-n) 1024
     pipe size          (512 bytes, -p) 8
     stack size            (kbytes, -s) 8192
     cpu time             (seconds, -t) unlimited
     max user processes            (-u) 2000
     virtual memory        (kbytes, -v) unlimited

Pour plus d'informations, consultez :


4.10.3 Actions de connexion de l'utilisateur : modification de /etc/login.defs

La prochaine étape est d'éditer les configuration et action de base lors de la connexion de l'utilisateur. Notez que ce fichier ne fait pas partie de la configuration PAM, c'est un fichier de configuration qui est pris en compte par les programmes login et su, il n'est pas logique de l'adapter aux cas pour lesquels ni l'un ni l'autre des programmes n'est appelé au moins indirectement (le programme getty qui gère les consoles et offre l'invite de connexion initiale appelle bien login).

       FAIL_DELAY          10

Cette variable devrait être configurée à une valeur suffisamment grande de façon à rendre plus difficiles les tentatives de connexion en utilisant la force brute. Si un mauvais mot de passe est fourni, le pirate potentiel (ou le simple utilisateur !) doit attendre 10 secondes avant d'obtenir une nouvelle invite de connexion, ce qui prend pas mal de temps quand vous testez des mots de passe. Veuillez noter que ce paramètre est inopérant si vous utilisez un programme différent de getty, comme par exemple mingetty.

       FAILLOG_ENAB        yes

Si vous activez cette variable, les connexions échouées seront enregistrées dans un journal. Il est important d'en garder une trace pour repérer si quelqu'un tente une attaque par force brute.

       LOG_UNKFAIL_ENAB    no

En configurant cette variable à « yes », les noms d'utilisateur seront enregistrés en cas d'échec de connexion. Laisser la configuration à « no » (par défaut) est plus prudent, puisque sinon, les mots de passe d'utilisateurs pourraient être enregistrés par erreur (si un utilisateur fait une faute de frappe et entre le mot de passe à la place de l'identifiant). Si vous configurez à « yes », assurez-vous que les journaux ont les droits adéquats (640 par exemple, avec une configuration de groupe adéquate comme adm).

       SYSLOG_SU_ENAB      yes

Cela va activer l'écriture dans les journaux de syslog des tentatives de su. Plutôt important sur des machines sérieuses, mais notez que cela peut aussi bien être à la base de problèmes de respect de la vie privée.

       SYSLOG_SG_ENAB      yes

La même chose que SYSLOG_SU_ENAB, mais s'applique au programme sg.

       MD5_CRYPT_ENAB      yes

Comme mentionné ci-dessus, les mots de passe MD5 réduisent considérablement le problème des attaques par dictionnaire étant donné que vous pouvez utiliser des mots de passe plus longs. Si vous utilisez Slink, consultez les documentations avant d'activer le MD5. Sinon, c'est paramétré dans PAM.

       PASS_MAX_LEN        50

Si les mots de passe MD5 sont activés dans la configuration PAM, alors cette variable devrait avoir la même valeur que dans celle-là.


4.10.4 Restreindre le FTP : éditer /etc/ftpusers

Ce fichier contient une liste d'utilisateurs qui ne sont pas autorisés à se connecter à l'hôte en utilisant FTP. Utilisez uniquement ce fichier si vous voulez réellement autoriser le FTP (qui n'est, en général, pas recommandé car il utilise des mots de passe en clair). Si le démon gère PAM, cela peut être utilisé pour permettre ou refuser certains services aux utilisateurs.

FIXME (bogue) : Est-ce un bogue que le fichier par défaut ftpusers dans Debian ne contienne pas tous les utilisateurs d'administration (dans base-passwd) ?

Un moyen pratique d'ajouter tous les comptes système à /etc/ftpusers est d'exécuter

     $ awk -F : '{if ($3<1000) print $1}' /etc/passwd > /etc/ftpusers

4.10.5 Utilisation de su

Si vous avez réellement besoin que des utilisateurs deviennent superutilisateur sur le système, par exemple pour installer des paquets ou ajouter des utilisateurs, vous pouvez utiliser la commande su pour changer d'identité. Vous devriez essayer d'éviter toute connexion en tant que superutilisateur et d'utiliser à la place su. En réalité, la meilleure solution est de supprimer su et de changer pour le mécanisme sudo qui a une logique plus large et plus de fonctionnalités que su. Cependant, su est plus commun étant donné qu'il est utilisé sur beaucoup d'autres UNIX.


4.10.6 Utilisation de sudo

sudo autorise l'utilisateur à exécuter des commandes définies sous l'identité d'un autre utilisateur, même en tant que superutilisateur. Si l'utilisateur est ajouté à /etc/sudoers et est authentifié correctement, il est capable de lancer des commandes qui ont été définies dans /etc/sudoers. Les infractions, telles que les mots de passe incorrects ou les tentatives de lancement d'un programme pour lequel vous n'avez pas les permissions, sont logguées et envoyées au superutilisateur.


4.10.7 Désactiver des accès d'administration à distance

Vous devriez également modifier /etc/security/access.conf pour désactiver la connexion d'administration à distance. Ainsi, les utilisateurs doivent exécuter su (ou sudo) pour utiliser des pouvoirs administratifs et ainsi la trace d'audit appropriée sera toujours générée.

Vous devez ajouter la ligne suivante à /etc/security/access.conf, le fichier de configuration par défaut Debian contient une ligne d'exemple commentée :

        -:wheel:ALL EXCEPT LOCAL

Rappelez-vous d'activer le module pam_access pour chaque service (ou configuration par défaut) dans /etc/pam.d/ si vous voulez que vos modifications dans /etc/security/access.conf soient prises en compte.


4.10.8 Restriction des utilisateurs

Parfois, vous pensez avoir besoin d'utilisateurs créés dans le système local de façon à fournir un service donné (service courrier POP3 ou FTP). Avant tout, rappelez-vous que l'implémentation PAM dans Debian GNU/Linux vous autorise à valider les utilisateurs avec une grande variété de répertoires de services externes (radius, LDAP, etc.) fournis par les paquets libpam.

Si des utilisateurs doivent être créés et que le système est accessible à distance, prenez en compte que des utilisateurs pourront se connecter au système. Cela peut être corrigé en donnant aux utilisateurs un interpréteur de commandes vide (/dev/null) (qui doit être dans /etc/shells). Si vous voulez autoriser les utilisateurs à accéder au système mais limiter leurs mouvements, vous pouvez utiliser le fichier /bin/rbash, ce qui est équivalent à l'ajout de l'option -r dans bash (consultez INTERPRÉTEUR RESTREINT dans bash(1)). Veuillez noter que même avec un interpréteur de commandes restreint, un utilisateur ayant accès à un programme interactif (qui peut permettre l'exécution d'un sous-interpréteur) peut être capable de passer outre les limites de l'interpréteur de commandes.

Debian fournit actuellement dans la version unstable le module pam_chroot (dans le paquet libpam-chroot) (et il pourrait être inclus dans les prochaines versions stables). Une alternative à celui-ci est de chrooter le service qui fournit la connexion à distance (ssh, telnet). [24]

Si vous voulez restreindre quand les utilisateurs peuvent accéder au système, vous devrez personnaliser /etc/security/access.conf en fonction de vos besoins.

Des informations sur la façon de chrooter des utilisateurs accédant au système par le service ssh sont décrites dans Environnement de chroot pour SSH, Annexe G.


4.10.9 Audit d'utilisateur

Si vous êtes vraiment paranoïaque, vous pourriez configurer l'environnement pour superviser ce que les utilisateurs font sur le système. Cette section présente quelques conseils avec différents utilitaires que vous pouvez utiliser.


4.10.9.1 Audit d'entrée et sortie avec script

Vous pouvez utiliser la commande script pour surveiller à la fois ce que les utilisateurs exécutent et les résultats de leurs commandes. Vous ne pouvez pas configurer script comme un interpréteur de commandes (même si vous l'ajoutez à /etc/shells). Mais vous pouvez faire en sorte que le fichier d'initialisation de l'interpréteur de commandes exécute les commandes suivantes :

     umask 077
     exec script -q -a "/var/log/sessions/$USER"

Bien sûr, si vous faites cela pour tout le système, cela veut dire que l'interpréteur ne continuerait pas à lire les fichiers d'initialisation personnels (car l'interpréteur sera écrasé par script). Une solution est de le faire dans les fichiers d'initialisation de l'utilisateur (mais l'utilisateur pourrait alors l'enlever, consultez les commentaires sur cela ci-dessous).

Vous devez également configurer les fichiers dans le répertoire d'audit (dans l'exemple /var/log/sessions/) pour que les utilisateurs puissent y écrire, mais pas supprimer le fichier. Cela pourrait être fait, par exemple, en créant les fichiers de session d'utilisateur en avance et en positionnant l'option append-only (« append-only ») en utilisant chattr.

Une alternative utile pour les administrateurs système, qui inclut des informations de date, serait :

     umask 077
     exec script -q -a "/var/log/sessions/$USER-`date +%Y%m%d`"

4.10.9.2 Utiliser le fichier d'historique de l'interpréteur de commandes

Si vous voulez passer en revue ce que les utilisateurs entrent dans l'interpréteur de commandes (mais sans voir le résultat), vous pouvez configurer un /etc/profile pour tout le système qui configure l'environnement pour que toutes les commandes soient enregistrées dans le fichier d'historique. La configuration pour tout le système doit être réalisée de telle façon que les utilisateurs ne puissent pas enlever les capacités d'audit de leur interpréteur de commandes. C'est plutôt spécifique à l'interpréteur de commandes, donc assurez-vous que tous les utilisateurs utilisent un interpréteur de commandes qui le permet.

Par exemple, pour bash, le fichier /etc/profile pourrait être paramétré ainsi [25] :

       HISTFILE=~/.bash_history
       HISTSIZE=10000
       HISTFILESIZE=999999
       # Empêcher les utilisateurs d'entrer des commandes qui seraient
       # ignorées dans le fichier d'historique
       HISTIGNORE=""
       HISTCONTROL=""
       readonly HISTFILE
       readonly HISTSIZE
       readonly HISTFILESIZE
       readonly HISTIGNORE
       readonly HISTCONTROL
       export HISTFILE HISTSIZE HISTFILESIZE HISTIGNORE HISTCONTROL

Afin que cela fonctionne, l'utilisateur doit être seulement capable d'ajouter des informations au fichier .bash_history. Vous devez aussi positionner l'attribut append-only en utilisant le programme chattr sur .bash_history pour tous les utilisateurs. [26]

Notez que vous pouvez introduire la configuration ci-dessus dans le fichier utilisateur .profile. Mais alors vous devriez configurer les permissions correctement de façon à empêcher à l'utilisateur de modifier ce fichier. Cela inclut : les répertoires personnels de l'utilisateur ne doivent pas appartenir à l'utilisateur (sinon, il pourrait supprimer le fichier), mais en même temps lui permettre de lire le fichier de configuration .profile et d'écrire dans .bash_history. Il serait bien de configurer l'attribut immuable (également en utilisant chattr) pour le .profile aussi si vous procédez ainsi.


4.10.9.3 Audit utilisateur complet avec utilitaires de comptabilité

L'exemple précédent est une manière simple de configurer l'audit utilisateur, mais qui peut ne pas être utile pour des systèmes complexes ou pour ceux dans lesquels les utilisateurs ne peuvent pas exécuter d'interpréteur de commande du tout (ou exclusivement). Si c'est le cas, vous devrez examiner acct, les utilitaires de comptabilité. Ces utilitaires archiveront toutes les commandes exécutées par les utilisateurs ou processus du système au détriment de l'espace disque.

Lors de l'activation de la comptabilité, toutes les informations sur les processus et utilisateurs sont conservées dans /var/account/, plus spécifiquement dans le fichier pacct. Le paquet de comptabilité inclut certains outils (sa et ac) afin d'analyser ces données.


4.10.9.4 Autres méthodes d'audit utilisateur

Si vous êtes complètement paranoïaque et que vous voulez auditer toutes les commandes des utilisateurs, vous pouvez prendre les codes source de bash, les modifier et récupérer dans un fichier toutes les commandes qu'un utilisateur tape. Vous pourriez aussi avoir ttysnoop constamment en attente de nouveaux ttys [27] et reverser toutes les sorties dans un fichier. Un autre programme utile est snoopy (consultez également la page du projet) qui est un programme transparent pour l'utilisateur qui se positionne comme une bibliothèque fournissant une encapsulation des appels execve(), toute commande exécutée est journalisée par syslogd en utilisant la fonctionnalité authpriv (généralement stockée dans /var/log/auth.log).


4.10.10 Inspection des profils utilisateurs

Si vous désirez voir ce que font vraiment les utilisateurs, comme l'heure à laquelle ils se connectent, vous pouvez utiliser la base de données wtmp qui contient toutes les informations concernant les connexions. Ce fichier peut être employé avec plusieurs utilitaires, parmi eux sac peut sortir un profil de chaque utilisateur montrant dans quel créneau horaire il se connecte habituellement au système.

Dans le cas où vous avez la comptabilité activée, vous pouvez également utiliser les outils qu'elle fournit pour déterminer quand les utilisateurs accèdent au système et ce qu'ils exécutent.


4.10.11 Positionner des umasks aux utilisateurs

En fonction de la politique d'utilisateur, vous pourriez modifier la façon dont les renseignements sont partagés entre utilisateurs, c'est-à-dire quels sont les droits de nouveaux fichiers par défaut créés par les utilisateurs.

Le paramètre umask par défaut de Debian est 022, cela signifie que les fichiers (et les répertoires) peuvent être lus et accédés par le groupe de l'utilisateur et par tout autre utilisateur du système. Cette définition est configurée dans le fichier de configuration normalisé /etc/profile utilisé par tous les interpréteurs de commandes.

Si la valeur par défaut de Debian est trop permissive pour le système, vous devrez changer ce paramètre umask pour tous les interpréteurs de commandes. Parmi les configurations plus restrictives d'umask, 027 (pas d'accès permis aux nouveaux fichiers pour le groupe other, c'est-à-dire aux autres utilisateur du système) ou 077 (pas d'accès permis aux nouveaux fichiers pour les membres du groupe de l'utilisateur) peuvent être utilisés. Debian (par défaut[28]) crée un groupe par utilisateur de telle sorte que seul l'utilisateur soit inclus dans son groupe. Par conséquent, 027 et 077 sont équivalents car le groupe de l'utilisateur ne contient que l'utilisateur lui-même.

Cette modification est configurée en définissant un réglage correct de umask pour tous les utilisateurs. Vous pouvez modifier cela en introduisant un appel umask dans les fichiers de configuration de l'interpréteur de commandes : /etc/profile (source par tous les interpréteurs de commandes compatibles Bourne), /etc/csh.cshrc, /etc/csh.login, /etc/zshrc et probablement d'autres (en fonction des interpréteurs de commandes installés sur le système). Vous pouvez aussi modifier le réglage de UMASK dans /etc/login.defs. De toutes celles-là, la dernière chargée par l'interpréteur de commandes est prioritaire. L'ordre est : la configuration système par défaut pour l'interpréteur de l'utilisateur (c'est-à-dire /etc/profile et les autres fichiers de configuration globaux du système) et ensuite ceux de l'utilisateur (ses ~/.profile, ~/.bash_profile, etc.). Certains interpréteurs, cependant, peuvent être exécutés avec une valeur nologin avec laquelle certains de ces fichiers pourraient être sautés. Consultez la page de manuel de l'interpréteur pour obtenir de plus amples renseignements.

Pour les connexions qui utilisent login, la définition de UMASK de /etc/login.defs est utilisée avant toutes les autres. Cependant, cette valeur ne s'applique pas aux programmes exécutés par l'utilisateur qui n'utilisent pas login comme ceux exécutés à travers su, cron ou ssh.

N'oubliez pas de vérifier et éventuellement modifier les fichiers de configuration utilisateur sous /etc/skel/ car ce sont ceux qui seront utilisés par défaut quand ils sont créés avec la commande adduser. Les fichiers de configuration utilisateur Debian par défaut ne contiennent pas d'appel umask mais s'il y en a dans n'importe quel fichier de configuration utilisateur, les utilisateurs nouvellement créés pourraient avoir une valeur différente.

Notez, cependant, que les utilisateurs peuvent modifier leur propre paramètre umask s'ils le désirent, le rendant plus permissif ou plus restrictif, en modifiant leurs propres fichiers de configuration utilisateur.

Le paquet libpam-umask règle l'umask par défaut utilisant PAM. Après l'installation du paquet, ajoutez ceci à /etc/pam.d/common-session :

     session    optional     pam_umask.so umask=077

Enfin, vous pourriez envisager de modifier l'umask par défaut du superutilisateur à 022 (tel que défini dans /root/.bashrc) à une valeur plus restrictive. Cela évitera à l'administrateur système de laisser fuir par inadvertance des fichiers sensibles lorsqu'il travaille en tant que superutilisateur dans des répertoires lisibles par tous (comme /tmp) et en les rendant lisibles aux autres utilisateurs.


4.10.12 Limiter ce que les utilisateurs peuvent voir et accéder

FIXME : Besoin de contenu. Indiquer les conséquences de changement des permissions des paquets lors d'une mise à jour (un administrateur aussi paranoïaque que cela devrait chrooter ses utilisateurs au passage) s'il n'utilise pas dpkg-statoverride.

Si vous avez besoin d'accorder aux utilisateurs un accès au système avec un interpréteur de commandes, réfléchissez-y très soigneusement. Un utilisateur peut, par défaut à moins d'être dans un environnement extrêmement restreint (comme une prison chroot), récupérer un assez grand nombre d'informations concernant le système, y compris :

Que peut voir un utilisateur dans le système ? Probablement un assez grand nombre de choses, essayez ceci (prenez une profonde respiration) :

       find / -type f -a -perm +006 2>/dev/null  
       find / -type d -a -perm +007 2>/dev/null

La liste des fichiers qu'un utilisateur peut voir et des répertoires auxquels il a accès est affichée.


4.10.12.1 Limiter l'accès aux informations d'autres utilisateurs

Si vous accordez toujours un accès d'interpréteur de commandes aux utilisateurs, vous pouvez vouloir limiter les informations qu'ils peuvent voir des autres utilisateurs. Les utilisateurs ayant un accès d'interpréteur de commandes ont tendance à créer un grand nombre de fichiers dans leur répertoire $HOME : boîtes aux lettres, documents personnels, configuration des applications X/GNOME/KDE, etc.

Sous Debian, chaque utilisateur est créé avec un groupe associé et aucun utilisateur n'appartient au groupe d'un autre utilisateur. Il s'agit du comportement par défaut : quand un compte d'utilisateur est créé, un groupe du même nom est créé et l'utilisateur lui est attribué. Cela évite le concept d'un groupe users qui peut rendre plus difficile pour les utilisateurs de cacher des informations aux autres utilisateurs.

Cependant, les répertoires $HOME des utilisateurs sont créés avec les permissions 0755 (lisible par le groupe et par tout le monde). Les permissions de groupe ne sont pas un problème car seul l'utilisateur appartient au groupe, cependant les permissions pour les autres peuvent être (ou non) un problème selon vos règles locales.

Vous pouvez changer ce comportement pour que la création d'utilisateur fournisse des permissions sur $HOME différentes. Pour changer ce comportement pour les nouveaux utilisateurs quand ils seront créés, changez DIR_MODE dans le fichier de configuration /etc/adduser.conf à 0750 (pas d'accès en lecture pour tout le monde).

Les utilisateurs peuvent toujours partager des informations, mais pas directement dans leur répertoire $HOME à moins qu'ils ne changent les permissions de celui-ci.

Notez que désactiver les répertoires utilisateur lisibles par tout le monde empêchera les utilisateurs de créer leurs pages personnelles dans le répertoire ~/public_html car le serveur web ne pourra pas lire un composant du chemin — leur répertoire $HOME. Si vous voulez permettre aux utilisateurs de publier des pages HTML dans leur ~/public_html, changez DIR_MODE en 0751. Cela permettra au serveur web d'accéder à ce répertoire (qui devrait lui-même avoir le mode 0755) et de fournir le contenu publié par les utilisateurs. Bien sûr, nous ne parlons ici que d'une configuration par défaut ; les utilisateurs peuvent généralement ajuster les permissions de leurs fichiers comme ils le désirent, ou vous pouvez conserver le contenu destiné au web dans un emplacement séparé qui n'est pas un sous-répertoire du répertoire $HOME de chaque utilisateur.


4.10.13 Générer des mots de passe utilisateur

Il y a plusieurs cas dans lesquels un utilisateur a besoin de créer un grand nombre de comptes utilisateur et de fournir des mots de passe pour tous ceux-ci. Bien sûr, l'administrateur peut facilement positionner le mot de passe pour être le même que le nom du compte utilisateur, mais cela n'est pas très conseillé sur le plan de la sécurité. Une meilleure approche est d'utiliser un programme de génération de mots de passe. Debian fournit les paquets makepasswd, apg et pwgen qui contiennent des programmes (dont le nom est le même que celui du paquet) qui peuvent être utilisés dans ce but. makepasswd génère des mots de passe vraiment aléatoires avec un accent sur la sécurité plus que la prononçabilité tandis que pwgen essaie de créer des mots de passe sans signification, mais prononçables (bien sûr, cela dépend de votre langue maternelle). apg dispose d'algorithmes pour les deux (il y a une version client/serveur pour ce programme, mais elle n'est pas incluse dans le paquet Debian).

passwd ne permet pas une attribution non interactive des mots de passe (car il utilise un accès direct au terminal tty). Si vous désirez changer des mots de passe lors de la création d'un grand nombre d'utilisateurs, vous pouvez les créer en utilisant adduser avec l'option --disabled-login, puis utiliser usermod ou chpasswd [29] (tous les deux dans le paquet passwd, ils sont donc déjà installés). Si vous voulez utiliser un fichier avec toutes les informations pour créer les utilisateurs comme un processus batch, il sera probablement préférable d'utiliser newusers.


4.10.14 Vérifier les mots de passe utilisateur

Les mots de passe des utilisateurs peuvent parfois devenir le maillon faible de la sécurité d'un système donné. Cela provient du fait que quelques utilisateurs choisissent des mots de passe faibles pour leur compte (et plus il y a d'utilisateurs, plus grandes sont les chances que cela se produise). Même si vous mettez en place des vérifications avec le module PAM cracklib et les limitations sur les mots de passe comme décrites dans Authentification utilisateur : PAM, Section 4.10.1, les utilisateurs pourront toujours utiliser des mots de passe faibles. Comme l'accès utilisateur peut inclure un accès à une invite de commandes à distance (en espérant que ce soit avec ssh), il est important de rendre les mots de passe aussi difficile à deviner que possible pour les attaquants à distance, particulièrement s'ils ont pu récupérer des informations importantes comme les noms d'utilisateur ou même les fichiers passwd et shadow eux-mêmes.

Un administrateur système doit, suivant le nombre d'utilisateurs, vérifier si les mots de passe sont cohérents avec la règle locale de sécurité. Comment vérifier ? Essayez de les casser comme le ferait un attaquant s'il avait accès aux mots de passe hachés (le fichier /etc/shadow).

Un administrateur peut utiliser john ou crack (tous deux utilisent la force brute) ensemble avec une liste de mots appropriés pour vérifier les mots de passe utilisateurs et prendre des mesures appropriées si un mot de passe faible est détecté. Vous pouvez rechercher des paquets Debian contenant des listes de mots en utilisant apt-cache search wordlist ou vous pouvez également visiter des sites de listes de mots sur Internet classique comme ftp://ftp.ox.ac.uk/pub/wordlists ou ftp://ftp.cerias.purdue.edu/pub/dict.


4.10.15 Déconnecter les utilisateurs inactifs (idle)

L'inactivité des utilisateurs pose habituellement un problème de sécurité, un utilisateur peut être inactif parce qu'il est parti déjeuner ou parce qu'une connexion à distance s'est bloquée et n'a pas été rétablie. Quelqu'en soit la raison, les utilisateurs inactifs peuvent amener à une compromission :

Certains systèmes à distance ont même été compromis à travers un screen inactif (et détaché).

La déconnexion automatique des utilisateurs inactifs est habituellement une partie qui doit être imposée par les règles de sécurité locales. Plusieurs moyens existent pour cela :

Les démons timeoutd et autolog sont les méthodes préférées car, après tout, les utilisateurs peuvent changer d'interpréteur de commandes par défaut ou peuvent, après avoir exécuté leur interpréteur de commandes par défaut, basculer sur un autre interpréteur de commandes (non contrôlé).


4.11 Utilisation de tcpwrappers

L'encapsulation TCP a été développée quand il n'y avait pas de réels filtres de paquets disponibles et que les contrôles d'accès étaient nécessaires. Toutefois, ils sont toujours très intéressants et utiles. L'encapsulation TCP vous permet d'autoriser ou de refuser un service à un hôte ou à un domaine et de définir une règle par défaut pour les autorisations et les refus (toutes réalisées au niveau applicatif). Pour plus de détails, jetez un œil à hosts_access(5).

De nombreux services installés dans Debian sont soit :

D'un côté, pour des services configurés dans /etc/inetd.conf, cela comprend telnet, ftp, netbios, swat et finger), vous observerez que le fichier de configuration exécute avant tout /usr/sbin/tcpd. D'un autre côté, même si un service n'est pas lancé par le super démon inetd, il peut être compilé avec la prise en charge pour les règles d'encapsulation TCP. Les services suivant sont compilés avec prise en charge d'encapsulation TCP dans Debian : ssh, portmap, in.talk, rpc.statd, rpc.mountd, gdm, oaf (le démon d'activation GNOME), nessus et beaucoup d'autres.

Pour voir quels paquets utilisent tcpwrappers [30], essayez :

       $ apt-cache rdepends libwrap0

Tenez compte de cela quand vous utilisez tcpdchk (un vérificateur très utile de règles et syntaxe de fichier de configuration d'encapsulation TCP). Quand vous pouvez ajouter des services indépendants (qui sont liés à la bibliothèque d'encapsulation) dans les fichiers host.deny et hosts.allow, tcpdchk vous informera qu'il ne peut pas trouver les services mentionnés étant donné qu'il les cherche dans /etc/inetd.conf (la page de manuel n'est pas totalement précise ici).

À présent, voici une petite astuce et probablement le plus petit système de détection d'intrusions disponible. Généralement, vous devriez disposer d'une politique correcte concernant le pare-feu en première ligne, puis disposer de l'encapsulation TCP en seconde ligne de défense. Un petit truc est de mettre en place une commande SPAWN [31] dans /etc/hosts.deny qui enverra un courrier au superutilisateur quand un service refusé déclenche l'encapsulation :

       ALL: ALL: SPAWN ( \
         echo -e "\n\
         Encapsulation TCP \: Connexion refusée\n\
         Par \: $(uname -n)\n\
         Processus \: %d (pid %p)\n\
         Utilisateur \: %u\n\
         Hôte \: %c\n\
         Date \: $(date)\n\
       " | /usr/bin/mail -s "Connexion à %d bloquée" root) &

Attention : L'exemple ci-dessus peut-être facilement sujet à une attaque par déni de service en soumettant énormément de connexions dans une période très courte. De nombreux courriers signifient de nombreuses E/S en envoyant uniquement quelques paquets.


4.12 L'importance des journaux et des alertes

Il est facile de voir que le traitement de journaux et alertes est un problème sérieux sur un système sécurisé. Supposons qu'un système est parfaitement configuré et sécurisé à 99 %. Si l'attaque représentant le 1 % vient à arriver et qu'il n'y a pas de mesures de sécurité mises en place pour, dans un premier temps, détecter cela et, dans un deuxième temps, lancer l'alerte, le système n'est pas sécurisé du tout.

Debian GNU/Linux fournit quelques outils pour effectuer des analyses de journaux, notamment swatch[32], logcheck ou log-analysis (tous ont besoin d'être personnalisés pour enlever les choses non nécessaires des comptes-rendus). Il peut être également utile, si le système est proche, d'avoir les journaux du système affichés sur une console virtuelle. C'est utile car vous pouvez (de loin) voir si le système se comporte correctement. Le fichier /etc/syslog.conf de Debian est fourni avec une configuration commentée par défaut ; pour l'activer, décommenter les lignes et redémarrez syslogd (/etc/init.d/syslogd restart) :

       daemon,mail.*;\
             news.=crit;news.=err;news.=notice;\
             *.=debug;*.=info;\
             *.=notice;*.=warn       /dev/tty8

Pour colorer les journaux, vous pouvez jeter un œil à colorize, ccze ou glark. Une grande partie de l'analyse des journaux ne peut pas être couverte ici, une bonne ressource d'informations est disponible dans les livres comme Gestion des journaux de sécurité : identification de motifs au milieu du chaos. Dans tous les cas, même des outils automatiques ne peuvent rivaliser avec le meilleur outil d'analyse : votre cerveau.


4.12.1 Utiliser et personnaliser logcheck

Le paquet logcheck dans Debian est divisé en trois paquets logcheck (le programme principal), logcheck-database (une base de données d'expressions rationnelles pour le programme) et logtail (affiche les lignes du journal qui n'ont pas encore été lues). Le comportement par défaut sous Debian (dans /etc/cron.d/logcheck) est que logcheck est exécuté toutes les heures et une fois après le démarrage.

Cet outil peut être assez utile s'il est personnalisé correctement pour alerter l'administrateur d'événements système inhabituels. logcheck peut être complètement personnalisé pour envoyer des courriers selon les événements récupérés des journaux et qui sont dignes d'attention. L'installation par défaut inclut des profils pour des événements ignorés et des violations de règles pour trois configurations différentes (station de travail, serveur et paranoïaque). Le paquet Debian contient un fichier de configuration /etc/logcheck/logcheck.conf, qui définit à quel utilisateur sont envoyés les vérifications. Il permet également aux paquets qui fournissent des services d'implémenter de nouvelles règles dans les répertoires : /etc/logcheck/cracking.d/_paquet_, /etc/logcheck/violations.d/_paquet_, /etc/logcheck/violations.ignore.d/_paquet_, /etc/logcheck/ignore.d.paranoid/_paquet_, /etc/logcheck/ignore.d.server/_paquet_ et /etc/logcheck/ignore.d.workstation/_paquet_. Cependant, peu de paquets le font actuellement. Si vous avez une règle qui peut être utile à d'autres utilisateurs, veuillez l'envoyer comme un rapport de bogue sur le paquet approprié (comme un bogue de gravité wishlist). Pour obtenir plus de renseignements, veuillez consulter /usr/share/doc/logcheck/README.Debian.

Le meilleur moyen de configurer logcheck est d'éditer son fichier de configuration principal /etc/logcheck/logcheck.conf après l'avoir installé. Modifiez l'utilisateur par défaut (root) à qui seront envoyés par courrier les comptes-rendus. Vous devriez également y positionner le niveau de compte-rendu. logcheck-database a trois niveaux de compte-rendu de verbosité croissante : station de travail, serveur, paranoïaque. « serveur » étant le niveau par défaut, « paranoïaque » n'est recommandé que pour les machines de haute sécurité ne faisant fonctionner qu'aussi peu de services que possible et « station de travail » est pour les machines relativement protégés et non critiques. Si vous désirez ajouter de nouveaux fichiers journaux, ajoutez-les simplement à /etc/logcheck/logcheck.logfiles. Celui-ci est configuré pour une installation de syslog par défaut.

Une fois fait, vous pouvez vouloir vérifier les courriers envoyés, pour les quelques premiers jours, semaines ou mois. Si estimez recevoir des messages indésirables, ajoutez simplement l'expression rationnelle (consultez regex(7) et egrep(1)) qui correspond à ces messages au fichier /etc/logcheck/ignore.d.niveau_de_compte-rendu/local. Essayez de faire correspondre à la ligne entière du journal. Des détails sur l'écriture des règles sont expliqués dans /usr/share/doc/logcheck-database/README.logcheck-database.gz. C'est un processus d'affinement perpétuel ; une fois que les messages envoyés sont toujours pertinents, vous pouvez considérer que l'affinement est terminé. Notez que si logcheck ne trouve rien de pertinent dans le système, il ne vous enverra pas de courrier même s'il fonctionne (donc, vous pouvez ne recevoir de courrier qu'une fois par semaine si vous êtes chanceux).


4.12.2 Configurer l'endroit où les alertes sont envoyées

Debian livre une configuration standard de syslog (dans /etc/syslog.conf) qui archive les messages dans les fichiers appropriés en fonction de la facilité du système. Vous devriez être familier avec cela ; jetez un œil au fichier syslog.conf et à la documentation si vous ne l'êtes pas. Si vous avez l'intention de maintenir un système sécurisé, vous devriez être conscient de l'endroit où les journaux sont envoyées ainsi ils ne sont pas perdus dans la nature.

Par exemple, envoyer des messages à la console est également utile pour de nombreux systèmes de production. Mais pour de nombreux systèmes semblables il est également important d'ajouter une nouvelle machine qui servira de serveur de journalisation (il reçoit les journaux de tous les autres systèmes).

Le courrier du superutilisateur devrait être pris en considération également, de nombreux contrôles de sécurité (comme snort) envoient des alertes dans la boîte aux lettres du superutilisateur. Celle-ci pointe généralement sur le premier utilisateur créé sur le système (vérifiez /etc/aliases). Veillez à envoyer le courrier du superutilisateur à un endroit où il sera lu (soit localement soit à distance).

Il y a d'autres comptes et alias « rôles » sur le système. Sur un petit système, le plus simple est probablement de s'assurer que tous ces alias pointent vers le compte du superutilisateur, et que les messages à destination du superutilisateur sont retransmis vers la boîte aux lettres personnelle de l'administrateur système.

FIXME : Il serait intéressant de dire comment un système Debian peut envoyer/recevoir des messages SNMP relatifs à des problèmes de sécurité (jfs). Voir : snmptragfmt, snmp et snmpd.


4.12.3 Utilisation d'un hôte d'archivage (loghost)

Un loghost est un hôte qui recueille les données des syslog à travers le réseau. Si l'une de vos machines est piratée, l'intrus n'est pas capable de dissimuler ses traces, à moins qu'il ne pirate également le loghost. Par conséquent, le loghost devrait être particulièrement sécurisé. Faire d'une machine un loghost est simple. Il suffit juste de démarrer le syslogd avec syslogd -r et un nouveau loghost est né. De façon à rendre cela permanent dans Debian, éditez /etc/default/syslogd et changez la ligne

     SYSLOGD=""

par

     SYSLOGD="-r"

Ensuite, configurez les autres machines afin qu'elles envoient les données au loghost. Ajoutez une entrée comme celle qui suit dans /etc/syslog.conf :

       facilité.niveau           @votre_loghost

Consultez la documentation pour savoir ce qu'on peut utiliser à la place de facilité et niveau (ils ne devraient pas être mot pour mot comme cela). Si vous voulez tout archiver à distance, il suffit d'écrire :

       *.*                       @votre_loghost

dans syslog.conf. Archiver à distance ainsi que localement est la meilleure solution (le pirate peut estimer avoir couvert ses traces après la suppression des fichiers de journalisation locaux). Consultez les pages de manuel syslog(3), syslogd(8) et syslog.conf(5) pour toutes informations complémentaires.


4.12.4 Permissions du fichier de journalisation

Il est important de décider non seulement comment les alertes sont utilisées, mais aussi qui y accède, c'est-à-dire qui peut lire ou modifier les fichiers de journalisation (en absence d'hôte d'archivage). Les alertes de sécurité que l'attaquant peut modifier ou désactiver sont de peu de valeur en cas d'intrusion. Vous devez également prendre en compte que les fichiers de journalisation peuvent révéler un grand nombre d'informations à propos du système à un intrus s'il y a accès.

Certaines permissions de fichiers de journalisation ne sont pas parfaites après l'installation (mais, bien sûr, cela dépend vraiment de vos règles de sécurité locales). Premièrement /var/log/lastlog et /var/log/faillog n'ont pas besoin d'être lisibles par les utilisateurs normaux. Dans lastlog, vous pouvez voir qui s'est connecté récemment, et dans faillog, vous voyez un résumé des connexions qui ont échouées. L'auteur recommande de faire un chmod 660 sur les deux fichiers. Faites un tour rapide des fichiers de journalisation et décidez avec beaucoup d'attention quels fichiers de journalisation vous rendez lisible ou modifiable par un utilisateur avec un UID différent de 0 et un autre groupe que « adm » ou « root ». Vous pouvez facilement vérifier cela sur le système avec :

       #  find /var/log -type f -exec ls -l {} \; | cut -c 17-35 |sort -u
       (voir à quels utilisateurs appartiennent les fichiers de /var/log)
       #  find /var/log -type f -exec ls -l {} \; | cut -c 26-34 |sort -u
       (voir à quels groups appartiennent les fichiers de /var/log)
       # find /var/log -perm +004
       (fichiers lisibles par tout utilisateur)
       #  find /var/log \! -group root \! -group adm -exec ls -ld {} \;
       (fichiers appartenant à des groupes autres que root ou adm)

Pour personnaliser la façon dont les fichiers de journalisation sont créés, vous devez probablement personnaliser le programme qui les génère. Cependant, si le fichier de journalisation est archivé, vous pouvez personnaliser le comportement de la création et de l'archivage.


4.13 Les utilitaires pour ajouter des correctifs au noyau

Debian GNU/Linux fournit quelques correctifs pour le noyau Linux qui améliorent sa sécurité du système. En voici quelques-uns.

Les correctifs de sécurité du noyau suivants ne sont disponibles que pour d'anciennes versions du noyau dans Woody et ils sont obsolètes :

Cependant, certains correctifs ne sont pas encore fournis dans Debian. Si vous croyez que certains devraient être inclus, veuillez le demander sur la page des paquets en souffrance et paquets souhaités.


4.14 Se protéger contre les dépassements de tampon

Dépassement de tampon est le nom d'une attaque courante sur un logiciel[34] qui utilise insuffisamment des vérifications de limites (une erreur de programmation courante, plus particulièrement en langage C) pour exécuter du code machine par des entrées de programme. Ces attaques, contre des logiciels serveur qui attendent des connexions distantes et contre des logiciels locaux qui autorisent des droits élevés aux utilisateurs (setuid ou setgid) peuvent avoir pour conséquence la compromission de tout un système.

Quatre méthodes en particulier permettent de se protéger contre les dépassement de tampon :

Debian GNU/Linux, dans sa version 3.0, fournit des logiciels pour implémenter toutes ces méthodes à l'exception de la protection de la compilation du code source (mais cela a été demandé dans le bogue nº 213994).

Notez que même si Debian fournissait un compilateur qui fournit cette fonction de protection de dépassement de tampon/pile, tous les paquets auraient besoin d'être recompilés pour introduire cette fonctionnalité. C'est, en fait, ce que fait Adamantix (entre autres fonctionnalités). L'effet de cette nouvelle fonctionnalité sur la stabilité des logiciels doit encore être déterminée (certains programmes ou architectures de processeur pourraient être cassés à cause d'elle).

Dans tous les cas, soyez conscient que même ces contournement peuvent ne pas prévenir les dépassements de tampon car il existe des moyens de circonvenir ceux-ci, comme décrit dans l'édition 58 du magazine phrack ou dans l'alerte du CORE Failles multiples dans les technologies de protection d'écrasement de la pile.

Si vous voulez tester la protection contre les dépassements de tampon une fois que vous l'avez mise en place (quelque que soit la méthode), vous pouvez vouloir installer le paxtest et exécuter les tests qu'il fournit.


4.14.1 Correctif du noyau de protection pour les dépassements de tampon

Des correctifs du noyau liés aux dépassements de tampon incluant le correctif Openwall fournissent une protection contre les dépassements de tampon dans les noyaux Linux 2.2. Pour les noyaux 2.4 et plus récents, vous devrez utiliser l'implémentation Exec-shield ou l'implémentation PaX (fournies dans le correctif grsecurity, kernel-patch-2.4-grsecurity et dans le correctif Adamantix, kernel-patch-adamantix). Pour plus d'informations sur l'utilisation de ces correctifs, veuillez consulter la section Les utilitaires pour ajouter des correctifs au noyau, Section 4.13.


4.14.2 Tester des programmes pour les dépassements

L'utilisation d'outils pour détecter des dépassements de tampon nécessitent dans tous les cas une expérience de programmation pour corriger (et recompiler) le code. Debian fournit par exemple : bfbtester (un testeur de dépassement de tampon qui brutalise des binaires par la force par des dépassements de ligne de commande et d'environnement). D'autres paquets intéressants pourraient aussi être rats, pscan, flawfinder et splint.


4.15 Sécurisation des transferts de fichiers

Pendant l'administration normale du système, il est habituellement nécessaire de transférer des fichiers à partir et vers le système installé. La copie des fichiers de façon sécurisée d'un hôte vers un autre peut être effectuée en utilisant le paquet serveur ssh. Une autre possibilité est d'utiliser ftpd-ssl, un serveur FTP qui utilise Secure Socket Layer pour chiffrer les transmissions.

Toutes ces méthodes nécessitent des clients spécifiques. Debian fournit des clients logiciels, comme scp du paquet ssh, qui fonctionne comme rcp, mais est complètement chiffré, donc les méchants ne peuvent même pas savoir CE QUE vous copiez. Il existe également un paquet client ftp-ssl pour le serveur équivalent. Vous pouvez trouver des clients pour ces logiciels, même pour d'autres systèmes d'exploitation (non UNIX), putty et winscp fournissent des implémentations de copie sécurisée pour toutes les versions des systèmes d'exploitation de Microsoft.

Notez qu'utiliser scp fournit un accès pour tous les utilisateurs à tout le système de fichiers à moins de faire un chroot comme décrit dans Chrooter SSH, Section 5.1.1. L'accès FTP peut être chrooté, c'est probablement plus facile selon le démon que vous choisissez, comme décrit dans Sécurisation de FTP, Section 5.3. Si vous vous inquiétez d'utilisateurs locaux pouvant parcourir les fichiers locaux et que vous voulez avoir une communication chiffrée, vous pouvez soit utiliser un démon FTP avec la prise en charge SSL, soit combiner un FTP sans chiffrement avec une configuration VPN (consultez Réseaux Privés Virtuels, Section 8.5).


4.16 Limites et contrôle des systèmes de fichiers


4.16.1 Utilisation de quotas

Avoir une bonne politique relative aux quotas est important, vu qu'elle empêche les utilisateurs de remplir les disques durs.

Vous pouvez utiliser deux systèmes de quotas différents : les quotas utilisateur et les quotas groupe. Comme vous l'avez probablement deviné, les quotas utilisateur limitent la quantité d'espace qu'un utilisateur peut avoir, les quotas groupe quant à eux font la même chose pour les groupes. Retenez cela quand vous calculerez les tailles des quotas.

Il y a quelques points importants auxquels il faut penser dans la mise en place d'un système de quotas :

Tous les répertoires et partitions auxquels les utilisateurs ont accès en écriture complet devraient avoir les quotas activés. Recherchez ces partitions et répertoires et calculez une taille adaptée qui combine disponibilité et sécurité.

Bon, maintenant vous désirez utiliser les quotas. Avant tout, vous avez besoin de vérifier si vous avez activé la prise en charge des quotas dans le noyau. Si non, vous devrez le recompiler. Après cela, contrôlez si le paquet quota est installé. Si non, vous en aurez également besoin.

L'activation des quotas pour des systèmes de fichiers différents est aussi facile que la modification du paramètre defaults en defaults,usrquota dans le fichier /etc/fstab. Si vous avez besoin des quotas par groupe, remplacez usrquota par grpquota. Vous pouvez également utiliser les deux. Ensuite, créez des fichiers vides quota.user et quota.group à la racine du système de fichiers sur lequel vous voulez utiliser les quotas (touch /home/quota.user /home/quota.group pour un système de fichiers /home).

Redémarrez quota en faisant /etc/init.d/quota stop;/etc/init.d/quota start. Maintenant les quotas devraient être en fonction et leurs tailles peuvent être configurées.

L'édition de quotas pour un utilisateur spécifique peut être réalisée en faisant edquota -u <user>. Les quotas par groupes peuvent être modifiés avec edquota -g <group>. Ensuite, paramétrez les quotas soft et hard ou les quotas pour inœuds selon vos besoins.

Pour plus d'informations concernant les quotas, consultez la page de manuel de la commande quota et le quota mini-howto (/usr/share/doc/HOWTO/fr-html/Quota.html). Vous pouvez également vouloir étudier pam_limits.so.


4.16.2 Les attributs spécifiques du système de fichiers ext2 (chattr/lsattr)

En plus des permissions standards UNIX, les systèmes de fichiers ext2 et ext3 offrent un ensemble d'attributs spécifiques qui donnent plus de contrôle sur les fichiers du système. À la différence des permissions de base, ces attributs ne sont pas affichés par la commande standard ls -l, ni changés par la commande chmod et vous avez besoin de deux autres utilitaires, lsattr et chattr (du paquet e2fsprogs) pour les gérer. Notez que cela veut dire que ces attributs ne sont habituellement pas enregistrés quand vous sauvegardez le système, donc si vous modifiez l'un d'entre eux, il peut être utile d'enregistrer les commandes chattr successives dans un script pour pouvoir les repositionner plus tard si vous avez à récupérer une sauvegarde.

Parmi tous les attributs disponibles, les deux plus importants pour améliorer la sécurité sont référencés par les lettres « i » et « a » et ils ne peuvent être positionnés (ou enlevés) que par le superutilisateur :

Ces attributs peuvent également être positionnés pour les répertoires, dans ce cas, le droit de modifier le contenu de la liste d'un répertoire est refusé (par exemple, renommer ou supprimer un fichier, etc.) Quand il est appliqué à un répertoire, l'attribut d'ajout ne permet que la création de fichiers.

Il est aisé de voir que l'attribut « a » améliore la sécurité, en donnant aux programmes qui ne sont pas exécutés par le superutilisateur, la possibilité d'ajouter des données à un fichier sans pouvoir modifier son précédent contenu. D'un autre côté, l'attribut « i » semble moins intéressant : après tout, le superutilisateur peut déjà utiliser les permissions standards UNIX pour restreindre l'accès à un fichier et un intrus qui aurait accès au compte superutilisateur peut toujours utiliser le programme chattr pour supprimer l'attribut. Un tel intrus peut tout d'abord être perplexe quand il se rendra compte qu'il ne peut pas supprimer un fichier, mais vous ne devriez pas supposer qu'il est aveugle — après tout, il est entré dans le système ! Certains manuels (y compris une précédente version de ce document) suggèrent de supprimer simplement les programmes chattr et lsattr du système pour améliorer la sécurité, mais ce genre de stratégie, aussi connu comme « sécurité par l'obscurité », doit être absolument évitée, car elle donne un sentiment trompeur de sécurité.

Une façon sûre de résoudre ce problème est d'utiliser les fonctionnalités du noyau Linux, comme décrit dans Défense proactive, Section 10.4.2.1. La fonctionnalité intéressante est appelée ici CAP_LINUX_IMMUTABLE : si vous la supprimez de l'ensemble des fonctionnalités (en utilisant par exemple la commande lcap CAP_LINUX_IMMUTABLE), il ne sera plus possible de modifier les attributs « a » ou « i » sur le système, même pour le superutilisateur ! Une stratégie complète serait alors la suivante :

  1. positionner les attributs « a » et « i » sur tous les fichiers voulus ;

  1. ajouter la commande lcap CAP_LINUX_IMMUTABLE (ainsi que lcap CAP_SYS_MODULE, comme suggéré dans Défense proactive, Section 10.4.2.1) à l'un des scripts de démarrage ;

  1. positionner l'attribut « i » sur ce script et les autres fichiers de démarrage, ainsi que sur le binaire lcap lui-même ;

  1. exécuter la commande ci-dessus vous-même (ou réamorcer le système pour vous assurer que tout fonctionne comme prévu).

Maintenant que la fonctionnalité a été enlevée du système, un intrus ne peut plus changer aucun attribut des fichiers protégés et donc, il ne peut pas changer ou supprimer les fichiers. S'il force la machine à redémarrer (ce qui est la seule façon de récupérer le jeu de fonctionnalités), cela sera facile à détecter et la fonctionnalité sera de toute façon enlevée à nouveau dès que le redémarrage du système. La seule façon de changer un fichier protégé serait de réamorcer le système en mode utilisateur seul (single-user mode) ou d'utiliser une autre image d'amorçage, deux opérations qui nécessitent un accès physique à la machine !


4.16.3 Vérifier l'intégrité des systèmes de fichiers

Êtes-vous sûr que le /bin/login présent sur le disque dur est le même que celui que vous aviez installé il y a de cela quelques mois ? Que faire si c'est une version piratée, qui enregistre les mots de passe entrés dans un fichier caché ou les envoie en clair sur Internet ?

La seule méthode pour avoir un semblant de protection est de vérifier vos fichiers tous les heures/jours/mois (je préfère quotidiennement) en comparant l'actuel et l'ancien md5sum de ce fichier. Deux fichiers ne peuvent avoir le même md5sum (le MD5 est basé sur 128 bits, ainsi la chance que deux fichiers différents aient le même md5sum est approximativement de un sur 3.4e3803), donc de ce côté tout est bon, à moins que quelqu'un ait piraté également l'algorithme qui crée les md5sums sur cette machine. C'est extrêmement difficile et très improbable. Vous devriez vraiment prendre en compte que la vérification de vos binaires est très importante étant donné que c'est un moyen facile de reconnaître des changements sur vos binaires.

Les outils couramment utilisés pour cela sont sxid, aide (Advanced Intrusion Detection Environment), tripwire, integrit et samhain. Installer debsums vous aidera également à vérifier l'intégrité du système de fichiers en comparant le md5sum de chaque fichier avec celui utilisé dans l'archive des paquets Debian. Mais faites attention : ces fichiers peuvent facilement être modifiés par un attaquant et tous les paquets ne fournissent pas de listes de md5sum pour les binaires qu'ils fournissent. Pour plus d'informations, veuillez consulter Tests d'intégrité périodiques, Section 10.2 et Prendre un instantané (« snapshot ») du système, Section 4.18.

Vous pouvez vouloir utiliser locate pour indexer le système de fichiers en entier ; si vous faites cela, envisagez les implications de cette action. Le paquet findutils de Debian contient locate qui s'exécute en tant qu'utilisateur nobody, ainsi, il indexe les fichiers qui sont visibles à tous les utilisateurs. Cependant, si vous changez son comportement, vous rendrez les emplacements de tous les fichiers visibles à tous les utilisateurs. Si vous voulez indexer tout le système de fichiers (pas les parties que l'utilisateur nobody peut voir), vous pouvez remplacer locate par slocate. slocate est étiqueté comme une version améliorée au niveau sécurité de GNU locate, mais il fournit en fait une fonctionnalité de localisation de fichier supplémentaire. Quand il utilise slocate, l'utilisateur ne peut voir que les fichiers auxquels il a vraiment accès et vous pouvez exclure tout fichier ou répertoire du système. Le paquet slocate exécute le processus de mise à jour avec des privilèges augmentés par rapport à locate et il indexe tous les fichiers. Les utilisateurs peuvent alors rechercher rapidement tout fichier qu'ils peuvent voir. slocate ne leur laisse pas voir les nouveaux fichiers ; il filtre la sortie selon l'UID.

Vous pourriez utiliser bsign ou elfsign. elfsign fournit un utilitaire pour ajouter une signature numérique à un binaire ELF et un autre pour vérifier cette signature. L'actuelle implémentation utilise PKI pour signer la somme de contrôle du binaire. L'avantage de faire cela est que ceux qui le veulent peuvent déterminer si un binaire a été modifié et qui l'a créé. bsign utilise GPG, elfsign utilise les certificats PKI (X.509, OpenSSL).


4.16.4 Mise en place de la vérification setuid

Le paquet Debian checksecurity fournit une tâche cron qui s'exécute tous les jours dans /etc/cron.daily/checksecurity [35]. Cette tâche cron exécutera le script /usr/sbin/checksecurity qui sauvegardera les renseignements sur les modifications.

Le comportement par défaut est de ne pas envoyer cette information au superutilisateur mais à la place de garder une copie quotidienne des modifications dans /var/log/setuid.changes. Vous devrez positionner la variable MAILTO (dans /etc/checksecurity.conf) à « root » pour que ces renseignements lui soient envoyés. Consultez checksecurity(8) pour plus d'informations sur la configuration.


4.17 Sécurisation des accès réseau

FIXME : Besoin de plus de contenu (spécifique à Debian).


4.17.1 Configuration des options réseau du noyau

Beaucoup de fonctionnalités du noyau peuvent être modifiées en cours de fonctionnement en envoyant quelque chose (par la commande echo) dans le système de fichiers /proc ou en utilisant sysctl. En entrant sysctl -A, vous pouvez voir ce que vous pouvez configurer et quelles sont les options, elles peuvent être modifiées en exécutant /sbin/sysctl -w variable=valeur (consultez sysctl(8)). Vous aurez seulement en de rares occasions à éditer quelque chose ici, mais vous pouvez augmenter la sécurité de cette manière aussi. Par exemple :

     net/ipv4/icmp_echo_ignore_broadcasts = 1

C'est un « émulateur Windows » parce que ça agit comme Windows sur les ping de broadcast si celui-ci est positionné à 1. C'est-à-dire que les requêtes d'echo ICMP envoyées à l'adresse broadcast seront ignorées. Sinon, cela ne fait rien.

Si vous voulez empêcher le système de répondre aux requêtes d'echo ICMP, activez cette option de configuration :

     net/ipv4/icmp_echo_ignore_all = 1

Pour enregistrer les paquets avec des adresses impossibles (à cause de routes erronées) sur le réseau, utilisez :

     /proc/sys/net/ipv4/conf/all/log_martians = 1

Pour plus d'informations sur ce qui peut être fait avec /proc/sys/net/ipv4/*, consultez /usr/src/linux/Documentation/filesystems/proc.txt. Toutes les options sont décrites de façon complète sous /usr/src/linux/Documentation/networking/ip-sysctl.txt [36].


4.17.2 Configurer syncookies

Cette option est à double tranchant. D'un côté, elle protège le système contre le syn packet flooding ; d'un autre côté, elle viole les standards définis (RFCs).

     net/ipv4/tcp_syncookies = 1

Si vous voulez changer cette option à chaque fois que le noyau fonctionne, vous devez le faire dans /etc/network/options en positionnant syncookies=yes. Cela prendra effet à chaque fois que /etc/init.d/networking est exécuté (ce qui est habituellement fait lors du démarrage) tandis que la commande suivante aura un effet unique jusqu'au prochain redémarrage :

     echo 1 > /proc/sys/net/ipv4/tcp_syncookies

Cette option n'est dispobile que si vous avez compilé le noyau avec CONFIG_SYNCOOKIES. Tous les noyaux Debian sont compilés avec cette option incluse, mais vous pouvez le vérifier en exécutant :

     $ sysctl -A |grep syncookies
     net/ipv4/tcp_syncookies = 1

Pour plus d'informations sur les syncookies TCP, consultez http://cr.yp.to/syncookies.html.


4.17.3 Sécurisation du réseau pendant l'amorçage

Quand vous positionnez des options de configuration de réseau du noyau, vous devez le configurer pour que ce soit chargé à chaque fois que le système est redémarré. L'exemple suivant active un grand nombre des options précédentes ainsi que d'autres options utiles.

Il y a en fait deux façons de configurer le réseau au démarrage. Vous pouvez configurer /etc/sysctl.conf (consultez sysctl.conf(5)) ou introduire un script qui est appelé quand l'interface est activée. La première option sera appliquée à toutes les interfaces alors que la seconde option vous permettra de configurer cela interface par interface.

Un exemple de fichier de configuration /etc/sysctl.conf qui sécurisera quelques options de réseau au niveau du noyau est présenté ci-dessous. Notez les commentaires dans ce fichier, /etc/network/options peut forcer certaines options si elles sont en contradiction avec celles de ce fichier lors de l'exécution de /etc/init.d/networking (ce qui a lieu après procps dans la séquence de démarrage).

     #
     # /etc/sysctl.conf - Fichier de configuration pour positionner les
     # variables système
     # Consultez sysctl.conf(5) pour plus de renseignements. Consultez
     # également les fichiers sous Documentation/sysctl/,
     # Documentation/filesystems/proc.txt et
     # Documentation/networking/ip-sysctl.txt dans les sources du noyau
     # (/usr/src/kernel-$version si vous avez installé un paquet de noyau) 
     # pour plus d'informations sur les valeurs qui peuvent être définies ici.
     
     #
     # Attention : /etc/init.d/procps est exécuté pour positionner les
     # variables suivantes. Cependant, après cela, /etc/init.d/networking
     # positionne certaines options réseau avec des valeurs intrinsèques. Ces
     # valeurs peuvent être forcées en utilisant /etc/network/options.
     #
     #kernel.domainname = example.com
     
     # Paramètres supplémentaires - adapté du script fourni
     # par Dariusz Puchala (voir ci-dessous)
     # Ignorer les broadcasts ICMP
     net/ipv4/icmp_echo_ignore_broadcasts = 1
     #
     # Ignorer les erreurs ICMP erronées
     net/ipv4/icmp_ignore_bogus_error_responses = 1
     # 
     # Ne pas accepter les redirections ICMP (empêche les attaques en
     # homme au milieu)
     net/ipv4/conf/all/accept_redirects = 0
     # _ou_
     # N'accepter les redirections ICMP que pour les passerelles
     # de notre liste de passerelles par défaut (activé par défaut)
     # net/ipv4/conf/all/secure_redirects = 1
     #
     # Ne pas accepter les redirections ICMP (ce n'est pas un routeur)
     net/ipv4/conf/all/send_redirects = 0
     #
     # Ne pas faire suivre les paquets IP (ce n'est pas un routeur)
     # Remarque : assurez-vous que /etc/network/options contient
     # « ip_forward=no »
     anet/ipv4/conf/all/forwarding = 0
     #
     # Activer les TCP Syn Cookies
     # Remarque : assurez-vous que /etc/network/options contient
     # « syncookies=yes »
     net/ipv4/tcp_syncookies = 1
     #
     # Enregistrer les paquets martiens
     net/ipv4/conf/all/log_martians = 1
     #
     # Activer la vérification d'adresse source pour toutes les
     # interfaces pour empêcher certaines attaques par usurpation
     # Remarque : assurez-vous que /etc/network/options contient
     # « spoofprotect=yes »
     net/ipv4/conf/all/rp_filter = 1
     #
     # Ne pas accepter les paquets de routage source IP
     # (ce n'est pas un routeur)
     net/ipv4/conf/all/accept_source_route = 0

Pour utiliser le script, vous devez tout d'abord le créer, par exemple, dans /etc/network/interface-secure (le nom est donné comme exemple) et l'appeler à partir de /etc/network/interfaces comme ceci :

     auto eth0
     iface eth0 inet static
             address xxx.xxx.xxx.xxx
             netmask 255.255.255.xxx
             broadcast xxx.xxx.xxx.xxx
             gateway xxx.xxx.xxx.xxx
             pre-up /etc/network/interface-secure

Dans cet exemple, avant que l'interface eth0 ne soit activée, le script sera appelé pour sécuriser toutes les interfaces réseau comme montré ci-dessous.

     #!/bin/sh -e
     # Nom du script : /etc/network/interface-secure
     #
     # Modification de plusieurs comportements par défaut pour sécuriser contre
     # certaines attaques et usurpations IP pour toutes les interfaces.
     #
     # Fourni par Dariusz Puchalak.
     #
     
     # Activation de la protection broadcast echo.
     echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
     
     # Désactivation de l'IP forwarding.
     echo 0 > /proc/sys/net/ipv4/conf/all/forwarding
     
     # Activation de la protection TCP syn cookies.
     echo 1 > /proc/sys/net/ipv4/tcp_syncookies
     
     
     # Enregistrement des paquets avec des adresses impossibles
     # (cela comprend les paquets usurpés (spoofed), les paquets routés
     # source, les paquets redirigés), mais faites attention à cela
     # sur les serveurs web très chargés.
     echo 1 >/proc/sys/net/ipv4/conf/all/log_martians 
     
     # Activation de la protection sur les mauvais messages d'erreur.
     echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
     
     # Protection d'usurpation IP.
     echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
     
     # Désactivation des redirections ICMP.
     echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
     echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
     
     # Désactivation des paquets source routés.
     echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
     
     exit 0

Remarquez que vous pouvez en fait avoir des scripts par interface qui activeront différentes options réseau pour différentes interfaces (si vous en avez plus d'une), il vous suffit de changer la ligne pre-up en :

     pre-up /etc/network/interface-secure $IFACE

et utiliser un script qui n'applique les changements qu'à une interface spécifique et non à toutes les interfaces disponibles. Notez cependant que certaines options réseau ne peuvent être appliquées que globalement. Un exemple de script est celui-ci :

     #!/bin/sh -e
     # Nom du script : /etc/network/interface-secure
     #
     # Modifie plusieurs comportements par défaut pour sécuriser contre
     # certaines attaques et usurpations TCP/IP pour une interface donnée.
     #
     # Fourni par Dariusz Puchalak.
     #
     
     IFACE=$1
     if [ -z "$IFACE" ] ; then
        echo "$0 : un nom d'interface doit être fourni en argument"
        echo "Utilisation : $0 <interface>"
        exit 1
     fi
     
     if [ ! -e /proc/sys/net/ipv4/conf/$IFACE/ ]; then
        echo "$0 : l'interface $IFACE n'existe pas "
        echo "(impossible de trouver /proc/sys/net/ipv4/conf/)"
        exit 1
     fi
     
     # Désactivation de l'IP forwarding.
     echo 0 > /proc/sys/net/ipv4/conf/$IFACE/forwarding
     
     # Enregistrement des paquets avec des adresses impossibles
     # (cela inclut les paquets usurpés (spoofed), les paquets routés
     # source, les paquets redirigés), mais faites attention à cela
     # sur les serveurs web très chargés.
     echo 1 >/proc/sys/net/ipv4/conf/$IFACE/log_martians
     
     # Protection d'usurpation IP.
     echo 1 > /proc/sys/net/ipv4/conf/$IFACE/rp_filter
     
     # Désactivation des redirections ICMP.
     echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_redirects
     echo 0 > /proc/sys/net/ipv4/conf/$IFACE/send_redirects
     
     # Désactivation des paquets source routés.
     echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_source_route
     
     exit 0

Vous pouvez également créer un script init.d et le faire exécuter au démarrage (en utilisant update-rc.d pour créer les liens rc.d appropriés).


4.17.4 Configuration des fonctionnalités de pare-feu

De façon à avoir des privilèges de pare-feu, soit pour protéger le système local ou d'autres derrière lui, le noyau doit être compilé avec les options correspondant aux pare-feu. Le noyau standard de Debian 2.2 (Linux 2.2) fournit ipchains qui est un pare-feu pour filtrer les paquets, le noyau standard de Debian 3.0 (Linux 2.4) fournit lui le pare-feu iptables (netfilter).

Dans tous les cas, il est relativement facile d'utiliser un noyau différent de celui fourni par Debian. Vous pouvez trouver des noyaux précompilés sous forme de paquets que vous pouvez facilement installer sur le système Debian. Vous pouvez également télécharger les sources du noyau en utilisant kernel-source-X et construire des paquets de noyau personnalisé en utilisant make-kpkg du paquet kernel-package.

La mise en place de pare-feu dans Debian est abordée plus en détail dans Ajouter des capacités au pare-feu, Section 5.14.


4.17.5 Désactiver les problèmes d'hôtes weak-end

Les systèmes avec plus d'une interface sur différents réseaux peuvent avoir des services configurés pour qu'ils ne puissent s'associer qu'à une adresse IP donnée. Cela prévient habituellement les accès aux services quand ils sont interrogés par une adresse donnée. Cependant, cela ne veut pas dire (bien qu'il s'agisse d'une erreur classique) que le service est lié à une adresse matérielle donnée (carte interface). [37]

Ce n'est pas un problème ARP et ce n'est pas une violation de RFC (c'est ce que l'on appelle le weak end host dans la RFC1122, section 3.3.4.2). Rappelez-vous que les adresses IP n'ont rien à voir avec les interfaces physiques.

Sur les noyaux 2.2 (et antérieurs), cela peut être corrigé avec :

     # echo 1 > /proc/sys/net/ipv4/conf/all/hidden
     # echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden
     # echo 1 > /proc/sys/net/ipv4/conf/eth1/hidden
     ...

Sur les noyaux suivants, cela peut être corrigé avec :

Tout au long de ce texte, il y aura plusieurs occasions pour lesquelles il est affiché comment configurer certains services (serveur SSH, Apache, service d'impression, etc.) pour les avoir en attente sur une adresse donnée, le lecteur devra prendre en compte que, sans les correctifs donnés ici, le correctif n'empêchera pas les accès depuis le même réseau (local). [40]

FIXME : Commentaires sur Bugtraq indiquant qu'il existe une méthode spécifique à Linux pour associer à une interface donnée.

FIXME : Créer un bogue sur netbase pour que le correctif de routage soit le comportement standard dans Debian ?


4.17.6 Protéger contre les attaques ARP

Quand vous ne faites pas confiance aux autres machines du réseau (ce qui devrait toujours être le cas parce que c'est l'attitude la plus sûre), vous devriez vous protéger contre les différentes attaques ARP existantes.

Comme vous le savez, le protocole ARP est utilisé pour lier des adresses IP à des adresses MAC (consultez la RFC826 pour tous les détails). À chaque fois que vous envoyez un paquet à une adresse IP, une résolution ARP est effectuée (en regardant en premier dans le cache local ARP, puis si l'adresse IP n'est pas présente dans le cache, en diffusant une requête ARP) pour trouver l'adresse matérielle de la cible. Toutes les attaques ARP ont pour but d'amener la machine à croire que l'adresse IP de la machine B est associée à l'adresse MAC de la machine de l'intrus ; puis tous les paquets que vous voudrez envoyer à l'adresse IP associée à la machine B seront envoyée à la machine de l'intrus, etc.

Ces attaques (empoisonnement du cache, falsification ARP, etc.) permettent à l'attaquant de renifler le trafic même sur des réseaux utilisant des switchs, pour pirater facilement des connexions, pour déconnecter tout hôte du réseau, etc. Les attaques ARP sont puissantes et simples à implémenter et plusieurs outils existent comme arpspoof du paquet dsniff ou arpoison.

Cependant, il existe toujours une solution :


4.18 Prendre un instantané (« snapshot ») du système

Avant de mettre le système en production, vous pouvez prendre un instantané du système entier. Cet instantané pourrait être utilisé en cas de compromission (consultez Après la compromission (la réponse à l'incident), Chapitre 11). Vous devriez refaire cette mise à jour à chaque fois que le système est mis à jour, particulièrement si vous mettez à jour vers une nouvelle version de Debian.

Pour cela, vous pouvez utiliser un support inscriptible et amovible qui peut être positionné en lecture seule, ce peut être une disquette (en lecture seule après utilisation), un CD d'une unité de CD (vous pourriez utiliser un CD réinscriptible, ainsi vous pourriez même garder des sauvegardes des md5sums à différentes dates), ou un disque USB ou une carte MMC (si le système peut accéder à ceux-ci et qu'ils peuvent être protégés en écriture).

Le script suivant crée un tel instantané :

     #!/bin/bash
     /bin/mount /dev/fd0 /mnt/floppy
     trap "/bin/umount /dev/fd0" 0 1 2 3 9 13 15
     if [ ! -f /usr/bin/md5sum ] ; then
        echo "Impossible de trouver md5sum. Échec."
        exit 1
     fi
     /bin/cp /usr/bin/md5sum /mnt/floppy
     echo "Calcul de la base de données md5"
     >/mnt/floppy/md5checksums.txt
     for dir in /bin/ /sbin/ /usr/bin/ /usr/sbin/ /lib/ /usr/lib/
     do
        find $dir -type f | xargs /usr/bin/md5sum\
     	                     >>/mnt/floppy/md5checksums-lib.txt
     done
     echo "Base de données md5 de post-installation calculée"
     if [ ! -f /usr/bin/sha1sum ] ; then
        echo "Impossible de trouver sha1sum"
        echo "Attention : seule la base de données MD5 sera gardée"
     else
        /bin/cp /usr/bin/sha1sum /mnt/floppy
        echo "Calcul de la base de données SHA-1"
        >/mnt/floppy/sha1checksums.txt
        for dir in /bin/ /sbin/ /usr/bin/ /usr/sbin/ /lib/ /usr/lib/
        do
           find $dir -type f | xargs /usr/bin/sha1sum\
                               >>/mnt/floppy/sha1checksums-lib.txt
       done
       echo "Base de données SHA-1 de post-installation calculée"
     fi
     exit 0

Notez que le binaire md5sum (et le binaire sha1sum, s'il est disponible) est placé sur la disquette pour pouvoir être utilisé plus tard pour vérifier les binaires du système (juste au cas où il serait aussi corrompu). Cependant, si vous voulez vous assurer que vous exécutez bien un binaire légitime, vous pouvez vouloir, soit compiler une copie statique du binaire md5sum et utiliser celui-ci (pour empêcher une bibliothèque libc corrompue d'interférer avec le binaire), soit utiliser des instantanés de md5sums depuis un environnement propre exclusivement comme un CD de récupération ou un CD autonome (pour empêcher un noyau corrompu d'interférer). Je ne peux insister assez sur ce point : si vous êtes sur un système compromis, vous ne pouvez pas faire confiance à ce qui s'affiche, consultez Après la compromission (la réponse à l'incident), Chapitre 11.

L'instantané n'inclut pas les fichiers sous /var/lib/dpkg/info qui incluent les sommes de hachage MD5 des paquets installés (dans les fichiers se terminant par .md5sums). Vous pourriez également y copier ces renseignements, veuillez cependant noter que :

Une fois que l'instantané est fait, vous devriez vous assurer de placer le support en lecture seule. Vous pouvez ensuite le stocker pour archivage ou le placer dans le lecteur et utiliser une vérification cron toutes les nuits en comparant les md5sums d'origine avec ceux de l'instantané.

Si vous ne voulez pas configurer de vérification manuelle, vous pouvez toujours utiliser n'importe quel système d'intégrité disponible qui fera cela et plus, pour de plus amples renseignements, veuillez consulter Tests d'intégrité périodiques, Section 10.2.


4.19 Autres recommandations


4.19.1 N'utilisez pas de logiciels dépendant de svgalib

SVGAlib est très bien pour les amoureux de la console mais s'est montrée très peu sûre par le passé. Des exploitations de failles de zgv ont été diffusées et il était facile de devenir superutilisateur. Essayez d'éviter l'utilisation de programmes utilisant la SVGAlib chaque fois que c'est possible.


[ précédent ] [ Table des matières ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ suivant ]


Securing Debian Manual

Version: 3.13, Sun, 08 Apr 2012 02:48:09 +0000

Javier Fernández-Sanguino Peña jfs@debian.org
Auteurs, Section 1.1