systemes:web:httpd

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 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.
  • 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 par conséquent 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
  • httpd.conf
    ##################################
    # Configuration relative au serveur
    ##################################
     
    # Ecoute du serveur
    Listen 80
    ServerName <nomduserveur>.domaine.fr
    ServerAdmin webmaster@domaine.fr
     
    # Directory par defaut
    DocumentRoot "/usr/local/WWW"
     
    ##################################
    # Configuration generale
    ##################################
     
    # Process
    ServerRoot "/etc/httpd"
    PidFile run/httpd.pid
     
    # Permet de garder un certain laps de temps les connexions ouverte
    KeepAlive On
     
    # Nombre de connexion ouverte à garder
    MaxKeepAliveRequests 200
     
    # Temps avant qu'une connexion soit fermée faute de demande
    KeepAliveTimeout 15
     
    # User d'execution du serveur
    User apache
    Group apache
     
    ##################################
    # Serveur/ Modules 
    ##################################
     
    # Inclusion des modules
    Include conf.modules.d/*.conf
     
    # Multi-Processing Modules - Nombre de serveur/worker
    #// 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
  • Exemple de vhost:
    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>

Configuration

  • Configuration du module de proxy
    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

  • Exemple de configuration de proxypass vers l'app1 défini précédemment dans un vhost
    vhost.d/00-defaut.conf
    <VirtualHost *:443>
            ###
            # Parametres vhost
            ###
     
           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> 
  • 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'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 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épôt:
    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é 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 nécessaire pour parcourir la
    #table, plus la valeur sera petite, plus le parcours de la table sera rapide.
     DOSHashTableSize 3097
    #Nombre de requêtes 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 secondes 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 requêtes, 
    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;

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 :
  • <VirtualHost *:443>
            ServerName domaine.fr
    	Protocols h2 h2c http/1.1

Rewrite

  • Redirect dans un sous dossier enfant: ( évite loop /REPERTOIRE/cible/cible/cible/cible/cible/cible/cible )
            RewriteCond %{REQUEST_URI} !^/site/.*$
            RewriteRule    "^/REPERTOIRE$" "/REPERTOIRE/cible" [R,L]

Retour

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