\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{} \`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}