Masquer les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
![]() |
1.1 | 1 | Reverse proxy du serveur : nginx préconfiguré par LinuxServer.io, avec obtention et renouvellement automatiques du certificat Let's Encrypt, fail2ban intégré et un système de mods pour ajouter des fonctions. Toutes les requêtes venant d'Internet passent par lui. |
| 2 | |||
| 3 | Stack et intégration avec Authelia et CrowdSec : voir [[Reverse proxy>>Wiki Batcave John.Infrastructure.ServeurPrincipal.ReverseProxy.WebHome]]. | ||
| 4 | |||
| 5 | == Certificat == | ||
| 6 | |||
| 7 | |=Variable|=Valeur|=Rôle | ||
| 8 | |##URL##|##<DOMAINE>##|Domaine principal | ||
| 9 | |##SUBDOMAINS##|##wildcard##|Certificat valable pour tous les sous-domaines (##*.<DOMAINE>##) | ||
| 10 | |##VALIDATION##|##duckdns##|Preuve de propriété du domaine par un enregistrement DNS, via DuckDNS | ||
| 11 | |##DUCKDNSTOKEN##|##<JETON>##|Jeton DuckDNS, le même que celui du conteneur [[DuckDNS>>Wiki Batcave John.Infrastructure.ServeurPrincipal.DuckDNS.WebHome]] | ||
| 12 | |##ONLY_SUBDOMAINS##|##false##|Le domaine nu est aussi couvert | ||
| 13 | |##EMAIL##|##<EMAIL>##|Avertissements de Let's Encrypt | ||
| 14 | |||
| 15 | Le renouvellement est automatique. Vérifier la date d'expiration : | ||
| 16 | |||
| 17 | {{code language="bash"}} | ||
| 18 | echo | openssl s_client -connect 127.0.0.1:443 -servername <DOMAINE> 2>/dev/null | openssl x509 -noout -dates | ||
| 19 | {{/code}} | ||
| 20 | |||
| 21 | Autres possibilités : ##VALIDATION=http## (sans DNS, mais pas de certificat wildcard), ##VALIDATION=dns## avec ##DNSPLUGIN## (Cloudflare, OVH…), ##CERTPROVIDER=zerossl##, ##EXTRA_DOMAINS## pour d'autres domaines, ##STAGING=true## pour tester sans consommer le quota de Let's Encrypt. | ||
| 22 | |||
| 23 | == Mods == | ||
| 24 | |||
| 25 | Déclarés dans ##DOCKER_MODS##, séparés par ##|## : | ||
| 26 | |||
| 27 | |=Mod|=Rôle | ||
| 28 | |##swag-dashboard##|Tableau de bord sur le port 81 : proxy-confs actifs, statistiques de trafic (GoAccess), état de fail2ban | ||
| 29 | |##swag-crowdsec##|Bouncer CrowdSec (voir [[CrowdSec>>Wiki Batcave John.Infrastructure.ServeurPrincipal.CrowdSec.WebHome]]) | ||
| 30 | |||
| 31 | Mods utiles, non installés : | ||
| 32 | |||
| 33 | |=Mod|=Rôle | ||
| 34 | |##swag-auto-reload##|Recharge nginx à chaque modification dans ##/config/nginx## | ||
| 35 | |##swag-auto-proxy## (avec ##universal-docker##)|Crée le proxy d'un conteneur portant le label ##swag=enable## ; labels ##swag_port##, ##swag_url##, ##swag_auth=authelia##, ##swag_auth_bypass=/api## | ||
| 36 | |##swag-maxmind## ou ##swag-dbip##|Géolocalisation des adresses, pour bloquer ou autoriser des pays | ||
| 37 | |##swag-cloudflare-real-ip##|Vraies adresses des visiteurs derrière le proxy Cloudflare | ||
| 38 | |||
| 39 | == Fichiers == | ||
| 40 | |||
| 41 | Dans ##<APPDATA>/swag/config/nginx/## : | ||
| 42 | |||
| 43 | |=Fichier ou dossier|=Rôle | ||
| 44 | |##nginx.conf##|Configuration générale de nginx | ||
| 45 | |##ssl.conf##|Réglages TLS et en-têtes de sécurité, inclus par chaque proxy-conf | ||
| 46 | |##proxy.conf##|En-têtes transmis au service (IP d'origine, protocole, WebSocket), délais | ||
| 47 | |##resolver.conf##|Résolveur DNS interne de Docker, pour trouver les conteneurs par leur nom | ||
| 48 | |##authelia-server.conf## / ##authelia-location.conf##|Intégration d'Authelia | ||
| 49 | |##authentik-*##, ##ldap-*##, ##tinyauth-*##|Équivalents pour d'autres systèmes d'authentification, non utilisés | ||
| 50 | |##site-confs/default.conf##|Site par défaut, pour les noms non reconnus | ||
| 51 | |##proxy-confs/##|Un fichier par service publié | ||
| 52 | |##real-ip.conf##, ##stream.conf##|Adresse réelle derrière un autre proxy ; proxy TCP/UDP | ||
| 53 | |||
| 54 | Chaque fichier existe aussi en ##.sample## : à chaque mise à jour, SWAG remet les modèles à jour sans toucher aux fichiers actifs. Comparer de temps en temps les deux versions pour intégrer les évolutions. | ||
| 55 | |||
| 56 | Après toute modification : | ||
| 57 | |||
| 58 | {{code language="bash"}} | ||
| 59 | docker exec swag nginx -t # vérifier la syntaxe | ||
| 60 | docker exec swag nginx -s reload # appliquer | ||
| 61 | {{/code}} | ||
| 62 | |||
| 63 | == Proxy-confs actifs == | ||
| 64 | |||
| 65 | Un fichier ##<SERVICE>.subdomain.conf## par service. Les préfixes numériques (##10-##, ##20-##…) fixent l'ordre de chargement. Un fichier renommé en ##.disabled## (ou toute extension autre que ##.conf##) est ignoré. | ||
| 66 | |||
| 67 | Services publiés : adguard, castopod-test, changedetection, code, copyparty, dashboard, dashy, dawarich, flus, glances, immich, jellyfin, jellystat, joplin, joplin-app, n8n, networking-toolbox, nextcloud, osint (web-check), passbolt, portainer, searx, ssh (Sshwifty), vikunja, wallabag, wallos, xwiki. | ||
| 68 | |||
| 69 | Exemple commenté de proxy-conf écrit à la main : voir [[Reverse proxy>>Wiki Batcave John.Infrastructure.ServeurPrincipal.ReverseProxy.WebHome]]. | ||
| 70 | |||
| 71 | == TLS et en-têtes de sécurité == | ||
| 72 | |||
| 73 | Dans ##ssl.conf## : TLS 1.2 et 1.3 uniquement. | ||
| 74 | |||
| 75 | Les en-têtes de sécurité proposés par SWAG sont tous commentés, donc inactifs : | ||
| 76 | |||
| 77 | |=En-tête|=Effet | ||
| 78 | |##Strict-Transport-Security##|Impose le HTTPS au navigateur pour les visites suivantes (HSTS) | ||
| 79 | |##Content-Security-Policy##|Passage automatique en HTTPS des ressources ; interdit l'affichage du site dans un cadre d'un autre site | ||
| 80 | |##X-Frame-Options##|Même protection contre l'affichage dans un cadre, ancienne méthode | ||
| 81 | |##X-Content-Type-Options##|Empêche le navigateur de deviner le type des fichiers | ||
| 82 | |##Referrer-Policy##|Ne transmet l'adresse de provenance qu'au même site | ||
| 83 | |##Permissions-Policy##|Désactive certaines fonctions de suivi du navigateur | ||
| 84 | |##Alt-Svc##|Annonce HTTP/3 | ||
| 85 | |||
| 86 | Pour les activer, les décommenter dans ##ssl.conf## puis recharger nginx. Précautions : HSTS est mémorisé longtemps par les navigateurs (le site ne pourra plus être servi en HTTP), et les restrictions de cadre peuvent casser un service affiché dans un autre (un tableau de bord qui intègre des pages, par exemple). Tester service par service. | ||
| 87 | |||
| 88 | == fail2ban intégré == | ||
| 89 | |||
| 90 | SWAG contient son propre fail2ban, qui bannit à partir des journaux de nginx, en complément de CrowdSec. | ||
| 91 | |||
| 92 | |=Prison|=Bannit | ||
| 93 | |##nginx-http-auth##|Les échecs d'authentification HTTP basique | ||
| 94 | |##nginx-badbots##|Les robots malveillants connus | ||
| 95 | |##nginx-botsearch##|Les recherches de pages d'administration ou de fichiers sensibles | ||
| 96 | |##nginx-deny##|Les accès refusés par une règle ##deny## | ||
| 97 | |##nginx-unauthorized##|Les réponses 401 répétées | ||
| 98 | |##nginx-444-copyparty##|Prison personnalisée pour copyparty | ||
| 99 | |||
| 100 | {{code language="bash"}} | ||
| 101 | docker exec swag fail2ban-client status # prisons actives | ||
| 102 | docker exec swag fail2ban-client status <PRISON> # adresses bannies | ||
| 103 | docker exec swag fail2ban-client set <PRISON> unbanip <IP> # débannir | ||
| 104 | {{/code}} | ||
| 105 | |||
| 106 | Configuration : ##<APPDATA>/swag/config/fail2ban/##. ##DISABLE_F2B=true## désactive ce fail2ban. | ||
| 107 | |||
| 108 | == Sauvegarde == | ||
| 109 | |||
| 110 | ##<APPDATA>/swag## (configuration, proxy-confs, certificats) est sauvegardé par le script de [[Sauvegarde>>Wiki Batcave John.Infrastructure.Sauvegarde.WebHome]]. |
