FreeBSD jail + Apache + FTPd sécurisé

J'ai écrit cet article pour un rapport que je devais rendre en cours. Il pourrait peut être intéressé quelqu'un donc je le met en ligne

-----------------------------------------------------------------------------------
- Installation d'un serveur apache dans une Jail sous FreeBSD sécurisée -
-----------------------------------------------------------------------------------
------------ Auteur : Rémi LAURENT -----------------------------------
------------ Mail : cloud@madpowah.org -------------------------------
------------ Date : 10/12/2007 ----------------------------------
-----------------------------------------------------------------------------------

Sommaire :

1 - Choix de la distribution
2 - Partitionnement
3 - Configuration
4 - Post installation
5 - Création de la jail
6 - Installation du serveur Apache
7 - Installation du serveur FTP
8 - Sécurisation
9 - Conclusion

1 - Choix de la distribution

Pour ce TP, j'ai choisi d'utiliser comme système d'exploitation FreeBSD. Pourquoi ?
Déjà parce que le logo est beaucoup plus sympa que celui de linux mais plus objectivement pour ses capacités et son orientation radicalement axée sur la sécurité. BSD est le système qui est peut être le plus proche de celui d'UNIX et sépare complètement les applications systèmes des applications utilisateurs qui seront toutes stockées et configurable depuis /usr/local. La hiérarchie dirigeant FreeBSD est également beaucoup plus stricte que Linux ou tout le monde peut mettre son grain de sable ( souvent des personnes pas forcement au top niveau) et on se retrouve avec des updates du kernel toutes les semaines et des failles régulières. FreeBSD est dirigé par une équipe définie, qui a fait ses preuves et qui a seule le droit de toucher aux sources. Le nombre de failles relatives au noyau FreeBSD se compte sur les doigts de la main.

De plus FreeBSD utilise un système de fichier très performant, UFS jusqu'à sa version 6.2 et supporte maintenant ZFS, le système de fichier utilisé par Solaris (basé sur du BSD).
FreeBSD possède sa propre libc et à recoder ses propres applications (awk, sed...) pour optimiser le tout.

De plus FreeBSD possède une bibliothèque impressionnante de paquetages manipulable via les ports et des outils de sécurité comme portaudit qui permet de contrôler si un logiciel possédant une faille a été installé sur notre système ou encore portversion qui permet de contrôler les paquets qui ne sont pas à jour. Pour les feignants (ou ceux qui ont des machines peu puissantes :) ), FreeBSD propose une grande quantité de ces paquetages en binaire pour les installer rapidement. Il possède également entre autre un parefeu très puissant et reconnu (pf) ainsi que des outils comme les jails qui sont natifs sur freeBSD et permettent toutes sorte de manipulation.

En conclusion, FreeBSD est stable, robuste et possède tous les outils pour les paranoïaques, donc c'est bien :)
Installation

Commençons donc par installer notre FreeBSD. On met le cd, on regarde le petit diable tout mignon et on appuie sur entrée pour lancer l'installation. On choisira une installation express qui est largement suffisante.


2 - Partitionnement

La 1ere chose qui peut dérouter est le système de partitionnement FreeBSD et surtout les slices. En effet une fois avoir créer notre partition de manière physique sur le disque dur, on a la possibilité d'affiné ce partitionnement en découpant de manière logique notre partition et ainsi créer un partition /usr /var /tmp / et une swap bien évidement. La séparation des partitions peut nous servir pour la gestion des quotas mais également à empêcher l'exécution de programme sur /tmp par exemple ou encore de crypter à la volée une partition critique, chose que l'on n'aura pas l'occasion de voir ici par faute de temps.

3 - Configuration

Et bien la on va choisir l'option système minimal pour ne pas se retrouver avec pleins de paquets inutils et pas toujours a jour. On choisira la langues et quelques options classiques sur une installation d'OS (clavier...)
On appuie sur entrée et tout s'installe comme il faut en 5mn et le pc reboot

4 - Post Installation

Une fois notre système installé et démarré, nous allons attribuer un pass root via la commande passwd et configurer le réseau. Le système diffère un peu de celui de Linux puisque là, plus de eth0, eth1 et compagnie. Le lo est toujours là mais à la place des interface ethernet on a des noms rl0 (realtek), nve0 (nvidia) et autres noms de carte. FreeBSD trie les cartes selon leur marque ce qui est fort pratique à mon goût vu que le nom de la carte me parle beaucoup plus que eth et un numéro. Ainsi on sait sans se tromper (encore faut il connaître son pc) sur quelle interface on agit.

