Bonjour,
Voici un petit tuto, pour ceux qui souhaiterai installer SWAG de chez linuxserver en Docker.
SWAG, c'est quoi ?
SWAG - Secure Web Application Gateway (anciennement connu sous le nom deletsencrypt, sans lien avec Let's Encrypt™) configure un serveur Web Nginx et un proxy inverse avec prise en charge de php et un client certbot intégré qui automatise les processus gratuits de génération et de renouvellement de certificat de serveur SSL (Let's Encrypt et ZeroSSL). Il contient également fail2ban pour la prévention des intrusions.
Retrouvez plus d'informations sur SWAG ici : SWAG : reverse proxy, certificat HTTPS, Fail2ban…
Disclamer :
Le but de ce tuto sera de rendre cette installation facile et accessible a tous, bien que loin d’être un expert de docker/docker compose, n’hésiter pas à répondre à ce sujet avec vos interrogations, .. Pour ceux qui sont plus a l'aise avec ce genre d'installation, n'hésiter pas a proposer des améliorations, ou des conseils, ...
Pour un support sur SWAG ne concernant pas une installation via ce tutoriel, merci de poster votre question dans Applications.
Pré-requis :
Avoir Docker et Docker Compose installé sur sa machine.
Ce connecter en SSH à votre Serveur/NAS, si vous ne savez pas le faire, vous trouverez ici un tuto explicatif : [Tuto] Acceder à son NAS en lignes de commande.
A modifier selon votre installation :
Toute mon installation, va ce faire dans un dossier partagé "docker" situé sur "volume1"
Je vais donc installer SWAG dans
Les PUID/PGID de mon compte utilisateur sont : PUID=9999 PGID=111 **
Le nom de domaine utilisé pour l'exemple sera :
** Pour connaitre le PUID/GUID de l'utilisateur : [Tuto] Connaitre le PUID / PGID d'un utilisateur.
Sommaire :
1/ Créer les dossiers nécessaires
2/ Configuration et Création du fichier "docker-compose.yml"
___a/ Méthode DuckDNS
___b/ Méthode OVH
5/ Démarrage du conteneur
6/ Les sous-domaines ( à venir ! )
7/ Activation du HSTS
8/ Fail2ban
b/ Mise en place de Fail2ban sur Jellyfin
10/ Faire une redirection si le conteneur/destination n'est pas disponible
11/ Ajout du blocage géographique sur SWAG
Aller go
1/ Créer les dossiers nécessaires
Sur le NAS nous allons devoir créer un dossier
Vous pouvez le créer en SSH avec cette commande :
Ensuite, avec la commande
Note : A partir de maintenant, toute les commandes du tutoriel partirions du principe que vous les executer depuis le dossier /SWAG
2/ Configuration et Création du fichier "docker-compose.yml"
___a/ Méthode DuckDNS
___b/ Méthode OVH
5/ Démarrage du conteneur
Maintenant que tout est prêt, nous relançons le conteneur :
Le 1er lancement peut être un peu long, car la modification du dns n'est pas instantanée, et le conteneur attend entre 30 et 60sec afin d'être sur que la modification soit faite, avant de lancer la procédure de validation.
Astuce :
Il est possible de voir les logs du conteneur avec :
Une fois fini, votre reverse proxy / serveur web est fonctionnel !
La page par défaut du serveur web est dans /docker/swag/config/www
7/ Activation du HSTS
Votre certificat HTTPS doit être valide avant de faire ceci !!
Pour l'activation du HSTS ( plus d'info ici : https://gist.github.com/quietsy/58590a640dd4f7a89696c68b0e6a8691#hsts ), rien de compliqué !
Editer votre fichier ssl.conf présent dans votre dossier /config/nginx/
et décommenter la ligne suivante :
Sauvegarder, quitter et re-démarrer le conteneur !
8/ Fail2ban
fail2ban, inclu dans SWAG permet la prévention des intrusions.
a/ Commandes utiles
Voir les "prisons" actives :
Voir les IPs bannies pour une "prison" :
Sortir une IP d'une "prison" :
Bannir une IP dans une "prison" :
b/ Mise en place de Fail2ban sur Jellyfin
Ce passage ne sert plus a rien depuis la MAJ de SWAG du 9 janvier.
En effet, maintenant, SWAG log directement les erreurs de connexion dans le fichier nginx-unauthorized.conf dont par defaut, la "prison" ban automatiquement au bout de plusieurs echec.
Plus d'info : https://www.forum-nas.fr/threads/tuto-installer-swag-en-docker-reverse-proxy.15057/#post-112642
Pour archive, voici l'ancienne méthode :
c/ Mise en place de Fail2ban sur Vaultwarden
Bien sur cela ne marche que si votre Vaultwarden utilise le reverse proxy SWAG
Rendez vous dans le dossier de configuration de SWAG, chez moi /volume1/docker/swag/config :
Editer le fichier config/fail2ban/jail.local :
A la fin du fichier rajouter :
Enregistrer, et fermer le fichier.
Créer le fichier config/fail2ban/filter.d/vaultwarden.conf :
Dans le fichier, indiquer ceci :
Note : Cette définition ne fonctionne que si votre proxy a une adresse du type : https://vault..., si l'adresse de debut de votre reverse pour vaultwarden est différente, alors il faut adapter le script matomo.conf ci dessus en conséquence.
Redémarrer votre conteneur SWAG :
d/ Recevoir des notifications sur Gotify
Nous allons voir ici comment faire pour être notifié via Gotify. Bien sur, nous partons sur le fait que vous avez déja Gotify d'installé et fonctionnel Sinon c'est par ici : [Tuto] Installation de Gotify en Docker un NAS Synology
Nous allons créer notre fichier gotifyEmbed.conf avec la commande suivante :
Dedans nous allons copier coller le code suivant :
On enregistre et on quitte l'edition avec Ctrl+X
Ensuite, nous allons créer le script de notification, avec la commande suivante :
Dedans nous allons copier coller le code suivant :
Plusieurs choses, a modifier :
, devra être remplacé par l'url de votre serveur Gotify
xXxXxXxXxX, par votre token Gotify
On enregistre et on quitte l'edition avec Ctrl+X
On rend le script executable avec la commande suivante :
Maintenant, il nous reste a faire en sorte que fail2ban active le script de notifications quand il fait une action, pour cela on edit le fichier jail.local avec la commande suivante :
Trouver la ligne :
Remplacer la ligne par :
Comme cela :
On enregistre et on quitte l'edition avec Ctrl+X
Il ne nous reste maitenant seulement a redémarrer SWAG pour que les modifications soit effectivement, apres le redémarrage vous devez recevoir vos 1ere notifications :
e/ Mise en place de Fail2ban sur Matomo
Bien sur cela ne marche que si votre Matomo utilise le reverse proxy SWAG
Editer le fichier config/fail2ban/jail.local :
A la fin du fichier rajouter :
Enregistrer, et fermer le fichier.
Créer le fichier config/fail2ban/filter.d/matomo.conf :
Dans le fichier, indiquer ceci :
Note : Cette définition ne fonctionne que si votre proxy a une adresse du type : https://matomo..., si l'adresse de debut de votre reverse pour matomo est différente, alors il faut adapter le script matomo.conf ci dessus en conséquence.
Redémarrer votre conteneur SWAG :
9/ Mise en place de Crowdsec
Pour cette étape, il s'agit d'un sujet a part, voir : [Tuto] Installation et Configuration de CrowdSec avec le reverse proxy SWAG
10/ Faire une redirection si le conteneur/destination n'est pas disponible
Il peut être intéressant de faire une redirection dans le cas ou la destination ne sera pas disponible.
Par exemple, on peut renvoyer le visiteur vers une page de "status" en cas d'erreur.
Pour cela, éditer votre fichier de configuration de votre proxy, et apres la ligne :
Créer une nouvelle ligne, et rajouter :
Ici, le code est asser simple a comprendre, en cas d'erreur 404, 500, 502, 503 ou 504 alors on execute l'action fallback.
Maintenant, juste avant le derniere } de notre fichier, nous allons rajouter la définition de l'action fallback, donc mon cas :
Ici, je souhaite rediriger le visiteur vers une page de status gérée via Uptime Kuma à l'adresse https://status.ndd.fr/
Exemple : voici ce que donne un exemple complet de configuration reverse proxy pour Jellyfin, avec la redirection en cas d'echec :
Note : Dans Uptime Kuma, si vous souhaitez que votre conteneur ne soit pas vu comme en ligne ( a cause de la redirection "fallback" ), vous devez régler l'option "Max Redirect" sur 1. De cette façon, si l'adresse de votre conteneur se retrouve redirigé car non dispo, uptime kuma le verra "hors ligne".
11/ Ajout du blocage géographique sur SWAG
Il est possible d'ajouter a SWAG le blocage géographique. Pour cela, vous devez rajouter cette variable d'environnement au fichier docker-compose.yml :
Une fois le conteneur re-créé, editer votre fichier nginx/nginx.conf :
Dans la section http, on rajoute :
Comme ceci :
Ensuite on edite le fichier nginx/dbip.conf:
Avec l'aide de cette page Wikipedia : https://en.wikipedia.org/wiki/ISO_3166-2 nous allons pouvoir modifier comme nous le souhaitons les filtres $geo-whitelist et $geo-blacklist
Par exemple :
La liste $geo-whitelist n'accepte rien, sauf les pays listé. Ici, seul les IPs française seront acceptées.
La liste $geo-blacklist accepte tout, sauf les pays listé. Ici, seul les IPs chinoise seront interdites.
Pour configurer l'utilisation de la geo-whitelist dans la configuration de votre proxy, il vous suffira de rajouter ces deux lignes :
Exemple :
Dans notre exemple, si l'ip du visiteur n'est pas française, alors une erreur 404 lui sera retourné.
Voici un petit tuto, pour ceux qui souhaiterai installer SWAG de chez linuxserver en Docker.
SWAG, c'est quoi ?
SWAG - Secure Web Application Gateway (anciennement connu sous le nom deletsencrypt, sans lien avec Let's Encrypt™) configure un serveur Web Nginx et un proxy inverse avec prise en charge de php et un client certbot intégré qui automatise les processus gratuits de génération et de renouvellement de certificat de serveur SSL (Let's Encrypt et ZeroSSL). Il contient également fail2ban pour la prévention des intrusions.
Retrouvez plus d'informations sur SWAG ici : SWAG : reverse proxy, certificat HTTPS, Fail2ban…
Disclamer :
Le but de ce tuto sera de rendre cette installation facile et accessible a tous, bien que loin d’être un expert de docker/docker compose, n’hésiter pas à répondre à ce sujet avec vos interrogations, .. Pour ceux qui sont plus a l'aise avec ce genre d'installation, n'hésiter pas a proposer des améliorations, ou des conseils, ...
Pour un support sur SWAG ne concernant pas une installation via ce tutoriel, merci de poster votre question dans Applications.
Pré-requis :
Avoir Docker et Docker Compose installé sur sa machine.
Ce connecter en SSH à votre Serveur/NAS, si vous ne savez pas le faire, vous trouverez ici un tuto explicatif : [Tuto] Acceder à son NAS en lignes de commande.
A modifier selon votre installation :
Toute mon installation, va ce faire dans un dossier partagé "docker" situé sur "volume1"
Je vais donc installer SWAG dans
/volume1/docker/swag
Les PUID/PGID de mon compte utilisateur sont : PUID=9999 PGID=111 **
Le nom de domaine utilisé pour l'exemple sera :
[B]tutoevo.fr
[/B] chez OVH** Pour connaitre le PUID/GUID de l'utilisateur : [Tuto] Connaitre le PUID / PGID d'un utilisateur.
Sommaire :
1/ Créer les dossiers nécessaires
2/ Configuration et Création du fichier "docker-compose.yml"
___a/ Méthode DuckDNS
___b/ Méthode OVH
5/ Démarrage du conteneur
6/ Les sous-domaines ( à venir ! )
7/ Activation du HSTS
8/ Fail2ban
a/ Commandes utiles
c/ Mise en place de Fail2ban sur Vaultwarden
d/ Recevoir des notifications sur Gotify
e/ Mise en place de Fail2ban sur Matomo
9/ Mise en place de Crowdsec10/ Faire une redirection si le conteneur/destination n'est pas disponible
11/ Ajout du blocage géographique sur SWAG
Aller go
1/ Créer les dossiers nécessaires
Sur le NAS nous allons devoir créer un dossier
swag
contenant un dossier config/
ce dernier contiendra tous les fichiers de configuration nécessaire au fonctionnement du conteneur SWAG.Vous pouvez le créer en SSH avec cette commande :
mkdir -p /volume1/docker/swag/config
Ensuite, avec la commande
cd /volume1/docker/swag
, rendez-vous dans le dossier principal de SWAG que nous venons de créer.Note : A partir de maintenant, toute les commandes du tutoriel partirions du principe que vous les executer depuis le dossier /SWAG
2/ Configuration et Création du fichier "docker-compose.yml"
___a/ Méthode DuckDNS
______1/ Modification du fichier docker-compose
Sur votre ordinateur, créer un fichier docker-compose.yml, copier dedans le contenu suivant :
Vous devez modifier[/U] :
- PUID=9999, à modifier avec le PUID de votre utilisateur
- PGID=111, à modifier avec le PUID de votre utilisateur
- URL=tutoevo.duckdns.org, a modifier avec votre nom de domaine duckdns
- DUCKDNSTOKEN, vous devez récuperer votre token sur le site de DuckDNS https://www.duckdns.org
Une fois tous ceci modifié, on enregistre le fichier
______2/ Lancement du conteneur avec docker-compose
Toujours en SSH, et depuis notre dossier SWAG :
On lance la création du conteneur :
Sur votre ordinateur, créer un fichier docker-compose.yml, copier dedans le contenu suivant :
Code:
---
version: "2.1"
services:
swag:
image: lscr.io/linuxserver/swag
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=9999
- PGID=111
- TZ=Europe/Paris
- URL=tutoevo.duckdns.org
- VALIDATION=duckdns
- SUBDOMAINS=wildcard
- DUCKDNSTOKEN=mon-super-token-duckdns
volumes:
- ./config:/config
ports:
- 443:443
- 80:80
restart: unless-stopped
Vous devez modifier[/U] :
- PUID=9999, à modifier avec le PUID de votre utilisateur
- PGID=111, à modifier avec le PUID de votre utilisateur
- URL=tutoevo.duckdns.org, a modifier avec votre nom de domaine duckdns
- DUCKDNSTOKEN, vous devez récuperer votre token sur le site de DuckDNS https://www.duckdns.org
Une fois tous ceci modifié, on enregistre le fichier
docker-compose.yml
, et on le transfert sur le nas dans notre dossier SWAG.______2/ Lancement du conteneur avec docker-compose
Toujours en SSH, et depuis notre dossier SWAG :
On lance la création du conteneur :
Code:
docker compose up -d
___b/ Méthode OVH
______1/ Modification du fichier docker-compose
Sur votre ordinateur, télécharger le fichier docker-compose.yml, disponible en fichier joint en bas de ce post.
Vous devez modifier :
- PUID=9999, à modifier avec le PUID de votre utilisateur
- PGID=111, à modifier avec le PUID de votre utilisateur
- URL=tutoevo.fr, a modifier avec votre nom de domaine
- EMAIL, a modifier avec votre email ( permet de recevoir les notif d'expiration du/des certificats )
Ensuite, à modifier aussi mais cela est plus particulier suivant votre fournisseur du nom de domaine :
- VALIDATION=dns
- DNSPLUGIN=ovh
Pour la VALIDATION, je choisis "dns" car je souhaite une certificat de type "wildcard"
Pour DNSPLUGIN, je choisis, "ovh", car mon fournisseur de mon nom de domaine, est ovh. Voici la liste des fournisseurs possibles : aliyun, cloudflare, cloudxns, cpanel, digitalocean, dnsimple, dnsmadeeasy, domeneshop, gandi, gehirn, google, inwx, linode, luadns, netcup, njalla, nsone, ovh, rfc2136, route53, sakuracloud and transip.
Une fois tous ceci modifié, on enregistre le fichier
______2/ Premier lancement du conteneur avec docker-compose
Toujours en SSH, et depuis notre dossier SWAG :
On lance la création du conteneur :
On attend 1 min, puis .... Une fois le conteneur lancé, nous allons le stopper :
______3/ Modifications des options DNS
______1Maintenant que le docker à été lancé une fois, le dossier docker/swag/config doit contenir toute une arborescence de fichiers.
Dans le fichier correspondant a notre choix de DNSPLUGIN ( chez moi ovh ), nous allons suivre les étapes nécessaire a la validation.
Nous allons donc dans config/dns-conf pour éditer le fichier ovh.ini :*
*Si vous avez choisi un autre plugin, si votre fournisseur est différent, vous devait éditer et suivre les instructions de fichier correspondant a votre fournisseur !
Ici les instructions sont claires,
Je doit aller sur la page : https://github.com/certbot/certbot/blob/master/certbot-dns-ovh/certbot_dns_ovh/__init__.py#L20
Et renseigné les valeurs demandées.
Une fois, sur la page indiqué, de nouvelles consignes :
Je suis chez OVH EU, donc je vais a l'adresse : https://eu.api.ovh.com/createToken/
Et je rempli le formulaire comme préconisé par l'aide de SWAG :
Puis je valide avec Create Keys
La page suivante va me fournir 3 clés :
application_key
application_secret
consumer_key
Il me suffira de remplacer les clés du fichiers ovh.ini par celle fourni par l'API. J'enregistre le fichier, et le ferme.
Sur votre ordinateur, télécharger le fichier docker-compose.yml, disponible en fichier joint en bas de ce post.
Vous devez modifier :
- PUID=9999, à modifier avec le PUID de votre utilisateur
- PGID=111, à modifier avec le PUID de votre utilisateur
- URL=tutoevo.fr, a modifier avec votre nom de domaine
- EMAIL, a modifier avec votre email ( permet de recevoir les notif d'expiration du/des certificats )
Ensuite, à modifier aussi mais cela est plus particulier suivant votre fournisseur du nom de domaine :
- VALIDATION=dns
- DNSPLUGIN=ovh
Pour la VALIDATION, je choisis "dns" car je souhaite une certificat de type "wildcard"
Pour DNSPLUGIN, je choisis, "ovh", car mon fournisseur de mon nom de domaine, est ovh. Voici la liste des fournisseurs possibles : aliyun, cloudflare, cloudxns, cpanel, digitalocean, dnsimple, dnsmadeeasy, domeneshop, gandi, gehirn, google, inwx, linode, luadns, netcup, njalla, nsone, ovh, rfc2136, route53, sakuracloud and transip.
Une fois tous ceci modifié, on enregistre le fichier
docker-compose.yml
, et on le transfert sur le nas dans notre dossier SWAG.______2/ Premier lancement du conteneur avec docker-compose
Toujours en SSH, et depuis notre dossier SWAG :
On lance la création du conteneur :
Code:
docker compose up -d
On attend 1 min, puis .... Une fois le conteneur lancé, nous allons le stopper :
Code:
docker stop swag
______3/ Modifications des options DNS
______1Maintenant que le docker à été lancé une fois, le dossier docker/swag/config doit contenir toute une arborescence de fichiers.
Dans le fichier correspondant a notre choix de DNSPLUGIN ( chez moi ovh ), nous allons suivre les étapes nécessaire a la validation.
Nous allons donc dans config/dns-conf pour éditer le fichier ovh.ini :*
*Si vous avez choisi un autre plugin, si votre fournisseur est différent, vous devait éditer et suivre les instructions de fichier correspondant a votre fournisseur !
Ici les instructions sont claires,
Je doit aller sur la page : https://github.com/certbot/certbot/blob/master/certbot-dns-ovh/certbot_dns_ovh/__init__.py#L20
Et renseigné les valeurs demandées.
Une fois, sur la page indiqué, de nouvelles consignes :
Je suis chez OVH EU, donc je vais a l'adresse : https://eu.api.ovh.com/createToken/
Et je rempli le formulaire comme préconisé par l'aide de SWAG :
Puis je valide avec Create Keys
La page suivante va me fournir 3 clés :
application_key
application_secret
consumer_key
Il me suffira de remplacer les clés du fichiers ovh.ini par celle fourni par l'API. J'enregistre le fichier, et le ferme.
5/ Démarrage du conteneur
Maintenant que tout est prêt, nous relançons le conteneur :
Code:
docker start swag
Le 1er lancement peut être un peu long, car la modification du dns n'est pas instantanée, et le conteneur attend entre 30 et 60sec afin d'être sur que la modification soit faite, avant de lancer la procédure de validation.
Astuce :
Il est possible de voir les logs du conteneur avec :
Code:
docker logs swag
Une fois fini, votre reverse proxy / serveur web est fonctionnel !
La page par défaut du serveur web est dans /docker/swag/config/www
7/ Activation du HSTS
Votre certificat HTTPS doit être valide avant de faire ceci !!
Pour l'activation du HSTS ( plus d'info ici : https://gist.github.com/quietsy/58590a640dd4f7a89696c68b0e6a8691#hsts ), rien de compliqué !
Editer votre fichier ssl.conf présent dans votre dossier /config/nginx/
et décommenter la ligne suivante :
Code:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
Sauvegarder, quitter et re-démarrer le conteneur !
8/ Fail2ban
fail2ban, inclu dans SWAG permet la prévention des intrusions.
a/ Commandes utiles
Voir les "prisons" actives :
docker exec -it swag fail2ban-client status
Voir les IPs bannies pour une "prison" :
docker exec -it swag fail2ban-client status <NOM_PRISON>
Sortir une IP d'une "prison" :
docker exec -it swag fail2ban-client set <JAIL-NAME> unbanip <ADRESSE_IP>
Bannir une IP dans une "prison" :
docker exec -it swag fail2ban-client set <JAIL-NAME> banip <ADRESSE_IP>
b/ Mise en place de Fail2ban sur Jellyfin
Ce passage ne sert plus a rien depuis la MAJ de SWAG du 9 janvier.
En effet, maintenant, SWAG log directement les erreurs de connexion dans le fichier nginx-unauthorized.conf dont par defaut, la "prison" ban automatiquement au bout de plusieurs echec.
Plus d'info : https://www.forum-nas.fr/threads/tuto-installer-swag-en-docker-reverse-proxy.15057/#post-112642
Pour archive, voici l'ancienne méthode :
Bien sur cela ne marche que si votre Jellyfin utilise le reverse proxy SWAG
Toujours dans le dossier de SWAG :
Editer le fichier config/fail2ban/jail.local :
A la fin du fichier rajouter :
Enregistrer, et fermer le fichier.
Créer le fichier config/fail2ban/filter.d/jellyfin.conf :
Dans le fichier, indiquer ceci :
Redémarrer votre conteneur SWAG :
Toujours dans le dossier de SWAG :
Editer le fichier config/fail2ban/jail.local :
nano config/fail2ban/jail.local
A la fin du fichier rajouter :
Code:
[jellyfin]
enabled = true
filter = jellyfin
port = http,https
logpath = /config/log/nginx/access.log
maxretry = 4
Enregistrer, et fermer le fichier.
Créer le fichier config/fail2ban/filter.d/jellyfin.conf :
nano config/fail2ban/filter.d/jellyfin.conf
Dans le fichier, indiquer ceci :
Code:
[Definition]
failregex = ^<HOST> \- \S+ \[\] \"(GET|POST|CONNECT|PUT|DELETE) \/.*? \S+\" 401 .+$
Redémarrer votre conteneur SWAG :
docker restart swag
et voila c'est en place Si une personne fait 4 fois une erreur au moment de la connexion a l'interface web de jellyfin, il sera banni pendant le temps défiini dans votre fichier config/fail2ban/jail.local
( chez moi 600secondes soit 10min ).c/ Mise en place de Fail2ban sur Vaultwarden
Bien sur cela ne marche que si votre Vaultwarden utilise le reverse proxy SWAG
Rendez vous dans le dossier de configuration de SWAG, chez moi /volume1/docker/swag/config :
cd /volume1/docker/swag/config
Editer le fichier config/fail2ban/jail.local :
nano config/fail2ban/jail.local
A la fin du fichier rajouter :
Code:
[vaultwarden]
enabled = true
filter = vaultwarden
port = http,https
logpath = /config/log/nginx/access.log
maxretry = 4
Enregistrer, et fermer le fichier.
Créer le fichier config/fail2ban/filter.d/vaultwarden.conf :
nano config/fail2ban/filter.d/vaultwarden.conf
Dans le fichier, indiquer ceci :
Code:
[Definition]
failregex = ^<HOST>.*"(GET|POST|HEAD).*" (400|429) .+ \"https://vault\..+\" .+$
ignoreregex =
datepattern = {^LN-BEG}%%ExY(?P<_sep>[-/.])%%m(?P=_sep)%%d[T ]%%H:%%M:%%S(?:[.,]%%f)?(?:\s*%%z)?
^[^\[]*\[({DATE})
{^LN-BEG}
Note : Cette définition ne fonctionne que si votre proxy a une adresse du type : https://vault..., si l'adresse de debut de votre reverse pour vaultwarden est différente, alors il faut adapter le script matomo.conf ci dessus en conséquence.
Redémarrer votre conteneur SWAG :
docker restart swag
et voila c'est en place Si une personne fait 4 fois une erreur au moment de la connexion a l'interface web de vaultwarden, il sera banni pendant le temps défini dans votre fichier config/fail2ban/jail.local
( chez moi 600secondes soit 10min ).d/ Recevoir des notifications sur Gotify
Nous allons voir ici comment faire pour être notifié via Gotify. Bien sur, nous partons sur le fait que vous avez déja Gotify d'installé et fonctionnel Sinon c'est par ici : [Tuto] Installation de Gotify en Docker un NAS Synology
Nous allons créer notre fichier gotifyEmbed.conf avec la commande suivante :
nano config/fail2ban/action.d/gotifyEmbed.conf
Dedans nous allons copier coller le code suivant :
JSON:
[Definition]
# Notify on Startup
actionstart = bash /config/fail2ban/Fail2Gotify.sh start <name>
# Notify on Shutdown
actionstop = bash /config/fail2ban/Fail2Gotify.sh stopped <name>
#
actioncheck =
# Notify on Banned
actionban = bash /config/fail2ban/Fail2Gotify.sh ban <name> <ip>
# Notify on Unbanned
actionunban = bash /config/fail2ban/Fail2Gotify.sh unban <name> <ip>
[Init]
# Name of the jail in your jail.local file. default = [your-jail-name]
name = default
On enregistre et on quitte l'edition avec Ctrl+X
Ensuite, nous allons créer le script de notification, avec la commande suivante :
nano config/fail2ban/Fail2Gotify.sh
Dedans nous allons copier coller le code suivant :
Bash:
#!/bin/bash
## Variables Gotify
GOTIFY_URL=https://gotify.url
GOTIFY_TOKEN=xXxXxXxXxX
GOTIFY_PRIORITY_SUCCESS=2
GOTIFY_PRIORITY_ERROR=7
#Default values
GOTIFY_PRIORITY=${GOTIFY_PRIORITY_ERROR}
MESSAGE="OUPS"
TITLE="Fail2Ban"
if [ "$1" == "start" ]
then
GOTIFY_PRIORITY=${GOTIFY_PRIORITY_SUCCESS}
MESSAGE="Démarrage de la prison $2 ![](https://i.postimg.cc/SsjV5vjC/true50.png)"
fi
if [ "$1" == "stopped" ]
then
GOTIFY_PRIORITY=${GOTIFY_PRIORITY_ERROR}
MESSAGE="Arrêt de la prison $2 ![](https://i.postimg.cc/zBMp1FRM/false50.png)"
fi
if [ "$1" == "ban" ]
then
GOTIFY_PRIORITY=${GOTIFY_PRIORITY_ERROR}
MESSAGE="Bannissement de l'ip $3 dans la prison $2 ![](https://i.postimg.cc/HL6B6gWT/warn50.png)"
fi
if [ "$1" == "unban" ]
then
GOTIFY_PRIORITY=${GOTIFY_PRIORITY_SUCCESS}
MESSAGE="Débannissement de l'ip $3 dans la prison $2 ![](https://i.postimg.cc/SsjV5vjC/true50.png)"
fi
URL=${GOTIFY_URL}/message?token=${GOTIFY_TOKEN}
curl -s -S --data '{"message": "'"${MESSAGE}"'", "title": "'"${TITLE}"'", "priority":'"${GOTIFY_PRIORITY}"', "extras": {"client::display": {"contentType": "text/markdown"}}}' -X POST -H Content-Type:application/json "$URL"
exit 0
Plusieurs choses, a modifier :
, devra être remplacé par l'url de votre serveur Gotify
xXxXxXxXxX, par votre token Gotify
On enregistre et on quitte l'edition avec Ctrl+X
On rend le script executable avec la commande suivante :
chmod +x config/fail2ban/Fail2Gotify.sh
Maintenant, il nous reste a faire en sorte que fail2ban active le script de notifications quand il fait une action, pour cela on edit le fichier jail.local avec la commande suivante :
nano config/fail2ban/jail.local
Trouver la ligne :
Code:
banaction = iptables-allports
Remplacer la ligne par :
Code:
# Notifications Gotify
action = gotifyEmbed
iptables-allports
Comme cela :
On enregistre et on quitte l'edition avec Ctrl+X
Il ne nous reste maitenant seulement a redémarrer SWAG pour que les modifications soit effectivement, apres le redémarrage vous devez recevoir vos 1ere notifications :
e/ Mise en place de Fail2ban sur Matomo
Bien sur cela ne marche que si votre Matomo utilise le reverse proxy SWAG
Editer le fichier config/fail2ban/jail.local :
nano config/fail2ban/jail.local
A la fin du fichier rajouter :
Code:
[matomo]
enabled = true
filter = matomo
port = http,https
logpath = /config/log/nginx/access.log
maxretry = 4
Enregistrer, et fermer le fichier.
Créer le fichier config/fail2ban/filter.d/matomo.conf :
nano config/fail2ban/filter.d/matomo.conf
Dans le fichier, indiquer ceci :
Code:
[Definition]
failregex = ^<HOST> \- \S+ \[\] \"POST \/.*? \S+\" 403 .+ \"https:\/\/matomo.+\" .+$
ignoreregex =
datepattern = {^LN-BEG}%%ExY(?P<_sep>[-/.])%%m(?P=_sep)%%d[T ]%%H:%%M:%%S(?:[.,]%%f)?(?:\s*%%z)?
^[^\[]*\[({DATE})
{^LN-BEG}
Note : Cette définition ne fonctionne que si votre proxy a une adresse du type : https://matomo..., si l'adresse de debut de votre reverse pour matomo est différente, alors il faut adapter le script matomo.conf ci dessus en conséquence.
Redémarrer votre conteneur SWAG :
docker restart swag
et voila c'est en place Si une personne fait 4 fois une erreur au moment de la connexion a l'interface web de matomo, il sera banni pendant le temps défini dans votre fichier config/fail2ban/jail.local
( chez moi 600secondes soit 10min ).9/ Mise en place de Crowdsec
Pour cette étape, il s'agit d'un sujet a part, voir : [Tuto] Installation et Configuration de CrowdSec avec le reverse proxy SWAG
10/ Faire une redirection si le conteneur/destination n'est pas disponible
Il peut être intéressant de faire une redirection dans le cas ou la destination ne sera pas disponible.
Par exemple, on peut renvoyer le visiteur vers une page de "status" en cas d'erreur.
Pour cela, éditer votre fichier de configuration de votre proxy, et apres la ligne :
Code:
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
Créer une nouvelle ligne, et rajouter :
Code:
error_page 404 500 502 503 504 = @fallback;
Ici, le code est asser simple a comprendre, en cas d'erreur 404, 500, 502, 503 ou 504 alors on execute l'action fallback.
Maintenant, juste avant le derniere } de notre fichier, nous allons rajouter la définition de l'action fallback, donc mon cas :
Code:
location @fallback {
rewrite ^/(.*) https://status.ndd.fr/?;
}
Ici, je souhaite rediriger le visiteur vers une page de status gérée via Uptime Kuma à l'adresse https://status.ndd.fr/
Exemple : voici ce que donne un exemple complet de configuration reverse proxy pour Jellyfin, avec la redirection en cas d'echec :
Code:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name jellyfin.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
resolver 127.0.0.11 valid=30s;
set $upstream_app jellyfin;
set $upstream_port 8096;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
error_page 404 500 502 503 504 = @fallback;
}
location @fallback {
rewrite ^/(.*) https://status.ndd.fr/?;
}
}
Note : Dans Uptime Kuma, si vous souhaitez que votre conteneur ne soit pas vu comme en ligne ( a cause de la redirection "fallback" ), vous devez régler l'option "Max Redirect" sur 1. De cette façon, si l'adresse de votre conteneur se retrouve redirigé car non dispo, uptime kuma le verra "hors ligne".
11/ Ajout du blocage géographique sur SWAG
Il est possible d'ajouter a SWAG le blocage géographique. Pour cela, vous devez rajouter cette variable d'environnement au fichier docker-compose.yml :
DOCKER_MODS=linuxserver/mods:swag-dbip
Une fois le conteneur re-créé, editer votre fichier nginx/nginx.conf :
nano config/nginx/nginx.conf
Dans la section http, on rajoute :
include /config/nginx/dbip.conf;
Comme ceci :
Ensuite on edite le fichier nginx/dbip.conf:
nano config/nginx/dbip.conf
Avec l'aide de cette page Wikipedia : https://en.wikipedia.org/wiki/ISO_3166-2 nous allons pouvoir modifier comme nous le souhaitons les filtres $geo-whitelist et $geo-blacklist
Par exemple :
Code:
map $geoip2_data_country_iso_code $geo-whitelist {
default no;
FR yes;
}
map $geoip2_data_country_iso_code $geo-blacklist {
default yes;
CN no;
}
La liste $geo-whitelist n'accepte rien, sauf les pays listé. Ici, seul les IPs française seront acceptées.
La liste $geo-blacklist accepte tout, sauf les pays listé. Ici, seul les IPs chinoise seront interdites.
Pour configurer l'utilisation de la geo-whitelist dans la configuration de votre proxy, il vous suffira de rajouter ces deux lignes :
Code:
if ($lan-ip = yes) { set $geo-whitelist yes; }
if ($geo-whitelist = no) { return 404; }
Exemple :
Code:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name some-app.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
if ($lan-ip = yes) { set $geo-whitelist yes; }
if ($geo-whitelist = no) { return 404; }
location / {
[...]
Dans notre exemple, si l'ip du visiteur n'est pas française, alors une erreur 404 lui sera retourné.
2022-11-08 - Dans 8/c/ Fail2ban pour Vaultwarden changement du regex
2022-08-14 - Correction Paragraphe HSTS suite a https://www.forum-nas.fr/threads/tuto-installer-swag-en-docker-reverse-proxy.15057/post-119971
2022-06-17 - L'installation et la configuration de Crowdsec sont maintenant un tutoriel a part
2022-05-15 - Ajout de la procédure d'installation de Crowdsec
2022-04-29 - Correction d'une erreur dans Fail2Gotify.sh
2022-03-19 - Ajout de la méthode avec un nom de domaine DuckDNS
2022-03-13 - Ajout du point 8.e/ Mise en place de Fail2ban sur Matomo - Correction du regex de vaultwarden pour être plus sélectif. Ajout d'une erreur dans la mise en place des notifications Gotify qui avait pour résultat de ne pas réellement bannir l'ip. Mise en forme du post.
2022-03-11 - Ajout du point 8.d/ Recevoir des notifications sur Gotify
2022-03-09 - Ajout du blocage géographique sur SWAG
2022-02-14 - Ajout 9/ Faire une redirection si le conteneur/destination n'est pas disponible
2022-02-04 - Suppression de la partie b/ Mise en place de Fail2ban sur Jellyfin suite à la MAJ de SWAG
2022-01-29 - Correction du nom du fichier dans le paragraphe 8.c
2021-09-22 - Mise en forme + Ajout Fail2ban Jellyfin / Vaultwarden
2021-06-05 - Ajout d'une note sur l'activation du HSTS
Pièces jointes
Dernière édition: