Outils pour utilisateurs

Outils du site


install:secureapache

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
install:secureapache [2011/04/13 22:04]
linkuff
install:secureapache [2021/07/27 20:51]
linkuff
Ligne 2: Ligne 2:
 Par défaut, Apache affiche la version que vous utilisez, votre système d'exploitation, et d'autres informations. Une personne malveillante peut utiliser ces informations pour mieux cibler son attaque sur votre serveur, nous allons donc les cacher. Par défaut, Apache affiche la version que vous utilisez, votre système d'exploitation, et d'autres informations. Une personne malveillante peut utiliser ces informations pour mieux cibler son attaque sur votre serveur, nous allons donc les cacher.
  
-**/etc/apache2/apache2.conf**+Éditez le fichier **/etc/apache2/apache2.conf**
  
 Nota : sur Apache/2.2.11 (entre autres, ubuntu 9.04) ces directives sont à placer dans **/etc/apache2/conf.d/security** Nota : sur Apache/2.2.11 (entre autres, ubuntu 9.04) ces directives sont à placer dans **/etc/apache2/conf.d/security**
-Mettez 
-<code>ServerSignature Off 
-ServerTokens Prod</code> 
  
 +Recherchez la ligne contenant
 +<file>ServerSignature</file>
 +et mettez
 +<file>ServerSignature Off</file>
  
-  * Limitations contre les DOS+Recherchez la ligne contenant 
 +<file>ServerTokens</file> 
 +et mettez 
 +<file>ServerTokens Prod</file>
  
-De façon à limiter la portée des attaques de type Denial of Service, il est conseillé de limiter le nombre de connexions simultanées MaxClients et en particulier le nombre de connexions persistantes MaxKeepAliveRequests. Celles-ci sont apparues avec la norme HTTP 1.1. Elles permettent d'effectuer des requêtes successives lors de la même connexion, ce qui augmente les performances du serveur. L'utilisation d'un timeout empêche les connexions sans fin. 
  
-Exemple pour un petit serveur : +===== Protéger contre le Clickjacking et le Referer ===== 
-<code>MaxClients 150 +Éditez le fichier **/etc/nginx/nginx.conf**
-KeepAlive On +
-MaxKeepAliveRequests 100 +
-KeepAliveTimeout 5</code>+
  
-  * Bien définir un virtual host+Ajouter : 
 +<code>add_header X-Frame-Options SAMEORIGINE; 
 +add_header Referrer-Policy strict-origin-when-cross-origin;</code> 
 +===== Restreindre l'accès aux seuls fichiers du répertoire web ===== 
 +On suppose que le répertoire /web est le répertoire où sont les fichiers de votre site web (à adapter selon votre configuration).
  
-Apache permet la définition de Virtual Host, c'est-à-dire que le même serveur peut héberger, compris sur une même adresse IPplusieurs sites différenciés par leur nom. Pour limiter les risques liés à une panne des serveurs DNS ou à des manipulations frauduleuses, il convient de définir le VirtualHost par une adresse IP puis de préciser son nom. +Éditez le fichier **/etc/apache2/sites-available/default** et insérez-y 
-<code><VirtualHost 194.57.201.103+<file><Directory /> 
-ServerName www.esiea.fr +  Order Deny,Allow 
-... +  Deny from all 
-</VirtualHost></code>+  Options None 
 +  AllowOverride None 
 +</Directory> 
 +<Directory /web
 +  Order Allow,Deny 
 +  Allow from all 
 +</Directory></file> 
 +Étant donné que les directives **Options** et **AllowOverride** sont mises à **None**, vous devrez ensuite les spécifier, si besoin, pour chaque répertoire décrit dans ce fichier.\\ 
 +Dans le cas d'hôtes virtuels, procédez de la même manière qu'avec le répertoire ///web//.
  
-  Gérer ses fichiers de log+===== Empêcher le parcours d'un répertoire ===== 
 +Pour empêcher le parcours du répertoire ///web//, ajoutez l'option **-Indexes**: 
 +<file> 
 +<Directory /web> 
 +  Order Allow,Deny 
 +  Allow from all 
 +  Options -Indexes 
 +</Directory></file>
  
