Installation et configuration d'un serveur http apache 2.2
Ce howto a été écrit au départ pour debian etch puis a été adapté pour debian lenny. Il reste cependant valable la plupart du temps pour ces deux versions de debian.
Ce howto va vous montrer comment mettre en place un serveur web apache2 gérant les domaines virtuels et l'ipv6 sous debian lenny.
Nous allons mettre en place trois sites : core.csnu.org, www.csnu.org et webmail.csnu.org.
core.csnu.org sera le site par défaut sur lequel tombera toute personne effectuant une requête http ne désignant aucun autre domaine virtuel.
www.csnu.org et webmail.csnu.org sont ce qu'on peut appeler des domaines virtuels : ils sont sur la même ip que core.csnu.org mais servent des domaines différents. Ces deux domaines disposeront d'un chiffrement ssl/tls actif.
Au niveau dns, core.csnu.org est le domaine identifiant la machine. Il possède l'adresse ipv4 213.186.47.110 et l'adresse ipv6 2001:41d0:1:d6e::110.
www.csnu.org et webmail.csnu.org sont des alias pour core.csnu.org.
Les changements de permissions effectués dans ce howto supposent que vous êtes en umask 0027
Champs dns
La première étape est de mettre en place les champs dns pour les différents domaines qu'on va gérer. Éditez la zone dns de votre domaine (/srv/http/csnu.org.host dans mon cas) et ajoutez ou modifiez les lignes suivantes :
csnu.org. IN A 213.186.47.110 csnu.org. IN AAAA 2001:41d0:1:d6e::110 core.csnu.org. IN A 213.186.47.110 core.csnu.org. IN AAAA 2001:41d0:1:d6e::110 www IN CNAME core.csnu.org. webmail IN CNAME core.csnu.org.
Si vous ne disposez pas d'ipv6, vous n'avez pas besoin des champs AAAA.
Installation de apache2
Utilisez aptitude pour installer apache2:
aptitude install apache2
Créez les dossier qui contiendront les vhosts et la configuration des sites :
mkdir /etc/apache2/vhosts mkdir /etc/apache2/sites
Créez le dossier /srv/http/ qui contiendra les sites internet :
mkdir /srv/http/ chown root:www-data /srv/http/
Configuration de apache2
Exemple de fichier de configuration
Voici un exemple de fichier apache2.conf. Nous verrons ensuite plus en détail les différentes directives de configuration utilisées.
ServerRoot /etc/apache2
Listen 213.186.47.110:80
Listen 213.186.47.110:443
Listen 127.0.0.1:80
Listen ::1:80
Listen 2001:41d0:1:d6e::110:80
Listen 2001:41d0:1:d6e::110:443
User www-data
Group www-data
PidFile /var/run/apache2.pid
ServerAdmin root@csnu.org
ServerName www.csnu.org:80
HostnameLookups Off
ServerTokens Prod
NameVirtualHost 213.186.47.110:80
NameVirtualHost 213.186.47.110:443
NameVirtualHost 2001:41d0:1:d6e::110:80
NameVirtualHost 2001:41d0:1:d6e::110:443
#NameVirtualHost 127.0.0.1:80
AcceptPathInfo On
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 2
MaxSpareServers 5
MaxClients 40
MaxRequestsPerChild 400
</IfModule>
#<IfModule mpm_worker_module>
# StartServers 3
# MaxClients 80
# MinSpareThreads 3
# MaxSpareThreads 6
# ThreadsPerChild 0
# MaxRequestsPerChild 200
#</IfModule>
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
# PHPIniDir /etc/php5/apache2
AddHandler cgi-script .cgi .pl
DefaultLanguage fr
AddDefaultCharset UTF-8
DocumentRoot /srv/http/default/
#Sécurisation de php pour tous les vhosts/autres qui n'en ont pas de configuré
php_admin_value open_basedir /srv/http/default/
<Directory />
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow From All
IndexIgnore .ht*
IndexIgnore .svn
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
Order allow,deny
Deny From All
Satisfy All
</FilesMatch>
<DirectoryMatch "\.svn">
Deny from all
</DirectoryMatch>
DirectoryIndex index.html index.htm index.php
ErrorLog /var/log/apache2/error.log
LogFormat "[%{%a %b %d %T %G}t] [access] %h %v %H %l %u \"%r\" %>s %b bytes = %D ms (%T s)" common
CustomLog /var/log/apache2/access.log common
TypesConfig /etc/mime.types
DefaultType text/plain
#################################################################
# Index #
#################################################################
IndexOptions FancyIndexing VersionSort
<Directory "/usr/share/apache2/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
Allow from 213.186.47.110
Allow from 2001:41d0:1:d6e::110
</Location>
ExtendedStatus On
#############################
# VHOSTS #
#############################
Include vhosts/core.csnu.org.conf.default
Include vhosts/csnu.org.conf.default
Include vhosts/*.conf
Explication sur les options utilisés dans le fichier de configuration
ServerRootdéfini le dossier principal de apache2. C'est dans ce répertoire que les configurations de apache2 sont stockés.Useretgroupdéfinissent l'utilisateur et le groupe sous lequel apache2 doit être lancé. Ces deux éléments (www-data dans les deux cas) ont normalement été créé automatiquement par aptitude.PidFiledéfini l'endroit où le fichier pid de apache2 doit être stocké.Listendéfini les différentes ips et ports sur lesquels apache2 écoute.NameVirtualHostdéfini les ips et les ports qui pourront être utilisés par la suite en tant que virtualhost (pour les domaines virtuels).ServerAdmindéfini le nom de la personne (en général une adresse email) que le serveur proposera de contacter en cas de problème lors de l'affichage d'une page ou d'un bug de configuration interne.ServerNamedéfini le nom du serveur.HostnameLookupsdéfini s'il faut résoudre l'ip des clients se connectant au serveur dans le but de loguer leur hostname dans les fichiers de logs. Il est préférable de désactiver cette option car apache2 ne servira pas la requête tant que la résolution n'aura pas eu lieu.ServerTokensdéfini comment apache2 doit s'identifier auprès des clients.ServerTokens Prod: Le serveur renvoi : Server: ApacheServerTokens Major: Le serveur renvoi : Server: Apache/2ServerTokens Minor: Le serveur renvoie : Server: Apache/2.2ServerTokens Min: Le serveur renvoi : Server: Apache/2.2.41ServerTokens OS: Le serveur renvoie : Server: Apache/2.2.41 (Unix)ServerTokens Full(valeur par défaut) : Le serveur renvoi : Server: Apache/2.2.41 (Unix) PHP/4.2.2 MyMod/1.2
KeepAlivedéfini si apache2 doit autoriser les connexions tcp persistantes (plusieurs requêtes http pourront être envoyées lors de la même connexion tcp).KeepAliveTimeoutdéfini le nombre de secondes que doit attendre apache2 avant de fermer une connexion tcp.MaxKeepAliveRequestsdéfini le nombre de requêtes maximum que apache2 servira lors de la même connexion tcp. Il est recommandé de laisser cette valeur relativement élevée.ErrorLogdéfini le fichier où les logs d'erreur de apache seront stockés.LogFormatpermet de formater les logs customs du serveur. La documentation officielle de apache détaille le formatage possible. La syntaxe estLogFormat Format TypeCustomLogpermet de spécifier un fichier de log pour chaque type de log custom.AddDefaultCharsetpermet de spécifier le charset par défaut à utiliser.AddHandler cgi-scriptpermet de préciser que les fichiers .cgi et .pl sont des scripts cgi.DocumentRootdéfini le répertoire où sont stockés les pages webs par défaut du serveur.DirectoryIndexdéfini les fichiers qui seront considérés comme des pages d'index.TypesConfigdéfini le fichier spécifiant la correspondance entre les extensions et les types de fichiers.DefaultTypedéfini le type par défaut d'un fichier si son extension n'est pas spécifié parTypesConfigAccessFileNamedéfini le nom du fichier de configuration distribué (un tel fichier sera lu par apache dans tous dossiers auquel apache a accès)
La directive Directory permet d'appliquer des directives qui ne s'appliqueront que pour un dossier donné (et tout ses sous dossiers et fichiers). Dans l'exemple suivant, on applique des règles pour l'ensemble du système de fichier (/) :
<Directory />
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow From All
IndexIgnore .ht*
</Directory>
IndexIgnore spécifie qu'il ne faut pas lister les fichiers débutants par .ht. Ces fichiers sont généralement des fichiers de configurations locaux aux sites webs.
Les lignes suivantes permettent de charger automatiquement tous les modules que vous avez activé pour apache au moyen de la commande a2enmod :
Include /etc/apache2/mods-enabled/*.load Include /etc/apache2/mods-enabled/*.conf
La directive FilesMatch "patern" permet de spécifier des directives s'appliquant à tout fichier correspondant à l'expression rationnelle spécifiée.
Les options suivantes s'appliquant aux fichiers de sécurités et de configuration locaux des sites :
<FilesMatch "^\.ht">
Order allow,deny
Deny From All
Satisfy All
</FilesMatch>
Les directives suivantes activent le module status de apache2 qui permet de suivre la consommation et les performances du serveur apache2 :
<Location /server-status> SetHandler server-status Order Deny,Allow Deny from all Allow from 127.0.0.1 Allow from ::1 Allow from 213.186.47.110 Allow from 2001:41d0:1:d6e::110 </Location> ExtendedStatus On
Et enfin, la ligne suivante permet de loader tous les fichiers .conf situés dans /etc/apache2/vhosts/. C'est dans ce dossier qu'on stockera les vhosts des sites.
Include vhosts/*.conf
Mise en place d'un site
Ajoutez la ligne suivante avant la directive Include vhosts/*.conf dans le fichier /etc/apache2/apache2.conf. Il est nécessaire de la placer avant afin d'avoir une sorte de "catch all" récupérant toutes les requêtes ne correspondant à aucune vhost.
Include vhosts/core.csnu.org.conf.default
Créez le fichier /etc/apache2/vhosts/core.csnu.org.conf.default et ajoutez y les lignes suivantes :
<VirtualHost 213.186.47.110>
ServerName core.csnu.org
Include sites/core.csnu.org.conf
</VirtualHost>
<VirtualHost [2001:41d0:1:d6e::110]>
ServerName core.csnu.org
Include sites/core.csnu.org.conf
</VirtualHost>
La configuration de cette vhost est défini pour être dans /etc/apache2/sites/core.csnu.org.conf. Créez ce fichier et ajoutez-y les lignes suivantes :
DocumentRoot /srv/http/default/
Les requêtes pour cette vhost correspondront donc aux pages webs situés dans /srv/http/default/. Bien sur, ce dossier doit exister et être accessible par apache2. Si ce n'est pas le cas :
mkdir -p /srv/http/default chown root:www-data /srv/http/default
Pour valider les modifications il faut reloader apache2:
/etc/init.d/apache2 reload
Mise en place d'un site sécurisé en ssl
Nous allons maintenant mettre en place les deux sites sécurisés en ssl : www.csnu.org et webmail.csnu.org.
Étant donné qu'on ne dispose que d'une seule adresse ipv4 on ne va pouvoir utiliser qu'un seul certificat ssl. C'est une limitation obligatoire du protocole https car la connexion sécurisée est établie avant l'envoi du header spécifiant quel site apache2 doit afficher (et donc quel certificat ssl utiliser).
Il est cependant possible de sécuriser plusieurs sites différents avec le même certificat ssl en utilisant la directive subjectAltName lors de la génération du certificat. Cela règlera les problèmes d'alertes sur tous les navigateur conforme à la RFC 2818 ("HTTP Over TLS").
A titre d'information il est possible de contourner ce problème avec le module gnutls : http://www.gcu.info/2399/2007/09/03/george-met-ssl-a-gnou/ http://www.g-loaded.eu/2007/08/10/ssl-enabled-name-based-apache-virtual-hosts-with-mod_gnutls/
Génération du certificat ssl
Nous allons supposer que vous avez créé votre propre autorité de certification. Vous pouvez suivre mon howto sur openssl si vous ne disposez pas d'autorité de certification.
Éditez votre fichier /etc/ssl/openssl.cnf et ajoutez les lignes suivantes :
[APACHE] nsComment = "CORE Apache Server" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always issuerAltName = issuer:copy subjectAltName = DNS:www.csnu.org, DNS:webmail.csnu.org basicConstraints = critical,CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment nsCertType = server extendedKeyUsage = serverAuth
Nous allons maintenant générer les clés publics et privés de notre certificat. Si vous connaissez un peu openssl vous devez savoir qu'il est possible de verrouiller les clés avec une passphrase. Apache2 supporte ce mécanisme mais cela empêchera apache2 de se lancer tout seul lors d'un redémarrage. A vous de choisir entre sécurité et disponibilité. Pour générer votre certificat ssl chiffré avec une passphrase puis le signer par votre autorité :
cd /etc/ssl/core_ca openssl req -config /etc/ssl/openssl.cnf -newkey rsa:2048 -keyout www.csnu.org.key -out www.csnu.org.req openssl ca -config /etc/ssl/openssl.cnf -name core_ca -extensions APACHE -in www.csnu.org.req -out www.csnu.org.pem chmod -R 600 /etc/ssl/core_ca/
Si vous ne souhaitez pas chiffrer le certificat avec une passphrase ajoutez l'argument -nodes à la première ligne.
Répondez aux différentes questions posées par openssl. La plupart sont assez triviales. Attention toutefois : Common Name doit être l'adresse principale de votre site (www.csnu.org dans mon cas).
Il est préférable de déplacer le certificat dans le dossier root de apache2:
mkdir /etc/apache2/ssl/ mv www.csnu.org.* /etc/apache2/ssl/ chown -R root:root /etc/apache2/ssl/ chmod -R 600 /etc/apache2/ssl/
Enfin, nous allons créer un fichier contenant la chaine de certification :
cat /etc/ssl/root_ca/root_ca.pem > /etc/apache2/ssl/ca_chain.pem cat /etc/ssl/core_ca/core_ca.pem >> /etc/apache2/ssl/ca_chain.pem
Apache enverra ce fichier aux clients souhaitant se connecter en https. Ainsi, même si le navigateur du client n'a que le certificat root_ca.pem dans sa liste de confiance, le certificat établit pour apache sera validé car le client recevra tous les certificats de la chaine (root_ca.pem > core_ca.pem > www.csnu.org.pem) : le client sera certain que la chaine est complètement valide.
Mise en place des sites
Activez le module ssl de apache2:
a2enmod ssl
Ajoutez la ligne suivante dans /etc/apache2/apache2.conf après Include vhosts/core.csnu.org.conf.default mais avant Include vhosts/*.conf :
Include vhosts/csnu.org.conf.default
Cette ligne doit a tout prix être placé à cet endroit. C'est la vhost ssl par défaut dans laquelle on charge le certificat ssl. Si elle est placée après le Include chargeant les autres vhosts, si l'une de ces vhosts est configuré en ssl, apache2 ne démarrera pas.
Créez le fichier /etc/apache2/vhosts/csnu.org.conf.default et ajoutez y ceci :
#Certificat SSL
#SSLCACertificateFile
SSLCertificateChainFile /etc/apache2/ssl/ca_chain.pem
SSLCertificateFile /etc/apache2/ssl/www.csnu.org.pem
SSLCertificateKeyFile "/etc/apache2/ssl/www.csnu.org.key"
<VirtualHost 213.186.47.110:80>
ServerName www.csnu.org
ServerAlias csnu.org
Include sites/csnu.org.conf
</VirtualHost>
<VirtualHost [2001:41d0:1:d6e::110]:80>
ServerName www.csnu.org
ServerAlias csnu.org
Include sites/csnu.org.conf
</VirtualHost>
<VirtualHost 213.186.47.110:443>
SSLEngine on
SSLProtocol All
SSLCipherSuite MEDIUM:HIGH
ServerName www.csnu.org
ServerAlias csnu.org
Include sites/csnu.org.conf
</VirtualHost>
<VirtualHost [2001:41d0:1:d6e::110]:443>
SSLEngine on
SSLProtocol All
SSLCipherSuite MEDIUM:HIGH
ServerName www.csnu.org
ServerAlias csnu.org
Include sites/csnu.org.conf
</VirtualHost>
La directive ServerAlias défini csnu.org comme un alias pour www.csnu.org
Créez ensuite /etc/apache2/sites/csnu.org.conf et ajoutez y les lignes suivantes:
DocumentRoot /srv/http/csnu.org/csnu.org/
ServerAdmin admin@csnu.org
Bien sur il faut que /srv/http/csnu.org/csnu.org/ existe et soit accessible par apache2:
mkdir -p /srv/http/csnu.org/csnu.org/
chown -R root:www-data /srv/http/csnu.org/
Pour que l'ajout soit pris en compte il faut reloader apache2:
/etc/init.d/apache2 reload
Si vous avez chiffré votre clé avec une passphrase il est important de modifier votre script logrotate car par défaut, il lance un restart de apache qui ne pourra pas se relancer tout seul du fait de la passphrase. Éditez le fichier /etc/logrotate.d/apache2 et modifiez la ligne /etc/init.d/apache restart en /etc/init.d/apache reload
Pour le site webmail.csnu.org créez le fichier /etc/apache2/vhosts/webmail.csnu.org.conf et ajoutez y les lignes suivantes :
<nowiki>
<VirtualHost 213.186.47.110:443>
ServerName webmail.csnu.org
Include sites/webmail.csnu.org.conf
</VirtualHost>
<VirtualHost 213.186.47.110:80>
ServerName webmail.csnu.org
Include sites/webmail.csnu.org.conf
</VirtualHost>
<VirtualHost [2001:41d0:1:d6e::110]:80>
ServerName webmail.csnu.org
Include sites/webmail.csnu.org.conf
</VirtualHost>
<VirtualHost [2001:41d0:1:d6e::110]:443>
ServerName webmail.csnu.org
Include sites/webmail.csnu.org.conf
</VirtualHost>
Créez ensuite le fichier <code>/etc/apache2/sites/webmail.csnu.org.conf</code> et ajoutez y les lignes suivantes :
<pre>
DocumentRoot /srv/http/csnu.org/webmail.csnu.org/
ServerAdmin admin@csnu.org
Comme précédemment, /srv/http/csnu.org/webmail.csnu.org/ doit exister et être accessible par apache2.