Aller au contenu

Mise en place Haproxy & Letsencrypt dans Docker


nasmanu

Messages recommandés

j'ai corrigé mon problème, j'ai du mettre l'IP du NAS au lieu de localhost dans le backend.

Par contre j'ai un autre soucis, je suis obligé de désactiver le fw du NAS car sinon je suis bloqué pour y accéder, j'ai pourtant autorisé l'application Docker Haproxy avec les ports adéquates mais ce n'est malheureusement pas suffisant. Je regarderais cela dans la semaine.

Lien vers le commentaire
Partager sur d’autres sites

Pour rappel, je n'utilise pas haproxy, donc ne vous attendez pas à un support de ma part sur la conf de ce dernier.

Par exemple, je viens de m'apercevoir que si on n'utilise pas les ports 80 et 443, mais par exemple les ports 10080 et 10443, la redirection ne fonctionne pas correctement :

En ajoutant http-request replace-header Host ^(.*?)(:[0-9]+)?$ \1:10443 juste avant la redirection, ça fonctionne :

Mais comme le port se retrouve hard codé dans la conf, ce n'est ni propre ni portable => il faudrait le passer en variable.

De même, rien qu'en regardant la conf par défaut, je vois bien que la partie SSL n'est pas optimum, loin sans faut (tls 1.0 et 1.1 autorisés, liste de cipher vieillotte, ...)

Il y a surement plein d'autres choses à modifier pour avoir une conf de base plus fiable et sécurisée, mais c'est de la conf haproxy, aucun rapport avec docker ou letsencrypt ou l'intégration des 3 ensemble.

Si ce conteneur fonctionne correctement et que vous me donnez un coup de main sur haproxy, j'intégrerai les modifications dans la mesure du possible.

Pour le moment si vous voulez jouer (j'ai publié le Dockerfile en automated build, donc plus besoin de faire le build vous même) : docker run -d --restart always --name haproxy -p 80:80 -p 443:443 -v /path/to/letsencrypt:/root/.acme.sh -v /path/to/haproxy:/etc/haproxy fenrir/acme-haproxy

nb : il existe plein d'autres conteneurs qui vont à peu près la même chose, donc c'est peut être inutile, à vous de voir

Lien vers le commentaire
Partager sur d’autres sites

oui c'est sur, il y'a de l'amélioration a faire côté Haproxy.

Il y a cet excellent tuto qui regroupe beaucoup d'info et je sais que @gaetan.cambier avait déjà conseillé (mais cela remonte déjà à fin 2015) de modifier certains points sur la sécurité notamment sur RC4 qui était obsolète.

Peut-être va-t-il passer par ici ;)

 

PS : j'ai remis en forme tout cela dans un document pour le tuto, il me reste a finaliser la partie crontab et a prendre peut être quelques screenshots

Lien vers le commentaire
Partager sur d’autres sites

Avant de publier le tuto, il faudrait finir le conteneur.

Comme dit juste avant, je peux modifier le Dockerfile pour y intégrer vos modifications de conf, mais je n'ai pas envi de faire le tour de la conf d'haproxy ou de divers tuto => donne moi les correctifs à passer

Une bonne base de départ pourrait être la conf du paquet haproxy du temps où il fonctionnait (de mémoire, il y avait des exemples pour la plupart des appli syno).

Je peux aisément ajouter un fichier haproxy.syno.example dans le dossier de conf, dans lequel les utilisateurs pourraient aller chercher les morceaux dont ils ont besoin.

Les seuls points que je traiterais peut être par moi même sont la partie TLS et les perfs, le reste ne m’intéresse pas plus que ça.

edit :

Voilà la conf d'HAProxy corrigée pour la partie TLS, au menu :

  • suite de chiffrement plus renforcée (en gardant un minimum de rétro compatibilité)
  • TLS1.2 uniquement (pas trop de rétro compatibilité non plus, faut pas pousser)
  • non présent dans la conf, mais l'OSCP stapling est fonctionnel (c'est galère avec haproxy en comparaison d'nginx)
  • HSTS

Il manque :

  • HKPK : ingérable avec LE et/ou si vous n'avez pas d'api sur vos DNS
  • HTTP/2 : j'ai fait quelques tests, mais haproxy ne semble pas le gèrer correctement (en tout cas pas en offload ssl)

J'ai ajouté quelques autres réglages :

  • CSP
  • XXSS
  • Referrer Policy
  • Compression
global
	log xxx.xxx.xxx.xxx:514 local1
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon

	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	# Default ciphers to use on SSL-enabled listening sockets.
	ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
	ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
	ssl-default-server-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
	ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
	tune.ssl.default-dh-param 2048

defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
	timeout connect 5000
	timeout client  50000
	timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http

	compression algo gzip
	compression type text/html text/plain text/css text/javascript

frontend ssl_redirector
	bind *:443 ssl crt /etc/haproxy/ssl/

	# Only if you never want HTTP again
	# See https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
	http-response set-header Strict-Transport-Security max-age=15552001

	http-request del-header X-Forwarded-Proto
	http-request set-header X-Forwarded-Proto https if { ssl_fc }
	acl letsencrypt-request path_beg -i /.well-known/acme-challenge/
	use_backend letsencrypt_backend if letsencrypt-request
	default_backend website_backend

frontend http_redirect
	bind *:80
	acl letsencrypt-request path_beg -i /.well-known/acme-challenge/
	# If your are using a non standard port, tune this
#	http-request replace-header Host ^(.*?)(:[0-9]+)?$ \1:10443
	redirect scheme https code 302 if !letsencrypt-request
	use_backend letsencrypt_backend if letsencrypt-request

backend letsencrypt_backend
	server letsencrypt 127.0.0.1:11444

backend website_backend
	server server01 xxx.xxx.xxx.xxx:12080

	http-request add-header X-Forwarded-Proto https

	# Hide server engine
	rspidel ^Server:.*$

	# Security related headers (very restrictive)
	rspadd Content-Security-Policy:\ default-src\ https:\
	rspadd X-Frame-Options:\ SAMEORIGIN
	rspadd X-Content-Type-Options:\ nosniff
	rspadd X-Xss-Protection:\ 1;\ mode=block
	http-response set-header Referrer-Policy "same-origin"

La partie perf n'est pas nécessaire, par défaut HAProxy encaisse plus que ne le permet un synology (sauf à tuner le noyau du syno).

Si vous ne voyez pas de coquille, je ferai un commit sur le dépôt dans la semaine.

Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...
  • 3 semaines après...

Hello,

Vraiment désolé pour ce long moment d'attente mais je n'ai pas eu de temps pour le nas et j'attendais aussi les 90J pour tester grandeur nature la renouvellement.

Depuis début aout d'accès distant au nas car le renouvellement n'a pas fonctionné. Il faut que je me penche sur ce problème...

 

Concernant tes dernières modifs de haproxy, cela me semble ok, je n'ai pas eu de soucis avec :)
J'ai ajouté ces éléments a la conf :

Default
    userlist my_users
    user TOTO insecure-password PASSWORD

Frontend ssl
    stats uri /stats
    stats auth TOTO:PASSWORD
    use_backend gateone                    if { path_beg /gateone }

backend gateone
    acl auth_access http_auth(my_users)
    http-request auth realm Authentification if !auth_access
    server gateone IP_NAS:PORT ssl check verify none

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • 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.