Chrooter apache
Ajout disque dur
Ajout carte
Audit des disques durs
Gestion des peripheriques
Disquette d'installation
Ajout d'un scanner
Graver en ligne de commande
Astuces
Astuces en Bash
Configuration reseau
Dns
Serveur cvs
Proxy squid 
Installation serveur ftp
Installation qmail 
Installation serveur courrier sous debian
Outil TCP/IP 
Le serveur samba
Connexion a distance securisee
Client/serveur vnc
Configurer apache
Dyndns
Chiffrer un fichier/dossier
Securiser son poste
Mur pare feu pas a pas
Authentification ht-access
Surveillance de serveur CACTI
Snort
Snort-inline
Securiser Apache avec mod_security
Filtrage squid/squidguard/dansguardian
Auditer son site web
Sécuriser son linux
Installer un Lamp avec ssl
Contrer les scans de ports
Traitement anti-spam
Installer/Utiliser tripwire
Utilisation de lilo
Les commandes Linux
Le multi-tache
Le crontab
Exploration de la configuration
Quotas
Messagerie
Installer une application
Debugger ses applications
Le format RPM
Mise a jour du noyau
Qemu
Tour d'horizon des principaux p2p
Récupération du système
Bips d'un pc
Astuces windows
Table Ascii
Lamerland
Conversion de fichiers musicaux
hakin9
Secureroot.com
Hackerthreads.org
Defcon
Hackerlounge
Les derniers exploits
Tous les codes sources
Securite sous Linux
Les logiciels libres quotidiens
Ezine divers
Madchat
Textes divers
Archives
 
Toutes les traductions
Toutes les traductions
Hackin9

Il y a actuellement 7 visiteurs connectés sur le site !

Google
Sécuriser Apache: pas-à-pas
Securiser Apache pas a pas

 

Fonctionnalites
Hypotheses de securite
Installation du système d'exploitation
Préparation du logiciel
Modules d'Apache
Compilation du logiciel
Chrooter le serveur
Configuration d'Apache
Dernière étape
En résumé

 

Fonctionnalites

Avant de commencer à sécuriser Apache, nous devons spécifier à quelle configuration nous nous attendons de la part du serveur. La diversité des serveurs Apache fait qu'il est difficile d'écrire une méthode universelle de sécurisation. C'est pourquoi, dans cet article, nous nous baserons sur les points suivants :

- Le serveur Web devra être accessible depuis l'Internet
- Seules les pages HTML de statistiques seront hébergées
- Le serveur supportera la directive "name-based virtual hosting"
- Spécifier les pages Web qui peuvent être accessibles uniquement à partir d'une certaine IP ou d'un unique utilisateur (authentification basique)
- Le serveur loguera toutes les requêtes Web (et récoltera des informations sur le navigateur du client)

Cette configuration ne supporte pas le PHP, JSP, CGI ou quelques-autres spécifications qui pourraient altérer les services Web. L'utilisation de telles technologies peut poser de grands problèmes de sécurité, et c'est pour cela que, même un petit script peut radicalement affecter la sécurité du serveur. Pourquoi ? Premièrement, les applications ASP/CGI peuvent contenir des failles (exemple : SQL injection, cross site scripting). Deuxièmement, le fait de laisser les applications faire le boulot peut être dangereux (vulnérabilités PHP, Perl modules, etc...). C'est pourquoi, je recommande fortement d'utiliser de telles méthodes seulement quand une interaction avec un site Web est absolument nécessaire.

Hypothese de securite

Un des éléments les plus importants dans tous les projets informatiques est la spécificité des hypothèses de sécurité. Cette dernière doit être mise en place avant que le projet ne soit implémenté. Les hypothèses pour notre serveur Web sont les suivantes :

- Le système d'exploitation doit résister aussi bien aux attaques locales qu'aux attaques à distance.
- Le serveur ne doit pas avoir de services réseau excepté HTTP : (80/TCP);
- L'accès à distance au serveur doit être contrôlé par un firewall, qui devrait bloquer toutes les connexions sortantes et toutes les connexions entrantes sur le port 80(TCP) du serveur Web;
- Le serveur Apache doit être le seul service disponible sur le système;
- Seuls les modules Apaches vraiment nécessaires doivent être activés;
- Les pages de diagnostic et le listage automatique de répertoires doivent être désactivés;
- Le serveur ne doit révéler aucune information sur lui;
- Le serveur doit tourner sous un unique UID/GID, qui ne soit pas utilisé par un autre process;
- Les process d'Apache doivent avoir un accès limité aux fichiers systèmes (chrooting);
- Aucun shell ne doit être présent dans l'environnement chrooté d'Apache (/bin/sh, /bin/csh etc..).

