Apache2 - Configuration

De wikilivois
Sauter à la navigation Sauter à la recherche
Fonctionnalités Solutions
Serveur Web Apache
Domaines Virtuels Directive <VirtualHost>
Authentification ldap mod_auth_ldap (intégré)
mod_ldap (intégré)
Sécurisation mod_rewrite (intégré)
HTTPS mod_ssl (intégré)

Package Gentoo: apache +vhosts +ldap +ssl

Configuration Gentoo : les fichiers de configuration se trouvent dans /etc/apache2

  • httpd.conf : fichier de configuration principal
  • /etc/apache2/modules : paramétrage des modules
  • /etc/apache2/vhosts : configuration des domaines virtuels
  • /etc/apache2/ssl : clés ssl

Configuration de base


La configuration par défaut

# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
ServerRoot "/usr/lib/apache2"

# PidFile: The file in which the server should record its process
# identification number when it starts.
PidFile "/var/run/apache2.pid"

# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
KeepAlive On

# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
MaxKeepAliveRequests 100

# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
KeepAliveTimeout 15

# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
HostnameLookups Off

Il faut changer le paramètre ServerAdmin:

# ServerAdmin: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g. admin@your-domain.com
ServerAdmin christophe_nospam@livois.com

La gestion des Multi Processing Modules (MPM) se fait dans 00_mpm.conf:

# prefork MPM
# This is the default MPM if USE=-threads
# MinSpareServers: Minimum number of idle child server processes
# MaxSpareServers: Maximum number of idle child server processes
<IfModule mpm_prefork_module>
        StartServers            5
        MinSpareServers         5
        MaxSpareServers         10
        MaxClients                      50
        MaxRequestsPerChild     10000

# worker MPM
# This is the default MPM if USE=threads
# MinSpareThreads: Minimum number of idle threads available to handle request spikes
# MaxSpareThreads: Maximum number of idle threads
# ThreadsPerChild: Number of threads created by each child process
<IfModule mpm_worker_module>
        StartServers            2
        MinSpareThreads         25
        MaxSpareThreads         75
        ThreadsPerChild         25
        MaxClients                      150
        MaxRequestsPerChild     10000





Limiter la fuite d'information

### 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 | Minor | Minimal | 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 (error documents, FTP directory listings,
### mod_status and mod_info output etc., but not CGI generated documents).
### Set to "EMail" to also include a mailto: link to the ServerAdmin.
### Set to one of:  On | Off | EMail
ServerSignature Off

Résister aux attaques DOS

Stratégie de défense (apachesecurity.net):

  1. Considérer les attaques DOS comme un des risques possibles.
  2. Connaître le contenu hébergé par le serveur - adapter le serveur (software) en conséquence. (cf § sur gestion des ressources)
  3. Préparer les réactions possibles en cas d'attaque DoS (ex: avoir un contact avec son fournisseur d'accès).
  4. Superviser le serveur pour détecter les attaques au plus tôt
  5. Réagir rapidement lors d'une attaque
  6. Si les attaques s'intensifient, mettre en place des outils de défense automatique.

# Timeout: The number of seconds before receives and sends time out.
Timeout 60

Remarque : Pour tester la charge d'un serveur, différents outils sont listés sur http://www.softwareqatest.com

L'outil ab (Apache Benchmark) est livré avec apache :

#ab -n 1000 -c 100 http://www.livois.com

"Chrooter" Apache

  • Utiliser mod_security ou mod_chroot



  • Définir la directive SecChrootDir (mod_security) ou Chrootdir (mod_chroot)
SecChrootDir /chroot/apache

  • Créer différents répertoires à l'intérieur de la prison
#mkdir -p /chroot/apache/var/run/
#mkdir /chroot/apache/var/log
#mkdir /chroot/apache/tmp
#cp -pR /var/www /chroot/apache/var/
  • Ajuster la configuration de mysql
