Aller au contenu

[TUTO] Certificat SSL & reverse proxy via Docker


.Shad.

Messages recommandés

Il y a 5 heures, Einsteinium a dit :

Question shad car je regardais ton tutoriel... Portainer prends enfin le

cap_add:
         - NET_ADMIN

du docker compose ?

Car de mémoire le déploiement échoue si on met cette argument, il faut alors le mettre en extra args : --cap-add=NET_ADMIN

Je pensais avoir posté ma réponse : aucun soucis avec ça depuis pas mal de temps avec Portainer.

 

Il y a 5 heures, Einsteinium a dit :

Globalement tu ne communiques qu'avec swag, c'est swag qui derrière communique avec tes différents serveurs et te l'affiche derrière, qu'importe que le serveur derrière est un certificat ou pas, qu'il soit en http ou https, au final tu ne verras que le certificats de swag qui est ton tiers de confiance, il sécurise entre toi et lui.

Ok 🙂 Je comprends enfin ce qu'il me manquait ^^

Il y a 4 heures, .Shad. a dit :

@MilesTEG1 Mais de quelle application tu aurais encore besoin sur le 443 sur le NAS directement ? Tout passe par SWAG comme l'a dit @Einsteinium, ce qui ne passe pas par SWAG (Drive, HBK, etc...) passe par un port dédié (6690, 6281, etc...) et là il te faut un certificat pour ces applis là sur le NAS, méthode acme par Docker ou ndd Synology, peu importe.

Ce qui continue de me faire comprendre 🙂 ce qu'il me manquait ^^

Merci pour ces infos complémentaires 🙂

 

Lien vers le commentaire
Partager sur d’autres sites

@.Shad.
J'ai constaté un truc assez pénible avec le Fail2ban intégré à SWAG : les fichiers de prisons fail2ban/jail.d/*.local donc tous ceux que j'ai mis dans le dossier fail2ban/jail.d/ne sont pas chargé !