Installation du système d'exploitation

Avant d'installer Apache, nous devons choisir un OS (système d'exploitation) sur lequel le serveur tournera. Nous avons un large choix, car Apache peut être installé et compilé sur presque tous les OS. Le reste de l'article explique comment sécuriser Apache Web server sur FreeBSD (4.7), cependant les méthodes décrites sont applicables à la plupart des systèmes UNIX/Linux. Le seul OS que je ne recommande pas est MS Windows - principalement à cause des capacités de sécurité limitées de Apache sur cet OS.

La première étape en sécurisant le serveur Web est de sécuriser le mieux possible l'OS. Une discussion sur ce sujet nous éloignerait du but de notre article. Cependant, il existe beaucoup de documents sur le Net expliquant comment résoudre ce problème.

Une fois le système installé et sécurisé, nous avons à ajouter un nouveau groupe appelé "apache" comme suit (exemple avec FreeBSD) :

pw groupadd apache pw useradd apache -c "Apache Server" -d /dev/null -g apache -s /sbin/nologin
Par défaut, les process d'Apache tournent avec les privilèges de l'utilisateur "nobody" (sauf le process principal, qui tourne avec les privilèges "root") et GID du groupe "nogroup". Cela pourrait poser un sérieux problème de sécurité. En cas d'intrusion, le pirate peut avoir accès à tous les autres process qui tournent sous le même UID/GID. De là, la solution optimum est de faire tourner Apache sous le UID/GID d'un user/group valide et consacré à ce logiciel. .

Préparation du logiciel

La prochaine étape est de télécharger la dernière version d'Apache sur le serveur Web d'Apache http://httpd.apache.org/. Quelques options d'Apache peuvent être activées pendant la compilation, ainsi il est important de télécharger le code source plutôt que la version binaire.

Après le téléchargement, nous devons le décompresser. Ensuite, nous devons décider quels modules devront rester activés. Une courte description de tous les modules est disponible dans la dernière version d'Apache 1.3.x (1.3.27) que l'on peut trouver à http://httpd.apache.org/docs/mod/

Modules d'Apache

Le choix des modules est une des plus importantes étapes de la sécurisation d'Apache. Règle d'or : le moins possible sera le mieux. Pour mettre en place la fonctionnalité et nos hypothèses de sécurité, les modules suivants doivent être activés :

httpd_core
Noyau de base d'Apache. Indispensable à toutes les installations.
mod_access
Contrôle d'accès sur une base d'hôte, IP, ou d'autres caractéristiques que le client demande. Parce que ce module est nécessaire pour utiliser les options "order", "allow" et "deny", il devrait rester activer.
mod_auth
Il permet une authentification des utilisateurs sur la base de fichiers texte (HTTP Basic Authentication).
mod_dir
Permet de choisir "l'index" prioritaire du serveur : index.html, default.html, etc...
mod_log_config
Permet de loguer les requêtes envoyées au serveur.
mod_mime
Ce module permet à Apache de déterminer le type de contenu des fichiers à partir de leur extension.
Tous les autres modules d'Apache doivent être désactivés. Nous pouvons les désactiver sans risque, car nous n'avons pas besoin d'eux. En désactivant les modules inutiles, nous évitons les intrusions potentielles lorsque de nouvelles vulnérabilités sont découvertes dans l'un d'entre eux.

Notons que 2 des modules d'Apache peuvent être plus dangereux que d'autres : "mod_autoindex" et "mod_info". Le premier contient le listage de répertoires automatique, et est activé par défaut. Il est très facile d'utiliser ce module dans le but de vérifier sur quel type de serveur tourne Apache (exemple : http://server_name/icons/) et d'obtenir le contenu du répertoire, quand aucun fichier index n'existe. Le second module, mod_info, ne devrait jamais être accessible depuis l'Internet, essentiellement car il donne des informations sur la configuration du serveur Apache.

Comment compiler les modules ? La méthode statique semble être le meilleur choix. Si de nouvelles vulnérabilités sont découvertes, nous recompilerons probablement, non pas juste les modules vulnérables ; mais le logiciel en entier. En choisissant le mode statique, nous éliminons le besoin d'un nouveau module.

Compilation du logiciel

Avant toutes choses, vérifiez s'il existe des patchs à appliquer. Ensuite, le serveur devrait être compilé et installé comme suit :

./configure --prefix=/usr/local/apache --disable-module=all --server-uid=apa che --server-gid=apache \ --enable-module=access --enable- module=log_config --enable-module=dir --enable-module=mime \ --enable-module=auth \

