next_inactive up previous


INSTALLATION ET CONFIGURATION D'UN FIREWALL SOUS DEBIAN


Guillaume LEHMANN (lehmann@free.fr)



Contents

Introduction :

Ce document explique l'installation d'un firewall sous Linux depuis une distribution GNU/Debian woody. Dans un premier temps nous verrons l'installation du système pour qu'il corresponde à un firewall, puis nous nous pencherons sur les modifications à effectuer pour le sécuriser.

Ce document est issu de mes expériences sur le sujet. Mon but n'est pas de rédiger une documentation de référence, mais de pouvoir aider toute personne voulant monter son firewall sous GNU/Linux et Debian.

Pour toute suggestion, ou demande d'aide : lehmann@free.fr


Document en version 0.4 du 16/09/2003.

Installation d'un système de base:

Nous travaillerons avec netfilter dans la suite du document. Même si nous changerons de noyau par la suite, il est conseillé de commencer l'installation avec un noyau 2.4.x (option bf24).


Insérer le CD 1 dans le lecteur, et booter dessus (l'installation décrite ici s'effectue essentiellement avec les CDROMs de la Debian que l'utilisateur devra avoir en sa possession). Lorsque le système nous donne la main, taper bf24. Ensuite laisser faire jusqu'à ce qu'un menu pseudo-graphique nous soit affiché.


Je ne vais pas ici détailler toute l'installation. J'indiquerai juste quelques détails qui diffèreront de l'installation classique.


Le partitionnement : Il est nécessaire de distinguer les partitions suivantes (les tailles sont données à titre d'exemple) :

/ (1000 Mo)

/boot (50 Mo)

/usr (1000 Mo)

/var (2000 Mo voir plus)

/home (300 Mo)

/sauv (cette partition servira à stocker une sauvegarde du système. Elle n'est cependant pas indispensable) (700 Mo)

la partition de swap (200 Mo)


Les paramètres réseaux de la machines seront :

Hostname : firewall

Adresse IP internet (eth0) : 194.170.50.1/24 (à adapter biensûr suivant son cas)

Adresse IP LAN (eth1) : 192.168.0.1/24

Passerelle : 194.170.50.10 (à adapter suivant son cas)

Nom de domaine : (laisser vide, ou à adapter suivant son cas)


Activer le cryptage md5 des mots de passe.

Utiliser les mots de passe cachés (shadow).

Faites un choix judicieux pour le mot de passe du root (mot de passe long et mélangeant divers caractères ASCII, sans logique).

Créer un compte utilisateur dont le choix du mot de passe sera aussi judicieux que pour le root... mais sans que ce soit le même mot de passe !

Utiliser les mises à jour depuis le site security.debian.org.

N'utiliser ni RunTaskSel ni dselect pendant l'installation.

Pas de configuration de service mail.

Désinstallation de paquetages

Lancer dselect et rentrer dans la rubrique Select. En resortir sans rien y avoir changé et rentrer dans la rubrique Install. Il est alors demandé de confirmer l'installation de nombreux paquetages. Répondre Y et suivre les instructions. Une fois toutes les installations et configurations effectuées, quitter.

De tous les paquetages installés, nous allons maintenant désinstaller ceux qui nous sont inutiles :

apt-get $-$purge remove bc biff bind9-host dnsutils cpp-3.0 gcc-3.0 dhcp-client doc-debian doc-linux-text fdutils finger flex ftp gnupg gnupg-doc iamerican ibritish ipchains ipmasqadm ispell libdns5 libisc4 libnss-db libpcap0 lpr pppoeconf pppoe pppconfig ppp libpng2 lynx man-db manpages manpages-dev mpack mtools mtr-tiny mutt nano nfs-common nfs-kernel-server nvi pidentd portmap procmail python python-newt python2.1 reportbug setserial sharutils tcsh telnet texinfo time vacation wenglish whois


Mise à jour du système:

Les paquettages disponiblent sur le CD ne sont pas forcément les plus récents. En mettant à jour le système depuis Internet, on va pouvoir :

Pour effectuer cette mise à jour, il faut éditer le fichier /etc/apt/sources.list qui ne devra contenir que les lignes suivantes :

deb http://ftp.info.iut-tlse3.fr/debian stable main contrib
deb http://ftp.info.iut-tlse3.fr/debian-non-US stable/non-US main contrib
deb http://security.debian.org/ stable/updates main

Ensuite taper les commandes suivantes :

apt-get update

apt-get -f $-$fix-missing $-$fix-broken dist-upgrade

Installation d'un nouveau noyau 2.4:

Installation des programmes nécessaire à la suite:

Copier les sources du noyau sur le disque dur. Pour cela, soit récupérer les sources de Linux depuis www.kernel.org, soit installer les sources disponibles dans la distribution (paquetage kernel-source-2.4.XX égal 18 au moment de la rédaction de ce document).

Installer les programmes suivant qui nous seront utiles ensuite (accepter d'installer les paquetages dont ils dépendent) :

Si on veut installer cette fonctionnalité indépendante du filtrage:

Si on veut faire des VPN avec IPSec:

Décompresser les sources du noyau dans le répertoire /usr/src/ et créer un lien symbolique de /usr/src/linux vers le répertoire contenant les sources de Linux.

Appliquer des patchs au noyau:

Afin de pouvoir mettre en place des VPN par le protocole IPSec, nous allons appliquer le patch freewan :

cd /usr/src/linux

make -C /usr/src/kernel-patches/all/freeswan -f Makefile insert KERNELSRC=/usr/src/linux PATCHER=/usr/src/kernel-patches/all/freeswan/patcher


Afin de sécuriser un maximum la machine, nous patcherons le noyau pour protéger le système (espace utilisateur et espace noyau) des buffers overflows. Ainsi, les effets des rootkits voulant exploiter une faille du système, seront inhibés. Pour appliquer le patch PaX, télécharger le patch pour le noyau 2.4.x choisi (au moment de la rédaction, pour le noyau 2.4.20, le patch se nomme pax-linux-2.4.20-200304191922.patch) sur le site http://pageexec.virtualave.net, et le placer dans le répertoire /usr/src/ . Ensuite, tapez les commandes suivantes :

cd /usr/src/linux

patch -p1 < ../pax-linux-2.4.20-200304191922.patch


Attention : Nous avons pris ici l'exemple d'un patch Pax pour le noyau 2.4.20. Si vous avez utilisé les sources de Linux fournies avec la distribution (2.4.18), vous devrez vous procurer le patch noyau pour cette version là du noyau.

Configuration du noyau:

Je n'entrerai pas dans le détail de la configuration du noyau, car cela peut beaucoup varier suivant le matériel. Il ne faut en revanche rien mettre en module (noyau complètement monolithyque). Je me bornerai à indiquer les options qu'il faut IMPERATIVEMENT ACTIVER, et celles qu'il faut IMPERATIVEMENT DÉSACTIVER.


Il faut activer les options suivantes :

--> File systems ==> /proc file system support
--> General Setup ==> Sysctl support
--> Networking options ==> Packet socket
--> Networking options ==> Unix domain sockets
--> Networking options ==> TCP/IP networking
--> Networking options ==> Network packet filtering (replaces ipchains)
--> Networking options ==> IP: Netfilter Configuration --> ==> Connection tracking (required for masq/NAT)
--> Networking options ==> IP: Netfilter Configuration --> ==> FTP protocol support
--> Networking options ==> IP: Netfilter Configuration --> ==> IP tables support (required for fitering/masq/NAT)
--> Networking options ==> IP: Netfilter Configuration --> ==> limit match support
--> Networking options ==> IP: Netfilter Configuration --> ==> MAC address match support
--> Networking options ==> IP: Netfilter Configuration --> ==> Connection state match support
--> Networking options ==> IP: Netfilter Configuration --> ==> Packet filtering
--> Networking options ==> IP: Netfilter Configuration --> ==> REJECT target support
--> Networking options ==> IP: Netfilter Configuration --> ==> Full NAT
--> Networking options ==> IP: Netfilter Configuration --> ==> MASQUERADE target support
--> Networking options ==> IP: Netfilter Configuration --> ==> REDIRECT target support
--> Networking options ==> IP: Netfilter Configuration --> ==> LOG target support
--> Networking options ==> IP: TCP syncookie support (disabled per default)
--> Character devices ==> Watchdog Cards --> ==> Watchdog Timer Support
--> Character devices ==> Watchdog Cards --> ==> Software Watchdog

Il faut désactiver les options suivantes :

--> Loadable module support ==> Enable loadable module support
--> Processor type and features ==> Machine Check Exception

Une fois le noyau configuré, ainsi que tous les patchs que l'on aura appliqués (voir ci-dessous), déplacer le noyau créé dans la partition /boot. Configuer lilo pour que l'on puisse démarrer sur ce nouveau noyau (que nous nommerons LinFirewall). Penser à relancer lilo pour que les changements soient pris en compte lors du prochain redémarrage.

Configuration dans le noyau du patch PaX :

Voici une configuration de PaX (sont affichées les options activées) sur un processeur Intel. A adapter suivant ses besoins (plus on sécurise, plus on affecte les performances).
--> PaX Options ==> Enforce non-executable pages
--> PaX Options ==> Paging based non-exucatable pages
--> PaX Options ==> Address Space Layout Randomization
--> PaX Options ==> Randomize kernel stack base
--> PaX Options ==> Randomize user stack base
--> PaX Options ==> Randomize mmap() base

Installation d'Iptables:

Nous pouvons utiliser le programme iptables livré avec la distribution. Son installation est alors identique à n'importe quel autre programme. Je vais ici expliquer comment installer le programme iptables depuis des sources que j'ai préalablement récupérées sur www.netfilter.org.

Une fois les sources décompressées, se placer dans le répertoire et taper les commandes suivantes :

make

make install


Pour pouvoir accéder directement à la commande iptables, il faudra déplacer le fichier iptables créé par la compilation dans le répertoire /sbin.


Penser à effacer le répertoire où se trouvent les sources de iptables afin que personne d'autre ne puisse recompiler le programme.

Configuration de lilo:

La configuration de lilo (LInux LOader) passe par l'édition du fichier /etc/lilo.conf. Lors du démarrage, une personne physique peut intervenir et prendre ainsi le contrôle de la machine. Cette personne doit avoir un accès physique au serveur. Une bonne protection de la salle des serveurs ne nécessiterait pas la sécurisation que nous allons effectuer ... mais au cas où, voici comment sécuriser rapidement et efficacement lilo :

Ne pas utiliser le mot clef timeout.

Ne pas utiliser le mot clef prompt.

Le mot clef default doit avoir pour valeur le nom de notre noyau le plus sécurisé.

Utiliser le mot clef password pour protéger les images du noyau à l'aide d'un mot de passe, ainsi que le processus d'amorçage en général.

Utiliser le mot clef restricted pour assurer une protection des images par mot de passe. Si aucun argument n'est fourni, le système démarre automatiquement. Dans le cas contraire, il demande un mot de passe (voir l'option password ci-dessus) avant d'aller plus loin.

Tous les menus des autres noyaux doivent être mis en commentaires afin que l'on ne puisse, au cas où l'on aurait le choix, démarrer un autre noyau. Tout démarrage sur une disquette, cdrom ou autres doit aussi être mis en commentaire.


Exemple de menu de noyau :

lba32
boot=/dev/hdc1
install=/boot/boot.b
map=/boot/System.map
delay=00
vga=normal
# prompt
# timetout=0
default=JoliNoyau
password="Ayg5hj1PjP58"
image=/boot/vmlinuz
    label=JoliNoyau
    root=/dev/hdc2
    restricted
    read-only

Changer les droits du fichier de configuration :

chmod 400 /etc/lilo.conf

Dans /etc/lilo.conf, on peut ensuite modifier le fichier pour enlever le mot de passe et y mettre une ligne qui va sortir une erreur si on relance lilo :

password=Rentrer un nouveau mot de passe

lilo étant lancé avant, il a enregistré le bon mot de passe, et la modification du fichier que l'on vient de décrire ne l'affectera pas. Ainsi, si une personne arrive à lire le fichier, elle ne pourra pas connaître le mot de passe actuellement actif. C'est une protection supplémentaire qui ne devrait pas retardé beaucoup un pirate si ce dernier est déjà arrivé à lire le fichier dont on avait autorisé la lecture que pour le root.

Sécuriser le démarrage du système:

Par défaut, le niveau de démarrage est le 2. Nous allons donc dans le répertoire /etc/rc2.d et supprimons tous les liens qui permettent le démarrage de services inutiles. Tous ne sont pas à supprimer !

S20inetd et S20exim sont à supprimer. Suivant l'utilisation que l'on peut en faire, on va aussi supprimer ou garder S89atd et S89cron

La cerise sur le gâteau

Faisons maintenant un point avant d'aller plus loin. Si toutes les instructions énoncées dans les chapitres précédents ont été suivis, le firewall fonctionne, le systéme est sécurisé, et avec une configuration adéquate du filtrage, le LAN n'a plus grand chose à craindre des attaques provenant d'Internet. Bref, le firewall est stable et sûr. Il y a de grande chance alors qu'une personne voulant s'introduire dans votre réseau ne tente pas d'attaquer le firewall, mais passe par des faiblesses sur les serveurs ou sur les postes clients (scripts, spam, virus, ...).

Ce qui suit n'est pas propre au firewall, mais si vous êtes un paranoïaque profond qui ne fait même pas confiance à son poisson rouge pour garder un secret, et encore moins à ce nouveau firewall, alors vous pouvez toujours appliquer ce qui suit à votre firewall ;-)

Sécuriser le BIOS:

Si le bios le permet :

Configuration de inittab:

Même si le démarrage est sécurisé, il est intéressant d'empêcher un personne, ayant accès au clavier, de redémarrer le serveur par une combinaison de touches telles que Ctrl + Alt + Suppr. Pour empêcher cela, il suffit d'éditer le fichier /etc/inittab et commenter (ou supprimer) la ligne qui ressemble à :

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

Une chose aussi à laquelle on ne pense pas toujours, est de surveiller le niveau d'exécution par défaut. Cela se définit dans le fichier /etc/inittab :

id:5:initdefault # pour démarrer au niveau 5
id:3:initdefault # pour démarrer au niveau 3
# et ainsi de suite pour le niveau de démarrage par défaut.

En général, on n'a pas besoin de l'interface X sur le serveur et on préfèrera passer par le mode console. On utilisera alors le niveau d'exécution 3 (ou 2 selon les distributions, comme Debian) : système multi-utilisateur sans interface graphique, mais avec tous les services réseaux activés.


Pour l'entretien du serveur, il vaut mieux utiliser le niveau d'exécution 1 : système mono-utilisateur (root) et minimal.


Sous Linux, l'utilisation de nombreuses consoles est très pratique, mais il arrive qu'on utilise 3 ou 4 consoles, et que lorsqu'on a fini, on oublie de se déconnecter de toutes. Une façon d'éviter cela est de limiter le nombre de consoles disponibles suivant les modes. Un exemple commenté de ces quelques lignes du fichier /etc/inittab expliquera bien la façon de faire :

# Disponibilité de la console 1, pour les niveaux 
#d'execution 2, 3, 4 et 5, en utilisant le programme 
# (pour gérer la fenêtre) /sbin/getty, sur le 
#périphérique de sortie /dev/tty1.

1:2345:respawn:/sbin/getty 38400 tty1

# Disponibilité de la console 2, pour les niveaux
# d'execution 2 et 3, en utilisant le programme
# (pour gérer la fenêtre) /sbin/getty, sur le
# périphérique de sortie /dev/tty2.

2:23:respawn:/sbin/getty 38400 tty2

# Disponibilité de la console 3, pour le niveau
# d'execution 2 seulement, en utilisant le programme
# (pour gérer la fenêtre) /sbin/getty, sur le périphérique
# de sortie /dev/tty3.

3:2:respawn:/sbin/getty 38400 tty3

# Non-disponibilité des consoles 4, 5 et 6.
# 4:23:respawn:/sbin/getty 38400 tty4
# 5:23:respawn:/sbin/getty 38400 tty5
# 6:23:respawn:/sbin/getty 38400 tty6

Administration à distance:

Pour traiter ce sujet d'administration à distance, on va parler de contrôle à distance. Il existe les outils très connus pour cela que sont telnet, rlogin, rsh, ... Mais tous ces outils commencent à être dépassés, et présentent de nombreux problèmes de sécurité. Pour cela, est apparu SSH (voir OpenSSH) qui offre les mêmes services, mais avec la sécurité en plus. SSH permet de contrôler un poste à distance, mais aussi d'y copier de fichiers dont on dispose localement, ou copier sur notre poste local des fichiers se trouvant sur le poste distant (scp).


SSH présente, comme on aurait pu s'en douter, une architecture client-serveur. Dans notre cas, le firewall devra pouvoir accepter les connexions distantes, il faudra donc qu'il héberge la partie serveur, et qu'elle soit activée.


Pour installer SSH, c'est très simple :

apt-get install ssh


Accepter tous les paquetages dont dépend ssh. Puis pour lancer le serveur, il suffit de taper, toujours en tant que root :

/usr/sbin/sshd

ou, pour être conforme à Debian :

/etc/init.d/ssh restart


Ssh peut aussi gérer l'affichage déporté de X11. Mais si on désire utiliser X11 sans ssh, cela est trés simple (mais bien moins sécurisé!). Pour lancer l'AFFICHAGE d'une application (ici emacs) sur un autre poste, il suffit d'utiliser l'option $-$display comme suit :

emacs $-$display 192.168.2.6:0

L'affichage sera déporté sur le serveur 0.0 (souvent, il n'y a que celui-ci d'activé) du poste 192.168.2.6 .


Ainsi, on peut prendre le contrôle à distance du firewall, et utiliser les aplicatifs qui y sont installés, pour déporter l'affichage sur notre machine et travailler ainsi à distance avec une interface graphique. On a ainsi tout le confort pour la manipulation du firewall, tout en laissant le firewall dans un endroit fermé, protecteur matériellement.



Nous allons maintenant nous pencher plus spécialement sur la sécurité du serveur ssh. Nous éditons le fichier de configuration /etc/ssh/sshd_config :

Port 22
# Dans le cas où 1.2.3.4 est l'unique adresse à 
#laquelle on doit pouvoir accéder à sshd.
ListenAdress 1.2.3.4
# Seul la version 2 du protocole est autorisée.
Protocol 2 
HostbasedAuthentication no
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_rsa_key
IgnoreRhosts yes
IgnoreUserKnownHosts yes
KeepAlive yes
LoginGraceTime 120
LogLevel INFO
MaxStartups 10:30:60
PasswordAuthentication yes
PermitEmptyPasswords no
# Attention, une connexion directe en root sera rejettée.
PermitRootLogin no
PrintLastLog yes
PrintMotd no
PubkeyAuthentication yes
RhostsRSAAuthentication no
RSAAuthentication yes
StrictModes yes
# Subsystem sftp /usr/lib/sftp-server
SyslogFacility AUTH
# UseLogin no
UsePrivilegeSeparation yes
X11DisplayOffset 10
# Si on veut transférer du X11 à travers ssh, il faudra indiquer yes.
X11Forwarding no

Le système de fichier journalisé:

Ici nous déscendons très bas dans le système, puisque nous sommes dans le système de fichiers. Au moment d'une coupure de courant ou d'un arrêt très brutal du firewall, tous les traitements en cours sont stoppés, et certaines données non-sauvegardées. Si vous avez des données se trouvant dans la mémoire vive en attendant d'être écrites sur le disque dur, vous pouvez leurs dire adieu. De plus, le redémarrage de la machine sera plus long à cause du efsck sur tous les disques durs (pour tenter de retrouver malgré tout certaines données). Le plus important dans un firewall est surtout d'éviter un redémarrage trop long.


Le fonctionnement de la journalisation repose sur un journal. On découpe en plusieurs étapes l'écriture des données sur le disque. Chaque étape est atomique c'est-à-dire quelle se poursuivra même si votre disque dur prend feu, que vous avez coupé le courant ou que votre poisson rouge s'est noyé. La journalisation a pour but de maintenir en permanence la cohérence des métadonnées. Après un crash, le système va relire le journal, examiner les transactions non terminées, et remettre un système de fichier sain en quelques secondes. En revanche, la journalisation n'assure pas toujours le contenu des fichiers eux-même (ext3 oui, dans le mode data=ordered). Voici un exemple de fonctionnement de la journalisaton (mode data=ordered de ext3) : Les métadonnées sont d'abord écrites dans le journal, ensuite sur le disque. S'il y a un crash au moment de l'écriture dans le journal, on dispose toujours des anciennes données. En cas de crash a moment de la reécriture des données sur le disque dur, on dispose des anciennes données et des nouvelles métadonnées. On peut alors "reconstruire" les nouvelles données qui n'avaient pas eu le temps d'être écrites sur le disque dur.


Etant donné que Linux repose sur ext2, je conseille ext3 qui est en fait ext2 + journal. La mise en place de ext3 peut se faire sur un disque dur formaté en ext2 sans pertes de données.


Pour ce qui est de la pratique, passer en tant qu'utilisateur root. Si c'est la partition /dev/hda3 que nous voulons passer de ext2 à ext3 :

tune2fs -J /dev/hda3


Il faut maintenant que ces changements soient pris en compte dans le fichier /etc/fstab. Pour cela, on doit passer d'une ligne du type :

/dev/hda3 /usr ext2 defaults 0 2

à une ligne du type :

/dev/hda3 /usr auto defaults 0 2

A la place de auto, on peut écrire ext3. Mais l'avantage du flag auto est que si le noyau ne reconnaît pas le format ext3, ou qu'il y a une erreur, la partition sera montée en ext2, et donc tout de même accessible.

Modification de l'arborescence:

FIXME : Je n'ai pas testé la stabilité du système plus de quelques heures. Des retours d'expériences sur les effets de modification de l'arborescence, sur du long terme ?


Nous allons ici expliquer comment modifier l'arborescence des répertoires afin de mieux sécuriser le poste de travail.


Les fichiers binaires se trouvent dans les répertoires /bin et /sbin. Il y a aussi des fichiers de commandes dans les répertoires /usr/bin et /usr/sbin.

Il ne faut pas que ces binaires soient modifiables. Pour cela, ils seront placés sur une partition en lecture seule. Ensuite un lien symbolique (ln -s) sera défini.


La partition root (/) doit être en lecture seule (en fait, une fois le système démarré, la partition racine est remontée en lecture seule). C'est donc dans cette partition que seront transférés les binaires en tapant les commandes suivantes :

mkdir /sbinu
cp -dpR /usr/sbin/* /sbinu
rm -rf /usr/sbin
ln -s /sbinu /usr/sbin

mkdir /binu
cp -dpR /usr/bin/* /binu
rm -rf /usr/bin
ln -s /binu /usr/bin

Configuration des accès disques:

Les paramètres de fonctionnement du disque dur peuvent être configurés grâce à la commande hdparm. Les commandes suivantes vont optimiser le disque dur par rapport aux paramètres de configuration par défaut.

On considère ici que le disque considéré est /dev/hda. Si ce n'est pas le cas, adapter la syntaxe.

Disque dur en mode 32 bits classique OU disque dur en mode 32 bits avec une séquence spéciale de synchronisation, requis par de nombreux chipset.


hdparm -c 1 /dev/hda OU hdparm -c 3 /dev/hda

Passage en mode UDMA.

hdparm -d 1 /dev/hda

Activer le mode multisecteur. Faire des tests pour savoir quelle est la meilleure valeur X (4, 8, 16, 32).

hdparm -m X /dev/hda


Pour tester les accès en lecture/écriture, on a le choix entre 2 commandes :

hdparm -t /dev/hda
hdparm -T /dev/hda
en 16 bits :
==> 3.62 MB/sec
==> 193.94 MB/sec
en 32 bites :
==> 5.25 MB/sec
==> 196.92 MB/sec
en 32 bits et UDMA :
==> 21.12 MB/sec
==> 196.92 MB/sec
en 32 bits et UDMA et mode multisecteur à 2 :
==> 21.19 MB/sec
==> 200 MB/sec
en 32 bits et UDMA et mode multisecteur à 4 :
==> 21.12 MB/sec
==> 200 MB/sec
en 32 bits et UDMA et mode multisecteur à 8 :
==> 21.05 MB/sec
==> 196.92 MB/sec
en 32 bits et UDMA et mode multisecteur à 16 :
==> 21.12 MB/sec
==> 200 MB/sec

Configuration du shell:

Fonctionnement du shell:

Le shell est un outil très puissant qu'il est important de configurer. Lorsque nous ouvrons un terminal ou une session console, l'initialisation du shell se fait suivant cet ordre :
  1. Le fichier /etc/profile est d'abord exécuté. ATTENTION : Sous interface graphique, c'est le fichier .bashrc qui est lu et traité.
  2. Ensuite, le bash regarde s'il existe le fichier .bash_profile dans le répertoire home de l'utilisateur. Si c'est le cas, il est alors lu et traité. ATTENTION : Sous interface graphique, le fichier .bash_profile n'est pas lu.
  3. Si le fichier .bash_profile est absent, le fichier .bash_login est recherché dans le répertoire home de l'utilisateur, lu et traité.
  4. Si aucun des fichiers .bash_profile ou .bash_login n'est trouvé, une dernière recherche est faite sur le fichier .profile. Si ce dernier fichier est présent dans le répertoire home de l'utilisateur, il sera lu et traité.
  5. Si aucun des 3 fichiers n'est présent, cela n'est pas considéré comme une erreur, et on passe à la suite.

Si le programme bash est lancé non pas à la connexion d'un utilisateur, mais, par exemple, depuis un autre interpréteur de commande, ou pour le root en passant pas l'utilisation de la commande su, ce n'est pas le fichier /etc/profile qui est traité mais uniquement le fichier .bashrc dans le répertoire home du nouvel utilisateur.

Si le fichier .bashrc n'est pas dans le répertoire de l'utilisateur, c'est alors le fichier /etc/profile qui est recherché, lu et traité.


Pour sécuriser le shell, on peut placer des alias à la place de commandes que l'on veut interdire. Par exemple, si on veut interdire l'utilisation de la commande diff, on peut mettre la ligne suivante dans le /etc/profile (attention, même le root ne pourra pas l'utiliser sauf s'il redéfinit l'alias dans son propre .bashrc) :

alias diff='TuTuT'


Il faut aussi bien configurer la variable PATH qui donne le chemin des exécutables :

PATH="/usr/bin:/usr/sbin"

En ce qui concerne les droits des répertoires et des fichiers, bien positionner le umask dans le fichier /etc/profile :

umask 022

ou

umask 066


On peut aussi vouloir replacer les droits des utilisateurs. Cela peut éviter de laisser un trou de sécurité causé par des droits mal configurés par l'utilisateur. On désactive aussi les bits suid et guid (si la partition /home est montée avec l'option nosuid, l'activation des bits suid ou guid ne devrait pas poser de problème). Sinon, il faut rajouter la ligne suivante dans le fichier .bash_logout du répertoire de l'utilisateur :

chmod -R 0600 ~/

Cette ligne devra aussi être rajoutée dans le fichier /etc/skel.

Modification des fichiers de configuration du shell:

Nous allons ici sécuriser un minimum la partie shell.


Nous désirons que l'écran soit effacé lorsqu'un utilisateur quitte le shell afin que l'on ne puisse pas voir les commandes tapées, ou les dernières actions effectuées. Pour cela, l'utilisateur doit avoir dans son home directory un fichier .bash_logout qui contiendra la ligne suivante :

/usr/bin/clear


Ce fichier pourra être ajouté dans /etc/skel afin qu'il soit automatiquement copié dans le home directory de tout nouvel utilisateur.


Ensuite, pour éviter la diversification des shells utilisés sur le système (et donc la difficulté de bien administrer le tout), on va limiter le nombre de shells utilisable à un seul. Pour cela, le fichier /etc/shells ne devra comporter qu'une seule ligne. Ci-dessous un exemple de fichier /etc/shells, où le shell choisi est bash :

# /etc/shells: valid login shells
/bin/bash

Configuration du fichier fstab:

Nous allons voir comment modifier le fichier /etc/fstab afin de nous protéger des accès en écriture illicites.


Ci-dessous un fichier /etc/fstab sécurisé :

# /etc/fstab: static file system information.
#
#<file system><mount point><type><options>                <dump><pass>
/dev/hda6    /          ext2     defaults,errors=remount-ro  0      1
/dev/hda3    none       swap     sw                          0      0
proc         /proc      proc     defaults                    0      0
#/dev/fd0    /floppy    auto     user,noauto                 0      0
#/dev/cdrom  /cdrom     iso9660  ro,user,noauto              0      0
/dev/hda5    /boot      ext2     nosuid,ro,noauto            0      2
/dev/hda7    /usr       ext2     nosuid                      0      2
/dev/hda8    /var       ext2     nosuid                      0      2
/dev/hda9    /home      ext2     noexec                      0      2

Nous pouvons observer que la partition root (/) a pour option defaults et qu'en cas d'erreur, elle est montée en lecture seule (errors=remount-ro).

Les lecteurs de disquettes et de CD-ROM ne sont pas accessibles.

La partition /boot est en lecture seule et les bits suid ne sont pas exécutés. Par défaut, cette partition n'est pas montée.

La partition /var n'exécute pas le bit suid d'un programme ayant ce bit activé.

La partition /home n'autorise pas l'exécution de programmes (donc pas de bits suid non plus).

Si on utilise un système de fichier journalisé, il faut aussi le prendre en compte ici.

Sécuriser les accès réseaux:

Pour sécuriser les accès réseaux, il faut agir sur les fichiers suivant :
/etc/inetd.conf
/etc/services
/etc/protocols
/etc/hosts
/etc/hosts.deny
/etc/hosts.allow
/etc/hostname

Nous allons maintenant voir en détail chaque fichier.

/etc/inetd.conf : Seulement les services autorisés doivent être non-commentés. Dans le cas d'un firewall, aucun service ne doit être disponible (sauf ssh ou telnet pour faire de la maintenance à distance, ainsi que syslog, mais mis à part telnet, ils n'apparaissent pas dans ce fichier).
/etc/services : Seulement les services autorisés doivent être non-commentés. Dans le cas d'un firewall, aucun service ne doit être disponible (sauf ssh ou telnet pour faire de la maintenance à distance, et syslog).
/etc/protocols : Dans ce fichier sont définis les protocoles reconnus (et donc utilisables) par le système. Commenter (ou supprimer) tous les protocoles à ne pas utiliser.
/etc/hosts : Dans ce fichier, sera défini la correspondance entre les adresses IP et les noms des machines. Ce fichier servira pour compléter les fichiers /etc/hosts.deny et /etc/hosts.allow.
/etc/hosts.allow : Sont ici définis les machines ou les groupes de machines qui sont autorisés à accéder aux services locaux. Il est aussi précisé si l'accès autorisé est local ou à distance... Pour plus de détails, se reporter au manuel d'utilisation. Dans le cas d'un firewall, ce fichier doit être vide.
/etc/hosts.deny : Sont ici définis les machines ou les groupes de machines qui ne sont pas autorisés à accéder aux services locaux. Pour plus de détails sur la rédaction du fichier, se reporter au manuel d'utilisation. Dans le cas d'un firewall, ce fichier doit contenir la ligne :

ALL: PARANOID

/etc/hostname : Ce fichier contient le nom de la machine.

Le fichiers /etc/network/options

Ce fichier comprend quelques options qu'il est intéressant d'activer :

Voici un exemple des valeurs de ces options :

ip_forward=yes
spoofprotect=yes
syncookies=yes

Configuration du fichier securetty:

/etc/securetty est un fichier tout simple qui définit les consoles sur lesquelles l'utilisateur root peut se connecter. Voici un exemple du fichier :
# /etc/securetty: list of terminals on which root is allowed to login.
# See securetty(5) and login(1).
tty1
tty2
tty5
tty6
tty7

Nous voyons ici que l'utilisateur root ne peut se connecter directement que sur les consoles tty1, tty2, tty5, tty6, et tty7. Moins il y aura de consoles sur lesquelles l'utilisateur root pourra se connecter, mieux ce sera.

Si le fichier est vide, l'utilisateur root ne pourra pas se connecter directement à une console. Il faudra passer par le profil d'un utilisateur normal et ensuite basculer sous le profil root à l'aide de la commande su : pour accéder au profil root on a donc besoin de connaître 2 mots de passe.

Licence:

Copyright (c) 2003 Guillaume Lehmann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and one Back-Cover Text: "La version originale de ce document a été publiée par Guillaume Lehmann".

About this document ...

This document was generated using the LaTeX2HTML translator Version 2K.1beta (1.48)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -split 0 InstallFirewall.tex

The translation was initiated by Lehmann Guillaume on 2003-09-20


next_inactive up previous
Lehmann Guillaume 2003-09-20