-Apache permet de définir ses propres formats LogFormat pour les enregistrements dans les fichiers de log.+===== Désactiver les inclusions coté serveur ===== 
 +Toujours au même endroit, (dans un tag <Directory>) : 
 +<file>Options -Includes</file>
  
-<code>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</code> 
  
-Ensuite, on enregistre les informations de log précisées par le format dans le fichier de son choix+===== Désactiver l'exécution de scripts CGI ===== 
 +Si vous n'utilisez pas de scripts CGI ajoutez cette option : 
 +<file>Options -ExecCGI</file>
  
-<code>CustomLog /var/log/httpd/access_log common.</code> 
  
-Suivant l'utilisation de ces fichiers de logs (reporting,...)il peut être intéressant de faire apparaître le nom des machines se connectant au serveur web au lieu de leur adresse IP : HostnameLookups On active la résolution inverse.+===== Empêcher le téléchargement de fichiers .htaccess ===== 
 +<file> 
 +AccessFileName .httpdoverride 
 +<Files ~ "^\.ht"> 
 +    Order allow,deny 
 +    Deny from all 
 +    Satisfy All 
 +</Files> 
 +</file>
  
-  * Gestion des droits+===== Filtrer les adresses IP ===== 
 +Vous pouvez choisir les adresses IP qui ont accès ou non à vos pages.
  
-Nous présenterons ici les mesures préventives liées aux fichiers contenus dans l'arborescence du serveur web.+Par exemple : autoriser l'accès seulement depuis votre poste : 
 +<file> 
 +Order Deny,Allow 
 +Deny from all 
 +Allow from 127.0.0.1 
 +</file>
  
-  * DirectoryFiles, Location+ou encore sur votre réseau local : 
 +<file> 
 +Order Deny,Allow 
 +Deny from all 
 +Allow from 192.168.0.0/24 
 +</file>
  
-La gestion des accès est effectuée par le module mod_access. On manipule principalement trois catégories d'objets :+ou interdire une IP précise : 
 +<file> 
 +Order Allow,Deny 
 +Allow from all 
 +Deny from 192.168.0.5 
 +</file>
  
-Directory désigne un répertoire du serveur ; +etc...
-Location une arborescence du serveur web ; +
-Files un fichier. +
-. +
-Voici un exemple un peu farfelu extrait du manuel d'Apache, qui autorise la consultation du répertoire /docroot aux personnes utilisant le brower KnockKnock/2.0. Si vous voulez restreindre la consultation d'une partie de votre site aux personnes n'utilisant pas I.E., vous n'aurez pas trop de difficultés =:-) +
-<code>BrowserMatch ^KnockKnock/2.0 let_me_in +
-<Directory /docroot> +
-order deny,allow +
-deny from all +
-allow from env=let_me_in +
-</Directory></code>+
  
-  Mesure défensive+Le principe est le suivant :\\ 
 +**Allow,Deny** : L'IP doit être dans un Allow from **et** ne pas être dans un Deny From pour être autorisée\\ 
 +**Deny,Allow** : L'IP doit être dans un Deny from **et** ne pas être dans un Allow From pour être interdite
  