make
su
umask 022
make install
chown -R root:sys /usr/local/apache

Chrooter le serveur

La prochaine étape va servir à limiter l'accès aux process d'Apache des fichiers systèmes. Nous pouvons faire ça en chrootant le service principal (httpd). Généralement, la technique du "chrooting" veut dire qu'il faut créer un nouveau répertoire avec les accès root, déplacer tous les fichiers des services dans ce dossier, et faire tourner le propre service dans ce nouvel emplacement. Grâce à ça, le service (et ses process) aura seulement accès à la nouvelle structure du répertoire racine.

Nous commencerons ce process en créant un nouveau répertoire avec les accès root par le chemin /chroot/httpd :

mkdir -p /chroot/httpd/dev
mkdir -p /chroot/httpd/etc
mkdir -p /chroot/httpd/var/run
mkdir -p /chroot/httpd/usr/lib
mkdir -p /chroot/httpd/usr/libexec
mkdir -p /chroot/httpd/usr/local/apache/bin
mkdir -p /chroot/httpd/usr/local/apache/logs
mkdir -p /chroot/httpd/usr/local/apache/conf
mkdir -p /chroot/httpd/www

Le possesseur de tous ces dossiers doit être le root, et les droits d'accès doivent être de 0755. Créons le fichier dispositif spécial : /dev/null/

ls -al /dev/null
crw-rw-rw- 1 root wheel 2, 2 Mar 14 12:53 /dev/null
mknod /chroot/httpd/dev/null c 2 2
chown root:sys /chroot/httpd/dev/null
chmod 666 /chroot/httpd/dev/null

Une méthode différente doit être utilisée pour créer un dispositif /chroot/httpd/dev/log, qui est aussi nécessaire pour que le serveur travaille correctement. Dans le cas de l'OS FreeBSD, la ligne suivante doit être ajoutée à /etc/rc.conf :

syslogd_flags="-l /chroot/httpd/dev/log"
Nous devons relancer le systeme ou le service syslogd afin que les changements prennent effet. Pour creer un autre dispositif chroot/httpd/dev/log sur d'autres systèmes d'exploitation, nous devrions jeter un coup d'oeil aux manuels (man syslogd).

La prochaine étape va être de copier le programme principal httpd dans le nouveau chemin avec tous les fichiers binaires et les librairies nécessaires. Pour cela, nous devons faire une liste de tous les fichiers requis. Nous pouvons faire cette liste en utilisant les commandes suivantes (leur existence dépend du système d'exploitation):

ldd - Tous les OS Listes des dépendances dynamique des fichiers exécutables ou des bibliothèques partagées.
ktrace/ktruss/kdump BSD - Active le traçage par le kernel des process, affiche le traçage des données par le kernel.
sotruss Solaris - Les traces d'appels de procédures de libraires partagées
strace/ltrace Linux - Trace les appels systèmes et les signaux.
strings Tous les OS - Trouve les chaînes imprimables dans les fichiers binaires.
trace AIX - Enregistre les évènements system sélectionnés
trace (gratuit) HP-UX <10.20 - Affiche les appels systèmes et les traces du kernel sur le process.
truss FreeBSD, Solaris - Trace les appels systèmes et les signaux.AIX 5L SCO Unixware
tusc (freeware) HP-UX>11 - Trace les appels systèmes que le process invoque dans HP-UX 11.

Exemples de l'utilisation de "ldd", les commandes "strings" et "truss" sont ci-dessous :
localhost# ldd /usr/local/apache/bin/httpd
/usr/local/apache/bin/httpd:
libcrypt.so.2 => /usr/lib/libcrypt.so.2 (0x280bd000)
libc.so.4 => /usr/lib/libc.so.4 (0x280d6000)

localhost# strings /usr/local/apache/bin/httpd | grep lib
/usr/libexec/ld-elf.so.1
libcrypt.so.2
libc.so.4

localhost# truss /usr/local/apache/bin/httpd | grep open
(...)
open("/var/run/ld-elf.so.hints",0,00) = 3 (0x3)
open("/usr/lib/libcrypt.so.2",0,027757775370) = 3 (0x3)
open("/usr/lib/libc.so.4",0,027757775370) = 3 (0x3)
open("/etc/spwd.db",0,00) = 3 (0x3)
open("/etc/group",0,0666) = 3 (0x3)
open("/usr/local/apache/conf/httpd.conf",0,0666) = 3 (0x3)
(...)

Les commandes ci-dessus ne devraient pas être appliquées qu'au programme httpd, mais aussi à toutes les librairies et les fichiers binaires requis (les librairies requièrent souvent d'autres librairies). Dans le cas de FreeBSD, les fichiers suivants sont à copier dans la nouvelle structure du répertoire racine :

