Installer et configurer Apache 2 sur Debian
Apache est un serveur HTTP très répandu. Il est reconnu pour sa modularité et le grand nombre de ses configurations possibles. Cet article à pour but de vous présenter la mise en place d'un serveur Apache 2 sur la distribution Debian GNU/Linux. Il propose aussi d'accélérer la mise en place de quelques configurations basiques.
Ce guide est testé sur:
- Debian 5.0 Lenny
- Debian 6.0 Squeeze
Prérequis
Ce guide recommande la mise en place des règles de blocage de DFind décrites dans l'article Bloquer le scanner de vulnérabilités DFind.
Installation
Installez le serveur avec support du PHP 5 (utilisez le paquet apache2 si vous ne souhaitez pas disposer de PHP sur votre serveur):
command apt-get install libapache2-mod-php5
Activez les modules rewrite et php5 :
command a2enmod rewrite php5
Activez les hôtes virtuels nommés (NameVirtualHost) permettant d'héberger plusieurs noms de domaines sur une même adresse IP :
if [ -z "$(command grep 'NameVirtualHost.*:80' /etc/apache2/ports.conf)" ]; then
command sed -i -e '/Listen[\t ]*80/i\
NameVirtualHost *:80' '/etc/apache2/ports.conf'
fi
if [ -z "$(command grep 'VirtualHost[ \t]*\*:80' /etc/apache2/sites-available/default)" ]; then
command sed -i -e 's/\(VirtualHost[ \t]*\*\)>/\1:80>/g' \
-e 's/^\(NameVirtualHost.*\)$/#\1/g' \
'/etc/apache2/sites-available/default'
fi
Rechargez la configuration :
/etc/init.d/apache2 force-reload
L'outil en ligne de commande a2tools simplifie l'administration d'Apache 2. Les guides présents sur ce site l'utilisent intensivement. Mettez en place l'outil:
command wget "http://howto.biapy.com/fr/debian-gnu-linux/serveurs/http/installer-et-configurer-apache-2-sur-debian/a2tools/at_download/file" \
--output-document="/usr/bin/a2tools"
command chmod +x "/usr/bin/a2tools"
Affichez l'aide de ce script:
command a2tools --help
Des exemples d'utilisation de cet outil sont disponibles dans la suite de cet article.
Durcir la sécurité du serveur
Appliquez quelque règles durcissant la sécurité du serveur:
echo '# Hardened security configurations.
#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of: Full | OS | Minimal | Minor | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
#
ServerSignature Off
#
# Limit access to SVN informations.
#
<DirectoryMatch ".*\.svn"> Order allow,deny Deny from all Satisfy All </DirectoryMatch>
#
# Block bad user agents.
#
<Directory />
<IfModule mod_rewrite.c> SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT Deny from env=HTTP_SAFE_BADBOT </ifModule>
</Directory>
' > '/etc/apache2/conf.d/security-hardened'
Rechargez la configuration du serveur:
/etc/init.d/apache2 reload
Protection à l'aide de fail2ban
Installez fail2ban :
command apt-get install fail2ban
Activez les protections spécifiques à Apache :
if [ ! -e '/etc/fail2ban/jail.local' ]; then
command touch '/etc/fail2ban/jail.local'
fi
if [ -z "$(command grep "[apache]" '/etc/fail2ban/jail.local')" ]; then
echo "[apache]
enabled = true
[apache-noscript]
enabled = true
[apache-overflows]
enabled = true
" >> '/etc/fail2ban/jail.local'
fi
Rechargez la configuration :
/etc/init.d/fail2ban restart
Configuration de PHP 5
Ajustez la configuration de PHP 5 pour en améliorer la sécurité:
if [ -d '/etc/php5/conf.d' ]; then
echo '; Harden PHP5 security
; Disable PHP exposureexpose_php = Off;Dangerous : disable system functions. This can break some administration softwares.
;disable_functions = symlink,shell_exec,exec,proc_close,proc_open,popen,system,dl,passthru,escapeshellarg,escapeshellcmd
' > '/etc/php5/conf.d/security-hardened.ini'
echo '; Set mbstring defaults to UTF-8
mbstring.language=UTF-8
mbstring.internal_encoding=UTF-8
mbstring.http_input=UTF-8
mbstring.http_output=UTF-8
mbstring.detect_order=auto' \
> '/etc/php5/conf.d/mbstring.ini'
fi
Rechargez la configuration:
/etc/init.d/apache2 force-reload
Désactivation du dossier cgi-bin
Le dossier cgi-bin est de moins en moins utilisé et peut éventuellement présenter un risque. Désactivez-le :
command sed -i \
-e 's|^.*ScriptAlias.*/cgi-bin/.*$|#\0|' \
-e '/Directory.*cgi-bin/,/\/Directory/s/^.*/#\0/' \
"/etc/apache2/sites-available/default"{,-ssl}
Rechargez la configuration :
/etc/init.d/apache2 force-reload
Activation de HTTPS
Renseignez l'interface réseau de la connexion HTTPS:
SSL_NET="eth0"
Obtenez l'adresse IP de l'interface réseau (utilisez-la par la suite pour créer les VirtualHost):
SSL_IP="$(command ifconfig ${SSL_NET} \
| command grep "inet adr" \
| command sed -e 's/^.*inet adr:\([^ ]*\) .*$/\1/')"
Configurez le serveur pour écouter sur le port 443:
if [ -z "$(/bin/grep 'Listen.*443' /etc/apache2/ports.conf)" ]; then /bin/echo "# Listen on the HTTPS port if the needed module is available. <IfModule mod_ssl.c> Listen 443 </IfModule>" | /usr/bin/tee -a /etc/apache2/ports.conf fi
Activez les hôtes virtuels pour l'interface réseau:
if [ -z "$(command grep "NameVirtualHost.*${SSL_IP}:443" '/etc/apache2/ports.conf')" ]; then
command sed -i -e "/Listen[\t ]*443/a\\
NameVirtualHost ${SSL_IP}:443" '/etc/apache2/ports.conf'
fi
Activez le module SSL:
command a2enmod ssl
Rechargez la configuration du serveur:
/etc/init.d/apache2 force-reload
Statistiques de fréquentation
Pour disposer de statistiques de fréquentation, reportez-vous à ces articles:
Administration simplifiée avec a2tools
Mise en place d'un hôte virtuel
Pour mettre en place un hôte virtuel servant un dossier, utilisez cette commande (adaptez les valeurs graissées à vos besoins):
command a2tools "www.mon-domaine-exemple.com" "/opt/mon-dossier"
Mise en place d'une redirection
Pour mettre en place un hôte virtuel redirigeant un domaine et tous ses sous-domaines vers un autre site, utilisez cette commande (adaptez les valeurs graissées à vos besoins):
command a2tools --template=redirect \
--alias="*.mon-domaine-exemple.com" \
"mon-domaine-exemple.com" "http://www.domaine-cible.com/"
Mise en place d'un "reverse proxy"
Pour mettre en place un hôte virtuel mettant à disposition un site hébergé sur un autre serveur (en reverse proxy), utilisez cette commande (adaptez les valeurs graissées à vos besoins):
command a2tools --template=reverse-proxy "www.mon-domaine-exemple.com" "http://www.mon-autre-serveur.com/"
Remarque : Sur le serveur "www.mon-autre-serveur.com", un hôte virtuel "www.mon-domaine-exemple.com" doit être présent. Si le serveur "www.mon-autre-serveur.com" utilise Apache 2, paramétrez-le à l'aide du guide Obtenir l'adresse IP réelle d'un visiteur accédant à un serveur Apache 2 à travers un reverse proxy.
Suppression d'un domaine
Pour retirer tous les hôtes virtuels d'un domaine, utilisez :
command a2tools --remove "www.mon-domaine-exemple.com"
Mise en place de sites sur HTTPS
Pour créer un hôte virtuel en HTTPS avec a2tools, ajoutez l'option --ssl à votre commande. Fournissez les clefs privées et publiques de votre certificat HTTPS à l'aide des options --private-key et --public-key. Si vous ne disposez pas d'un certificat SSL pour votre domaine, créez en un. Une procédure de création est disponible dans le guide Créer un certificat SSL / TLS sur Debian.
Si votre certificat SSL nécessite un certificat intermédiaire, précisez le avec l'option --chain-ca. Précisez le certificat racine de l'autorité de certification ayant signé votre certificat avec l'option --root-ca.
command a2tools --ssl \
--private-key="/etc/ssl/private/www.mon-domaine-exemple.com.key" \
--public-key="/etc/ssl/certificates/www.mon-domaine-exemple.com.crt" \
--root-ca="/etc/ssl/roots/www.mon-domaine-exemple.com-root.ca" \
--chain-ca="/etc/ssl/chains/www.mon-domaine-exemple.com.ca" \
"www.mon-domaine-exemple.com" "/opt/mon-dossier"
Avec le mod_ssl, un seul certificat SSL peut être utilisé pour une adresse IP donnée. Pour héberger plusieurs sous-domaines sur un même serveur, utilisez des certificats "wildcard" (cad. "*.exemple.com"). Pour héberger plusieurs domaines sur un serveur, vous devez utilisez le module gnutls, ou assigner plusieurs adresses IP au serveur (si vous utilisez un serveur OVH, assignez une IP failover au serveur). Vous pouvez spécifier l'adresse IP de l'hôte virtuel avec l'option --bind-ip de a2tools.
Obtenir la liste des modules Apache 2 activés
Listez les modules Apache 2 activés :
command apache2ctl -t -D DUMP_MODULES
Références
- La documentation du serveur HTTP Apache Version 2.2 est une lecture pratiquement indispensable si vous modifiez fréquement la configuration de votre serveur Apache 2.
- Pour une utilisation avancée de mod_rewrite, lisez "Le module Apache mod_rewrite".
Ces livres peuvent vous aider:
Remerciements
- Merci à George Notaras pour SSL-enabled Name-based Apache Virtual Hosts with mod_gnutls.
- Merci à Alsacréations pour Installation d'Apache et PHP.
- Merci à Smashing Magazine pour SVN Server Admin Issue: Fix It !
- Merci à la Ferme du Web pour .htaccess - Quelques astuces bien pratiques à connaître.
- Merci à Desidia pour Enjoliver le listage de fichiers par Apache.