-Plus sérieusement, il est fortement conseillé de tout interdire par défaut :+Pour ceux qui voudraient aller encore plus loin [[http://www.system-linux.eu/index.php?category/Apache2|Tutoriels et astuces pour sécuriser Php et Apache]] 
 +----
  
-<code><Directory /> 
-Order deny,allow 
-Deny from all 
-</Directory></code> 
  
-Ensuite, il ne reste qu'à valider l'accès aux répertoires correspondant aux sites 
  
-Order indique dans quel ordre les directives deny et allow sont évaluées. Deny from all interdit l'accès depuis partout. On aurait pu indiquer un nom de machine, un nom de domaine, une adresse IP, un couple IP/masque de réseau. 
  
-  * Options, AllowOverride 
  
-Options contrôle 
  
-le suivi des liens symboliques FollowSymLinks/SymLinksIfOwnerMatch ; +===== Bloquer les attaques DDOS avec NGinx ===== 
-l'exécution des scripts CGI ExecCGI ; +Commencez par ouvrir la configuration générale de NGinx
-les Server Side Includes Includes et IncludesNOEXEC ; +
-la génération de pages d'index Indexes en l'absence de celles-ci ; +
-ainsi que l'orientation multilingue MultiViews. +
-All regroupe les différentes options sauf MultiViews, None supprime les options. +
-MultiViews redirige une demande pour index.html vers index.html.en ou index.html.fr selon la préférence signalée par le navigateur au serveur web.+
  
-Il est important d'être le plus restrictif possible par défaut, je conseille de n'autoriser que le suivi des liens symboliques où liens et destinations ont le même propriétaire :+<code>sudo nano /etc/nginx/nginx.conf</code> 
  
-<code><Directory /> +Nous allons utiliser deux variables :
-    Options SymLinksIfOwnerMatch +
-    AllowOverride None +
-</Directory></code>+
  
-Un pirate pouvant écrire dans un répertoire du serveur web, par exemple via un partage NFS, peut en profiter pour accéder au fichier /etc/passwd via un lien symbolique si l'option FollowSymLinks est présente, Includes ou ExecCGI permet d'exécuter des programmes... En un mot, soyez prudent.+**limit_req** : permet de limiter le nombre de requetes maximum par IP et par seconde 
 +**limit_conn** : permet de limiter le nombre de connexions maximum par IP
  
-La directive AllowOverride peut prendre n'importe quel paramètre qu'aurait pris Options.+Au début du bloc http ajoutez donc les lignes suivantes 
 +<code> 
 +#Requete maximun par ip  
 +limit_req_zone $binary_remote_addr zone=flood:10m rate=100r/s;  
 +limit_req zone=flood burst=100 nodelay; 
  
-  * Protection par mot de passe+#Connexions maximum par ip  
 +limit_conn_zone $binary_remote_addr zone=ddos:10m;  
 +limit_conn ddos 100; 
 +</code>
  
-Le module mod_auth permet de protéger l'accès à un répertoire par mot de passe. En pratique, c'est souvent utiliser pour filtrer les accès à un sous-répertoires d'une page personnelle.+L’exemple ci-dessus vous permet de limiter une IP à 100 connexions simultanées ou 100 requêtes par seconde (ce qui est déjà énorme). Si une personne devait dépasser l’une de ces limites votre serveur lui servirait alors une jolie erreur 503.
  
-<code><Directory /home/*/public_html> +Testez donc la configuration de votre serveur
-    AllowOverride AuthConfig +
-    Options SymLinksIfOwnerMatch +
-</Directory></code>+
  
-ou pour bloquer l'accès à un répertoire déterminé+<code>sudo nginx -t</code> 
 + 
  
-<code><Location "/private"> +Si tout fonctionne redémarrez le
-Options None +
-AllowOverride None +
-AuthName "restricted stuff" +
-AuthType Basic +
-AuthUserFile "/etc/httpd/.passwd" +
-require valid-user +
-</Location></code>+
  
-Dans le cas des pages personnelles /home/*/public_html des utilisateurs, l'accès est déterminé par un fichier .htaccess que peut utiliser ou non un utilisateur, le nom du fichier même est défini dans la section générale de la configuration du serveur. Ce fichier protége l'accès au répertoire dans lequel il est placé ainsi que l'accès aux sous-répertoires. AllowOverride AuthConfig permet à ce fichier d'être pris en compte. Par précaution, il faut empêcher un utilisateur de les récupérer via le web :+<code>sudo service nginx restart</code>
  
-<code>AccessFileName .htaccess +===== Bloquer les attaques DDOS avec NGinx via fail2ban ===== 
-<Files ~ "^\.ht"> +Lorsque NGinx bloque une IP à cause de son trop grands nombres de requêtes et/ou connexions simultanés il l’indique dans ses logsSi ces informations sont loguées elles peuvent alors être utilisées par fail2ban. Pour bloquer les IPs des attaquants nous allons créer deux règles fail2ban : une pour limit_conn et une pour limit_req
-    Order deny,allow +
-    Deny from all +
-</Files></code>+
  
-Si on veut pouvoir définir explicitement des exceptions pour les fichiers .htpipo par exemple, il faut spécifier l'ordre allow puis deny pour que l'autorisation prime sur l'interdiction. +Créons un fichier pour notre première règle
-Le fichier .htaccess contient les mêmes champs que pour le répertoire /private de l'exemple, c'est-à-dire un nom qui apparaîtra sur la fenêtre de demande d'identification (AuthName), la méthode d'identification (AuthType), le fichier de mot de passe (AuthUserFile) et enfin require valid-user :+
  
-<code>AuthName "my restricted stuff" +<code>sudo nano /etc/fail2ban/filter.d/nginx-conn-limit.conf</code>
-AuthType Basic +
-AuthUserFile "/home/titi/.htpasswd" +
-require valid-user</code>+
  
-Le serveur Apache s'articule sur un ensemble de modules qu'il convient de restreindre au strict nécessaire.+Dans celui-ci, collez les lignes de configuration suivantes 
 +<code> 
 +# Fail2Ban configuration file  
 +# # supports: ngx_http_limit_conn_module 
  
-  Server Side Includes mod_include+[Definition] failregex = limiting connections by zone.*client<HOST> 
  
-Les SSI ont déjà été présentés lors du sixième article sur la programmation sécuriséeIl s'agit d'un vestige de l'époque où les Perl et PHP n'avaient pas encore fait leurs apparitionsIl est fortement conseillé de le supprimé ou de ne l'activé qu'avec prudence Options +IncludesNOEXEC ou Options +Includes.+# Option: ignoreregex  
 +# Notes.: regex to ignoreIf this regex matches, the line is ignored 
 +# Values: TEXT # ignoreregex = 
 +</code>
  
-  * Perl: mod_perl+Créons maintenant notre seconde règle
  
-Le module mod_perl a été le résultat d'une intégration plus poussée des scripts CGI écrits en Perl. Il permet de meilleures performances qu'un script CGI classique. En terme de sécurité, il présente des risques identiques.+<code>sudo nano /etc/fail2ban/filter.d/nginx-req-limit.conf</code> 
 + 
  
-  * PHPmod_php+Dans lequel nous ajoutons la configuration ci-dessous 
 +<code> 
 +# Fail2Ban configuration file #  
 +# supportsngx_http_limit_req_module 
  
-PHP a été conçu spécifiquement pour la programmation web en tenant compte d'impératif de sécurité. Il est grandement paramétrable. Il est conseillé de définir les options suivantes dans son fichier de configuration /etc/php.ini. safe_mode surveille les fichiers accédés et interdit l'usage de commande à risqueexpose_php contrôle l'affichage de sa banner, max_execution_time et memory_limit limite les risques de DoS, magic_quotes_gpc ajoute des quotes pour les données reçues des GET/POST et des cookiesEnfin, souvent oublié en production, il faut éviter l'affichage des lignes fautives lorsque les scripts PHP plantent.+[Definition] failregex = limiting requestsexcess:.* by zone.*client: <HOST> 
  
-<code>safe_mode = On +# Option: ignoreregex  
-expose_php = Off +# Notes.: regex to ignore. If this regex matchesthe line is ignored. # Values: TEXT # ignoreregex 
-max_execution_time = 30 ; Maximum execution time of each scriptin seconds +</code>
-memory_limit 8M +
-magic_quotes_gpc = On +
-display_errors = Off +
-[SQL] +
-sql.safe_mode = On</code>+
  
-  * CGI+Nos règles sont paramétrées, il faut maintenant demander à fail2ban de les utiliser. Modifions la configuration de fail2ban
  
-Il faut limiter leur présence à des répertoires bien déterminés, ils sont alors autorisés par un Options +ExecCGI sur la base d'un répertoire particulier.+<code>sudo nano /etc/fail2ban/jail.local</code> 
 + 
  
-  * Répertoires des utilisateurs mod_userdir+Ajoutons deux blocs 1 par règle 
 +<code> 
 +[nginx-req-limit]  
 +enabled = true  
 +filter = nginx-req-limit  
 +action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]  
 +logpath = /var/log/nginx/*error.log  
 +findtime = 600  
 +bantime = 7200  
 +maxretry = 10 
  
-Les utilisateurs du serveur peuvent bien souvent publier leurs pages dans leur répertoire public_htmlconfiguré via le paramètre UserDir public_html. De façon à éviter une mauvaise surpriseroot n'est pas autorisé à faire de même : UserDir disabled root.+[nginx-conn-limit]  
 +enabled = true  
 +filter = nginx-conn-limit  
 +action = iptables-multiport[name=ConnLimitport="http,https"protocol=tcp]  
 +logpath = /var/log/nginx/*error.log  
 +findtime = 300  
 +bantime = 7200  
 +maxretry = 100 
 +</code>
  
-  * Directory listing : mod_dir, mod_autoindex+Rechargez la configuration de fail2ban
  
-La directive DirectoryIndex définit les pages d'index souvent index.html ou index.php3 et en l'absence de celle-ci, le module mod_autoindex en génère une si l'option Indexes est présente. Les index peuvent aider un pirate à découvrir d'anciennes versions de script, un backup du site ou d'autres documents sensibles.+<code>sudo service fail2ban reload</code> 
 + 
  
-  * Users et users+Vérifiez que les règles soient bien chargées
  
-Le serveur web est lancé par l'utilisateur root ce qui lui permet d'utiliser le port privilégié 80, ensuite il prend l'identité d'un utilisateur sans pouvoir apache ou nobody.+<code>sudo fail2ban-client status</code> 
 + 
  
-<code>User apache +Ce qui dans mon cas me donne
-Group apache</code>+
  
-  * suexec+<code>Status |- Number of jail: 4 `- Jail list: nginx-conn-limit, nginx-req-limit, ssh, nginx-http-auth</code> 
 + 
  
-Le problème est que les scripts s'exécutent tous avec le même id (i.e. le même propriétaire). En conséquence, ils peuvent interférer entre eux. Le programme suexec permet d'utiliser des User/Group différents pour chaque virtual host de façon à séparer les utilisateurs. En contrepartie, un pirate disposant du compte apache est capable d'utiliser ce programme pour corrompre d'autres comptes, c'est pour cela qu'il n'est pas actif par défaut. Il faut lire très attentivement la documentation.+Pour avoir plus d’information sur le nombres d’échecs et bannissements
  
-Il est déjà compilé sur une RedHat mais pas forcément activé, il suffit alors d'un chmod u+s /usr/sbin/suexec pour le rendre actif. +<code>sudo fail2ban-client status nginx-conn-limit && sudo fail2ban-client status nginx-req-limit</code> 
-<code> +  
-ls -/usr/sbin/suexec + 
--r-s--x---    1 root     apache      10976 Mar 29 19:52 /usr/sbin/suexec +Ce qui nous donne 
-# httpd -+ 
-Compiled-in modules+<code>Status for the jail: nginx-conn-limit |- filter | |- File list: /var/log/nginx/error.log | |Currently failed: 0 | `Total failed: 0 `action |Currently banned: 0 | `IP list: `Total banned: 0 Status for the jail: nginx-req-limit |- filter | |- File list: /var/log/nginx/error.log | |Currently failed: 0 | `Total failed0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0</code> 
-  http_core.c +  
-  mod_so.c + 
- suexec: enabled; valid wrapper /usr/sbin/suexec</code>+Si vous effectuez des tests et que votre IP est bannie utilisez la commande suivante 
 + 
 +<code>sudo fail2ban-client set nom-de-regle unbanip XXX.XXX.XXX.XXX</code> 
 + 
install/secureapache.txt · Dernière modification: 2021/07/27 20:51 de linkuff