Ajouter de la sécurité (Nginx)

Sécuriser les communications (TLS)

Site de vérifications pour tester la qualité du chiffrage :

Site de recommandation :

Officiel avec Let's Encrypt

On a besoin de ces dépendances :

apt-get install git bc wget curl

Téléchargeons et installons le logiciel client :

git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh/
./acme.sh --install
rm -r acme.sh/

Créons le dossier qui contiendra les certificats et le Diffie-Hellman :

mkdir -p /etc/nginx/ssl/exemple.com/
cd /etc/nginx/ssl/exemple.com/
openssl dhparam -out dhparams.pem 4096

Créons les certificats pour notre site web :

acme.sh --issue -w /var/www/html/ -d exemple.com -k 4096

On déclare les certificats dans notre contexte Nginx :

nano /etc/nginx/sites-available/exemple.com
exemple.com
server {
 
#... config de base puis on ajoute ces lignes :
 
    ssl on;
    ssl_certificate /etc/nginx/ssl/exemple.com/exemple.com.cer;
    ssl_certificate_key /etc/nginx/ssl/exemple.com/exemple.com.key;
    ssl_session_timeout 30m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    ssl_session_cache shared:SSL:10m;
    ssl_dhparam /etc/nginx/ssl/exemple.com/dhparams.pem;
    ssl_prefer_server_ciphers on;
 
    ## Improves TTFB by using a smaller SSL buffer than the nginx default
    ssl_buffer_size 8k;
 
    ## Enables OCSP stapling
    ssl_stapling on;
    resolver 8.8.8.8;
    ssl_stapling_verify on;
 
    ## Send header to tell the browser to prefer https to http traffic
    add_header Strict-Transport-Security max-age=31536000;
 
}

Installer les certificats pour le serveur nginx :

acme.sh --installcert -d exemple.com --keypath /etc/ssl/private/exemple.com/exemple.com.key --fullchainpath /etc/ssl/certs/exemple.com/exemple.com.cer --reloadcmd 'systemctl reload nginx'

Félicitation! Testez et obtetez le résultat des clés d'échange via SSL Labs

Pour renouveler son certificat, il suffit de faire :

acme.sh --renew -d exemple.com

On peut l'ajouter dans une tâche cron pour automatiser le renouvellement :

crontab -e

Puis ajouter cette ligne pour qu'elle soit exécuté tous les 3 mois au même jour où les certificats ont été créer :

1 1 18 */3 * "/home/pi/.acme.sh/acme.sh --renew -d exemple.com" > /dev/null

Ce tutoriel est un condensé du tutoriel suivant : https://www.cyberciti.biz/faq/how-to-configure-nginx-with-free-lets-encrypt-ssl-certificate-on-debian-or-ubuntu-linux/

Ça fonctionne toujours pas ? Peut être qu'avec ce tutoriel ça marchera.

Auto-signé

openssl req -x509 -sha256 -newkey rsa:4096 -days 365 -nodes -out /etc/ssl/certs/example.com.crt -keyout /etc/ssl/private/example.com.key -subj "/C=FR/ST=Example/L=Example/O=Example/CN=example.org"
server {
   listen 443 ssl;
   ssl_certificate /etc/ssl/certs/example.com.crt;
   ssl_certificate_key  /etc/ssl/private/example.com.key;
}

Cacher la version de développement

nano /etc/nginx/nginx.conf

On enlève le dièse devant ce commentaire :

server_tokens off;

Eviter les petites attaques par DDOS

On ajoute dans le paramètre http du fichier nginx.conf ces lignes :

#Connexions maximum par ip
limit_conn_zone $binary_remote_addr zone=limit_per_ip:1m;
limit_conn limit_per_ip 30;

#Nombre de requêtes par secondes maximum par ip
limit_req_zone $binary_remote_addr zone=allips:10m rate=150r/s;
limit_req zone=allips burst=150 nodelay;

Protéger un répertoire

On créer un utilisateur :

htpasswd -c /var/www/html/.htpasswd mon-utilisateur
location / {
    auth_basic "site protégé";
    auth_basic_user_file conf/htpasswd;
}

Cele requis le module suivant :

ngx_http_auth_basic_module
Il est cependant pas possible de spécifier un groupe d'utilisateur.