socket                                          = /chroot/apache/var/run/mysqld/mysqld.sock

socket                                          = /chroot/apache/var/run/mysqld/mysqld.sock

  • LDAP ?




Package Gentoo: mod_security ~x86

Remarque Gentoo: Au 09/04/06, la version gentoo de base est la 1.8.7. Les règles proposées ne sont valides qu'à partir de la version 1.9. Nous rajoutons donc la ligne net-www/mod_security ~x86 au fichier /etc/portage/package.keywords.

Les fontionnalités de modsecurity sont :

  • Request filtering; incoming requests are analysed as they come in, and before they get handled by the web server or other modules.
  • Anti-evasion techniques; paths and parameters are normalised before analysis takes place in order to fight evasion techniques.
  • Understanding of the HTTP protocol; since the engine understands HTTP, it performs very specific and fine granulated filtering.
  • POST payload analysis; the engine will intercept the contents transmitted using the POST method, too.
  • Audit logging; full details of every request (including POST) can be logged for later analysis.
  • HTTPS filtering; since the engine is embedded in the web server, it gets access to request data after decryption takes place.
  <IfModule !mod_security.c>
    LoadModule security_module    modules/mod_security.so

<IfModule mod_security.c>

    # Turn the filtering engine On or Off
    SecFilterEngine On

    # Make sure that URL encoding is valid
    SecFilterCheckURLEncoding On

    # The audit engine works independently and
    # can be turned On of Off on the per-server or
    # on the per-directory basis. "On" will log everything,
    # "DynamicOrRelevant" will log dynamic requests or violations,
    # and "RelevantOnly" will only log policy violations
    SecAuditEngine RelevantOnly

    # The name of the audit log file
    SecAuditLog logs/audit_log

    SecFilterDebugLog logs/modsec_debug_log
    SecFilterDebugLevel 1

    # Should mod_security inspect POST payloads
    SecFilterScanPOST On

    # Action to take by default
    SecFilterDefaultAction "deny,log,status:500"

    # Prevent OS specific keywords
    SecFilter /etc/passwd

    # Prevent path traversal (..) attacks
    SecFilter "\.\./"

    # Weaker XSS protection but allows common HTML tags
    SecFilter "<[[:space:]]*script"

    # Prevent XSS atacks (HTML/Javascript injection)
    SecFilter "<(.|\n)+>"

    # Require HTTP_USER_AGENT and HTTP_HOST headers
    SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"

    # Forbid file upload
    #SecFilterSelective "HTTP_CONTENT_TYPE" multipart/form-data

    # when allowing upload, only allow images
    # note that this is not foolproof, a determined attacker
    # could get around this
    #<Location /fileupload.php>
    #    SecFilterInheritance Off
    #    SecFilterSelective POST_PAYLOAD "!image/(jpeg|bmp|gif)"

#mkdir /etc/apache2/modules.d/mod_security 
#cd /etc/apache2/modules.d/mod_security 
#wget http://www.modsecurity.org/download/rules/modsecurity-general.conf
#wget http://www.modsecurity.org/download/rules/modsecurity-hardening.conf
#wget http://www.modsecurity.org/download/rules/modsecurity-php.conf

Rajouter ces fichiers à la configuration:

Include /etc/apache2/modules.d/mod_security/modsecurity-hardening.conf
Include /etc/apache2/modules.d/mod_security/modsecurity-general.conf
Include /etc/apache2/modules.d/mod_security/modsecurity-php.conf

/etc/conf.d/apache2 Il faut ajouter la directive -D SECURITY à la variable APACHE2_OPTS.


Package Gentoo : dev-lang/php +apache2 +cli +dba +exif

Voir la liste des modules php compilés.

#php -m

Désactiver certaines options

register globals


Il est important de laisser cette directive à Off (défaut depuis PHP 4.2).

; You should do your best to write your scripts so that they do not require
; register_globals to be on;  Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
register_globals = Off


