Ubuntu server 20.04 LTS: installation de apache2, ssl et modsecurity
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 apache2On 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 $FWdans le fichier
/etc/shorewall/rules
puis en redémarrant shorewall :
sudo systemctl restart shorewall.serviceL'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 apache2On 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-apacheLe 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.pempuis on active la configuration :
sudo a2ensite default-ssl sudo systemctl restart apache2L'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"
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-security2Ce 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.confOn 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.XXOn 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.servicedont on peut vérifier le bon fonctionnement avec
sudo fail2ban-client status