Ce post décrit l'installation de apache2 sur Kimsufi, Ubuntu server 20.04 LTS et la mise en place de divers outils de sécurité.

Installation basique de apache2

apache2 est installé par

sudo apt install apache2
On crée ensuite une entrée DNS de type "A" sur la manager OVH pour diriger mydomain.org vers l'IP du server puis on ajoute l'entrée mydomain.org dans le fichier /etc/hosts. La configuration de base de apache2 est présente dans le fichier /etc/apache2/sites-available/00-default.conf et pointe vers le répertoire physique /var/www/html. On peut éditer ce fichier pour en modifier les paramètres avant de démarrer apache2 avec
sudo systemctl start apache2

Enfin, il ne faut pas oublier, si on utilise shorewall, d'ouvrir le protocole correspondant, en ajoutant la ligne

HTTP(ACCEPT)    net             $FW
dans le fichier /etc/shorewall/rules puis en redémarrant shorewall :
sudo systemctl restart shorewall.service
L'ouverture de l'URL mydomain.org dans le navigateur devrait afficher la page de configuration de base de apache2.

SSL

Refs : https://www.memoinfo.fr/tutoriels-linux/configurer-lets-encrypt-apache/ et https://certbot.eff.org/lets-encrypt/ubuntubionic-apache.html.

L'encryptage SSL est activé sur apache2 par

sudo a2enmod ssl
sudo a2enmod rewrite
sudo systemctl restart apache2
	
On va alors obtenir un certificat de sécurité SSL publié par le serveur qui authentifiera son identité. Pour cela, on commence par installer le ppa "certbot" :
sudo add-apt-repository ppa:certbot/certbot
**Attention** : Ce ppa n'existe pas pour focal, on édite donc le fichier /etc/apt/sources.list.d/certbot-ubuntu-certbot-focal.list pour remplacer focal par bionic en attendant la publication du ppa pour la 20.04 LTS. On peut alors installer certbot avec :
sudo apt update
sudo apt-get install certbot python3-certbot-apache
	
Le certificat SSL, certifié par Let's Encrypt peut alors être obtenu avec la commande
certbot certonly --webroot --webroot-path /var/www/html/ --domain mydomain.org --email tuxette@mydomain.org
**Attention** : Pour la création du certificat, le site mydomain.org doit être une URL valide. Si la création est réussie, un message s'affiche de ce type :
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/mydomain.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/mydomain.org/privkey.pem
   Your cert will expire on XXX-XX-XX. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
	

Pour terminer l'activation de SSL sur mydomain.org, on édite le fichier /etc/apache2/sites-available/default-ssl.conf pour modifier les deux lignes

SSLCertificateFile	/etc/letsencrypt/live/mydomain.org/fullchain.pem
SSLCertificateKeyFile	/etc/letsencrypt/live/mydomain.org/privkey.pem
	
puis on active la configuration :
sudo a2ensite default-ssl
sudo systemctl restart apache2
	
L'URL https://mydomain.org sur le navigateur doit alors afficher le fichier de configuration par défaut d'apache2 avec une indication que le certificat est valide et que la navigation est protégée.

CAA et Forward Secrecy

Refs : https://www.ssllabs.com/ssltest/, https://blog.qualys.com/ssllabs/2017/03/13/caa-mandated-by-cabrowser-forum et https://www.digicert.com/kb/ssl-support/ssl-enabling-perfect-forward-secrecy.htm

À ce stade le site est authentifié et la navigation sécurisé mais il ne respecte pas pour autant les dernières recommandations en terme de sécurité de la navigation. Pour le vérifier, entrez mydomain.org à https://www.ssllabs.com/ssltest/. En particulier, les points faibles suivants peuvent être identifiés :

  • La non présence d'une entrée CAA qui indique quelle devrait être l'autorité de certification de mydomain.org. Pour créer cette entrée, allez dans le manager OVH et ajoutez un champ CAA du type
    IN CAA 0 issue "letsencrypt.org"
    qui indique que Let's Encrypt devrait être l'autorité certifiant l'authenticité du site.
  • Le non respect de Perfect Forward Secrecy qui peut être corrigé en éditant la configuration SSL /etc/apache2/sites-available/default-ssl.conf pour y ajouter les lignes suivantes :
    		
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
    
Il faut bien sur terminer par recharger la configuration de apache2 :
sudo systemctl restart apache2

modsecurity

Refs : https://doc.ubuntu-fr.org/modsecurity

Le module de sécurisation de apache2 "modsecurity" est installé avec

sudo apt install libapache2-mod-security2
Ce module est fourni avec un fichier de configuration exemple qu'il faut copier dans le fichier de configuration définitif dans /etc/modsecurity :
sudo cp modsecurity.conf-recommended modsecurity.conf
	
On peut éditer le fichier /etc/modsecurity/modsecurity.conf pour ajouter, par exemple, une signature personnalisée aux pages "404" d'apache2 par exemple :
SecServerSignature "Custom Name"
	
Puis on active la configuration de modsecurity avec
sudo systemctl reload apache2.service

fail2ban pour apache

Refs : https://www.supinfo.com/articles/single/2660-proteger-votre-vps-apache-avec-fail2ban

fail2ban peut aussi être utilisée pour sécuriser apache contre divers types de nuisances. En particulier, un certain nombre de filtres sont déjà fournis dans /etc/fail2ban/filters.d/apache-*** dont les paramètres spécifiques sont documentés dans /etc/fail2ban/jail.conf. Pour activer un de ces filtres, il suffit de la copier dans /etc/fail2ban/jail.local en ajoutant enabled = true et en personnalisant les paramètres éventuellement. Par exemple, on peut ajouter le filtre apache-auth avec:

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
bantime = 600
maxretry = 3
findtime = 600
ignoreip = XXX.X.X.XX
	
On peut aussi créer des filtres personnalisés. Par exemple, en créant un fichier /etc/fail2ban/filter.d/apache-dos.conf contenant
[Definition] 
failregex = ^<HOST> -.*"(GET|POST).*
ignoreregex =
	
et en ajoutant ces lignes au fichier /etc/fail2ban/jail.conf :
[apache-dos]
enabled = true
port = http,https
filter = apache-dos
logpath = /var/log/apache2/access.log
bantime = 600
maxretry = 300
findtime = 300
ignoreip = XXX.X.X.XX
action = iptables[name=HTTP, port=http, protocol=tcp]
	
on protège apache2 contre les attaques DOS. Pour mettre en œuvre, on recharge la configuration de fail2ban :
sudo systemctl restart fail2ban.service
	
dont on peut vérifier le bon fonctionnement avec
sudo fail2ban-client status