Cette option permet de traiter les urls comme des fichiers. Ainsi, mettre une valeur d'url à une variable permettrait l'exécution d'un code externe lors de la réutilisation de cette variable par les scripts PHP.

; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
allow_url_fopen = Off


La fonction dl() permet à PHP de charger une extension à la volée. Quelqu'un pourrait écrire un module qui contourne certaines sécurité et le charger ensuite comme le décrit l'article: http://www.phrack.org/phrack/62/p62-0x0a_Attacking_Apache_Modules.txt .

; Whether or not to enable the dl() function.  The dl() function does NOT work
; properly in multithreaded servers, such as IIS or Zeus, and is automatically
; disabled on them
enable_dl = Off

Remarque : Cette directive est à Off en safe_mode.

safe mode


Attention : Ce mode n'est plus préconisé et est supprimé dans PHP6

Le safe_mode est une tentative des développeurs PHP de limiter les risques liés à la programmation "server-side".

L'impact le plus important du safe_mode est la restriction sur l'accès aux fichiers. PHP demande que l'uid du propriétaire du fichier corresponde à l'uid du propriétaire du script exécuté.

; Safe Mode
safe_mode = On

; By default, Safe Mode does a UID compare check when
; opening files. If you want to relax this to a GID compare,
; then turn on safe_mode_gid.
safe_mode_gid = Off

Mettre le safe_mode_gid à On permet d'assouplir la règle. Il faut que le compte apache et les comptes des développeurs quid déposent les scripts soient dans le même groupe.

La directive open_basedir restreint l'accès de PHP aux répertoires listés. Lorsqu'un serveur apache est configuré en multi- domaines, il vaut mieux définir cette directive par vhost:

<Directory /var/www/www.livois.com/>
  php_admin_value open_basedir /var/www/www.livois.com/

limiter l'utilisation des ressources

Définir les limites

; Resource Limits ;

max_execution_time = 60     ; Maximum execution time of each script, in seconds
max_input_time = 60     ; Maximum amount of time each script may spend parsing request data
memory_limit = 8M      ; Maximum amount of memory a script may consume (8MB)

; You should do your best to write your scripts so that they do not require
; register_globals to be on;  Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
register_globals = On

; Maximum size of POST data that PHP will accept.
post_max_size = 10M

Gestion des uploads

; File Uploads ;

; Whether to allow HTTP file uploads.
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
;upload_tmp_dir =

; Maximum allowed size for uploaded files.
upload_max_filesize = 50M

Gestion des logs

error_reporting  =  E_ALL

; Log errors into a log file (server-specific log, stderr, or error_log (below))
; As stated above, you're strongly advised to use error logging in place of
; error displaying on production web sites.
log_errors = On

; Print out errors (as a part of the output).  For production web sites,
; you're strongly encouraged to turn this feature off, and use error logging
; instead (see below).  Keeping display_errors enabled on a production web site
; may reveal security information to end users, such as file paths on your Web
; server, your database schema or other information.
display_errors = Off

; Even when display_errors is on, errors that occur during PHP's startup
; sequence are not displayed.  It's strongly recommended to keep
; display_startup_errors off, except for when debugging.
display_startup_errors = Off

; Log errors to specified file.
error_log = /var/log/apache2/php5.log

La configuration ci-dessus permet de logguer les erreurs dans un fichier de logs et de ne pas les afficher à l'écran.


PHP5 contient une couche d'abstraction qui permet de filtrer la valeur d'un paramètre avant de l'enregistrer. Un filtre d'exemple est disponible à l'adresse suivante: http://cvs.php.net/viewvc.cgi/php-src/README.input_filter

Domaines virtuels


Créer un répertoire pour chaque domaine virtuel à créer

#mkdir /var/www/www.livois.com/
#mkdir /var/www/www.info.test/

Les vhosts sont définis dans le répertoire /etc/apache2/vhosts.d.

