systemes:web:httpd

Ceci est une ancienne révision du document !


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

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_proxy sert à transmettre les requêtes propres vers le bon serveur.

RHEL :

yum install httpd

Debian :

apt-get install apache2

Test http :

telnet www.domaine.fr 80
GET /index.php HTTP/1.1
Host: www.domaine.fr

Test https :

openssl s_client -connect www.domaine.fr:443
---informations du cert---
GET /index.php HTTP/1.1
Host: www.domaine.fr

Installation

vi /etc/httpd/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
 
       #Controle le flux des requetes
       ProxyVia On

Configuration

       ServerName www.mondomaine.fr
       SSLProxyEngine On
 
 
       ProxyPass / http://site1.mondomaine.fr
       ProxyPassreverse / http://site1.mondomaine.fr
 
 
       ProxyHTMLEnable On
       ProxyHTMLURLMap http://site1.mondomaine.fr /
 
       # Reecriture d'URL
       SetOutputFilter INFLATE;proxy-html;DEFLATE
 
 
               ProxyPassReverse /
               ProxyHTMLEnable On
               ProxyHTMLURLMap http://site1.mondomaine.fr /site1/
               ProxyHTMLURLMap / /site1/
               RequestHeader    unset  Accept-Encoding
 
 
       #
       #        ProxyPassReverse /
       #        ProxyHTMLEnable On
       #        ProxyHTMLURLMap  /      /
       #        RequestHeader    unset  Accept-Encoding
       #

Redémarrer le serveur web

systemctl restart httpd.service

Installation

yum install mod_security mod_security_crs

Configuration

Edit /etc/httpd/conf.d/mod_security.conf

# Default recommended configuration
SecRuleEngine On

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. 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 :

<LocationMatch "/file.php">
SecRuleRemoveById 960015 #ID que l'on peut voir dans les logs [id "960015"]

Désactiver toutes les règles sur des pages spécifiques:

<LocationMatch "/[0-9a-zA-Z/_.+-]+\.example)">
SecRuleEngine off

Désactiver une règle pour une page d’IP:

SecRule REQUEST_HEADERS:x-forwarded-for "@ipmatch xxx.yyy.zzz.0/16" "phase:2,t:none,pass,nolog"

( A completer )Requière mlogc, collecteur de log de ModSecurity

Installation

Ajouter un repos :vi /etc/yum.repos.d/jwall.repo

[jwall]
name=CentOS-jwall - jwall.org packages for noarch
baseurl=http://download.jwall.org/yum/jwall
enabled=1
gpgcheck=1
protect=1

Ajouter la clé du dépot:

rpm --import http://download.jwall.org/chris.gpg
yum install auditconsole

Configuration

/etc/mlogc.conf

# ModSecurity Console receiving URI. You can change the host
# and the port parts but leave everything else as is.
#
ConsoleURI          "http://127.0.0.1:8080/rpc/auditLogReceiver"
CollectorRoot       "/var/log/mlogc"
ErrorLog	    "mlogc.log"
#
# Sensor credentials
#
SensorUsername      "sensor"
SensorPassword      "test"
 
 
 
# Base directory where the audit logs are stored.  This can be specified
# as a path relative to the CollectorRoot, or a full path.
LogStorageDir       "data"
 
# Transaction log will contain the information on all log collector
# activities that happen between checkpoints. The transaction log
# is used to recover data in case of a crash (or if Apache kills
# the process).
TransactionLog      "mlogc-transaction.log"
 
# The file where the pending audit log entry data is kept. This file
# is updated on every checkpoint.
QueuePath           "mlogc-queue.log"
 
# The location of the error log.
ErrorLog            "mlogc-error.log"
 
# The location of the lock file.
#LockFile            "mlogc.lck"
 
# Keep audit log entries after sending? (0=false 1=true)
# NOTE: This is required to be set in SecAuditLog mlogc config if you
# are going to use a secondary console via SecAuditLog2.
KeepEntries         0
systemctl restart auditconsole

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 )

/etc/httpd/conf.d/mod_security.conf

Avec mlogc

....
SecAuditLog "|/usr/bin/mlogc /etc/mlogc.conf"

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

....
SecAuditLog "|/usr/bin/jwall mlogc /etc/mlogc.conf"

Alors on peut utiliser une commande alternative en tache cron pour lancer la collecte:

/usr/bin/jwall send 'http://sensor:test@127.0.0.1:8080/rpc/auditLogReceiver' '/var/log/httpd/modsec_audit.log

Installation

yum install mod_evasive

Configuration

/etc/httpd/conf.d/mod_evasive.conf

LoadModule evasive20_module modules/mod_evasive24.so
#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
#Nombre de requête pour une même page dans l'intervale DOSPageInvernal, au delà, l'IP est bloquée.
 DOSPageCount 2
#Intervalle du nombre de pages en secondes.
 DOSPageInterval 1
#Pareil qu'au dessus mais pour un site au lieu d'une page.
 DOSSiteCount 150
#Intervalle du nombre de sites par secondes.
 DOSSiteInterval 1
#Période en seconde pendant laquelle l'IP sera bloquée.
 DOSBlockingPeriod 60
#IP Jamais blacklistés
 DOSWhitelist 66.249.65.*
 DOSWhitelist 66.249.66.*
 DOSWhitelist 66.249.71.*
#Email de notification
 DOSEmailNotify william.vincent@mondomaine.fr
# Dossiers de logs
 DOSLogDir "/var/log/mod_evasive"
#Commande supplementaire ( %s = IP )
# DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP"
# DOSSystemCommand "/bin/nomduscript.sh %s"
mkdir /var/log/mod_evasive
chown apache:apache /var/log/mod_evasive

Pour tester le fonctionnement : Un script perl plus évolué que celui fourni ( /usr/share/doc/mod_evasive-*/test.pl )

#!/usr/bin/perl -w
# Script original : mod_dosevasive test.pl
# A ajouter : : Permettre un sleep, Choisir un nombre de requetes, 
use IO::Socket;
 
$num_args = $#ARGV + 1;
if ($num_args != 1) {
    	print "\nUsage: ddos_web.pl ipOrNameServer:80\n";
    	exit;
}
 
my $time=time;
 
 
for ($i=0; $i<300; $i++) {	my($response);	my($SOCKET) = new IO::Socket::INET( Proto   => "tcp", PeerAddr=> $ARGV[0]);
	print $SOCKET "GET / HTTP/1.0\n\n";
	$response = <$SOCKET>;
	print $i;
	print $response;
	if ($response =~ "Forbid") { 
		$time=time-$time;
		print "Temps d'execution : ", $time, " secondes \n";
		print "Ip bloquée\n\n";
		exit; 
	}
	close($SOCKET);
 
}
 
print "Le bloquage n'a pas eu lieu";
exit;

Retour

Vous pourriez laisser un commentaire si vous étiez connecté.
  • systemes/web/httpd.1452959727.txt.gz
  • Dernière modification: 2019/02/06 14:02
  • (modification externe)