Une fois le réseau configuré, on va taper sysinstall pour installer les paquetages que l'on souhaite ainsi que les sources de notre FreeBSD qui nous serviront pour créer une jail. Nous choisirons alors portaudit, portversion, portupgrade, portsentry, apache2.2.3, squid, rkhunter et vim (sinon on ne possède que ee comme éditeur de base). -portaudit, portversion, et portupgrade nous permettrons de tenir à jour notre FreeBSD
-portsentry est une application permettant de simuler des ports ouvert et qui bloque automatiquement l'ip qui scanne ces ports. Ainsi la machine sera immunisé contre les scans agressifs
-rkhunter est un détecteur de rootkit qui nous assurera que notre serveur est propre
-apache et squid sont les serveurs que l'on souhaite mettre en place


5 - Création de la jail

Nous allons maintenant choisir dans sysinstall d'installer les sources de FreeBSD qui iront se mettre dans /usr/src. Une fois cela fait nous allons créer une jail. Commençons par expliquer ce qu'est une jail.
Une jail est une technique pour enfermer des processus dans un sous système de notre serveur. Le noyau reste le même mais la jail possède ses propres applicatifs (que l'on réduira au maximum) ainsi que des droits très limités en exécution. Les processus de la jail sont différencier de ceux de notre système. Ainsi un attaquant qui prend la main sur la jail sera restreint dans cette partie et le système principal continuera de fonctionner.

Revenons donc sur l'installation :
Nous allons créer un répertoire /jails a la racine et un repertoire www/ à l'intérieur de celui ci qui identifiera notre jail pour le serveur web. On va alors compiler tout le système de base de notre FreeBSD a l'intérieur de la jail par la commande :

cd /usr/src && make world DESTDIR=/jails/www


Cette commande prend un certain moment, selon la puissance de la machine. Une fois cela terminé on installe les fichiers de configuration de base via la commande

cd etc/ && make distribution DESTDIR=/jails/www


Puis :
mount_devfs devfs /jails/www/dev 
afin de monter les périphériques a l'intérieur de la jail

Notre jail est donc maintenant installer. Il va falloir maintenant la configurer.

On va activer alors la jail dans le /etc/rc.conf afin de pouvoir la lancer :

jail_enable="YES"   # Utiliser NO pour désactiver le lancement des environnements jail
jail_list="www"     # Liste des noms des environnements jail séparés par une espace
jail_www_rootdir="/jails/www"     # le répertoire racine de l'environnement jail
jail_www_hostname="gargamel"  # le nom de machine de l'environnement jail
jail_www_ip="172.16.3.100"           # son adresse IP
jail_www_devfs_enable="YES"          # monter devfs dans l'environnement jail
jail_www_devfs_ruleset= "devfsrules_jail"# les règles devfs à appliquer à l'environnement jail

On va également attribuer une IP fixe a notre serveur ainsi qu'un alias sur l'interface ayant l'adresse de la jail. On ajoute a /etc/rc.conf :

ifconfig_rl0="inet 172.16.3.103 netmask 255.255.255.0"
ifconfig_rl0_alias0="inet 172.16.3.100 netmask 255.255.255.0"

Si l'on ne désire pas redémarrer la machine pour l'attribution des IP on effectue les commandes:
ifconfig rl0 172.16.3.103 netmask 255.255.255.0
ifconfig rl0 172.16.3.100 netmask 255.255.255.0 alias

Il ne reste plus qu'à lancer la jail via la commande :
/etc/rc.d/jail start

Au préalable il est bon de configurer le DNS en modifiant le fichier /jails/www/etc/resolv.conf pour avoir le réseau.

On peut tester que notre jail fonctionne via la commande jls ou executer des commandes a l'intérieur de celle ci avec la commande jexec

6 - Installation de Apache

Installons maintenant Apache a l'intérieur de notre prison. On va utiliser l'outil sysinstall à l'intérieur de la jail :
jexec 1 sysinstall


On choisi alors d'installer le package apache2.2.3, openssl (pour la création des certificats ssl) et portsentry.
Tout s'installe et ensuite nous allons configurer

Configuration de apache
Modifions le fichier /jails/www/usr/local/etc/apache22/httpd.conf

On va tout d'abord attribuer un ServerName
ServerName pinkrabbit.org


On ajoutera ensuite la variable ServerSignature en la mettant sur Off afin de limiter l'affichage d'information sur le serveur (Version, modules installés)
ServerSignature off
ServerTokens Prod


On va activer le SSL en décommentant la ligne adéquat afin d'accepter le support sécuriser et rediriger toute tentative de connexion sur le port 80 vers le port SSL (443) au moyen d'un Virtual Host:

Include etc/apache22/extra/httpd-ssl.conf


ServerName pinkrabbit.org
CustomLog /var/log/apache2/toto-access.log combined
ErrorLog /var/log/apache2/toto-error.log

RewriteEngine on
RewriteLog /var/log/apache2/https_rewrite.log
RewriteLogLevel 1
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]