Attention : les fichiers de configuration doivent être de la forme *.conf

Le virtualhost par défaut est défini dans le fichier 00_default_vhost.conf

NameVirtualHost *:80
<VirtualHost *:80>
  DocumentRoot /var/www/localhost

<Directory /var/www/localhost/>

Pour les suivant, il faut indiquer:

  • le ServerName
  • le DocumentRoot
  • le ServerAlias (au cas où plusieurs noms de sites sont acceptés)
<VirtualHost *:80>
  ServerName www.livois.com
  #ServerAlias *.livois.com
  DocumentRoot /var/www/www.livois.com
  Setenv VLOG

<Directory /var/www/www.livois.com/>

Authentification LDAP



Les modules ldap sont inclus dans le package apache2

La configuration de l'authentification LDAP nécessite l'activation de 2 modules:

  • mod_auth_ldap (permet l'authentification LDAP pour apache)


  • mod_ldap (améliore les performances d'authentification)


L'authentification LDAP s'active active par l'intermédiaire de 2 fichiers.

  • L'activation des modules LDAP se fait en indiquant -D AUTH_LDAP -D LDAP dans /etc/conf/apache2, comme l'explique /etc/apache2/conf/modules.d/46_mod_ldap.conf

<Directory /var/www/www.livois.com/>
    Options -Indexes FollowSymLinks MultiViews
    AllowOverride All
    AuthType Basic
    AuthBasicProvider ldap #directive requise avec apache2.2

    AuthName "La Page des Livois"
    AuthLDAPURL ldap://ldap.livois.com:389/o=hebergement,dc=livois,dc=com?uid?sub?(&(AccountActive=TRUE)(objectClass=*))

    <IfModule mod_access.c>
      Order allow,deny
      Allow from all

La ligne AuthLDAPURL définit l'authentification LDAP

  • sur le serveur ldap.livois.com, sur le port 389
  • le base DN est o=hebergement, dc=livois,dc=com
  • l'authentification se fait à partir du champ mail
  • si le champ AccountActive=TRUE
  • si le champ uid est non vide

L'autorisation se fait si l'utilisateur (champ uid) est valide et que le mot de passe entré dans le navigateur correspond au mot de passe LDAP du compte.

ldap-status La performance de cache du module mod_ldap est accessible à l'adresse: http://www.livois.com/ldap-status, comme configuré dans 46_mod_ldap.conf

<Location /ldap-status>
        SetHandler ldap-status
        Order deny,allow
        Deny from all
        Allow from


Modules Apache



Package Gentoo: mod_dav

<IfDefine DAV>
  <IfModule !mod_dav.c>
    LoadModule dav_module    modules/mod_dav.so

<IfDefine DAV_FS>
  <IfModule !mod_dav_fs.c>
    LoadModule dav_fs_module   modules/mod_dav_fs.so

<IfModule mod_dav.c>
    DavMinTimeout 600

<IfModule mod_dav_fs.c>
    # Location of the WebDAV lock database.
    DavLockDB /var/lib/dav/lockdb

Nous configurons l'accès à certains fichiers en protocole WEBDAV avec l'option « Dav On ».
  fichier de configuration de l'hôte virtuel
<Directory /var/www/www.livois.com/supervision/>
<IfModule mod_dav.c>
  DavMinTimeout 600
  #Options None
  Dav On

    Require valid-user

/etc/conf.d/apache2 Il faut ajouter la directive -D DAV -D DAV_FS à la variable APACHE2_OPTS.

Quelques remarques :

  • Attention à bien sécuriser l'accès aux fichier par une authentification apache!
  • Les répertoires doivent être accessible en lecture et en écriture par l'utilisateur apache.

Remarque php : One common request is to use mod_dav to manipulate dynamic files (PHP scripts, CGI scripts, etc). This is difficult because a GET request will always run the script, rather than downloading its contents. One way to avoid this is to map two different URLs to the content, one of which will run the script, and one of which will allow it to be downloaded and manipulated with DAV.

Alias /phparea /home/gstein/php_files

Alias /php-source /home/gstein/php_files

<Location /php-source> DAV On

ForceType text/plain


With this setup, http://example.com/phparea can be used to access the output of the PHP scripts, and http://example.com/php-source can be used with a DAV client to manipulate them.

Une autre de solution serait peu-être de configurer un hôte virtuel dédié à l'accès WEBDAV (ex: webdav.livois.com).

Test et utilisation

L'utilitaire litmus sous Linux permet de tester le fonctionnement de webdav.

Des clients possibles sont :

Sécurité avancée

Optimisation des performances

A HOWTO on Optimizing PHP http://phplens.com/lens/php-book/optimizing-debugging-php.php

Tuning Apache and PHP for Speed on Unix http://phplens.com/phpeverywhere/tuning-apache-php

Optimizing apache http://www.linuxquestions.org/questions/answers.php?action=viewarticle&artid=312

Performance-tuning Apache http://www.xs4all.nl/~thomas/oscon2003/PerformanceTuning.html

Optimisation des ressources


Les serveurs virtuels héritent de la configuration du serveur principal. Pour alléger les process apache, il est bon de limiter la configuration du serveur principal.

Programmation des applications

Bande Bassante

  • Bandwith stealing (lien vers une image du site)

Une façon de régler ce problème est d'utiliser mod_rewrite.

# allow empty referrers, for when a user types the URL directly
RewriteCond %{HTTP_REFERER} !^$

# allow users coming from livois.com
RewriteCond %{HTTP_REFERER} !^http://www\.livois\.com [nocase]

# only prevent images from being hotlinked - otherwise
# no one would be able to link the site at all!
RewriteRule(\.gif|\.jpg|\.png|\.swf)$ $0 [forbidden]

Accélérateurs PHP

Remarque :Eaccelerator semble plus rapide qu'apc mais ne fonctionne pas avec PHP5.1.



Package Gentoo: dev-php4/eaccelerator ou dev-php5/eaccelerator ~x86

Configurer apache pour accéder à la page eaccelerator/eaccelrator.php:

 Alias /eaccelerator "/usr/share/eaccelerator/"



Package Gentoo: dev-php4/pecl-apc ou dev-php5/pecl-apc ~x86

Configurer apache pour accéder à la page apc/apc.php

  Alias /apc "/usr/share/apc/"

La configuration est réalisée dans apc.ini.

  • activer en passant apc.enabled à 1
  • apc.shm_size donne la taille de la mémoire accordée au cache
  • apc.shm_segments permet d'avoir plusieurs cache en mémoire


Load Balancing et Fail Over

Linux Mag 78

Répartition de charge par DNS

Répartition de charge par http Redirect

Cette redirection peut être intelligente et s'appuyer sur la localisation géographique du client.

Cette approche fonctionne pour les requêtes du type GET mais n'est généralement pas applicable sur des requêtes de type POST. En effet, les navigateurs ne savent pas ré-émettre des requêtes POST.

Répartition de charge par boîtier

Un serveur frontal redirige le trafic vers un serveur approprié (analyse de la charge et disponibilité des serveurs).

Ces technologies permettent de déployer des clusters verticaux (ensemble de même applications sur un serveur) et horizontaux (ensemble de machines similaires). .


Packages Gentoo

Package D Fichiers de configuration
apache apache2
dev-lang/php USE= apache2 cli dba exif


© 2006-2008 Christophe de Livois

Tête de GNU Vous avez l'autorisation de copier, distribuer et/ou modifier ce document suivant les termes de la GNU Free Documentation License, Version 1.2 ou n'importe quelle version ultérieure publiée par la Free Software Foundation; sans section invariante, sans page de garde, sans entête et sans page finale. Pour plus d'informations consulter le site de l'APRIL.