Security/Services/Apache
Sécuriser son serveur Apache
C'est ballot de mettre une serrure aux fenêtres si la porte reste grande ouverte.
C'est pourquoi, avant même de penser à sécuriser Apache, quelques sécurités de base doivent préalablement être mise en place:
- Firewall: C'est le premier rempart de la sécurité
- Protection basique contre le flood. Cela peut être fait avec une règle firewall du type
iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT - Avoir au moins un service de détection d'intrusion: <package>ossec</package>, <package>snort</package> et/ou autres...
- Vérifier régulièrement la présence de rootkits avec les outils <package>chkrootkit</package>, <package>rkhunter</package>, etc...
- Surveiller les logs.
- Mettre son système à jour régulièrement. En effet si les logiciels ne sont pas à jour ou que les patchs de sécurités ne sont pas appliqués, la sécurisation n'aurait pas de sens et ne serait qu'un arbre qui cache la forêt.
Apache
Cacher le numéro de version et autres informations sensibles
Par défaut, Apache rapporte les informations suivantes:
- numéro de version d'Apache
- Liste des modules installés
- Système d'exploitation et numéro de version de celui-ci
Ajout/modification des directives dans le fichier <path>/etc/httpd/conf/httpd.conf</path>
ServerSignature Off
ServerTokens Prod
La clé ServerSignature provoque l'affichage d'informations sensibles dans les pages d'erreur (403, 404 notamment), ainsi que dans les pages auto-générées listant les fichiers du répertoire.
La clé ServerTokens est utilisée pour déterminer si des informations doivent apparaître dans l'en-tête de réponse. Si la valeur de cette clé est Prod, la seule information sera:
Server: Apache
S'assurer qu'apache tourne avec son propre user et group
Beaucoup de serveurs web tourne avec le user nobody ou daemon. Dans le cas où Apache serait compromis, tous les processus utilisant le même user le serait aussi rapidement, et inversement.
User apache
Group apache
S'assurer que les fichiers en dehors du répertoire de travail d'apache ne soient pas servis
Pour cela on bloque la racine du serveur, et on accepte de servir uniquement les fichiers se trouvant le répertoire de travail d'Apache.
<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>
<Directory /web>
Order Allow,Deny
Allow from all
</Directory>
Désactiver l'indexation des répertoires
Il faut spécifier dans les options que l'indexation n'est pas autorisée en mettant -Indexes ou None aux Options dans la balise Directory.
Options -Indexes
Désactiver l'inclusion de fichiers
Il faut spécifier dans les options que l'inclusion n'est pas autorisée en mettant -Includes ou None aux Options dans la balise Directory.
Options -Includes
Désactiver l'exécution des scripts CGI
Il faut spécifier dans les options que l'exécution des scripts CGI n'est pas autorisée en mettant -ExecCGI ou None aux Options dans la balise Directory.
Options -ExecCGI
Désactiver le suivi des liens symboliques
Il faut spécifier dans les options que le suivi des liens symboliques n'est pas autorisée en mettant -FollowSymLinks ou None aux Options dans la balise Directory.
Options -FollowSymLinks
Désactiver plusieurs options
Il faut spécifier dans les options que rien n'est autorisé en mettant None aux Options dans la balise Directory.
Options None
On peut aussi spécifier les options interdites
Options -ExecCGI -FollowSymLinks -Indexes
Désactiver le support des fichiers .htaccess
Il faut spécifier dans la directive AllowOverride que rien n'est autorisé.
AllowOverride None
Pour les répertoires nécessitant un fichier .htaccess, il convient de modifier le nom et de spécifier le nouveau nom à Apache. De plus ces fichiers doivent être interprétés mais ne doivent pas être téléchargés.
AccessFileName .httpdoverride
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>
Activer le module mod_security
mod_security module Apache écrit par Ivan Ristic, l'auteur du livre Apache Security des éditions O'Reilly.
mod_security peut:
- Filtrage simple
- Filtre basé sur des expressions régulières
- Validation de l'encodage d'URL
- Validation de l'encodage Unicode
- Audit
- Prévention des attaques Null byte
- Respect d'un quota pour la mémoire
- Masquage de l'identité du serveur Web
- Support du chroot
- Et bien d'autres choses encore...
Disable any unnecessary modules
Apache typically comes with several modules installed. Go through the apache module documentation and learn what each module you have enabled actually does. Many times you will find that you don't need to have the said module enabled.
Look for lines in your httpd.conf that contain LoadModule. To disable the module you can typically just add a # at the beginning of the line. To search for modules run:
grep LoadModule httpd.conf
Here are some modules that are typically enabled but often not needed: mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex. Make sure only root has read access to apache's config and binaries
This can be done assuming your apache installation is located at /usr/local/apache as follows:
chown -R root:root /usr/local/apache
chmod -R o-rwx /usr/local/apache
Lower the Timeout value
By default the Timeout directive is set to 300 seconds. You can decrease help mitigate the potential effects of a denial of service attack.
Timeout 45
Limiting large requests
Apache has several directives that allow you to limit the size of a request, this can also be useful for mitigating the effects of a denial of service attack.
A good place to start is the LimitRequestBody directive. This directive is set to unlimited by default. If you are allowing file uploads of no larger than 1MB, you could set this setting to something like:
LimitRequestBody 1048576
If you're not allowing file uploads you can set it even smaller.
Some other directives to look at are LimitRequestFields, LimitRequestFieldSize and LimitRequestLine. These directives are set to a reasonable defaults for most servers, but you may want to tweak them to best fit your needs. See the documentation for more info.
Limiting the size of an XML Body
If you're running mod_dav (typically used with subversion) then you may want to limit the max size of an XML request body. The LimitXMLRequestBody directive is only available on Apache 2, and its default value is 1 million bytes (approx 1mb). Many tutorials will have you set this value to 0 which means files of any size may be uploaded, which may be necessary if you're using WebDAV to upload large files, but if you're simply using it for source control, you can probably get away with setting an upper bound, such as 10mb:
LimitXMLRequestBody 10485760
Limiting Concurrency
Apache has several configuration settings that can be used to adjust handling of concurrent requests. The MaxClients is the maximum number of child processes that will be created to serve requests. This may be set too high if your server doesn't have enough memory to handle a large number of concurrent requests.
Other directives such as MaxSpareServers, MaxRequestsPerChild, and on Apache2 ThreadsPerChild, ServerLimit, and MaxSpareThreads are important to adjust to match your operating system, and hardware.
Restriction d'accès par adresse IP
Si certaines ressources ne doivent être servies que pour certaines adresses ou plages d'adresses IP, il convient de restreindre l'accès de celle-ci dans la configuration d'Apache. Restriction à la plage d'adresse 192.168.0.0/24.
Order Deny,Allow
Deny from all
Allow from 192.168.0.0/24
Restriction sur une adresse IP.
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Ajustage des connexions persistantes
D'après la documentation d'Apache, les connexions persistantes augmentent les performances de 50%, donc ces paramètres doivent être modifiés avec précaution.
Les connexions persistantes sont activés par défaut et doivent le rester. Toutefois un ajustage du nombre de connections persistantes, ainsi que du timeout peut être entrepris après une analyse très poussée des journaux d'Apache afin de déterminer les meilleures valeurs. par défaut le nombre de connections persistantes est fixé à 100 et le timeout à 15.
Exécuter Apache dans un environnement Chroot
Un Chroot permet d'exécuter un programme dans une prison isolée. Cela permet de limiter l'intrusion à ce seul service.
Ce n'est pas vraiment facile d'exécuter Apache dans un chroot, notamment à cause des dépendances des librairies. Toutefois le module mod_security le permet très facilement en ajoutant la directive suivante à la configuration d'Apache.
SecChrootDir /chroot/apache
PHP
Cacher le numéro de version
PHP expose son numéro de version ( par défaut ? ). En effet il suffit de lancer la commande suivante pour s'en rendre compte. Bien entendu le fichier index.php doit exister, sinon Apache rapporte une erreur 404.
nc localhost 80 << EOF
HEAD http://localhost/index.php http/1.1
host: localhost
EOF
Apache répond en spécifiant le numéro de version de php
HTTP/1.1 200 OK
Date: Thu, 06 Sep 2012 10:03:22 GMT
Server: Apache
X-Powered-By: PHP/5.4.6
Connection: close
Content-Type: text/html; charset=UTF-8
Ajout de la ligne suivante au fichier <path>/etc/php.ini</path>
expose_php = Off
Après la modification et un restart d'Apache plus tard
nc localhost 80 << EOF
HEAD http://localhost/index.php http/1.1
host: localhost
EOF
Cette fois le numéro de version de php est caché
HTTP/1.1 200 OK
Date: Thu, 06 Sep 2012 10:03:22 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=UTF-8