J'ai également ajouté quelques règles de Logging afin de voir que le rewriting se fait correctement.

Il est possible également de rediriger toutes les erreurs (403, 404...) sur l'index afin que l'attaquant ne puisse déceler d'informations sur l'existence de fichiers.

Nous allons maintenant créer le certificat nécessaire a apache-ssl. Pour cela nous allons utiliser la commande openssl :
openssl req -config openssl.cnf -new -out mon-serveur.csr
openssl rsa -in privkey.pem -out mon-serveur.key
openssl x509 -in mon-serveur.csr -out mon-serveur.cert -req -signkey mon-serveur.key -days 365
On place ensuite ces fichiers en les appelant server.* dans /jails/www/usr/local/etc/apache22/.

Il ne reste plus qu'à ajouter apache2 au /jails/www/etc/rc.conf :
apache22_enable="YES"

On démarre le service dans la jail et on constate que tout marche bien :)
jexec 1 /usr/local/etc/rc.d/apache22 start

7 - Installation du server FTP
FreeBSD possède déjà un serveur FTP qui a fait ses preuves. Pour le mettre en place, ils nous suffira d'autoriser son lancement en ajoutant ftpd_enable= »YES » dans le /jails/www/etc/rc.conf et de lancer le ftpd avec la commande :
jexec 1 /etc/rc.d/ftpd start


On peut créer par la suite des utilisateurs en ouvrant un shell dans la jail et en utilisant la commande adduser:
jexec 1 sh


Il est tout a fait possible de sécuriser le serveur FTP en ajoutant du SSL mais cela n'a pas été fait pour raison de temps.

8 - Sécurisation

On va commencer par effectuer une vérification du système avec rkhunter avec la commande :
rkhunter -c

Ce programme va alors vérifié s'il y a la présence de rootkit et enregistré le checksum de tous les fichiers systèmes de la machine pour les comparer régulièrement en configurant cette commande en cron.

Portsentry est une autre application permettant de tromper l'attaquant en bindant de nombreux ports que l'on choisi. Ces ports ne devraient, en théorie, ne jamais être appelés donc on applique une règle de firewall (ipfw par exemple sous FreeBSD)si un des port est contacté bloquant l'ip pour toujours sur la machine. En plus l'ip est ajoutée dans le /etc/hosts.deny afin de bannir l'ip.

Pour évter qu'il ne bannisse de mauvaise IP, on ajoute les adresse locales ou « sures » dans le fichier /usr/local/etc/portsentry.ignore

Portsentry se lance très simplement :
portsentry -tcp
portcentry -udp

Une fois notre système complètement installé, nous appliquerons également la commande :
portaudit -F && portaudit -a


Ceci est une commande propre a FreeBSD qui va vérifié pour chaque paquet installé s'il y a un avis de sécurité qui a été annoncé en téléchargeant grâce à l'option -F la liste de ces failles. Ainsi on est assuré d'avoir un système propre.

9 - Conclusion

Nous avons donc vu ici la configuration de FreeBSD qui est un système d'exploitation radicalement orienté sécurité et qui propose une gamme d'outil permettant à l'administrateur de configurer de nombreuses options de sécurité et d'être sûr de son système. De plus sa structure même de base annonce une rigueur du point de vue de la structure et donc de la manière de réfléchir sur les mesures à mettre en place.

Nous avons également vu ici la fonctionnalité de jail qui permet d'isoler un service du système. Bien sûr avant de mettre en place de système aussi important, il est nécessaire de bien configurer à la base les serveurs en camouflant au maximum les informations et en restant toujours à jour.

Auteur : Rémi LAURENT
Mail : cloud@madpowah.org
Date : 10/12/2007