cp /usr/local/apache/bin/httpd /chroot/httpd/usr/local/apache/bin/
cp /var/run/ld-elf.so.hints /chroot/httpd/var/run/
cp /usr/lib/libcrypt.so.2 /chroot/httpd/usr/lib/
cp /usr/lib/libc.so.4 /chroot/httpd/usr/lib/
cp /usr/libexec/ld-elf.so.1 /chroot/httpd/usr/libexec/

En utilisant la commande "truss" nous pouvons aussi découvrir que la configuration des fichiers suivants doit être présente dans l'environnement chrooté :

cp /etc/hosts /chroot/httpd/etc/
cp /etc/host.conf /chroot/httpd/etc/
cp /etc/resolv.conf /chroot/httpd/etc/
cp /etc/group /chroot/httpd/etc/
cp /etc/master.passwd /chroot/httpd/etc/passwords
cp /usr/local/apache/conf/mime.types /chroot/httpd/usr/local/apache/conf/

Notez que dans /chroot/httpd/etc/passwords nous avons enlevé toutes les lignes exceptées "nobody" et "apache". De la même façon, nous devons enlever toutes les lignes sauf "apache" et "nogroup" dans /chroot/httpd/etc/group. Ensuite, nous allons créer le mot de passe de la base de données :

cd /chroot/httpd/etc
pwd_mkdb -d /chroot/httpd/etc passwords
rm -rf /chroot/httpd/etc/master.passwd

La prochaine étape est de tester si le serveur httpd tourne correctement dans le nouvel environnement chrooté. Pour cela, nous allons copier les fichiers de configuration d'Apache par défaut et copier index.html :

cp /usr/local/apache/conf/httpd.conf /chroot/httpd/usr/local/apache/conf/
cp /usr/local/apache/htdocs/index.html.en /chroot/httpd/www/index.html

Après la copie des fichiers mentionnés ci-dessus, nous devons changer le DocumentRoot comme suit (dans /chroot/httpd/usr/local/apache/conf/httpd.conf)

DocumentRoot "/www"
Ensuite, essayons de lancer le serveur :
chroot /chroot/httpd /usr/local/apache/bin/httpd

Si un problème se produit, je vous recommande d'analyser les fichiers log d'Apache (chroot/httpd/usr/local/apache/logs). Alternativement, les commandes suivantes peuvent être utilisées :

truss chroot /chroot/httpd /usr/local/apache/bin/httpd
Le programme truss devrait montrer la cause du problème. Après avoir éliminer les éventuelles erreurs, nous pouvons configurer le serveur Apache.

Configuration d'Apache

La première étape est de retirer le fichier /chroot/httpd/usr/local/apache/conf/httpd.conf et d'en créer un nouveau à sa place, avec un contenu similaire à celui-ci :

# =================================================
# Basic settings
# =================================================
ServerType standalone
ServerRoot "/usr/local/apache"
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
ResourceConfig /dev/null
AccessConfig /dev/null

# =================================================
# Performance settings
# =================================================
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0

# =================================================
# Apache's modules
# =================================================
ClearModuleList
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_dir.c
AddModule mod_access.c
AddModule mod_auth.c

# =================================================
# General settings
# =================================================
Port 80
User apache
Group apache
ServerAdmin Webmaster@www.ebank.lab
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod

DirectoryIndex index.html

DocumentRoot "/www/vhosts"

# =================================================
# Access control
# =================================================

Options None
AllowOverride None
Order deny,allow
Deny from all


Order allow,deny
Allow from all


Order allow,deny
Allow from all


# =================================================
# MIME encoding
# =================================================

TypesConfig /usr/local/apache/conf/mime.types

DefaultType text/plain

AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
AddType application/x-tar .tgz


# =================================================
# Logs
# =================================================
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
ErrorLog /usr/local/apache/logs/error_log
CustomLog /usr/local/apache/logs/access_log combined

# =================================================
# Virtual hosts
# =================================================
NameVirtualHost *

DocumentRoot "/www/vhosts/www.ebank.lab"
ServerName "www.ebank.lab"
ServerAlias "www.e-bank.lab"
ErrorLog logs/www.ebank.lab/error_log
CustomLog logs/www.ebank.lab/access_log combined


DocumentRoot "/www/vhosts/www.test.lab"
ServerName "www.test.lab"
ErrorLog logs/www.test.lab/error_log
CustomLog logs/www.test.lab/access_log combined