Pour réussir à avoir mes jails de pris en compte, il a fallu que je mette le contenu des fail2ban/jail.d/*.local dans le fichier fail2ban/jail.local après celles concernant nginx … sinon ça charge pas du tout…
Savez vous pourquoi ?


C’est quand même moins pratique d’aller chercher tout en bas du jail.local les infos à modifier que de prendre le fichier *.local dédié…

edit : 
Ajour du jail.local (avant ajout des jails supplémentaires) 

## Version 2020/05/10 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/jail.local
# This is the custom version of the jail.conf for fail2ban
# Feel free to modify this and add additional filters
# Then you can drop the new filter conf files into the fail2ban-filters
# folder and restart the container


##==============================================================================================
##                                                                                            ##
##       Sources utilisées pour personnaliser ce fichier et ceux dans les sous-dossiers       ##
##     https://www.linode.com/docs/guides/using-fail2ban-to-secure-your-server-a-tutorial/    ##
##                                                                                            ##
##                       https://www.linuxtricks.fr/wiki/print.php?id=40                      ##
##                                                                                            ##
##==============================================================================================



[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1/8 ::1
           10.0.0.0/8
           192.168.0.0/16
           172.16.0.0/12

# Changes the default ban action from "iptables-multiport", which causes issues on some platforms, to "iptables-allports".
banaction = %(banaction_allports)s

# "bantime.increment" allows to use database for searching of previously banned ip's to increase a
# default ban time
bantime.increment = true

# "bantime.maxtime" is the max number of seconds using the ban time can reach (doesn't grow further)
bantime.maxtime = 5w

# "bantime.factor" is a coefficient to calculate exponent growing of the formula or common multiplier
bantime.factor = 24

# "bantime" is the number of seconds that a host is banned.
bantime = 1h

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 24h

# "maxretry" is the number of failures before a host get banned.
maxretry = 5

# ########################################
# eMail config
destemail = mon-email@gmail.com
dest = mon-email@gmail.com
sender = mon-email@gmail.com
sendername = Fail2Ban (SWAG)

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action = %(action_mwl)s

# Notes.:  command executed on demand at the first ban (or at the start of Fail2Ban if actionstart_on_demand is set to false).
actionstart = printf %%b "Subject: [Fail2Ban (SWAG)] <name>: started on <fq-hostname>
              Date: `LC_ALL=C date +"%%a, %%d %%h %%Y %%T %%z"`
              From: <sendername> <<sender>>
              To: <dest>\n
              Hi,\n
              The jail <name> has been started successfully.\n
              Regards,\n
              Fail2Ban (SWAG)" | <mailcmd>

# Notes.:  command executed at the stop of jail (or at the end of Fail2Ban)
actionstop = printf %%b "Subject: [Fail2Ban (SWAG)] <name>: stopped on <fq-hostname>
             Date: `LC_ALL=C date +"%%a, %%d %%h %%Y %%T %%z"`
             From: <sendername> <<sender>>
             To: <dest>\n
             Hi,\n
             The jail <name> has been stopped.\n
             Regards,\n
             Fail2Ban (SWAG)" | <mailcmd>

# ########################################
backend = auto


[ssh]
enabled = true
port    = 99    # Valeur du port si changer, sinon ssh
filter  = sshd
logpath = /log/host_ssh_auth.log

[nginx-http-auth]
enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /config/log/nginx/error.log

[nginx-badbots]
enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /config/log/nginx/access.log
maxretry = 2

[nginx-botsearch]
enabled  = true
port     = http,https
filter   = nginx-botsearch
logpath  = /config/log/nginx/access.log

[nginx-deny]
enabled  = false
port     = http,https
filter   = nginx-deny
logpath  = /config/log/nginx/error.log

[nginx-unauthorized]
enabled  = true
port     = http,https
filter   = nginx-unauthorized
logpath  = /config/log/nginx/unauthorized.log

Et un fichier dans fail2ban/jail.d :

## /volume1/docker/swag_macvlan/fail2ban/jail.d/vaultwarden-auth.conf
## See : https://github.com/dani-garcia/vaultwarden/wiki/Fail2Ban-Setup#synology-dsm

## Version 2022/08/06
# Fail2Ban jail configuration for vaultwarden
# Requires modification to Vaultwarden's settings
# https://github.com/dani-garcia/vaultwarden/wiki/Logging#logging-to-a-file

[vaultwarden-auth]
enabled = true
port = 882,443,3012

# Doit correspondre au nom du fichier .conf dans le dossier filter.d
filter = vaultwarden-auth

banaction = %(banaction_allports)s
logpath = /var/log/vaultwarden.log
maxretry = 3
bantime = 14400
findtime = 14400

 

Modifié par MilesTEG1
Lien vers le commentaire
Partager sur d’autres sites

il y a 30 minutes, .Shad. a dit :

En même temps dans leur jail.local je ne vois pas d'include, essaie d'ajouter :

include jail.d/*.conf

et de redémarrer le conteneur.

Si ça fonctionne tu peux toujours créer une demande d'amélioration sur leur GitHub. 😉 

Bon et bien ça ne fonctionne pas XD

Va falloir que je fasse une issue quand même je pense...

Modifié par MilesTEG1
Lien vers le commentaire
Partager sur d’autres sites

Bonsoir à tous,
Alors j’ai fait je ne sais pas combien de tests avec le fail2ban de crasymax et celui intégré à swag.

Le fail2ban de crazy-max :

Je peux envoyer des e-mails nativement (il y a ssmtp dans le conteneur et on lui passe des variables d’environnant pour le configurer)
Il va bien chercher les différents fichiers dans jail.d.
MAIS : tout ce que je mets dans la section DEFAULT de mon jail.local n’est absolument pas pris pour valeur par défaut pour les fichiers .local du jail.d ! Je suis donc obligé de faire du copier coller des paramètres pour l’e-mail, les durées de ban etc…
Toutes les prisons que je définie dans le jail.local ne sont pas prises en compte…
Pfff…

 

Le fail2ban intégré à SWAG :

Je ne peux pas envoyer de mail directement sans modifier la commande de send mail dans un fichier sendmail-common.local (copie du .conf). Tout ça parce que ce conteneur (swag) n’inclue pas ssmtp…
Impossible de faire prendre en compte les fichiers .local dans le dossier jail.d… c’est comme s’ils n’existaient pas …
MAIS : la section DEFAULT semble garder les valeurs pour toutes les prisons qui suivent… les prisons définies dans ce jail.local sont bien prise en compte.

Purée que c’est lourd…

 

Bref, verdict, le fail2ban inclus dans SWAG me semble pas du tout identique (pour ne pas dire moisi) à celui fourni par l'image de Crazy-Max... sans parler de l'absence de ssmtp pour envoyer les emails via quelques variables d'environnement...
 

Quoiqu'il en soit, je suis preneur de configuration pour l’envoi d’émail via sendmail sur un serveur smtp ovh (le mail inclus avec le nom de domaine que j’ai acheté), et aussi de celle pour le smtp d’infomaniak.
Car aucun des réglages que j’ai tenté n’a fonctionné, tout du moins avec le f2b de crazy-max.

Les possibilités sont limitées à ces variables-là :

services:
  fail2ban:
    image: ghcr.io/crazy-max/fail2ban:latest    # https://github.com/fail2ban/fail2ban
    
    ...
      
    environment:

      ...

      - SSMTP_HOST=smtp.gmail.com
      - SSMTP_PORT=587            # Pour gmail : 587
      - SSMTP_HOSTNAME=Docker-Fail2ban      # Ce sera le nom qui sera affiché dans les emails
      - SSMTP_USER=mon-mail@gmail.com
      - SSMTP_PASSWORD=MDP-application      # Pensez à générer un mot de passe application si la 2FA est activée
      - SSMTP_TLS=NO              # Pour gmail : YES ou NO ?? Ça fonctionne avec NO ?!
      - SSMTP_STARTTLS=YES        # Pour gmail : YES
    ...

Les paramètres que j'ai eu de OVH pour le serveur SMTP sont

  • le serveur : ssl0.ovh.net
  • le port de connexion 465
  • Ne cochez pas la case « Exiger l'authentification par mot de passe sécurisé (SPA) lors de la connexion ».

Rien de plus...
J'utilise ces infos avec succès avec Tautulli pour envoyer des mails de newsletter. J'utilise aussi mes clients mails (Spark) pour récupérer les mails avec succès.
Mais je n'arrive pas à déterminer quelle combinaison de SSMTP_TLS et de SSMTP_STARTTLS utiliser...
Je ne sais même pas si le serveur répondrait sur le port 587...

Sur ce, ++

Lien vers le commentaire
Partager sur d’autres sites

Pour les notifications, vu que Discord ne te convient pas, tu as aussi Gotify, partie 8-d du tutoriel de EVOTk : https://www.forum-nas.fr/threads/tuto-installer-swag-en-docker-reverse-proxy.15057/

Pour le SMTP d'OVH c'est simple : port 587 -> STARTTLS / port 465 -> SSL

Sachant qu'on utilise maintenant plutôt STARTTLS que SSL.

Et le SMTP de Google c'est bien STARTTLS qu'ils utilisent.

De là à dire que c'est illisible dans un seul fichier de jail :

## Version 2020/05/10 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/jail.local
# This is the custom version of the jail.conf for fail2ban
# Feel free to modify this and add additional filters
# Then you can drop the new filter conf files into the fail2ban-filters
# folder and restart the container

[DEFAULT]

# Changes the default ban action from "iptables-multiport", which causes issues on some platforms, to "iptables-allports".
banaction = iptables-allports

# "bantime" is the number of seconds that a host is banned.
bantime  = 24h

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 30m

# "maxretry" is the number of failures before a host get banned.
maxretry = 5

# Ignore local IPs
ignoreip = 10.0.0.0/8 192.168.0.0/16 172.16.0.0/12 2a02:xxxx:xxxx:da01::/64

[ssh]

enabled = true
filter  = sshd
port    = ssh
logpath = /log/host_auth.log
action  = discordEmbed[bantime=24]
          iptables-allports


[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /config/log/nginx/error.log


[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /config/log/nginx/access.log
maxretry = 2


[nginx-botsearch]

enabled  = true
port     = http,https
filter   = nginx-botsearch
logpath  = /config/log/nginx/access.log


[nginx-deny]

enabled  = true
port     = http,https
filter   = nginx-deny
logpath  = /config/log/nginx/error.log



[bitwarden]

enabled  = true
port     = http,https
filter   = bitwarden
logpath  = /log/host_bitwarden.txt
action   = discordEmbed[bantime=24]
           iptables-allports


[calibre-web]

enabled  = true
port     = http,https
filter   = calibre-web
logpath  = /log/calibre-web/calibre-web.log
action   = discordEmbed[bantime=24]
           iptables-allports


[embyserver]

enabled = true
port    = http,https
filter  = embyserver
logpath = /log/host_embyserver.txt
action  = discordEmbed[bantime=24]
          iptables-allports
Lien vers le commentaire
Partager sur d’autres sites

il y a 30 minutes, .Shad. a dit :

Pour les notifications, vu que Discord ne te convient pas, tu as aussi Gotify, partie 8-d du tutoriel de EVOTk : https://www.forum-nas.fr/threads/tuto-installer-swag-en-docker-reverse-proxy.15057/

 

Je suis avec iOS 😅 donc je crois que gotify c’est pas pour moi 😅

il y a 30 minutes, .Shad. a dit :

Pour le SMTP d'OVH c'est simple : port 587 -> STARTTLS / port 465 -> SSL

Sachant qu'on utilise maintenant plutôt STARTTLS que SSL.

Et le SMTP de Google c'est bien STARTTLS qu'ils utilisent.

Ok merci pour les infos, je re testerais avec.

il y a 31 minutes, .Shad. a dit :

De là à dire que c'est illisible dans un seul fichier de jail

J’ai jamais dis que c’était illisible mais que c’était pas pratique du tout…

Lien vers le commentaire
Partager sur d’autres sites

Il y a 1 heure, Einsteinium a dit :

@.Shad. Une question, pourquoi donné une ip au docker swag au lieu de l’hébergé en bridge ?

Probablement pour que les IP sources soient correctement vues, sinon ça risque d'être l'IP du réseau bridge... (j'ai pas le terme exact en tête pour parler de ça. Mais une IP comme ça : 172.26.0.1

Lien vers le commentaire
Partager sur d’autres sites

@Einsteinium D'une part parce que les ports 80 et 443 du NAS sont déjà utilisés. Et que je préfère ne pas toucher à DSM.

D'autre part on pourrait se dire on map les ports 80 et 443 du NAS sur 10080 et 10443 par exemple et sur le modem/routeur on fait un NAT 80 -> 10080 du NAS et 10443 du NAS. De l'extérieur c'est transparent, mais si on veut utiliser les mêmes noms de domaine en interne qu'en externe on est coincé.

En macvlan on règle ces deux problèmes, même si je reconnais que c'est plus facile en bridge. Le plus simple étant de mettre SWAG en bridge sur une machine dont les ports 80 et 443 sont libres (ou passer par une VM, mais ça revient peu ou prou à faire un conteneur en macvlan, avec en plus des ressources dédiées qui seront toujours trop importantes pour du Nginx qui ne consomme quasi rien).

Lien vers le commentaire
Partager sur d’autres sites

il y a 33 minutes, .Shad. a dit :

De l'extérieur c'est transparent, mais si on veut utiliser les mêmes noms de domaine en interne qu'en externe on est coincé.

Bah justement, plutôt que de faire du nat vers ses ports, pourquoi ne pas le faire vers le 443/80 du nas et déclarer le serveur dans web station ?

Lien vers le commentaire
Partager sur d’autres sites

Via les virtual host ? Je veux bien que tu m'expliques alors. Car pour moi les virtual host de Webstation, c'est l'équivalent Apache des blocs "server" de Nginx mais ma connaissance d'Apache est quasi nulle.

S'il y a moyen d'avoir Nginx sur les ports 80 et 443 du NAS sans se passer de Webstation et commencer à désinstaller/stopper des paquets du NAS je suis preneur.

Mais à ma connaissance 80 est pris par Apache (ou Nginx si on le configure ainsi) et par Nginx sur le 443.

 

Modifié par .Shad.
Lien vers le commentaire
Partager sur d’autres sites

En recréant le conteneur, j’ai de nouveau un Dashboard.subdomain.conf dans le dossier proxy-confs !

j’ai du commenter les deux lignes où il y’a les include vers les fichiers de ce dossier dans le proxy-confs/default

Bon après le Dashboard c’est pas si utile que ça… je vais peut-être le virer 😅

tu me diras quand tu auras mis en place les thèmes 😉 moi je suis en cours, fait l’étape du fichier de conf pour le domaine themepark.mon-ndd.tld

Lien vers le commentaire
Partager sur d’autres sites

il y a 20 minutes, MilesTEG1 a dit :

En recréant le conteneur, j’ai de nouveau un Dashboard.subdomain.conf dans le dossier proxy-confs !

Sans .sample à la fin ?

Pour theme-park je n'ai pas encore testé en auto-hébergé pour l'instant, mais franchement c'est sympa sur Deluge :

deluge_dashboard_themepark.png

Lien vers le commentaire
Partager sur d’autres sites

il y a 7 minutes, .Shad. a dit :

Sans .sample à la fin ?

Oui dans le .sample à la fin… et comme je mets mes sites dans l’autre dossier… je ne mets rien dans proxy-confs…

 

il y a 8 minutes, .Shad. a dit :

Pour theme-park je n'ai pas encore testé en auto-hébergé pour l'instant, mais franchement c'est sympa sur Deluge :

Ha oui carrément ! Moi utilise pour plein de site : ruttorent, AdGuard home , portainer, etc…

Lien vers le commentaire
Partager sur d’autres sites

@.Shad.

Salut, 

alors, je valide la méthode swag avec variables. J’ai testé sur AdGuard Home et Calibre Web, et ça fonctionne super bien.

Par contre ça ne fonctionne pas avec Vaultwarden , ce serait une histoire de Content-Security-Policy

https://docs.theme-park.dev/themes/bitwarden/#setup

Mais je ne trouve pas le fichier de configuration yml dont ils parlent puisque moi c’est Vaultwarden et pas Bitwarden, et si je met dans le .conf fR nginx pour Vaultwarden une ligne add_header ca ne fonctionne pas non plus…

Faudrait que je fasse une issue là aussi 😉

Lien vers le commentaire
Partager sur d’autres sites

@.Shad.

Bon voilà, j'ai finalisé mes configurations de services qui passent par le reverse proxy.
j'ai même ajouté des thèmes via les .conf de nginx. Voir ici :https://docs.theme-park.dev/setup/

J'ai thémé les applications suivantes :

  • tautulli
  • AdGuard Home
  • Portainer
  • calibre web

Je suis passé par la méthode des variables. J'ajoute ces lignes à chaque fichier de configuration de service :

# THEME.PARK
set $theme nord;
set $app adguard;
include /config/nginx/theme-park.conf;

Avec ceci pour le fichier theme-park.conf :

# File to be included in each .conf
# See : https://docs.theme-park.dev/setup/

proxy_set_header Accept-Encoding "";
sub_filter
'</head>'
'<link rel="stylesheet" type="text/css" href="https://theme-park.dev/css/base/$app/$theme.css">
</head>';
sub_filter_once on;

 

Pour Vaultwarden, j'ai tenté d'ajouter ce qui suit au bloc serveur de mon entrée vaultwarden, mais sans succès :
 

add_header Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline' theme-park.dev;" always;

Si jamais tu avais une idée XD je suis preneur ^^

 

Il me reste plus qu'à finaliser Crowdsec et Authellia

Lien vers le commentaire
Partager sur d’autres sites

Tu as testé d'ajouter les blocs de subfiltering dans les deux blocs suivant du fichier vaultwarden.subdomain.conf ?

    location / {
        # enable the next two lines for http auth
        #auth_basic "Restricted";
        #auth_basic_user_file /config/nginx/.htpasswd;

        # enable the next two lines for ldap auth
        #auth_request /auth;
        #error_page 401 =200 /ldaplogin;

        # enable for Authelia
        #include /config/nginx/authelia-location.conf;

        include /config/nginx/proxy.conf;
        include /config/nginx/resolver.conf;
        set $upstream_app vaultwarden;
        set $upstream_port 80;
        set $upstream_proto http;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;

    }

    location ~ (/vaultwarden)?/admin {
        # enable the next two lines for http auth
        #auth_basic "Restricted";
        #auth_basic_user_file /config/nginx/.htpasswd;

        # enable the next two lines for ldap auth
        #auth_request /auth;
        #error_page 401 =200 /ldaplogin;

        # enable for Authelia
        #include /config/nginx/authelia-location.conf;

        include /config/nginx/proxy.conf;
        include /config/nginx/resolver.conf;
        set $upstream_app vaultwarden;
        set $upstream_port 80;
        set $upstream_proto http;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;

    }

 

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.