From fb1fcf75d157e59845fc7f7f1143c80355eb01b1 Mon Sep 17 00:00:00 2001 From: Jeremy Lecour Date: Tue, 20 Jun 2017 12:04:51 +0200 Subject: [PATCH] Mise en forme Apache --- reveal/httpd.html | 359 +++++++++++++++++++++++++++++++--------------- 1 file changed, 246 insertions(+), 113 deletions(-) diff --git a/reveal/httpd.html b/reveal/httpd.html index 6eb329c..604c130 100644 --- a/reveal/httpd.html +++ b/reveal/httpd.html @@ -46,77 +46,107 @@

Services HTTP

-Apache est le serveur HTTP le plus utilisé sur le web depuis 1996. +
+
+

Apache

+ Serveur HTTP le plus utilisé, depuis 1996 +
-# apt install apache2-mpm-itk libapache2-mod-evasive apachetop libwww-perl +
+

Installation

+

+# apt install apache2-mpm-itk \
+              libapache2-mod-evasive apachetop libwww-perl
+    
+
+
+

Fichiers de configuration

+
 /etc/apache2/
-|-- apache2.conf
-|       `--  ports.conf
-|-- mods-enabled
-|       |-- *.load
-|       `-- *.conf
-|-- conf-enabled
-|       `-- *.conf
-`-- sites-enabled
-        `-- *.conf
+├── apache2.conf
+├── conf-available
+│   └── *.conf
+├── conf-enabled
+│   └── *.conf -> ../conf-available/*.conf
+├── envvars
+├── magic
+├── mods-available
+│   ├── *.conf
+│   └── *.load
+├── mods-enabled
+│   ├── *.conf -> ../mods-available/*.conf
+│   └── *.load -> ../mods-available/*.load
+├── ports.conf
+├── sites-available
+│   └── *.conf
+└── sites-enabled
+    └── *.conf -> ../sites-available/*.conf
+    
+
-# a2enmod rewrite expires headers rewrite cgi +
+

Des modules à la carte

+

+      # a2enmod rewrite expires headers rewrite cgi
+    
+
-ServerTokens Prod -Timeout 10 -KeepAliveTimeout 2 -MaxKeepAliveRequests 10 -ServerLimit 250 -#MaxClients 250 -MaxRequestWorkers 250 -StartServers 50 -MinSpareServers 20 -MaxSpareServers 30 -MaxRequestsPerChild 100 - - AllowOverride None - Require all granted - - -SSLProtocol all -SSLv2 -SSLv3 -SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!RC4 - +
+

Optimisations "Evolix"

+

+      ServerTokens Prod
+      Timeout 10
+      KeepAliveTimeout 2
+      MaxKeepAliveRequests 10
+      ServerLimit 250
+      #MaxClients 250
+      MaxRequestWorkers 250
+      StartServers 50
+      MinSpareServers 20
+      MaxSpareServers 30
+      MaxRequestsPerChild 100
+      
+          AllowOverride None
+          Require all granted
+      
+      
+      SSLProtocol all -SSLv2 -SSLv3
+      SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!RC4
+      
+    
+
-/etc/apache2/envvars +
+

Forcer le umask

+
# grep umask /etc/apache2/envvars
 umask 007
+
+
-VirtualHost -Le terme VirtualHost correspond à la séparation de plusieurs sites sur un même serveur HTTP. Apache permet d’avoir des VirtualHost basés sur des noms de domaine différents (ou des adresses IP différentes). +
+

VirtualHost

+
    +
  • Permet de séparer de plusieurs sites sur un même serveur HTTP
  • +
  • Séparation par nom de domaine ou par adresses IP
  • +
+
-Exemple d’un VirtualHost basé sur un nom de domaine via /etc/apache2/sites-available/example.conf : - +
+

VirtualHost basé sur un nom de domaine

+ +

+<VirtualHost *:80>
     ServerName www.example.com
     ServerAlias example.com
 
     DocumentRoot /home/example/www/
-    
+    <Directory /home/example/www/>
         Options SymLinksIfOwnerMatch
         AllowOverride AuthConfig Limit FileInfo Indexes
-    
-
-    ScriptAlias /cgi-foo /usr/lib/cgi-bin/
-    
-        Options ExecCGI -MultiViews
-        AllowOverride None
-
-        AuthType Basic
-        AuthName "Restricted"
-        AuthUserFile /home/example/.htpasswd
-        require valid-user
-
-        Deny from all
-        Include ipaddr_whitelist.conf
-        Allow from 192.0.2.43
-        Satisfy any
-    
+    </Directory>
 
     AssignUserID www-example example
     MaxClientsVHost 150
@@ -129,45 +159,92 @@ Exemple d’un VirtualHost basé sur un nom de domaine via /etc/apache2/sites-av
     UseCanonicalName On
     RewriteCond %{HTTP_HOST} !^www.example.com$
     RewriteRule ^/(.*) http://%{SERVER_NAME}/$1 [L,R]
+</VirtualHost>
+    
- -# vim: set filetype=apache expandtab shiftwidth=4 softtabstop=4 tabstop=4 : +
+
+

Activation du site

+

 # adduser example
 # adduser --ingroup example www-example
-# mkdir /home/example/{www,log,awstats} && chown example: /home/example/{www,log,awstats}
+# mkdir /home/example/{www,log,awstats}
+# chown example: /home/example/{www,log,awstats}
 # a2ensite example
+    
+
- -Gestion des droits -Séparation complète des VirtualHost - -L’utilisation d’Apache-ITK nous permet d’utiliser des utilisateurs/groupes Unix distincts pour chaque VirtualHost. Il est donc impossible pour un utilisateur d’accéder en lecture à des fichiers d’un autre site, même si un langage dynamique comme PHP est utilisé. - +
+

Gestion des droits avec Apache-ITK

+
    +
  • user/group distincts pour chaque VirtualHost
  • +
  • séparation stricte des droits
  • +
  • … y compris la lecture
  • +
  • … y compris avec PHP
  • +
+

 # chmod 750 /home/example
+      
+
-Restriction en écriture pour Apache - -Par défaut on souhaite donner uniquement un droit de lecture à Apache, sauf sur certains répertoires du type uploads/, cache/, etc. On utilise pour cela un utilisateur distinct pour Apache (www-example) et la gestion du code via FTP/SSH/SFTP/SCP/RSYNC (example), le groupe étant identique. Ainsi on donnera la permission g+w pour les répertoires nécessitant un droit en écriture pour Apache. Les fichiers uploadés via Apache auront des permissions adéquats (g+rwX) pour être lus/modifiés/effacés via FTP/SSH/SFTP/SCP/RSYNC (l’opération chmod est impossible mais n’est pas nécessaire car le umask d’Apache est forcé à 007). - +
+

Restriction en écriture pour Apache

+
    +
  • Lecture seule pour Apache, sauf certains répertoires (uploads/, cache/)
  • +
  • utilisateur dédié pour l'écriture par Apache : www-example
  • +
  • … et pour FTP/SSH/SFTP/SCP/RSYNC : example
  • +
  • groupe commun pour tous et droits accordés au groupe
  • +
  • pas besoin de chmod, Apache a son umask à 007
  • +
+

 # echo "umask 027" >> /etc/profile
 # find /home/example -type f -user www-example -exec chmod 660 {} \;
 # find /home/example -type d -user www-example -exec chmod 770 {} \;
+      
+
-Attention, il ne faut jamais forcer les droits récursivement sur toute l’arborescence. Si la restriction en écriture pour Apache est impossible à gérer, on n’utilisera pas d’utilisateur distinct en indiquant AssignUserID example example ce qui éliminera 100% des problèmes de droits (mais pose des problèmes de sécurité). +
+

Attention !

+

Ne jamais forcer les droits
récursivement sur toute l’arborescence.

+

Si la restriction en écriture pour Apache est impossible :

+
    +
  • plus d’utilisateur distinct
  • +
  • "AssignUserID example example" élimine 100% des soucis de droits
  • +
  • … mais réduction de la sécurité
  • +
+
- -ssl - +
+

HTTPS ‑ TLS/SSL

+
+
+

Activation du module SSL pour Apache

+

 # a2enmod ssl
+  
+
+
+

Création d'un certificat

+

+# openssl req -newkey rsa:2048 -sha256 -nodes \
+    -keyout private.key -out demande.csr
+# openssl x509 -req -days 3650 -sha256 -in demande.csr \
+    -signkey private.key -out certificate.crt
+# mv private.key /etc/ssl/private/
+# chown root:ssl-cert /etc/ssl/private/private.key
+# chmod 640 /etc/ssl/private/private.key
+# mv certificate.crt /etc/ssl/certs
+# chown root:root /etc/ssl/certs/certificate.crt
+# chmod 644 /etc/ssl/certs/certificate.crt
+  
+
-# openssl req -newkey rsa:2048 -sha256 -nodes -keyout private.key -out demande.csr -# openssl x509 -req -days 3650 -sha256 -in demande.csr -signkey private.key -out certificate.crt -# mv private.key /etc/ssl/private/ && chown root:ssl-cert /etc/ssl/private/private.key && chmod 640 /etc/ssl/private/private.key -# mv certificate.crt /etc/ssl/certs/ && chown root:root /etc/ssl/certs/certificate.crt && chmod 644 /etc/ssl/certs/certificate.crt - - +
+

Modification du VirtualHost

+

+<VirtualHost *:80 *:443>
     ServerName secure.example.com
     ServerAlias www.example.com example.com
 
@@ -175,16 +252,19 @@ ssl
     SSLProtocol all -SSLv2 -SSLv3
     SSLCertificateKeyFile /etc/ssl/private/private.key
     SSLCertificateFile /etc/ssl/certs/certificate.crt
-    #SSLCertificateChainFile /etc/ssl/certs/certificates_chain.pem
+    # SSLCertificateChainFile /etc/ssl/certs/certificates_chain.pem
 
     RewriteEngine On
     RewriteCond %{HTTPS} !=on
     RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R=permanent]
-
-
-
-logs
+</VirtualHost>
+    
+
+
+

logs

+Apache propose plusieurs formats de logs +

 CustomLog log/global_access.log vhost_combined
 CustomLog log/access.log combined
 
@@ -192,18 +272,24 @@ SetEnvIf User-Agent "Foo" dontlog
 CustomLog log/access.log combined env=!dontlog
 
 ErrorLog  log/error.log
+
+
+
+

Authentification "HTTP Basic"

+ Le module mod_auth_basic est disponible par défaut. +

+    AuthType Basic
+    AuthName "Restricted"
+    AuthUserFile /foo/.htpasswd
+    AuthGroupFile /dev/null
+    require valid-user
+    
+
-HTTP Basic Authentication (mod_auth_basic) - -AuthType Basic -AuthName "Restricted" -AuthUserFile /foo/.htpasswd -AuthGroupFile /dev/null -require valid-user - -RW rule - +
+

Règles de ré-écriture

+

 RedirectPermanent / http://new.example.com
 
 RedirectMatch ^/(.*)$ http://new.example.com/$1
@@ -222,55 +308,102 @@ RewriteRule ^/FoO.tXt /sub/ [L,R,NC]
 # empêcher des requêtes POST sur une URL particulière
 RewriteCond %{REQUEST_METHOD} POST
 RewriteRule ^/foo.txt [L,F]
+
+
+
+

mod_evasive

+

Limite les accès, notamment les dénis de service

+

+<IfModule mod_evasive20.c>
+    DOSHashTableSize    3097
+    DOSPageCount        5
+    DOSSiteCount        30
+    DOSPageInterval     3
+    DOSSiteInterval     1
+    DOSBlockingPeriod   60
+    DOSEmailNotify      security@example.com
+</IfModule>
+
+
-mod_evasive +
+

Fail2ban

+
    +
  • recherche de comportements anormaux dans les logs
  • +
  • blocage temporaire ou permanent, via firewall
  • +
+
-fail2ban +
+

Apachetop

+ Affiche en direct des stats sur le traffic, d'après les logs. +

+  $ apachetop -f access.log -T 3600 -q
+  
+
- -$ apachetop -f access.log -T 3600 -q - - -ExtendedStatus On - +
+

mod_status

+ Génère une page web résumant l'état d'Apache. +

+<IfModule mod_status.c>
+    ExtendedStatus On
+    <Location /server-status-XXXX>
         SetHandler server-status
         Deny from all
         Include ipaddr_whitelist.conf
         Allow from 192.0.2.43
         Allow from 127.0.0.1
-    
-
+    </Location>
+</IfModule>
+    
+
+
- - - -NGINX +
+
+

NGINX

# aptitude install nginx https://wiki.evolix.org/HowtoNginx +
+
- -HAPROXY +
+
+

HAPROXY

https://wiki.evolix.org/HowtoHaproxy +
+
- -VARNISH +
+
+

VARNISH

https://wiki.evolix.org/HowtoVarnish +
+
-PHP +
+
+

PHP

https://wiki.evolix.org/HowtoLAMP/PHP +
+
-LE +
+
+

Let's Encrypt

# apt install certbot https://wiki.evolix.org/HowtoLetsEncrypt - +
+