systemes:web:httpd

Différences

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

Lien vers cette vue comparative

Prochaine révision
Révision précédente
systemes:web:httpd [2016/01/16 16:55]
william créée
systemes:web:httpd [2019/02/06 14:03] (Version actuelle)
Ligne 3: Ligne 3:
 ===== Introduction ===== ===== Introduction =====
  
-**apache2/httpd** +  * **apache2/httpd** 
  
-**mod_security** est un "web application firewall" (WAF) et un IDS/IPS (système détection/prévention d'intrusion) pour les applications web. Il surveille le traffic HTTP en temps réel et protège les applications web des attaques. Il peut utiliser les règles CRS d'OWASP. Il filtre et modifie la réponse renvoyé par le serveur web. https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project+  * **mod_security** est un "web application firewall" (WAF) et un IDS/IPS (système détection/prévention d'intrusion) pour les applications web. Il surveille le trafic HTTP en temps réel et protège les applications web des attaques. Il peut utiliser les règles CRS d'OWASP. Il filtre et modifie la réponse renvoyée par le serveur web. https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project
  
-**AuditConsole** est une console web pour afficher les logs de modsecurity plus clairement.+  * **AuditConsole** est une console web pour afficher les logs de modsecurity plus clairement.
  
-**mod_evasive** est un module Apache pour contrer les attaques DoS (Denial of Service). Il est par exemple capable de détecter lorsqu'un utilisateur demande un trop grand nombre de pages sur un site web, sur un délai de temps très court, et de bloquer son IP par iptables.+  * **mod_evasive** est un module Apache pour contrer les attaques DoS (Denial of Service). Il est par exemplecapable de détecter lorsqu'un utilisateur demande un trop grand nombre de pages sur un site web, sur un délai de temps très court, et par conséquent de bloquer son IP par iptables.
  
-**mod_proxy** sert à transmettre les requêtes propres vers le bon serveur.+  * **mod_proxy** sert à transmettre les requêtes propres vers le bon serveur.
  
 ===== Installation ===== ===== Installation =====
  
-RHEL :  +  * RHEL : <code bash>
-<code bash>+
 yum install httpd yum install httpd
 </code> </code>
  
  
-Debian : +  * Debian : <code bash>
-<code bash>+
 apt-get install apache2 apt-get install apache2
 </code> </code>
Ligne 28: Ligne 26:
 ===== Tests de fonctionnement ===== ===== Tests de fonctionnement =====
  
- +  * Test http : <code bash>
- +
-Test http : +
-<code bash>+
 telnet www.domaine.fr 80 telnet www.domaine.fr 80
 GET /index.php HTTP/1.1 GET /index.php HTTP/1.1
Ligne 38: Ligne 33:
  
  
-Test https : +  * Test https : <code bash>
- +
-<code bash>+
 openssl s_client -connect www.domaine.fr:443 openssl s_client -connect www.domaine.fr:443
 ---informations du cert--- ---informations du cert---
Ligne 47: Ligne 40:
 </code> </code>
  
-===== Sécurisation du serveur =====+===== Configuration du serveur =====
  
 +====Configuration conseillé====
  
 +  * <file bash httpd.conf>
 +##################################
 +# Configuration relative au serveur
 +##################################
  
 +# Ecoute du serveur
 +Listen 80
 +ServerName <nomduserveur>.domaine.fr
 +ServerAdmin webmaster@domaine.fr
  
-====Proxy_http==== +# Directory par defaut 
-===Installation=== +DocumentRoot "/usr/local/WWW"
-vi /etc/httpd/conf.d/proxy.conf+
  
-<code bash>      ProxyPreserveHost On +################################## 
-       On interdit de se servir du serveur en tant que mandataire +Configuration generale 
-      ProxyRequests Off+##################################
  
-        +Process 
-               AddDefaultCharset off +ServerRoot "/etc/httpd" 
-               Order deny,allow +PidFile run/httpd.pid
-               Allow from all +
-        +
-       #Controle le flux des requetes +
-       ProxyVia On +
-</code>+
  
 +# Permet de garder un certain laps de temps les connexions ouverte
 +KeepAlive On
  
-===Configuration=== +# Nombre de connexion ouverte à garder 
-<code bash>       ServerName www.mondomaine.fr +MaxKeepAliveRequests 200
-       SSLProxyEngine On+
  
 +# Temps avant qu'une connexion soit fermée faute de demande
 +KeepAliveTimeout 15
  
-       ProxyPass / http://site1.mondomaine.fr +# User d'execution du serveur 
-       ProxyPassreverse / http://site1.mondomaine.fr+User apache 
 +Group apache
  
 +##################################
 +# Serveur/ Modules 
 +##################################
  
-       ProxyHTMLEnable On +# Inclusion des modules 
-       ProxyHTMLURLMap http://site1.mondomaine.fr /+Include conf.modules.d/*.conf
  
-       Reecriture d'URL +Multi-Processing Modules - Nombre de serveur/worker 
-       SetOutputFilter INFLATE;proxy-html;DEFLATE+#// InfoDoc: Le MPM prefork utilise plusieurs processus enfants possédant chacun un seul thread.  
 +#// Chaque processus gère une seule connexion à la fois. Sur de nombreux systèmes, prefork est comparable en matière de vitesse à worker 
 +#// mais il utilise plus de mémoire 
 +#// Si probleme de perf, il faudra passer en mode "event" 
 +<IfModule prefork.c> 
 + # Nombre min de processus serveurs enfants inactifs 
 + MinSpareServers    8 
 + # Nombre max de processus serveurs enfants inactifs 
 + MaxSpareServers   25 
 + # Nombre max de processus serveurs enfants en parralèle ( Anciennement MaxClients ) - (Calcul : RAM Mo / 30 ) 
 + # ( Defaut MaxRequestWorkers       256) 
 + # Nombre de requetes avant de tuer le worker ( Anciennement MaxRequestsPerChild )  
 + #// Calcul : total amount of daily requests / total number of daily processes 
 + MaxConnectionsPerChild  1000 
 + #// Avec les MPMs prefork et event, n'utilisez cette directive que si vous devez définir MaxRequestWorkers à une valeur supérieure à 256 
 + #// ( Default ServerLimit      200) 
 + #// Prechauffe du serveur au demarrage Dans notre cas il ne sert pas de specifier  
 + #// ( Default StartServers 5)
  
 +</IfModule>
 +
 +# Configuration ancienne désormais native en apache 2.4
 +#// AutoIndentification IP:Port
 +#// (Default UseCanonicalName Off )
 +#// Desactiver reverse DNS 
 +#// (Default HostnameLookups off )
 +#// Desactiver l'envoi de fichier 
 +#// (Default EnableSendfile Off ) 
 +#// Nom des fichier htaccess 
 +#// (Default AccessFileName .htaccess )
 +#// Temps pour fermer une connection ouverte mais qui n'a pas été utilisée - Baisser en cas de DDOS 
 +#// (Default: Timeout 300)
 +
 +################################## 
 +# Securité 
 +##################################
 +
 +# Prod="Server: Apache"                                                  
 +ServerTokens Prod
 +# Aucune infos sur les pages d'erreurs
 +ServerSignature Off
 +
 +# Interdire de parcourir l'ensemble du systeme de fichier
 +<Directory "/">
 + AllowOverride none
 + Require all denied
 +</Directory>
 +
 +<Files ".ht*">
 + Require all denied
 +</Files>
 +
 +<IfModule mod_userdir.c>
 + UserDir disabled root
 +</IfModule>
 +
 +
 +##################################
 +# Configuration types de fichiers et langue
 +##################################
 +
 +<IfModule mime_module>
 + TypesConfig /etc/mime.types
 +
 + AddType application/x-compress .Z
 + AddType application/x-gzip .gz .tgz
 + # Permettre les SSI (Inclusions Côté Serveur)
 + AddType text/html .shtml
 + AddOutputFilter INCLUDES .shtml
 +
 + AddEncoding x-compress Z
 + AddEncoding x-gzip gz
 + AddLanguage en .en
 + AddLanguage fr .fr
 + AddLanguage de .de
 + AddLanguage da .da
 + AddLanguage el .el
 + AddLanguage it .it
 +</IfModule>
 +
 +<IfModule mime_magic_module>
 + MIMEMagicFile conf/magic
 +</IfModule>
 +
 +
 +<IfModule mod_negotiation>
 + LanguagePriority  fr en de
 + ForceLanguagePriority Prefer Fallback
 +</IfModule>
 +
 +<IfModule dir_module>
 +    DirectoryIndex index.html
 +</IfModule>
 +
 +
 +##################################
 +# Mise en forme des logs
 +##################################
 +
 +ErrorLog "logs/error_log"
 +LogLevel warn
 +
 +<IfModule log_config_module>
 +    #
 +    # The following directives define some format nicknames for use with
 +    # a CustomLog directive (see below).
 +    #
 +    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
 +    LogFormat "%h %l %u %t \"%r\" %>s %b" common
 +
 +    <IfModule logio_module>
 +      # You need to enable mod_logio.c to use %I and %O
 +      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
 +    </IfModule>
 +
 +    CustomLog "logs/access_log" combined
 +</IfModule>
 +
 +##################################
 +# Supplemental configuration
 +##################################
 +
 +IncludeOptional conf.d/*.conf
 +
 +##################################
 +# Configuration des vhost 
 +# // Lu par ordre alphabetique 0-z
 +##################################
 +
 +Include vhost.d/*.conf
 +
 +</file>
 +
 +==== VirtualHost ====
 +  * Exemple de vhost: <file bash vhost.d/00-default.conf>
 +
 +####################################################
 +# HTTP - Redirection vers SSL
 +####################################################
 +
 +<VirtualHost nomduserveur.domaine.fr:80>
 + ###
 + # Parametres vhost
 + ###
 + ServerName nomduserveur.domaine.fr
 + ServerAdmin webmaster@domaine.fr
 + ErrorLog /var/log/httpd/www_error.log
 + LogLevel debug
 + CustomLog /var/log/httpd/www_access.log combined
 +
 + ###
 + # Redirection vers SSL
 + ###
 + RewriteEngine on
 + RewriteCond %{HTTPS} off
 + RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
 +
 +</VirtualHost>
 +
 +####################################################
 +# HTTPS
 +####################################################
 +
 +<VirtualHost nomduserveur.domaine.fr:443>
 + ###
 + # Parametres vhost
 + ###
 + DocumentRoot "/local/dataWeb/"
 + ServerName nomduserveur.domaine.fr
 + ServerAdmin webmaster@domaine.fr
 + SSLEngine on
 + ErrorLog /var/log/httpd/www_error.log
 + LogLevel warn
 + CustomLog /var/log/httpd/www_access.log combined
 +
 +
 + <Location /server-status>
 + SetHandler server-status
 + AuthName "Administrateur du serveur"
 + AuthType Basic
 + AuthBasicProvider ldap
 + Require group-admin
 + </Location>
 +
 + <Location /server-info>
 + SetHandler server-info
 + AuthName "Administrateur du serveur"
 + AuthType Basic
 + AuthBasicProvider ldap
 + Require group-admin
 + </Location>
 +
 + <Directory "/local/dataWeb/">
 + # On interdit tout accès
 + AllowOverride none 
 + Require all none
 + </Directory>
 +
 +        <Directory "/local/dataWeb/app1/">
 + # Eviter FollowSymlinks à la racine, cela reduit les performances apache
 +                Options Indexes FollowSymLinks
 + # Si besoin d'un htaccess, mais il serait préférable d'indiqué ici les paramètres de l'application
 +                AllowOverride All
 + # On autorise l'accès au répertoire
 +                Require all granted
 +        </Directory>
 +</VirtualHost>
 +
 +</file>
 +
 +====Proxy_http====
 +=== Configuration ===
 +
 +  * Configuration du module de proxy <file bash conf.d/proxy.conf>      ProxyPreserveHost On
 +       # On interdit de se servir du serveur en tant que mandataire
 +       ProxyRequests Off
 +       AddDefaultCharset off
 +       Order deny,allow
 +       Allow from all
                
-               ProxyPassReverse / +       #Controle le flux des requetes 
-               ProxyHTMLEnable On +       ProxyVia On 
-               ProxyHTMLURLMap http://site1.mondomaine.fr /site1/ +</file>
-               ProxyHTMLURLMap / /site1/ +
-               RequestHeader    unset  Accept-Encoding +
-       +
  
-       # 
-       #        ProxyPassReverse / 
-       #        ProxyHTMLEnable On 
-       #        ProxyHTMLURLMap  /      / 
-       #        RequestHeader    unset  Accept-Encoding 
-       # 
  
-</code>+===Configuration=== 
 +  * Exemple de configuration de proxypass vers l'app1 défini précédemment dans un vhost <file bash vhost.d/00-defaut.conf> 
 +<VirtualHost *:443> 
 +        ### 
 +        # Parametres vhost 
 +        ###
  
-Redémarrer le serveur web+       ServerName www.domaine.fr 
 +       ServerAdmin webmaster@domaine.fr 
 +       ServerAlias domaine.fr 
 +       ErrorLog /var/log/httpd/www_error.log 
 +       LogLevel warn 
 +       CustomLog /var/log/httpd/www_access.log combined 
 +        
 +       ### 
 +       # Parametres SSL 
 +       ### 
 +       SSLEngine on 
 +       SSLProxyEngine On 
 +        
 +        
 +       <Location "/app1"> 
 +             ProxyPass https://nomduserver.domaine.fr/app1 
 +             ProxyPassReverse  https://nomduserver.domaine.fr/app1 
 +       </Location> 
 +        
 +</VirtualHost>  
 +</file>
  
-<code bash>systemctl restart httpd.service</code>+  * Redémarrer le serveur web : <code bash>systemctl restart httpd.service</code>
  
 ====mod_security==== ====mod_security====
 ===Installation=== ===Installation===
-<code bash>yum install mod_security mod_security_crs</code>+  * <code bash>yum install mod_security mod_security_crs</code>
  
 ===Configuration==== ===Configuration====
-Edit /etc/httpd/conf.d/mod_security.conf +  * Edit /etc/httpd/conf.d/mod_security.conf <code bash># Default recommended configuration
- +
-<code bash># Default recommended configuration+
 SecRuleEngine On SecRuleEngine On
 </code> </code>
  
-On passe **SecRuleEngine** à la valeur **DetectionOnly** afin de ne faire que de la journalisation d'erreur sans bloquer les requêtes. On pourra la mettre à **On** quand il n'y aura plus de fonctions bloquantes.+  * On passe **SecRuleEngine** à la valeur **DetectionOnly** afin de ne faire que de la journalisation d'erreurs sans bloquer les requêtes. On pourra la mettre à **On** quand il n'y aura plus de fonctions bloquantes.
 Les logs des actions de mod_security sont dans le fichier /var/log/httpd/modsec_audit.log Les logs des actions de mod_security sont dans le fichier /var/log/httpd/modsec_audit.log
 Pour désactiver une règle pour une page spécifique : Pour désactiver une règle pour une page spécifique :
  
-<code bash><LocationMatch "/file.php">+  * <code bash><LocationMatch "/file.php">
 SecRuleRemoveById 960015 #ID que l'on peut voir dans les logs [id "960015"] SecRuleRemoveById 960015 #ID que l'on peut voir dans les logs [id "960015"]
 </code> </code>
  
-Désactiver toutes les règles sur des pages spécifiques: +  * Désactiver toutes les règles sur des pages spécifiques: <code bash><LocationMatch "/[0-9a-zA-Z/_.+-]+\.example)">
- +
-<code bash><LocationMatch "/[0-9a-zA-Z/_.+-]+\.example)">+
 SecRuleEngine off SecRuleEngine off
 </code> </code>
  
-Désactiver une règle pour une page d’IP: +  * Désactiver une règle pour une page d’IP: <code bash>SecRule REQUEST_HEADERS:x-forwarded-for "@ipmatch xxx.yyy.zzz.0/16" "phase:2,t:none,pass,nolog"
- +
-<code bash>SecRule REQUEST_HEADERS:x-forwarded-for "@ipmatch xxx.yyy.zzz.0/16" "phase:2,t:none,pass,nolog"+
 </code> </code>
  
Ligne 140: Ligne 370:
  
 ===Installation=== ===Installation===
-Ajouter un repos :vi /etc/yum.repos.d/jwall.repo +  * Ajouter un repos :vi /etc/yum.repos.d/jwall.repo <code bash>[jwall]
- +
-<code bash>[jwall]+
 name=CentOS-jwall - jwall.org packages for noarch name=CentOS-jwall - jwall.org packages for noarch
 baseurl=http://download.jwall.org/yum/jwall baseurl=http://download.jwall.org/yum/jwall
Ligne 150: Ligne 378:
 </code> </code>
  
-Ajouter la clé du dépot:+  * Ajouter la clé du dépôt<code bash>rpm --import http://download.jwall.org/chris.gpg</code>
  
-<code bash>rpm --import http://download.jwall.org/chris.gpg</code> +  * <code bash>yum install auditconsole</code>
- +
- +
-<code bash>yum install auditconsole</code>+
  
 ===Configuration=== ===Configuration===
-/etc/mlogc.conf +  * /etc/mlogc.conf <code bash># ModSecurity Console receiving URI. You can change the host
- +
-<code bash># ModSecurity Console receiving URI. You can change the host+
 # and the port parts but leave everything else as is. # and the port parts but leave everything else as is.
 # #
Ligne 201: Ligne 424:
 </code> </code>
  
-<code bash>systemctl restart auditconsole</code>+  * <code bash>systemctl restart auditconsole</code>
  
 ===Utilisation=== ===Utilisation===
-http://adresse-du-serveur:8080/si le serveur n'est pas accessible edit jdk1.6 -> jdk1.7 (ou 1.8) dans /etc/init.d/auditconsole ( :s/1.6/1.7/g && systemctl daemon-reload )+  * http://adresse-du-serveur:8080/si le serveur n'est pas accessible edit jdk1.6 -> jdk1.7 (ou 1.8) dans /etc/init.d/auditconsole ( :s/1.6/1.7/g && systemctl daemon-reload )
  
 +  * /etc/httpd/conf.d/mod_security.conf
  
-/etc/httpd/conf.d/mod_security.conf +  * Avec mlogc <code bash>....
- +
-Avec mlogc +
- +
-<code bash>....+
 SecAuditLog "|/usr/bin/mlogc /etc/mlogc.conf" SecAuditLog "|/usr/bin/mlogc /etc/mlogc.conf"
 </code> </code>
  
-Si vous ne pouvez pas installer/compiler mod_security, jwall fourni un outil pour collecter les logs, mais j'ai rencontrés des problèmes+  * Si vous ne pouvez pas installer/compiler mod_security, jwall fourni un outil pour collecter les logs, mais j'ai rencontré des problèmes
  
-<code bash>....+  * <code bash>....
 SecAuditLog "|/usr/bin/jwall mlogc /etc/mlogc.conf" SecAuditLog "|/usr/bin/jwall mlogc /etc/mlogc.conf"
 </code> </code>
  
-Alors on peut utiliser une commande alternative en tache cron pour lancer la collecte:+  * Alors on peut utiliser une commande alternative en tache cron pour lancer la collecte:
  
-<code bash>/usr/bin/jwall send 'http://sensor:test@127.0.0.1:8080/rpc/auditLogReceiver' '/var/log/httpd/modsec_audit.log+  * <code bash>/usr/bin/jwall send 'http://sensor:test@127.0.0.1:8080/rpc/auditLogReceiver' '/var/log/httpd/modsec_audit.log
 </code> </code>
  
 ====mod_evasive==== ====mod_evasive====
 ===Installation=== ===Installation===
-<code bash>yum install mod_evasive</code>+  * <code bash>yum install mod_evasive</code>
  
 ===Configuration=== ===Configuration===
-/etc/httpd/conf.d/mod_evasive.conf +  * /etc/httpd/conf.d/mod_evasive.conf <code bash>LoadModule evasive20_module modules/mod_evasive24.so 
- +#Taille de la table hash, plus grande est la valeur, plus de mémoire sera nécessaire pour parcourir la 
-<code bash>LoadModule evasive20_module modules/mod_evasive24.so +#table, plus la valeur sera petite, plus le parcours de la table sera rapide.
-#Taille de la table hash, plus grande est la valeur, plus de mémoire sera necessaire pour parcourir la +
-#table, plus la valeur sera petite, plus le parcourt de la table sera rapide.+
  DOSHashTableSize 3097  DOSHashTableSize 3097
-#Nombre de requête pour une même page dans l'intervale DOSPageInvernal, au delà, l'IP est bloquée.+#Nombre de requêtes pour une même page dans l'intervale DOSPageInvernal, au delà, l'IP est bloquée.
  DOSPageCount 2  DOSPageCount 2
 #Intervalle du nombre de pages en secondes. #Intervalle du nombre de pages en secondes.
Ligne 245: Ligne 463:
 #Intervalle du nombre de sites par secondes. #Intervalle du nombre de sites par secondes.
  DOSSiteInterval 1  DOSSiteInterval 1
-#Période en seconde pendant laquelle l'IP sera bloquée.+#Période en secondes pendant laquelle l'IP sera bloquée.
  DOSBlockingPeriod 60  DOSBlockingPeriod 60
 #IP Jamais blacklistés #IP Jamais blacklistés
Ligne 260: Ligne 478:
 </code> </code>
  
-<code bash>mkdir /var/log/mod_evasive+  * <code bash>mkdir /var/log/mod_evasive
 chown apache:apache /var/log/mod_evasive chown apache:apache /var/log/mod_evasive
 </code> </code>
  
-Pour tester le fonctionnement : Un script perl plus évolué que celui fourni ( /usr/share/doc/mod_evasive-*/test.pl ) +  * Pour tester le fonctionnement : Un script perl plus évolué que celui fourni ( /usr/share/doc/mod_evasive-*/test.pl ) <code perl>#!/usr/bin/perl -w
- +
-<code perl>#!/usr/bin/perl -w+
 # Script original : mod_dosevasive test.pl # Script original : mod_dosevasive test.pl
-# A ajouter : : Permettre un sleep, Choisir un nombre de requetes+# A ajouter : : Permettre un sleep, Choisir un nombre de requêtes
 use IO::Socket; use IO::Socket;
  
Ligne 298: Ligne 514:
 exit; exit;
  
 +</code>
 +
 +====HTTP2  ====
 +===Activation dans le vhost ===
 +  * HTTP2 est un module d'apache qui permet de mutualiser un socket afin d'y envoyer plusieurs données simultanément 
 +  * Par exemple pour adminwiki.fr nous sommes passé de 2.8 secondes de chargement pour la page d'accueil à 2.2 secondes
 +  * Certain navigateur ne l'implémente que pour TLS
 +  * Après avoir charger le module http2, la configuration se fait au niveau du vhost : 
 +  * <code bash>
 +<VirtualHost *:443>
 +        ServerName domaine.fr
 + Protocols h2 h2c http/1.1
 +</code>
 +
 +==== Astuces en vrac  ====
 +
 +=== Rewrite ===
 +
 +  * Redirect dans un sous dossier enfant: ( évite loop /REPERTOIRE/cible/cible/cible/cible/cible/cible/cible ) <code bash>
 +        RewriteCond %{REQUEST_URI} !^/site/.*$
 +        RewriteRule    "^/REPERTOIRE$" "/REPERTOIRE/cible" [R,L]
 </code> </code>
  
  
 [[systemes:start|Retour]] [[systemes:start|Retour]]
  • systemes/web/httpd.1452959727.txt.gz
  • Dernière modification: 2019/02/06 14:02
  • (modification externe)