Ci-dessous, les différences entre deux révisions de la page.
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' | Par défaut, Apache affiche la version que vous utilisez, votre système d' | ||
- | **/ | + | Éditez le fichier |
Nota : sur Apache/ | Nota : sur Apache/ | ||
- | Mettez | ||
- | < | ||
- | ServerTokens Prod</ | ||
+ | Recherchez la ligne contenant | ||
+ | < | ||
+ | et mettez | ||
+ | < | ||
- | * Limitations contre les DOS | + | Recherchez la ligne contenant |
+ | < | ||
+ | et mettez | ||
+ | < | ||
- | 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' | ||
- | Exemple pour un petit serveur : | + | ===== Protéger contre le Clickjacking et le Referer ===== |
- | < | + | Éditez le fichier **/ |
- | KeepAlive On | + | |
- | MaxKeepAliveRequests 100 | + | |
- | KeepAliveTimeout 5</code> | + | |
- | * Bien définir un virtual host | + | Ajouter : |
+ | < | ||
+ | add_header Referrer-Policy strict-origin-when-cross-origin;</ | ||
+ | ===== Restreindre l' | ||
+ | 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, | + | Éditez le fichier **/ |
- | <code><VirtualHost 194.57.201.103> | + | < |
- | 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' | ||
- | | + | ===== Empêcher le parcours d'un répertoire ===== |
+ | Pour empêcher le parcours du répertoire ///web//, ajoutez l' | ||
+ | < | ||
+ | < | ||
+ | Order Allow, | ||
+ | Allow from all | ||
+ | Options -Indexes | ||
+ | </ | ||
- | Apache permet de définir ses propres formats LogFormat pour les enregistrements | + | ===== Désactiver |
+ | Toujours au même endroit, (dans un tag < | ||
+ | < | ||
- | < | ||
- | LogFormat "%h %l %u %t \" | ||
- | LogFormat " | ||
- | LogFormat " | ||
- | Ensuite, on enregistre les informations | + | ===== Désactiver l' |
+ | Si vous n' | ||
+ | < | ||
- | < | ||
- | Suivant l' | + | ===== Empêcher le téléchargement |
+ | < | ||
+ | AccessFileName | ||
+ | <Files ~ "^\.ht"> | ||
+ | Order allow,deny | ||
+ | Deny from all | ||
+ | Satisfy All | ||
+ | </ | ||
+ | </ | ||
- | * 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 |
+ | < | ||
+ | Order Deny, | ||
+ | Deny from all | ||
+ | Allow from 127.0.0.1 | ||
+ | </ | ||
- | * Directory, Files, Location | + | ou encore sur votre réseau local : |
+ | < | ||
+ | Order Deny,Allow | ||
+ | Deny from all | ||
+ | Allow from 192.168.0.0/ | ||
+ | </ | ||
- | La gestion des accès est effectuée par le module mod_access. On manipule principalement trois catégories d' | + | ou interdire une IP précise |
+ | < | ||
+ | Order Allow, | ||
+ | Allow from all | ||
+ | Deny from 192.168.0.5 | ||
+ | </ | ||
- | 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' | + | |
- | < | + | |
- | < | + | |
- | order deny, | + | |
- | deny from all | + | |
- | allow from env=let_me_in | + | |
- | </ | + | |
- | | + | Le principe est le suivant :\\ |
+ | **Allow, | ||
+ | **Deny, | ||
- | Plus sérieusement, | + | Pour ceux qui voudraient aller encore plus loin [[http:// |
+ | ---- | ||
- | < | ||
- | Order deny,allow | ||
- | Deny from all | ||
- | </ | ||
- | Ensuite, il ne reste qu'à valider l' | ||
- | Order indique dans quel ordre les directives deny et allow sont évaluées. Deny from all interdit l' | ||
- | * Options, AllowOverride | ||
- | Options contrôle | ||
- | le suivi des liens symboliques FollowSymLinks/ | + | ===== Bloquer |
- | l' | + | Commencez par ouvrir |
- | les Server Side Includes Includes et IncludesNOEXEC ; | + | |
- | la génération | + | |
- | ainsi que l' | + | |
- | 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' | + | < |
- | < | + | Nous allons utiliser deux variables : |
- | Options SymLinksIfOwnerMatch | + | |
- | AllowOverride None | + | |
- | </ | + | |
- | 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' | + | **limit_req** : permet de limiter le nombre de requetes maximum |
+ | **limit_conn** : permet | ||
- | La directive AllowOverride peut prendre n' | + | Au début du bloc http ajoutez donc les lignes suivantes |
+ | < | ||
+ | #Requete maximun par ip | ||
+ | limit_req_zone $binary_remote_addr zone=flood: | ||
+ | limit_req zone=flood burst=100 nodelay; | ||
- | * Protection | + | #Connexions maximum |
+ | limit_conn_zone $binary_remote_addr zone=ddos: | ||
+ | limit_conn ddos 100; | ||
+ | </ | ||
- | Le module mod_auth | + | L’exemple ci-dessus vous permet de limiter une IP à 100 connexions simultanées ou 100 requêtes |
- | < | + | Testez donc la configuration de votre serveur |
- | AllowOverride AuthConfig | + | |
- | Options SymLinksIfOwnerMatch | + | |
- | </ | + | |
- | ou pour bloquer l' | + | < |
+ | |||
- | < | + | Si tout fonctionne redémarrez le |
- | Options None | + | |
- | AllowOverride None | + | |
- | AuthName " | + | |
- | AuthType Basic | + | |
- | AuthUserFile "/ | + | |
- | require valid-user | + | |
- | </ | + | |
- | Dans le cas des pages personnelles | + | < |
- | < | + | ===== 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 logs. Si 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, | + | |
- | Deny from all | + | |
- | </ | + | |
- | Si on veut pouvoir définir explicitement des exceptions pour les fichiers .htpipo par exemple, il faut spécifier l' | + | Créons un fichier pour notre première règle |
- | Le fichier | + | |
- | < | + | < |
- | AuthType Basic | + | |
- | AuthUserFile "/home/titi/.htpasswd" | + | |
- | require valid-user</ | + | |
- | Le serveur Apache s' | + | Dans celui-ci, collez les lignes |
+ | < | ||
+ | # Fail2Ban configuration file | ||
+ | # # supports: ngx_http_limit_conn_module | ||
- | | + | [Definition] failregex = limiting connections by zone.*client: < |
- | Les SSI ont déjà été présentés lors du sixième article sur la programmation sécurisée. Il s'agit d'un vestige de l' | + | # Option: ignoreregex |
+ | # Notes.: regex to ignore. If this regex matches, the line is ignored. | ||
+ | # Values: TEXT # ignoreregex = | ||
+ | </ | ||
- | * Perl: mod_perl | + | Créons maintenant notre seconde règle |
- | Le module mod_perl a été le résultat | + | < |
+ | |||
- | * PHP: mod_php | + | Dans lequel nous ajoutons la configuration ci-dessous |
+ | < | ||
+ | # Fail2Ban configuration file # | ||
+ | # supports: ngx_http_limit_req_module | ||
- | PHP a été conçu spécifiquement pour la programmation web en tenant compte d' | + | [Definition] failregex = limiting requests, excess:.* by zone.*client: < |
- | < | + | # Option: ignoreregex |
- | expose_php = Off | + | # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex |
- | max_execution_time = 30 ; Maximum execution time of each script, in seconds | + | </ |
- | memory_limit | + | |
- | magic_quotes_gpc = On | + | |
- | display_errors = Off | + | |
- | [SQL] | + | |
- | sql.safe_mode = On</ | + | |
- | * CGI | + | Nos règles sont paramétrées, |
- | Il faut limiter leur présence à des répertoires bien déterminés, | + | < |
+ | |||
- | * Répertoires des utilisateurs | + | Ajoutons deux blocs : 1 par règle |
+ | < | ||
+ | [nginx-req-limit] | ||
+ | enabled = true | ||
+ | filter = nginx-req-limit | ||
+ | action = iptables-multiport[name=ReqLimit, | ||
+ | logpath = / | ||
+ | findtime = 600 | ||
+ | bantime = 7200 | ||
+ | maxretry = 10 | ||
- | Les utilisateurs du serveur peuvent bien souvent publier leurs pages dans leur répertoire public_html, configuré via le paramètre UserDir public_html. De façon à éviter une mauvaise surprise, root n'est pas autorisé à faire de même : UserDir disabled root. | + | [nginx-conn-limit] |
+ | enabled = true | ||
+ | filter = nginx-conn-limit | ||
+ | action = iptables-multiport[name=ConnLimit, port=" | ||
+ | logpath = / | ||
+ | findtime = 300 | ||
+ | bantime = 7200 | ||
+ | maxretry = 100 | ||
+ | </ | ||
- | * Directory listing : mod_dir, mod_autoindex | + | Rechargez la configuration de fail2ban |
- | La directive DirectoryIndex définit les pages d' | + | < |
+ | |||
- | * Users et users | + | Vérifiez que les règles soient bien chargées |
- | Le serveur web est lancé par l' | + | < |
+ | |||
- | < | + | Ce qui dans mon cas me donne |
- | Group apache</ | + | |
- | * suexec | + | < |
+ | |||
- | Le problème est que les scripts s' | + | Pour avoir plus d’information sur le nombres |
- | Il est déjà compilé sur une RedHat mais pas forcément activé, il suffit alors d'un chmod u+s /usr/ | + | < |
- | < | + | |
- | ls -l /usr/sbin/suexec | + | |
- | -r-s--x--- 1 root | + | Ce qui nous donne |
- | # httpd -l | + | |
- | Compiled-in modules: | + | < |
- | | + | |
- | | + | |
- | suexec: enabled; valid wrapper / | + | Si vous effectuez des tests et que votre IP est bannie utilisez la commande suivante |
+ | |||
+ | < | ||
+ |