diff --git a/pica-traefik/README.md b/pica-traefik/README.md index 0544aa4..d3c67df 100644 --- a/pica-traefik/README.md +++ b/pica-traefik/README.md @@ -7,36 +7,28 @@ Ce service doit être lancé sur l'ensemble des machines de l'infrastructure. ### Configuration -La configuration a lieu dans le fichier [traefik.toml](./traefik.toml). +La configuration a lieu dans les fichiers [traefik.toml](./traefik.toml) et [traefik_dynamic.toml](./traefik_dynamic.toml). Notez que toute modification dans ce fichier impactera l'ensemble des machines, puisque le même fichier est utilisé pour l'ensemble des machines. À des fins de tests, il peut être modifié localement sur les machines, mais doit toujours rester synchronisé avec ce dépôt à long terme. Pour la génération des certificats, Traefik utilise Let's Encrypt. Il n'y a aucune configuration à faire de ce côté. Attention, le nombre de certificats générables est limité à 50 par semaine. -Si on lance plein de conteneurs de tests, on utilisera temporairement [l'environnement de qualification](https://letsencrypt.org/fr/docs/staging-environment/) de Let's Encrypt, en ajoutant la directive `caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"` sous la section `[acme]`. +Si on lance plein de conteneurs de tests, on utilisera temporairement [l'environnement de qualification](https://letsencrypt.org/fr/docs/staging-environment/) de Let's Encrypt, en ajoutant la directive `caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"` sous la section `[certificatesResolvers.letsencrypt.acme]`. ### Lancement -Assurez-vous que le dossier `/DATA/docker/traefik/certs` existe. -C'est dans ce dossier que seront conservés tous les certificats générés par Traefik. +Au premier lancement, assurez-vous que : +* Le dossier `/DATA/docker/traefik/certs` existe +* Créez un fichier `acme.json` à l'intérieur +* Changez son propriétaire à `root` +* Changez ses permissions à `600` + +C'est dans ce fichier que seront conservés tous les certificats générés par Traefik. ### Mise à jour Il suffit de mettre à jour le tag de l'image dans Compose. -Attention, Traefik v2 introduit énormément de changements et [nous ne sommes pas certains](https://wiki.picasoft.net/doku.php?id=technique:adminsys:migration-traefik-v2) de la manière d'effectuer la migration. +Lire la documentation [sur les mises à jour mineures](https://docs.traefik.io/v2.2/migration/v2/) pour voir s'il y a des opérations à effectuer ou des options dépréciées. -Aussi, Traefik v1.6 est utilisé pour tenterd d'éviter un bug introduit dans la 1.7, qui rend certains services redémarrés inaccessibles (voir [cette discussion](https://team.picasoft.net/picasoft/pl/66aorsxhtffrjytyhnecn436wa)). - -Avant toute mise à jour, il faudra discuter avec l'équipe technique et modifier ce README le cas échéant. - -### Todo - -*Voir si on peut passer Traefik en "host" au niveau du réseau pour qu'il ait accès à tous les réseaux* : -https://kanban.picasoft.net/b/7fCn765LCNGraBhxA/team-technique-picasoft/kjvc3iw2pFvszCTcR - -Actuellement, Traefik est dans le réseau `docker_default` sur toutes les machines, et les conteneurs souhaitant être accessibles via Traefik doivent être explicitement dans ce réseau. - -Ceci induit une complexité supplémentaire au niveau des fichiers Compose. - -Il serait peut être bon de permettre à Traefik d'accéder à tous les réseaux et de supprimer énormément de directives "inutiles" dans les Compose. +La mise à jour vers Traefik v2 a été effectuée ; quelques détails sont à consulter [sur le wiki](https://wiki.picasoft.net/doku.php?id=technique:adminsys:migration-traefik-v2). diff --git a/pica-traefik/docker-compose.yml b/pica-traefik/docker-compose.yml index daaf980..d4a139e 100644 --- a/pica-traefik/docker-compose.yml +++ b/pica-traefik/docker-compose.yml @@ -1,18 +1,22 @@ version: '3.7' +networks: + proxy: + name: 'proxy' + services: traefik: - container_name: traefik - # DO NOT UPGRADE - # SEE THIS BEFORE AND DISCUSS : https://team.picasoft.net/picasoft/pl/66aorsxhtffrjytyhnecn436wa - image: traefik:1.6.6 - ports: - - "80:80" - # Uncomment to expose the web interface. Warning : do not use without setting a password in traefik.toml - #- "8080:8080" - - "443:443" - volumes: - - /var/run/docker.sock:/var/run/docker.sock - - ./traefik.toml:/traefik.toml - - /DATA/docker/traefik/certs:/certs - restart: always + image: traefik:2.3 + container_name: traefik + ports: + - 80:80 + - 443:443 + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./traefik.toml:/traefik.toml + - ./traefik_dynamic.toml:/traefik_dynamic.toml + - /DATA/docker/traefik/certs:/certs + networks: + - proxy + restart: unless-stopped diff --git a/pica-traefik/traefik.toml b/pica-traefik/traefik.toml index 3514619..a154bb5 100644 --- a/pica-traefik/traefik.toml +++ b/pica-traefik/traefik.toml @@ -1,35 +1,40 @@ -logLevel = "INFO" -debug = true -defaultEntryPoints = ["http", "https"] - -[docker] -endpoint = "unix:///var/run/docker.sock" -watch = true -exposedbydefault = false - -[api] +[global] + sendAnonymousUsage = false + checkNewVersion = true [entryPoints] - [entryPoints.http] - address = ":80" - compress = false - [entryPoints.http.redirect] - entryPoint = "https" - [entryPoints.https] - address = ":443" - compress = false - [entryPoints.https.tls] - # Accept only TLS1.1 and 1.2 - MinVersion = "VersionTLS11" - # Accept all ciphers excepting TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA and TLS_RSA_WITH_3DES_EDE_CBC_SHA - # CipherSuites = ["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA","TLS_RSA_WITH_AES_128_GCM_SHA256","TLS_RSA_WITH_AES_256_GCM_SHA384","TLS_RSA_WITH_AES_128_CBC_SHA","TLS_RSA_WITH_AES_256_CBC_SHA" ] - # Keep only ECDHE : - CipherSuites = ["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" ] + [entryPoints.web] + address = ":80" + [entryPoints.web.http.redirections.entryPoint] + to = "websecure" + scheme = "https" + [entryPoints.websecure] + address = ":443" + [entryPoints.websecure.http] + middlewares = ["hardening@file", "compression@file"] + [entryPoints.websecure.http.tls] + certResolver = "letsencrypt" + options = "tls12@file" -[acme] - email = "picasoft@assos.utc.fr" - storage = "/certs/acme.json" - entryPoint = "https" - onHostRule = true - [acme.httpChallenge] - entryPoint = "http" + +[providers] + providersThrottleDuration = "2s" + [providers.docker] + watch = true + endpoint = "unix:///var/run/docker.sock" + exposedByDefault = false + network = "proxy" + [providers.file] + filename = "/traefik_dynamic.toml" + watch = true + +[log] + level = "INFO" + +[certificatesResolvers] + [certificatesResolvers.letsencrypt] + [certificatesResolvers.letsencrypt.acme] + email = "picasoft@assos.utc.fr" + storage = "/certs/acme.json" + [certificatesResolvers.letsencrypt.acme.httpChallenge] + entryPoint = "web" diff --git a/pica-traefik/traefik_dynamic.toml b/pica-traefik/traefik_dynamic.toml new file mode 100644 index 0000000..398f83d --- /dev/null +++ b/pica-traefik/traefik_dynamic.toml @@ -0,0 +1,28 @@ +[tls.options] + [tls.options.tls12] + minVersion = "VersionTLS12" + cipherSuites = [ + "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", + "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", + "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", + "TLS_AES_256_GCM_SHA384", + "TLS_CHACHA20_POLY1305_SHA256" + ] + curvePreferences = ["CurveP521","CurveP384"] + +[http] + [http.middlewares.hardening.headers] + addVaryHeader = true + browserXssFilter = true + contentTypeNosniff = true + forceSTSHeader = true + frameDeny = true + stsIncludeSubdomains = true + stsPreload = true + customFrameOptionsValue = "SAMEORIGIN" + referrerPolicy = "same-origin" + featurePolicy = "vibrate 'self'" + stsSeconds = 315360000 + + [http.middlewares.compression.compress] + excludedContentTypes = ["text/event-stream"]