| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
| serveurs:installation:web-srv:nginx [2022/05/25 08:12] – [Création d'un certificat SSL avec Certbot] jpmilcent | serveurs:installation:web-srv:nginx [2026/09/18 14:14] (Version actuelle) – [Blocage de bloc d'IP] jpmilcent |
|---|
| |
| ===== Installation ===== | ===== Installation ===== |
| * Installer //Nginx// et //Certbot// : ''sudo aptitude install supervisor nginx python3-certbot-nginx python3-certbot-dns-ovh '' | * Installer //Nginx// et //Certbot// : ''sudo apt install nginx python3-certbot-nginx python3-certbot-dns-ovh '' |
| * Activer le redémarrage automatique du service : ''systemctl enable nginx.service'' | * Activer le redémarrage automatique du service : ''systemctl enable nginx.service'' |
| * Activer le démarrage automatique du service Systemd lançant deux fois par jour ''certbot renew'' : ''systemctl enable certbot.timer'' | * Activer le démarrage automatique du service Systemd lançant deux fois par jour ''certbot renew'' avec : ''systemctl enable certbot.timer'' |
| * Vérifier le status et démarrer le service si nécessaire : ''systemctl status certbot.timer'' | * Vérifier le status et démarrer le service si nécessaire : ''systemctl status certbot.timer'' |
| |
| ===== Modification du format des logs ===== | ===== Modification du format des logs ===== |
| Modifier les logs d'accès (ajout d'infos) pour Telegraf et GoAccess : | Modifier les logs d'accès (ajout d'infos) pour Telegraf et GoAccess : |
| * Éditer la conf de Nginx ''vi /etc/nginx/nginx.conf'' et remplacer la section Log contenant :<code nginx> | * Éditer la conf de Nginx ''vi /etc/nginx/nginx.conf'' et remplacer dans la section ''http {...}'' contenant :<code nginx> |
| access_log /var/log/nginx/access.log; | access_log /var/log/nginx/access.log; |
| error_log /var/log/nginx/error.log; | |
| </code> | </code> |
| * Par le contenu suivant : <code nginx> | * Par le contenu suivant : <code nginx> |
| |
| access_log /var/log/nginx/access.log enhanced-fmt; | access_log /var/log/nginx/access.log enhanced-fmt; |
| error_log /var/log/nginx/error.log; | |
| </code> | </code> |
| **ATTENTION** : vérifier la présence du nom de domaine de l'hôte virtuel (''$host'') dans les logs d’accès. | **ATTENTION** : vérifier la présence du nom de domaine de l'hôte virtuel (''$host'') dans les logs d’accès. |
| ===== Ajouter le support de GeoIp ===== | ===== Ajouter le support de GeoIp ===== |
| * Vérifier le support de GeoIp par Ngninx : ''nginx -V 2>&1 | grep -o with-http_geoip_module'' | * Vérifier le support de GeoIp par Ngninx : ''nginx -V 2>&1 | grep -o with-http_geoip_module'' |
| * GeoIP n'est plus maintenu => geoip2 dont le module et le support dans Nginx nécessite [[https://github.com/leev/ngx_http_geoip2_module#user-content-download-maxmind-geolite2-database-optional|la compilation du module]] | * GeoIP n'est plus maintenu => geoip2 dont le module et le support dans Nginx nécessite [[https://github.com/leev/ngx_http_geoip2_module#user-content-download-maxmind-geolite2-database-optional|la compilation du module]] mais depuis Debian 11 un module ''GeoIP2'' existe dans [[https://packages.debian.org/bullseye/nginx-full| le paquet pour la version Debian 11 Bullseye]]. |
| * À voir plus tard... | * Debian 11+ : installer le module avec : ''apt install libnginx-mod-http-geoip2'' |
| * Apparemment, un module ''GeoIP2'' existe dans [[https://packages.debian.org/bullseye/nginx-full| le paquet pour la version Debian 11 Bullseye]]. A voir lors de la mise à jour vers Debian 11. | |
| |
| ===== Ajouter le support des fichiers d'authentification HTTP ===== | ===== Ajouter le support des fichiers d'authentification HTTP ===== |
| * Installer le paquet suivant : ''aptitude install apache2-utils'' | * Installer le paquet suivant : ''apt install apache2-utils'' |
| * Pour créer une fichier //.htpasswd// : ''htpasswd -c /etc/nginx/.htpasswd <user-name-1>'' | * Pour créer une fichier //.htpasswd// : ''htpasswd -c /etc/nginx/.htpasswd <user-name-1>'' |
| * Ensuite, pour ajouter des utilisateurs (sans l'option ''-c'') : ''htpasswd /etc/nginx/.htpasswd <user-name-2>'' | * Ensuite, pour ajouter des utilisateurs (sans l'option ''-c'') : ''htpasswd /etc/nginx/.htpasswd <user-name-2>'' |
| * Penser à recharger Nginx : ''sudo service nginx reload'' | * Penser à recharger Nginx : ''sudo service nginx reload'' |
| |
| ===== Activer les prisons Fail2ban pour Nginx ===== | |
| * Penser à décommenter les prisons liés à Nginx présentes dans le fichier : '' vi /etc/fail2ban/jail.d/defaults-debian.conf '' | ===== Problèmes et erreurs ===== |
| * Relancer //Fail2ban// : ''systemctl restart fail2ban.service'' | ==== Éviter l'erreur "bind() to 172.18.5.1:9090 failed (99: Cannot assign requested address)" ==== |
| ===== Éviter l'erreur "bind() to 172.18.5.1:9090 failed (99: Cannot assign requested address)" ===== | |
| <note info>Au redémarrage de la machine, il arrive que Docker ne soit pas complètement lancé. Cela provoque l'erreur : ''bind() to 172.18.5.1:9090 failed (99: Cannot assign requested address)'' et cela empêche Nginx de démarrer. Il faut donc le lancer manuellement : ''systemctl start nginx''. L'erreur était due au fichier ///etc/nginx/conf.d/status.conf// qui contenait une ligne '' listen 172.18.5.1:9090; ''. Cette ligne n'est finalement pas utile car il suffit d'écouter sur le port 9090 avec la commande '' listen 9090; '' les paramètres ''allow <...> ;'' suffisent à limiter l'accès. Le port est bien accessible sur 127.0.0.1 comme sur 172.18.5.1 (pour un accès dans un container Docker).</note> | <note info>Au redémarrage de la machine, il arrive que Docker ne soit pas complètement lancé. Cela provoque l'erreur : ''bind() to 172.18.5.1:9090 failed (99: Cannot assign requested address)'' et cela empêche Nginx de démarrer. Il faut donc le lancer manuellement : ''systemctl start nginx''. L'erreur était due au fichier ///etc/nginx/conf.d/status.conf// qui contenait une ligne '' listen 172.18.5.1:9090; ''. Cette ligne n'est finalement pas utile car il suffit d'écouter sur le port 9090 avec la commande '' listen 9090; '' les paramètres ''allow <...> ;'' suffisent à limiter l'accès. Le port est bien accessible sur 127.0.0.1 comme sur 172.18.5.1 (pour un accès dans un container Docker).</note> |
| * Pour éviter ce problème, nous avons modifier le fichier ///etc/nginx/conf.d/status.conf// comme indiqué précédement. Deplus, nous avons modifié le script Systemd de Nginx : ///lib/systemd/system/nginx.service// | * Pour éviter ce problème, nous avons modifier le fichier ///etc/nginx/conf.d/status.conf// comme indiqué précédement. Deplus, nous avons modifié le script Systemd de Nginx : ///lib/systemd/system/nginx.service// |
| * Redémarrer la machine, attendre son redémarrage, s'y reconnecter et s'assurer que Nginx est bien démarré : '' systemctl status nginx '' | * Redémarrer la machine, attendre son redémarrage, s'y reconnecter et s'assurer que Nginx est bien démarré : '' systemctl status nginx '' |
| |
| ===== Création d'un certificat SSL avec Certbot ===== | ===== Certbot ===== |
| | ==== Création d'un certificat SSL avec Certbot ==== |
| D'une manière générale la démarche à suivre pour créer un certificat SSL chez Letsencrypt à l'aide de Certbot : | D'une manière générale la démarche à suivre pour créer un certificat SSL chez Letsencrypt à l'aide de Certbot : |
| * Installer un certificat SSL via Certbot (Letsencrypt) : ''<nowiki> certbot --nginx -d <domaine-principal> -d <alias-du-domaine-principal> </nowiki>'' | * Installer un certificat SSL via Certbot (Letsencrypt) : ''<nowiki> certbot --nginx -d <domaine-principal> -d <alias-du-domaine-principal> </nowiki>'' |
| </code> | </code> |
| |
| ===== Suppression d'un certificat SSL avec Certbot ===== | ==== Suppression d'un certificat SSL avec Certbot ==== |
| Si vous souhaitez supprimer une certificat SSL créé par l'intermédiaire de Certbot, utiliser la commande : ''<nowiki> sudo certbot delete --cert-name <domaine>.<ext> </nowiki>'' | Si vous souhaitez supprimer une certificat SSL créé par l'intermédiaire de Certbot, utiliser la commande : ''%% sudo certbot delete --cert-name <domaine>.<ext> %%'' |
| |
| | ===== Lutte contre les IP agressives (Robots) ===== |
| | |
| | ==== Activer les prisons Fail2ban pour Nginx ==== |
| | * Penser à décommenter les prisons liés à Nginx présentes dans le fichier : '' vi /etc/fail2ban/jail.d/defaults-debian.conf '' |
| | * Relancer //Fail2ban// : ''systemctl restart fail2ban.service'' |
| | |
| | ==== Extraction des IPs créant des erreurs ==== |
| | * Pour afficher les IP créant des erreurs (302|403|404|500), utiliser la commande : ''%% SEUIL=50; awk '$9 ~ /^(302|403|404|500)$/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk -v min=$SEUIL '$1 >= min {printf "%-15s : %d erreurs\n", $2, $1}' %%'' |
| | * Vous pouvez extraire uniquement les IP avec : ''%% SEUIL=50; awk '$9 ~ /^(302|403|404|500)$/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | awk -v min=$SEUIL '$1 >= min {print $2}' > ip_a_bannir.txt %%'' |
| | |
| | ==== Blocage de bloc d'IP ==== |
| | * Repérer les IP qui posent problème dans les logs de Nginx : ''%% tail -f /var/log/nginx/access.log %%'' |
| | * Créer un fichier qui bloquera les IP au niveau global de la config de Nginx : ''%% vi /etc/nginx/conf.d/blockips.conf %%'' |
| | * Souvent nous avons à faire à un bloc d'IP, il faut alors bloquer le bloc complet avec une syntaxe d'IP du type ''xxx.xxx.0.0/15'' où l'on garde uniquement les 2 premiers nombre de l'IPv4. |
| | * Ajouter le contenu suivant :<code nginx> |
| | # IP bloqués sur le serveur |
| | # Bloqué le 2026-09-18 : |
| | deny xxx.xxx.0.0/15; |
| | </code> |
| | * Prendre en compte la nouvelle config : ''%% nginx-reload %%'' |
| | * Nginx va bloquer ces IP en renvoyant une erreur ''HTTP 403''. Si [[serveurs:installation:fail2ban#prison_nginx-errors| la prison Fail2ban nginx-errors]] est active, les IPs seront progressivement bannies automatiquement. |