securiser_apache

naos 2017/10/30 23:38

Sécuriser Apache

testé sur Debian 8 Jessie

# nano /etc/apache2/apache2.conf

Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Header always append X-Frame-Options "DENY"
Header always append X-Content-Type-Options "nosniff"
Header always append X-XSS-Protection "1; mode=block"
Header always append X-Permitted-Cross-Domain-Policies "none"
Header always append Referrer-Policy: "strict-origin-when-cross-origin"
Header always append Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always append Content-Security-Policy "default-src 'none'; script-src 'self'; font-src 'self'; img-src 'self'; style-src 'self';"
SecServerSignature 'LENOMQUEVOUSVOULEZ'
ServerSignature Off
Header unset X-Powered-By
SSLProtocol  all -SSLv2 -SSLv3 -TLSv1
Include /etc/apache2/ssl/**DOMAIN.TLD**-hpkp.conf

L'option Content Security Policity vous ai présentée avec des règles de base fonctionnant sur la plupart des sites. Pour plus d'informations sur les règles disponibles se référer à ces explications : https://developer.mozilla.org/fr/docs/HTTP/Headers/Content-Security-Policy L'utilisation de la console web du navigateur vous permettra de voir les éléments refusés par les règles CSP.

Le script ci-dessous permet d'assurer le mécanisme HTTP Public Key Pinning (HPKP) qui protège les sites internet de l'usurpation d'identité contre les certificats frauduleux émis par des autorités de certification compromises. Ce script est très utile pour ceux qui utilisent Let's Encrypt, les clés publique en base64 sont ainsi générées avant expiration des nouvelles clés TLS.

# nano /root/le.sh

#!/bin/bash
 
# First, let's define our domain name :
 
LEDomain='DOMAIN.TLD'
 
 
 
# Next, let's get the certificates locations
 
LEPrivkey=/etc/letsencrypt/live/${LEDomain}/privkey.pem
 
LEAuthority=/etc/letsencrypt/live/${LEDomain}/chain.pem
 
LERootCert=/etc/ssl/certs/DST_Root_CA_X3.pem
 
 
 
# Then we get the HPKP keys needed
 
echo '---'
 
echo 'First key to pin:'
 
Key1=$(openssl rsa -in ${LEPrivkey} -outform der -pubout 2>/dev/null | openssl dgst -sha256 -binary | openssl enc -base64)
 
echo ${Key1}
 
echo '---'
 
echo 'Second key to pin:'
 
Key2=$(openssl x509 -in ${LEAuthority}  -pubkey -noout 2>/dev/null | openssl pkey -pubin -outform der 2>/dev/null |  openssl dgst -sha256 -binary | openssl enc -base64)
 
echo ${Key2}
 
echo '---'
 
echo 'Last key to pin:'
 
Key3=$(openssl x509 -in ${LERootCert} -pubkey -noout 2>/dev/null | openssl pkey -pubin -outform der 2>/dev/null | openssl dgst -sha256 -binary | openssl enc -base64)
 
echo ${Key3}
 
echo '---'
 
echo 'Backup key to pin:'
 
BackupKey=${LEDomain}-backup.key
 
if [ -f $BackupKey ]
 
then
 
  echo 'Generating backup key for '${LEDomain}
 
  openssl genrsa -out ${LEDomain}-backup.key 4096 2>/dev/null
 
fi
 
Key4=$(openssl x509 -in ${LEDomain}-backup.key -pubkey -noout 2>/dev/null | openssl pkey -pubin -outform der 2>/dev/null |  openssl dgst -sha256 -binary | openssl enc -base64)
 
echo ${Key4}
 
echo '---'
 
 
 
# Finally, we export those informations into a file in order to import it in our Apache configuration
 
mkdir -p /etc/apache2/ssl/
 
echo '' > /etc/apache2/ssl/${LEDomain}-hpkp.conf
 
echo '	Header always set Public-Key-Pins "pin-sha256=\"'${Key1}'\"; pin-sha256=\"'${Key2}'\"; pin-sha256=\"'${Key3}'\"; pin-sha256=\"'${Key4}'\"; max-age=5184000; includeSubDomains"' >> /etc/apache2/ssl/${LEDomain}-hpkp.conf
 
echo '' >> /etc/apache2/ssl/${LEDomain}-hpkp.conf
 
 
 
# Reload Apache2 configuration
 
if [[ $(/usr/sbin/apachectl -t) != "Syntax OK" ]]
 
then
 
  echo 'Reloading Apache'
 
  systemctl reload apache2
 
  echo 'Reload is done'.
 
else
 
  echo 'Syntax is not OK. Check it and reload on your end.'
 
fi

(Source du script: https://poinsot.info/articles/linux/hpkp-avec-lets-encrypt-et-apache)

# chmod 744 /root/le.sh

# crontab -e

45 23 * * * root certbot renew --quiet > /dev/null 2>&1 && /root/le.sh

Pour vérifier votre configuration il existe plusieurs méthodes:

  • securiser_apache.txt
  • Dernière modification: 2019/03/10 14:07
  • par naos