\documentclass[a4paper,11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{times}
\usepackage{tabularx}
\usepackage{color}
\usepackage{epsfig}
\usepackage{shadow}
\usepackage{fancybox}
\usepackage{graphicx}
\usepackage{longtable}
\setlength{\hoffset}{-18pt}     
\setlength{\oddsidemargin}{5pt}         % Marge gauche sur pages impaires
\setlength{\evensidemargin}{5pt}        % Marge gauche sur pages paires
\setlength{\marginparwidth}{0pt}        % Largeur de note dans la marge
\setlength{\textwidth}{500pt}           % Largeur de la zone de texte (17cm)
\setlength{\voffset}{-18pt}             % Bon pour DOS
\setlength{\marginparsep}{7pt}          % Séparation de la marge
\setlength{\topmargin}{0pt}             % Pas de marge en haut
\setlength{\headheight}{10pt}           % Haut de page
\setlength{\headsep}{10pt}              % Entre le haut de page et le texte
\setlength{\footskip}{5pt}              % Bas de page + séparation
\setlength{\textheight}{720pt}          % Hauteur de la zone de texte (25cm)
\title{Installation d'une passerelle sous Debian GNU/Linux}
\definecolor{PineGreen}{cmyk}{0.92,0,0.59,0.25}
\definecolor{Gray}{cmyk}{0,0,0,0.1}
\begin{document}
\hspace{3cm}
\begin{picture}(10,10)(20,0)
\linethickness{5pt}
\put(-2.5,0){\line( 100,0){100}}
\put(0,-2.5){\line( 0,-100){100}}
\end{picture}
\vspace{25pt}
\begin{center}
{\Huge Installation d'une passerelle\\
\vspace{1cm}
Sous\\
\vspace{1cm}
Debian GNU/Linux}
\vspace{1cm}
\end{center}
\vspace{1cm}
\begin{center}
{\huge Arnaud Fontaine}\\
\vspace{25pt}
\large{(janvier 2004)}
\end{center}
\vspace{25pt}
\hspace{3cm}
\begin{picture}(10,10)(-335,0)
\linethickness{5pt}
\put(-2.5,0){\line( -100,0){100}}
\put(0,-2.5){\line( 0,100){100}}
\end{picture}
\thispagestyle{empty}
\vspace{1cm}

\clearpage
\tableofcontents
\pagestyle{headings}
\clearpage

\section{Introduction}
Ce document d\'ecrit l'installation d'une passerelle sous Debian
GNU/Linux Woody qui se trouve \^etre la version stable actuellement de
cette distribution. Ce document ne se pr\'etend pas exhaustif mais est
plut\^ot destin\'e \`a servire de base aux personnes souhaitant mettre
en place un syst\`eme s\'ecuris\'e sans trop s'emb\^eter. Celui-ci se
veut une approche pratique et non th\'eorique, pour cela, je vous
conseille de lire la section \verb+`+Ressources' qui contient des liens
vers d'autres documentations parfois plus th\'eoriques.\\
\\
En effet, on entend de plus en plus parler du piratage. On remarque
que souvent, les failles permettant une intrusion proviennent
g\'en\'eralement des personnes qui utilisent ce syst\`eme, plutôt que
le syst\`eme en lui-même. Cette documentation est donc destin\'ee à
vous apprendre pas à pas la configuration d'une passerelle sous Debian
GNU/Linux. De plus, il est tr\`es important de ne pas se connecter sur
Internet avant que le serveur ne soit pr\^et et que les r\`egles de
s\'ecurit\'e de base aient \'et\'e correctement appliqu\'ees.\\
\\
Pourquoi utiliser cette distribution et pas une autre ? Tout d'abord
parce que j'utilise Debian depuis un certain temps, mais aussi parce que
cette distribution est r\'eput\'ee pour ses efforts concernant les mises à
jour de s\'ecurit\'e, et enfin pour sa gestion performantes des paquets.

\section{Installation et s\'ecurisation du syst\`eme}
Il d\'ecrit donc en premi\`ere partie l'installation (sans pour autant
rentrer dans les d\'etails) et la s\'ecurisation basique du
syst\`eme. Cette partie donne un aper\c{c}u de ce que vous devez
absolument faire pour que votre syst\`eme ne soit pas trop
vuln\'erable.\\
\\
Je vous conseille fortement de lire cette section même si cela peut
vous permettre simple car elle comporte des éléments importants pour
la sécurité de base de votre système. En compl\'ement de cette
section, je vous conseille vivement de lire \'egalement le \textit{«
Securing Debian Manual »}~\cite{debian-manuel-secu} tr\`es complet.

\subsection{Recommandations pour et apr\`es l'installation }
Je ne détaillerai pas l'installation d'une distribution Debian GNU/Linux
car cette description a déjà été faîte dans un article écrit du guide de
l'utilisateur Debian disponible sur Andesi [1]. De plus cela n'est pas
vraiment l'objet de ce cours, je vous dirais seulement de n'installer
aucun paquets de plus que ceux de l'installation par d'\'efaut, et
donc de ne pas utiliser \textit{dselect} ou \textit{taskselect}.\\
\\
Je vais toutefois décrire le partitionnement qui est assez spécifique
pour un serveur. Il est vivement recommandé de créer plusieurs
partitions. En effet, comme indiqu\'e dans le manuel de S\'ecurisation
de Debian~\cite{debian-manuel-secu} :\\
\begin{itemize}
  \item Toute arborescence dans lequel un utilisateur quelconque a des
  permissions d'\'ecriture tel que \textit{/home} ou \textit{/tmp}
  doit \^etre plac\'ee dans une partition qui lui est propre.
  \\
  \item Toute arborescence dont la taille varie beaucoup tel que
  \textit{/var} doit aussi \^etre plac\'e sur une autre partition que
  la racine.
  \\
  \item Il aparra\^it plus logique de d\'eplacer les donn\'ees
  statiques sur une autre partition afin de pouvoir la monter en
  lecture seule.\\
\end{itemize}

Nous choisirons le syst\'eme de fichier ext3 qui pr\'esente
l'avantage, par rapport \`a son pr\'ed\'cesseur, d'\^etre
journalis\'e~\cite{ext3}. Ainsi, en cas de coups dur vous pourrez
toujours monter vos partitions en ext2 et \'eviter les pertes de
donn\'ees. Nous allons affecter quelques options sp\'ecifiques aux
partitions cr\'ees pendant l'installation. Voici un exemple de fichier
\texttt{/etc/fstab} :

\input{include/fstab.tex}

Vous pouvez remarquer les options \textit{nosuid, noexec, ro, nodev}
qui permettent respectivement le montage de partition sans fichier
avec les bits SUID/SGID, sans la permission d'ex\'ecuter quoique ce
soit, le montage en lecture seule et enfin d'ignorer les
p\'eriph\'eriques. Notez que ces options ne sont pas synonyme de
protection totale car un intrus poss\'edant les droits de
l'utilisateur root pourra facilement remonter les partitions comme il
le d\'esire, mais cela constitue une bonne protection contre les
Script Kiddies.\\
\\
Cependant, le montage de la partition \texttt{/usr} en lecture seule
peut poser quelques probl\`emes notamment lors de l'installation ou la
mise \`a jour de paquet, car ces op\'erations requi\`erent la
possibilit\'e d'\'ecrire sur cette partition. Pour rem\'edier \`a ce
probl\`eme, nous allons ajouter un fichier \texttt{/etc/apt/apt.conf}
qui contiendra ceci :

\input{include/apt-conf.tex}

Vous devriez aussi activer les mots de passe au format MD5 et shadow,
ce dernier \'etant activ\'e par d\'efaut, afin de rendre vos mots de
passe beaucoups plus difficilement crackable. C'est tout ce qu'il
\'etait important de ne pas oublier de faire durant l'installation.

\subsection{Pam et autres restrictions}
Pam (acronyme de \textit{« Pluggable Authentication Modules »})
repr\'esente en quelque sorte le syst\`eme d'authentification de votre
syst\`eme. En effet c'est gr\^ace \`a celui-ci que vous pouvez vous
authentifiez quelque soit le programme par lequel vous fa\^ites
cela. Nous allons d\'ecrire bri\`evement les fichiers de configuration
de Pam, une description \'etant disponible dans le manuel de
s\'ecurisation de Debian~\cite{debian-manuel-secu}.\\
\\
Voici quelques fichiers de configuration essentiels de PAM qu'il faut
que vous modifiez :

\input{include/pam-su}

\input{include/pam-login.tex}

\input{include/pam-passwd.tex}

\input{include/pam-ssh.tex}

\input{include/pam-other.tex}

Une fois que ces fichiers ont \'et\'e adapt\'es \`a votre
environnement, il ne faut surtout pas oublier d'ajouter les
utilisateurs autoris\'es \`a se connecter en root, via la commande
\texttt{su}, au groupe wheel, cr\'eez ce dernier si celui-ci n'existe
pas d\'ej\`a par l'interm\'ediaire des commandes suivantes :\\
\texttt{\# addgroup wheel\\
\# adduser toto wheel}\\
\\
Enfin n'oubliez pas non plus d'installer la biblioth\`eque
\texttt{libpam-cracklib} sous peine de ne plus pouvoir s'identifier
ult\'erieurement. Je n'ai pas utilis\'e cette biblioth\`eque dans le
fichier \texttt{/etc/pam.d/passwd} car cela posait quelques
probl\`emes dont je n'ai pas trouv\'e la solution.\\
\\
Maintenant que vous en avez termin\'e avec PAM, quelques petites
choses sont encore \`a configurer. Vous pouvez restreindre les
consoles sous lesquelles l'utilisateurs root pourra se connecter
gr\^ace au fichier d\'ecrit ci-dessous :

\input{include/securetty.tex}

Enfin, on termine cette section en modifiant le fichier
\texttt{/etc/login.defs} d\'efinissant quelques param\`etres tr\`es
utiles et concernant principalement la journalisation ainsi que
pour les mots de passe.

\input{include/login-defs.tex}

\subsection{Installation d'un noyau}
En g\'en\'eral, on installe un serveur sur une machine peu puissante (en
tout cas pour les particuliers), vous devez donc \'economiser au maximum
de la m\'emoire. De plus, vous devriez ne disposer dans votre noyau
que des options que vous aurez besoin. C'est pour cela qu'il peut
s'av\'erer utile de compiler un noyau r\'epondant \`a ces besoins. Par
contre je vous conseille fortement de compiler votre noyau \`a partir
d'une autre machine sous Debian GNU/Linux, car il ne faut pas que vous
installiez les programmes de d\'eveloppement. Je donnerai dans cette
partie seulement les commandes \`a taper avec peu d'explications car
un article plus complet concernant la compilation du noyau \`a la
sauce Debian est disponible sur Andesi~\cite{andesi-noyau}.\\ 
\\
Voi\`a donc ce que vous devez faire sur une autre machine avec une
distribution Debian GNU/Linux pr\'einstall\'e :
\texttt{\# apt-get install build-essential fakeroot kernel-package
libncurses5-dev}\\
\\
Une fois ces paquets t\'el\'echarg\'es et install\'es, il ne vous
reste plus qu'\`a t\'el\'echarger la derni\`ere version des sources du
noyau sur le site officiel du noyau Linux~\cite{linux-src}, puis \`a
les d\'ecompresser et enfin \`a compiler le noyau :\\ 
\texttt{\$ wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.24.tar.bz2}\\
\texttt{\$ mkdir \tild/src \&\& cd \tild/src \&\& tar xvfj \tild/linux-2.4.24.tar.bz2}\\
\texttt{\$ wget
http://www.andesi.org/articles/autre/passerelle-2.4.24.config} \verb+\+\\
\texttt{\&\& cp \tild/passerelle-2.4.24.tex \tild/src/linux-2.4.24/.config}\\
\texttt{\$ make menuconfig}\\
\texttt{\$ cd \tild/src/linux-2.4.24/ \&\& make-kpkg clean \&\&
make-kpkg} \verb+\+\\
\verb+--+\texttt{rootcmd fakeroot} \verb+--+\texttt{revision=2.4.24-1 kernel-image}\\
\\
Enfin copiez l'image du noyau, g\'en\'er\'e sous la forme d'un paquet
Debian, gr\^ace \`a ssh (en admettant que votre serveur ssh soit actif
voir la section concernant ssh) :\\
\texttt{\$ scp \tild/src/kernel-image-2.4.23\_2.4.24-1.deb toto@192.168.0.1:\tild}\\
\\
Enfin, revenez sur le serveur puis tapez :\\
\texttt{\# dpkg -i /home/toto/kernel-image-2.4.24\_2.4.24-1.deb}\\
\\
Vous devez lire la section suivante afin de pouvoir amorcer sur ce
nouveau noyau sans aucun probl\`eme.

\subsection{Lilo et le BIOS}
De plus en plus de personnes prennent conscience des risques li\'es
aux attaques distantes, mais il ne faut pas non plus n\'egliger les
risques que l'on prend lorsque la machine est accessible
physiquement. Une personne mal intentionn\'e pouvant simplement
red\'emarrer les machine puis d\'emarrer \`a partir d'un c\'ed\'erom
puis installer un rootkit tr\`es facilement. Pour rem\'edier \`a ce
probl\`eme, il faut activer l'amor\c{c}age \`a partir du disque dur
uniquement et aussi mettre un mot de passe au BIOS afin d'\'eviter
toute modification de ce param\`etre par n'importe qui.\\
\\
Vous pouvez, si vous le souhaitez mettre un mot de passe au
gestionnaire d'amor\c{c}age qui se trouve \^etre Lilo, install\'e par
d\'efaut sur Debian GNU/Linux. Ainsi, on ne pourra pas d\'emarrer le
syst\`eme en passant par exemple \texttt{/bin/bash} comme ligne de
commande (cela permet d'arriver directement sur un shell sans avoir
\`a s'identifier auparavant). N\'eanmoins, en cas de coupure de
courant, vous serez oblig\'es d'intervenir pour taper le mot de passe,
sans \c{c}a votre syst\`eme ne se lancera pas. Il s'av\`ere plus
judicieux de ne me mettre un mot de passe uniquement lorsque des
param\`etres seront pass\'es \`a la ligne de commande. Pour cela, on
utilise l'option \textit{restricted} et \textit{password}. Un exemple
de fichier de configuration de Lilo est fourni ci-dessous :

\input{include/lilo-conf.tex}

Une fois ce fichier modifi\'e selon vos besoins, il est n\'ecessaire de
taper ensuite la commande suivante pour prendre en compte les
modification :\\ 
\texttt{\# lilo}

\subsection{Paquets et services inutiles}
Lorsque vous installez un serveur digne de ce nom, tous les paquets et
services inutiles doivent \^etre enlev\'es ou d\'esactiv\'es. Ainsi
nous allons d\'esactiver le service inetd sujet \`a des failles de
s\'ecurit\'e (corrig\'ees heureusement mais ce service ne nous est
d'aucune utilit\'e). On tape donc la commande suivant pour ne plus
d\'emarrer inetd lors de l'amor\c{c}age du syst\`eme :\\
\texttt{\# update-rc.d -f inetd remove}\\
\\
Et enfin nous commentons l'ensemble du fichier de configuration de
inetd en ajoutant un signe di\`ese devant chaque ligne dans le cas
d'une mise \`a jour du paquet correspondant. Vous pouvez effectuer la
m\^eme op\'eration sur l'ensemble de vos services. Pour savoir quels
sont les services lanc\'es au d\'emarrage, vous pouvez simplement
v\'erifier le contenu des r\'epertoires \texttt{/etc/rc2.d} et
\texttt{/etc/rcS.d}.\\
\\
Pour enlever les paquets que vous jugez inutiles pour votre syst\`eme,
vous pouvez tout d'abord v\'erifier quels sont ceux qui sont installez
ainsi que leur description via la commande suivante :\\
\texttt{\# dpkg -l | grep ii}\\
\\
Vous pouvez par exemple supprimer telnet que nous remplisserons
avantageusement par ssh pour des raisons de s\'ecurit\'e. Ensuite
supprimez-les (paquets et fichiers de configuration) par
l'interm\'ediaire de la commande suivant :\\ 
\texttt{\# apt-get remove --purge nom\_paquet}

\subsection{Mise en place d'un firewall}
La mise en place d'un pare-feu ou firewall est absolument
indispensable. Nous allons donc configurer celui-ci avant de se
connecter sur internet. La commande en espace utilisateur pour la
version 2.4 et 2.6 du noyau GNU/Linux s'appelle Iptables. Netfilter
repr\'esentant le pare-feu en lui m\^eme. Notez que nous ne
d\'ecrirons pas la configuration d'un pare-feu utilisant ipchains
(disponible pour la version 2.2 du noyau).\\
\\
Dans cette documentation, nous n'allons pas d\'ecrire le
fonctionnement de Netfilter ainsi que de Iptables car de nombreuses
documentations tr\`es compl\`etes existent d\'ej\`a sur le sujet. Nous
allons simplement distinguer les commandes qui permettent de manipuler
les r\`egles et jeu de r\`egles, les param\`etres de sp\'ecification
des r\`egles et enfin les extensions. Je pense plus utile de fournir
un script Iptables fonctionnant correctement plut\^ot que de d\'ecrire
\`a nouveau le fonctionnement de Iptables.\\
\\
Dans l'exemple suivant, nous consid\'erons que l'interface utilis\'e
pour internet est \textit{ppp0}. J'ai eu l'occasion de tester ce
script \`a plusieurs reprises et j'avoue n'avoir eu aucun probl\`eme
sur diff\'erentes machines. Il se peut cependant qu'il manque quelque
chose, dans ce cas n'h\'esitez pas \`a me le dire.

\input{include/iptables.tex}

Une fois ce script adapt\'e \'eventuellement \`a vos besoins et que
celui-ci a \'et\'e copi\'e dans le r\'epertoire \texttt{/etc/init.d/},
il ne vous reste plus qu'\`a le rendre ex\'ecutable puis \`a cr\'eer
les liens pour que le pare-feu soit lanc\'e \`a chaque d\'emarrage de
la machine, ceci pourra se faire simplement sous Debian via la
commande \texttt{update-rc.d} :\\
\texttt{\# chmod 755 /etc/init.d/iptables.sh\\
\# update-rc.d iptables.sh defaults 20}\\
\\
Vous pourrez trouver plus d'informations au sujet de la gestion des
services lanc\'es au d\'emarrage dans la documentation disponible sur
Andesi~\cite{andesi-services}.

\subsection{Mises \`a jour de s\'ecurit\'e}
Si vous avez install\'e Debian GNU/Linux depuis les c\'ed\'eroms, il
faut absolument mettre \`a jour les paquets de votre syst\`eme afin de
corriger des failles \'eventuelles. Cela se fait tr\`es simplement en
sp\'ecifiant les sources APT dans le fichier adapt\'e. Voici un exemple
de ce fichier :

\input{include/sources-list.tex}

Une fois que vous avez modifi\'e ce fichier, vous devrez taper les
commandes suivantes pour mettre \`a jour respectivement la liste des
paquets et d'installer les mises \`a jour disponibles :\\
\texttt{\# apt-get update\\
\# apt-get upgrade -u}\\
\\
Normalement peu de paquets seront mis \`a jour lors de cette
\'etape. Enfin tout d\'epend \'evidemment des paquets que vous avez
install\'e. Enfin vous pouvez v\'erifier les paquets affect\'es par
une faille de s\'ecurit\'e et corrig\'es sur la partie s\'ecurit\'e du
site de Debian~\cite{site-secu-debian}. Vous pouvez ensuite installer
quelques paquets utiles :\\
\texttt{\# apt-get install locales libpam-cracklib}

\section{Installation et configuration des services}
Cette partie concerne la mise en place de services disponibles aux
utilisateurs du r\'eseau local et \'egalement via internet. Elle
d\'ecrit donc l'installation d'un serveur web \textit{Apache}, d'un
serveur de base de donn\'ees \textit{MySQL}, d'un service permettant un
acc\`es s\'ecuris\'e \`a distance \textit{SSH}. Ces trois services
\'etant disponible par Internet. Les autres services sont destin\'es aux
utilisateurs du syst\`eme ou du r\'eseau local. Avec notamment un
serveur de mail \textit{Postfix}, d'un proxy \textit{Squid} et de
\textit{Rsync} qui vous permettra de faire des sauvegardes du
syst\`eme.

\subsection{MySQL}
MySQL est un serveur de bases de donn\'ees libre, performant et
tr\`es utilis\'e. De plus, celui-ci peut s'utiliser sans aucun
probl\`eme avec le module PHP de Apache. Celui-ci est utilis\'e sur
\'enorm\'ement de serveurs actuellement.\\
\\
Nous allons donc d\'ecrire la configuration minimale \`a faire pour
configurer un tel serveur. Cela est relativement simple si on
conna\^it d\'ej\`a un peu quelques commandes SQL. Nous installons donc
les paquets correspondants :\\
\texttt{\# apt-get install mysql-client mysql-common mysql-server
libmysqlclient}\\
\\
Une fois cette op\'eration effectu\'ee, le plus dur a \'et\'e fait. Il
ne vous reste plus qu'\`a d\'ecommenter la ligne comportant l'option
\texttt{skip-networking}. Ensuite red\'emarrez le serveur MySQL par la
commande :\\
\texttt{\# /etc/init.d/mysql restart}\\
\\
On peut dire que la configuration de MySQL est termin\'e, n\'eanmoins,
il faut mettre un mot de passe pour l'utilisateur root de la base de
donn\'ees (celui-ci \'etant totalement diff\'erent de l'utilisateur
root du syst\`eme). Pour cela on tape la commande :\\
\texttt{\# mysqladmin -u root password your\_password}\\
\\
Maintenant on peut se connecter \`a la base de donn\'ees avec le mot
de passe pr\'ecedemment assign\'es :\\
\texttt{\# mysql -u root -p}\\
\\
Cr\'eons ensuite une base de donn\'ees ainsi qu'un utilisateur ayant
tous les droits dessus :\\
\texttt{> CREATE DATABASE toto ;\\
> USE mysql ;\\
> GRANT ALL PRIVILEGES on toto.* to toto@localhost IDENTIFIED BY
'your\_pass' ;}\\
\\
D\'esormais l'utilisateur toto pourra se connecter \`a sa base de
donn\'ees en tapant la m\^eme commande que pr\'ecedemment :\\
\texttt{\$ mysql -u toto -p\\
> USE toto ;}\\
\\
La configuration du serveur MySQL est maintenant termin\'e. Cela n'est
vraiment pas compliqu\'e, pour une introduction \`a MySQL, je vous
conseille le manuel officiel tr\`es complet et disponible en
fran\c{c}ais.

\subsection{Apache}
Apache est un serveur web tr\`es populaire, son succ\`es est du tout
d'abord \`a sa libert\'e d'utilisation mais \'egalement parce qu'il est
puissant et stable \`a la fois. Je vous conseille donc fortement de
choisir Apache pour votre serveur. De plus il est disponible en paquet
Debian. Nous allons \'egalement installer PHP en tant que module pour
Apache afin de pouvoir disposer de ce language de programmation web de
plus en utilis\'e pour la r\'ealisation de sites internet dynamiques.
Je ne vais pas d\'ecrire la configuration d'apache dans cette section
mais plut\^ot les modifications \`a faire au niveau du fichier de
configuration.\\
\\
Commencons tout d'abord par installer le serveur Apache ainsi que le
module PHP en tapant la commande suivante :\\
\texttt{\# apt-get install apache apache-common php4 php4-mysql\\
\# apacheconfig}\\
\\
Le dernier des paquets \'est destin\'e \`a permettre l'utilisation des
fonctions MySQL dans PHP. Enfin la derni\`ere des commandes est
destin\'e \`a relancer la d\'etection des modules install\'es. Une fois
ces paquets install\'es, il vous reste seulement \`a modifier les
fichiers de configuration de Apache et celui de PHP \'eventuellement. La
configuration que je vais d\'ecrire est adapt\'e pour un serveur web
avec un minimum de s\'ecurit\'e mais pour un h\'ebergeur, il faudrait
que celle-ci soit beaucoup plus stricte.\\
\\
On modifie d'abord le fichier de configuration de Apache en ajoutant si
ce n'est pas d\'ej\`a fait les extensions des scripts au format PHP et
quelques autres options dont la description est donn\'e dans les
commentaires.

\input{include/httpd-conf.tex}

Une fois que la configuration a \'et\'e adapt\'e selon vos param\`etre,
vous n'avez plus qu'\`a relancer Apache :\\
\texttt{\# /etc/init.d/apache restart}\\
\\
Maintenant que nous avons correctement configur\'e Apache, il ne reste
plus qu'\`a modifier quelques d\'etails dans le fichier de configuration
de php afin de renforcer un peu la s\'ecurit\'e de celui-ci. Voici
encore un exemple de fichier de configuration avec seulement les lignes
que j'ai modifi\'e. Une fois que vous avez modifi\'e ce fichier avec les
valeurs indiqu\'ees, il faudra red\'emarrer le serveur Apache afin que
les modifications soient prises en compte.

\input{include/php-ini.tex}

Vous pouvez \`a tout moment v\'erifier que votre serveur tourne
correctement en tapant la commande `ps'. Si ce n'est pas le cas,
v\'erifiez dans les journaux de Apache qui se trouve dans
\texttt{/var/log/apache/}, le fichier \texttt{error.log} de ce
r\'epertoire \'etant le plus important dans le cas o\`u votre serveur
web rencontre un probl\`eme quelconque.

\subsection{Ssh}
Ssh est un remplacement tr\`es int\'eressant pour Telnet car il
pr\'esente l'\'enorme avantage de crypter la communication de bout en
bout. Il vous permettra donc d'acc\'eder \`a distance \`a votre machine
afin de l'administrer, vous \'economisant ainsi un \'ecran et autres
fioritures. De plus la configuration d'un tel serveur est tr\`es simple
\`a faire.\\
\\
Il faut tout d'abord installer le paquet de OpenSSH disponible bien
entendu en tant que paquet Debian :\\
\texttt{\# apt-get install ssh}\\
\\
Enfin modifiez le fichier de configuration de OpenSSH dont la syntaxe
est vraiment tr\`es simple \`a comprendre :

\input{include/sshd-config.tex}

Vous avez sans doute remarquer que nous n'avons pas autoriser
l'utilisateur root \`a se connecter, tout simplement car cela forcera
l'utilisateur qui \`a les permissions n\'ecessaires \`a taper deux
mots de passe cons\'ecutivement. Ainsi on \'evite les attaques par
force brute contre le compte root.\\
\\
Nous avons choisi d'accepter deux formes d'authentification, la
premi\`ere est classique (d\'efini par l'option\\
\texttt{PasswordAuthentication}) car elle n\'ecessite simplement que
vous tapiez le mot de passe du compte sur lequel vous souhaitez vous
connecter. La seconde forme (d\'efini par l'option
\texttt{PubkeyAuthentication}) est plus int\'eressante, selon moi, car
elle permet la connexion par cl\'e publique. Ainsi, si un utilisateur
souhaite se connecter sur la machine qui accepte uniquement cette
forme, il devra obligatoirement disposer d'un mot de passe pour
d\'everouiller sa cl\'e priv\'e, qui aura \'et\'e pr\'ealablement
ajouter sur le serveur, afin de se connecter.\\
\\
Voyons comment utiliser cette seconde m\'ethode. Nous allons tout
d'abord cr\'eer une cl\'e publique et priv\'e sur la machine cliente
par la commande suivante :\\
\texttt{\# ssh-keygen -t dsa}\\
\\
Une fois le mot de passe choisi et cette cl\'e g\'en\'er\'ee, il ne
vous reste plus qu'\`a copier la cl\'e publique de votre client sur le
serveur dans le fichier \texttt{\tild/.ssh/authorized\_keys} de ce
dernier, \`a l'aide la commande :\\
\texttt{ssh-copy-id -i \tild/.ssh/id\_dsa.pub toto@ip\_serveur}\\
\\
D\'esormais vous pourrez vous connecter sur le serveur en utilisant la
m\'ethode d'authentification par cl\'e publique. Un pirate \'eventuel
devra disposer \`a la fois disposer du mot de passe de la cl\'e mais
aussi de l'assortiment de cl\'es proprements d\^ites.\\
\\
Un serveur ssh pourra remplacer avantageusement un serveur FTP si peu
d'utilisateurs utilise cette machine, car vous pourrez utiliser Gftp
comme client pour vous connecter sur votre serveur ssh. Celui-ci se
comportera exactement comme un serveur FTP classique.

\subsection{Postfix}
Postfix est un serveur de mail plut\^ot connu qui est cens\'e \^etre
plus s\'ecuris\'e que Sendmail et dont la configuration est plus
ais\'e que ce dernier. Celui-ci va nous servir de serveur de mail
local et va nous permettre \'egalement d'envoyer des courriels en se
servant d'un serveur SMTP (celui de votre FAI par exemple).\\
\\
Nous allons commencer, comme d'habitude, par installer ce paquet :\\
\texttt{\# apt-get install postfix}\\
\\
R\'epondez aux diff\'erents choix qui vous sont propos\'es, vous
devriez obtenir un fichier de configuration de postfix qui ressemble
\`a celui-ci :

\input{include/main-cf.tex}

Enfin voici le contenu du fichier destin\'e \`a rediriger les
courriels envoy\'es \`a l'utilisateur root vers un autre
utilisateur. Ceci n'est pas obligatoire bien entendu.

\input{include/aliases.tex}

Une fois la configuration termin\'e, vous pouvez red\'emarrez le
serveur de courriels, afin que les modifications soient prises en
compte, gr\^ace \`a la commande suivante :\\
\texttt{\# /etc/init.d/postfix restart}

\section{Mise en place de prisons chroot}
Dans cette partie, nous d\'ecrirons la mise en place de prisons chroot
pour diff\'erents services cl\'e que sont Apache et MySQL. La
configuration de ces services que vous avez fait dans les
pr\'ec\'dentes sections ne seront bien s\^ur pas inutiles puisqu'on va
se baser sur exactement les m\^emes fichiers de configuration.\\
\\
Vous vous demandez certainement ce qu'est une prison chroot ?
Admettons que nous laissions le syst\`eme configur\'e ainsi, une
faille sur MySQL pourrait permettre \`a un attaquant d'acc\'eder au
syst\`eme sous l'utilisateur du processus MySQL. M\^eme si celui-ci
n'a pas beaucoup de droits, il serait alors possible d'exploiter une
faille locale permettant d'acc\'der au compte root, ce qui peut se
r\'ev\'eler catastrophique car l'ensemble de l'arborescence du
syst\`eme serait touch\'e. Pour r\'esoudre ce probl\`eme, il existe un
m\'ecanisme permettant d'enfermer le processus dans une arborescence
minimale, qui serait donc \`a l'int\'erieur de l'arborescence du
syst\`eme. Ce m\'ecanisme s'appelle chroot. On installera dans cette
prison seulement les fichiers n\'cessaires au service, ainsi
l'attaquant se retrouvera en th\'eorie bloqu\'e dans l'arborescence et
ne pourra donc pas corrompre le reste du syst\`eme.

\subsection{Pr\'esentation de Makejail}
Vous pourriez tr\`es bien copier manuellement les fichiers
n\'ecessaires aux services, mais cela s'av\`ere plut\^ot
fastidieux. Makejail vient donc \`a notre rescousse en permettant de
copier automatiquement les fichiers n\'ecessaires au bon
fonctionnement du syst\`eme. Cet utilitaire est \'ecrit en Python et
permet de faire des mises \`a jour de la prison chroot beaucoup plus
facilement qu'avec l'ancienne m\'ethode.\\
\\
Makejail n'est malheureusement pas disponible en tant que paquets
officiels pour la version stable de Debian. Cependant j'ai fait un
r\'etro-portage de ce paquet afin qu'il soit utilisable sur
woody. Pour installer ce paquet, il vous suffit de taper les commandes
:\\ 
\texttt{\# echo "deb http://www.andesi.org/public/ stable main" >>
/etc/apt/sources.list\\
\# apt-get update\\
\# apt-get install makejail stat strace binstats python}\\
\\
Il faut savoir que vous pouvez tr\`es bien cr\'eer des prisons chroot
pour d'autres services tels que Ssh ou Bind, dont la construction
n'est pas d\'ecrite dans cet article. Passons donc \`a la cr\'eation
d'une prison chroot pour Apache et MySQL, m\^eme si cela peut
para\^itre plut\^ot compliqu\'e, en fait il n'en est rien.

\subsection{Configuration d'une prison chroot pour Apache}
La cr\'eation de cette prison chroot n\'ecessite auparavant la
cr\'eation d'un fichier de configuration pour Makejail \'ecrit en
Python plut\^ot facile \`a faire. En voici un exemple :

\input{include/makejail-apache}

N'oubliez pas de cr\'eer le r\'epertoire \texttt{/etc/makejail/} s'il
n'existe pas d\'ej\`a. Maintenant que vous avez cr\'e\'e ce fichier,
vous pouvez cr\'eer le r\'epertoire qui va accueillir la prison chroot
pour Apache, on arr\^ete le service Apache, puis on lance makejail qui
effectue les op\'erations n\'ecessaires :\\
\texttt{\# mkdir -p /var/chroot/apache/ \\
\# /etc/init.d/apache stop\\
\# makejail /etc/makejail/apache.py}\\
\\
Il peut \`etre n\'cessaire de lancer Makejail deux fois afin que la
totalit\'e des fichiers soient copi\'es.  Vous pouvez tester d\`es
maintenant le fonctionnement du service en montant le syst\`eme de
fichier virtuel \texttt{/proc} dans la prison puis en lan\c{c}ant le
service :\\
\texttt{\# mount -t proc proc /var/chroot/apache/proc\\
\# chroot /var/chroot/apache/ /usr/sbin/apachectl start}\\
\\
Normalement vous ne devriez avoir aucune erreur \`a ce
stade. Copiez ensuite, le r\'epertoire publique de votre serveur web
actuel ainsi que les journaux :\\
\texttt{\# cp -a /var/www /var/chroot/apache/var/ \\
\# mkdir /var/chroot/apache/var/log \&\& chmod 755
/var/chroot/apache/var/log/ \\
\# cp -a /var/log/apache /var/chroot/apache/var/log/}\\
\\
Configurons d\'esormais pour que le service soit automatiquement
lanc\'e dans la prison chroot. Pour cela il faut modifier le fichier
pr\'esent dans \texttt{/etc/init.d/} qui permet le lancement du
service en toute simplicit\'e. Cela vous \'evitera donc de taper de
longues commandes pour d\'emarrer votre serveur web.

\input{include/makejail-apache-init.tex}

Maintenant, Apache se lancera sans aucun probl\`eme \`a chaque
d\'emarrage de votre serveur dans la prison chroot, m\^eme si ce
script est loin d'\^etre parfait, il fonctionne plut\^ot bien chez
moi. Modifiez enfin le service sysklogd afin qu'il `capture' tous les
messages qui passe dans la chroot de Apache, voici ce que vous devriez
obtenir :\\
\texttt{SYSLOGD="-a /var/chroot/apache/dev/log"}\\
\\
Modifions enfin le fichier de configuration de LogRotate afin de ne
pas disposer de journaux trop lourd dans la prison chroot pour apache
:\\

\input{include/makejail-apache-logr.tex}

Vous pouvez v\'erifier le bon fonctionnement de Apache directement
dans les journaux de la prison chroot qui sont les fichiers du
r\'epertoire \texttt{/var/chroot/apache/var/log/apache}. La prison
chroot pour Apache est maintenant compl\`etement termin\'e, nous
allons maintenant aborder la cr\'eation d'une prison chroot pour MySQL
qui n'est pas plus difficile que celle-ci.

\subsection{Configuration d'une prison chroot pour MySQL}
On va proc\'eder exactement de la m\^eme fa\c{c}on que pour la prison
chroot pour Apache. On commence donc par cr\'eer un fichier de
configuration pour makejail destin\'e \`a MySQL dont je donne un
exemple ci-dessous :

\input{include/makejail-mysqld.tex}

On cr\'ee le r\'epertoire qui dans lequel on va placer la prison
chroot pour MySQL, puis on arr\^ete le service et enfin on lance
makejail qui va s'occuper de copier pour nous tous les fichiers et
r\'epertoires n\'ecessaires \`a MySQL :\\
\texttt{\# mkdir /var/chroot/mysqld/ \\
\# /etc/init/mysql stop\\
\# makejail /etc/makejail/mysqld.py}\\
\\
Comme pour le cas de Apache, il peut \^etre n\'ecessaire de lancer
deux fois makejail afin que tous les fichiers et r\'epertoires soient
copi\'es dans la prison chroot pour MySQL. Copions les r\'epertoires
qui ont \'et\'e pr\'eserv\'es par Makejail :\\
\texttt{\# cp -a /var/lib/mysql /var/chroot/mysqld/var/lib/ \\
\# mkdir /var/chroot/mysqld/var/log/ \\
\# cp -a /var/log/mysql/ /var/chroot/mysqld/var/log/}\\
\\
Testons enfin le bon fonctionnement de la prison chroot en montant
tout d'abord le syst\`eme de fichiers virtuel \texttt{/proc} puis on
tente de lancer le service :\\
\texttt{\# mount -t proc proc /var/chroot/mysqld/proc/ \\
\# chroot /var/chroot/mysqld/ /usr/bin/safe\_mysqld \&}\\
\\
Si tout va bien, le serveur MySQL est d\'emarr\'e dans la prison
chroot, on peut ais\'ement v\'erifier cela avec la commande
\texttt{ps}. Enfin on modifie le script permettant le lancement du
service afin que ce dernier d\'emarre dans la prison chroot qui lui
est r\'eserv\'ee.

\input{include/makejail-mysql-init.tex}

Voil\`a, gr\^ace \`a ce script, qui, il faut bien l'avouer est loin
d'\^etre parfait mais qui a l'avantage de fonctionner, vous n'aurez
pas \`a taper de longues lignes de commandes pour d\'emarrer votre
serveur MySQL. Il faut aussi modifier le script de d\'emarrage du
service \texttt{sysklogd} afin qu'il puisse capter les messages \'emis
par MySQL, vous devriez donc avoir cela dans
\texttt{/etc/init.d/sysklogd} :\\
\texttt{SYSLOGD="-a /var/chroot/apache/dev/log -a
/var/chroot/mysqld/dev/log"}\\
\\
Modifions \'egalement le fichier de configuration de LogRotate afin
que les journaux dans la prison chroot ne deviennent pas trop
importants :

\input{include/makejail-mysql-logr.tex}

Un petit d\'etail avant de terminer cette partie sur la mise en place
d'une prison chroot pour MySQL, vous devrez pr\'eciser dans vos
script, qui devront pouvoir se connecter au serveur MySQL, le serveur
suivant : \texttt{12.0.0.1:3306}.

\section{Outils de surveillance du syst\`eme}
Cette section concerne la mise en place d'outils de surveillance (on
parle aussi de monitoring), tel qu'un outil de v\'erification de
l'int\'egrit\'e du syst\`eme, on utilisera pour cela
\textit{Aide}. Enfin on d\'ecrira la configuration d'un autre outil
(\textit{Logcheck}) permettant de v\'erifier les \'ev\`enements suspects
dans les journaux du syst\`eme.

\subsection{Aide}
AIDE ~\cite{aide-auteur}(acronyme de \textit{« Advanced Intrusion
Detection Environment »}) permet la cr\'eation d'une base de donn\'ees
des fichiers et r\'epertoires sp\'ecifi\'es dans le fichier de
configuration \texttt{/etc/aide/aide.conf}. L'int\'er\^et de cette base
de donn\'ees est qu'elle contient les attributs des fichiers ainsi
qu'une somme de contr\^ole de ceux-ci vous permettant de savoir si des
fichiers ont \'et\'e modifi\'es sur votre syst\`eme apr\`es une attaque
par exemple.\\
\\
Il convient ainsi de cr\'eer cette base de donn\'ees avant de se
connecter \`a un r\'eseau quelconque afin de cr\'eer une base de
donn\'ees saine et de ne pas ajouter dans la base de donn\'ees des
fichiers qui sont tr\`es souvent modifi\'es afin d'obtenir un rapport
court et simple \`a examiner.\\
\\
Vous pouvez installer tr\`es facilement AIDE car il est disponible en
paquet Debian pour Woody, on tape donc la commande :\\
\texttt{\# apt-get install aide}\\
\\
Lors de l'installation du paquet, vous pourrez cr\'eer la base de
donn\'ees directement. Une fois ce paquet install\'e il ne vous reste
plus qu'\`a adapter le fichier de configuration en suivant par exemple
l'exemple donn\'e ci-dessous. Ce fichier est celui par d\'efaut du
paquet auquel j'ai ajout\'e des options pour les environnements chroot
pour \textit{Apache} et \textit{MySQL}.

\input{include/aide-conf.tex}

Maintenant, AIDE devrait se lancer de tous les jours via
\textit{Cron}. Vous pourrez ainsi lire ces rapports par
l'interm\'ediaire de \textit{mutt} ou, si vous n'avez pas install\'e ce
dernier, avec la commande \texttt{mail}. Notez que les rapports seront
envoy\'e \`a l'utilisateur `toto' suivant la configuration de postfix
que nous avons choisi (les courriels de l'utilisateur root sont
automatiquement redirig\'es vers l'utilisateur toto).\\
\\
Cependant, n'oubliez pas que si vous mettez \`a jour les paquets de
votre syst\`eme (cela devrait se produire assez rarement pour la version
stable de Debian GNU/Linux et concernera tr\`es souvent des mises \`a
jour de s\'ecurit\'e), AIDE vous dira que ces fichiers ont \'et\'e
modifi\'es, ce qui est parfaitement normal. Vous pourrez, une fois ces
mises \`a jour et la v\'erification de la base de donn\'ees
effectu\'ees, mettre \`a jour celle-ci en tapant tout simplement :\\
\texttt{\# aideinit}\\
\\
AIDE se r\'ev\`ele \^etre selon moi un outil indispensable \`a
l'administration d'un syst\`eme, tout d'abord car il est puissant et
tr\`es simple \`a configurer qui plus est. On peut ais\'ement le
comparer \`a Tripwire, un logiciel \'equivalent mais pas tout \`a fait
libre.\\
\\
Pour plus d'informations au sujet de AIDE, vous pouvez consultez le
manuel officiel~\cite{aide-manuel} ou la page de manuel d\'edi\'ee
(\texttt{man aide}).

\subsection{Logcheck}
Logcheck est un utilitaire destin\'e \`a v\'erifier les journaux que
vous souhaitez \`a la recherche d'\'ev\'enements suspects et envoit
enfin ce rapport par courriler. Cela vous \'evite donc de consulter les
journaux p\'eriodiquement et en entier, ce qui peut se r\'ev\'eler long
et surtout peu pratique. De plus, vous pouvez d\'efinir le niveau
d'alerte.\\
\\
L'installation se fait tr\'es simplement pour Debian car Logcheck est
disponible officiellement, on installe donc ce paquet :\\
\texttt{\# apt-get install "logcheck*"}\\
\\
Normalement quelques questions vous seront pos\'ees au sujet de la
configuration de Logcheck. Choississez l'adresse courriel vers laquelle
seront envoy\'es les rapports g\'en\'er\'es par Logcheck. Ensuite
r\'epondez \textit{<Yes>} \`a la question vous demandant si vous
souhaitez cr\'eer un fichier comportant \texttt{/var/log/syslog} et qui
va sp\'ecifiez que ce journal va \^etre examiner.\\
\\
Lors de l'installation du paquet \texttt{logcheck-database}, choissisez
le niveau de s\'ecurit\'e qui sera utilis\'e, le plus \'elev\'e \'etant
\textit{paranoid}, puis \textit{server} et enfin
\textit{workstation}. Personnellement j'ai choisi le premier car il
rapporte \'egalement les connexions effectu\'ees depuis l'ext\'erieur.\\
\\
Désormais, Logcheck sera lanc\'e toutes les heures via Cron et un
courriel sera envoyé \`a l'utilisateur que vous avez choisi lors de
l'installation. Vous pouvez modifier ces valeurs en tapant simplement la
commande suivante pour logcheck :\\
\texttt{\# dpkg-reconfigure logcheck}\\
\\
Et enfin pour les options du paquet \texttt{logcheck-database} qui
permet de r\'egler le niveau de s\'ecurit\'e :\\
\texttt{\# dpkg-reconfigure logcheck-database}\\
\\
Vous pouvez \'egalement configurer Logcheck afin qu'il v\'erifie les
journaux de votre choix. Cela se fait assez facilement :

\input{include/logcheck-log.tex}

La configuration de cet outil est maintenant termin\'e, il faut bien
avouer que celui-ci est tr\`es facile \`a configurer, je vous
conseille donc vivement de l'utiliser.

\section{Conclusion}
Dans cette premi\`ere partie de cet article, nous avons vu comment
installer puis configurer quelques services couramment utilis\'e sur
des serveurs. Nous avons \'egalement mis en place une passerelle et
s\'ecuriser de fa\c{c}on basique l'infrastructure. Dans une seconde
partie, il sera expliqu\'e comment configurer la passerelle pour un
r\'eseau Sans-Fil de la mani\`ere la plus s\'ecuris\'e possible.

\input{Bibliographie.tex}

\newpage

\section{Annexe}

\subsection{Arborescence d'une prison chroot pour Apache}

\input{include/makejail-apache-tree.tex}

\subsection{Arborescence d'une prison chroot pour MySQL}

\input{include/makejail-mysql-tree.tex}

\end{document}
