serveurs:installation:web-srv:nginx

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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/02/10 17:25] – [Modification du format des logs] jpmilcentserveurs:installation:web-srv:nginx [2026/09/18 14:14] (Version actuelle) – [Blocage de bloc d'IP] jpmilcent
Ligne 4: Ligne 4:
  
 ===== 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''
  
Ligne 45: Ligne 45:
 ===== 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>
Ligne 58: Ligne 57:
  
 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 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.
 ===== Configuration de la compression ===== ===== Configuration de la compression =====
 Activer la compression Gzip du contenu renvoyé par Nginx pour tous les types Mime (JS, CSS...) :  Activer la compression Gzip du contenu renvoyé par Nginx pour tous les types Mime (JS, CSS...) : 
Ligne 118: Ligne 116:
 ===== 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>''
Ligne 146: Ligne 144:
     * 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//
Ligne 171: Ligne 168:
   * 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>''
Ligne 183: Ligne 181:
     * https://www.ssllabs.com/ssltest/analyze.html?d=<domaine-principal>     * https://www.ssllabs.com/ssltest/analyze.html?d=<domaine-principal>
     * https://www.ssllabs.com/ssltest/analyze.html?d=<alias-du-domaine-principal>     * https://www.ssllabs.com/ssltest/analyze.html?d=<alias-du-domaine-principal>
-  * Exemple de fichier de conf Nginx contenant la redirection HTTP vers HTTPS (en 302 afin d'éviter d'éventuel problème de mise en cache par les navigateurs toujorus difficile à résoudre) et le HTTP2 : <code nginx>+  * Exemple de fichier de conf Nginx contenant la redirection HTTP vers HTTPS (en 302 afin d'éviter d'éventuel problème de mise en cache par les navigateurs toujours difficile à résoudre) et le HTTP2 : <code nginx>
 server { server {
     listen 443 ssl http2;     listen 443 ssl http2;
Ligne 231: Ligne 229:
 </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.
  • serveurs/installation/web-srv/nginx.1644513943.txt.gz
  • Dernière modification : 2022/02/10 17:25
  • de jpmilcent