La configuration ci-dessus inclues seulement les commandes qui sont nécessaires aux "fonctionnalités" et aux "hypothèses de sécurité". Dans la configuration présentée, il y a 2 hôtes virtuels supportés par le serveur Web :

- www.ebank.lab (www.e-bank.lab)
- www.test.lab

Le contenu de ces sites est physiquement présent dans les répertoires suivants :
/chroot/httpd/www/vhosts/www.ebank.lab
/chroot/httpd/www/vhosts/www.test.lab


Chaque site web a son propre système de fichiers logs, présents dans les répertoires suivants :
/chroot/httpd/usr/local/apache/logs/www.ebank.lab
/chroot/httpd/usr/local/apache/logs/www.test.lab

Ces répertoires doivent être créé avant le premier lancement du serveur Apache - autrement Apache ne tournera pas correctement. Le possesseur de ces répertoires devra être le root:sys, et les droits initialisé à 0755.

Comparé avec les fichiers de configuration par défaut de Apache, les changements suivant sont à constatés :

- Le nombre de modules actif a considérablement baissé.
- Apache ne doit pas révéler quelle version est utilisée.
- Les process d'Apache (sauf le process root) sont fait pour être exécutés juste avec les privilèges user/group.
- Apache permettra l'accès seulement aux répertoires, sous-répertoires et fichiers qui sont explicitement spécifiés dans le fichier de configuration (Directory, Allow); toutes les autres requêtes doivent être rejetées.
- Apache logue plus d'informations sur les requêtes HTTP qu'auparavant.

 

Dernière étape

Créons un script de lancement "apache.sh", le contenu doit ressembler à celui-ci :

#!/bin/sh
CHROOT=/chroot/httpd/
HTTPD=/usr/local/apache/bin/httpd
PIDFILE=/usr/local/apache/logs/httpd.pid
echo -n " apache"
case "$1" in
start)
/usr/sbin/chroot $CHROOT $HTTPD
;;
stop)
kill `cat ${CHROOT}/${PIDFILE}`
;;
*)
echo ""
echo "Usage: `basename $0` {start|stop}" >&2
exit 64
;;
esac
exit 0

Ce script devrait être copié dans le répertoire de démarrage (tout dépend du système UNIX utilisé), où par défaut les scripts de lancement sont placés. Dans le cas de FreeBSD, c'est le répertoire /usr/local/etc/rc.d

En résumé

La méthode présentée permet d'arriver à un certain niveau de sécurité du serveur Apache que la configuration par défaut n'offre pas.

Merci d'activer simplement les modules nécessaires d'Apache. La découverte d'une vulnérabilité dans les serveurs Apache ne veut pas forcément dire que notre serveur est vulnérable. Cacher la version du serveur utilisé, désactiver l'auto-indexation, chrooter et restreindre la configuration, fera de votre Apache un serveur difficile à pénétrer. Un environnement chrooté a aussi encore un avantage important : l'immunité face à un grand nombre d'exploits, principalement à cause de la non-présence de shells (bin/sh, /bin/csh etc...). Même si un intrus arrivait à exécuter des commandes systèmes, quitter l'environnement chroot peut résoudre le problème.


Sources de l'article


 

Forum d'entraide
Les news du site
Formulaire en php
Administrer un serveur Mysql
Session en php
Gerer ses bases mysql
Les bases php
Securiser ses scripts PHP
Controler ses programmes avec RATS
Convertir une base sql en utf8
Astuces php
Python rapide
Tutorial Python
Tutorial Perl
Tutorial Perl complet
Tutoriel ruby
Tutoriel C
Introduction à gawk
Filtres et utilitaires
Find
Programmation Shell
Ecriture de scripts bash
Expressions regulieres
Vi
Introduction a Javascript
Compiler avec gcc
Tutoriel Assembleur
Guide du cracking pour débutant
Assembleur
Manual Unpacking
Différentes failles Web
Arp spoofing dans un réseau switché
Les intrusions
Les attaques externes
Defacage
Defacage complet
Buffer overflow
Netcat
Injection sql
Injection sql(suite)
John the Ripper
Spoofer un email
Utiliser google
La faille system
Usurper une identité
Le rooting
Shellcode sous Unix
La faille race condition
La faille xss
La faille xss (2)
Attaques sur un routeur
Azureus pas-a-pas
Lire les news de Linux-pour-lesnuls.com au format RSS
Gestion des paquets debian
101 commandes debian
Effet neon dans GIMP
Effet vapeur dans GIMP
Cours fonctionnalités de GIMP
Ensemble
Divers