Métriques propres aux services
Lorsque les métriques des services sont exposées via un exporter Prometheus, cela signifie simplement que, sur un chemin du domaine (généralement /metrics
), les métriques sont accessibles en HTTP. Pour des raisons de sécurité, nous préférons que ces métriques ne soient pas exposées publiquement, et que seul notre scraper vmagent puisse y avoir accès.
Comme l’exporter est exposé via HTTP, et donc derrière Traefik, on peut simplement activer de l’authentification Basic pour permettre uniquement à vmagent
de récupérer les métriques.
Configuration Traefik
Du côté de Traefik, on va simplement se baser sur le middleware Basic Auth. Il permet d’activer une authentification Basic sur un router Traefik spécifique.
Prenons l’exemple d’un service Web classique, ici Hedgedoc.
Dans notre cas, un exporter Prometheus écoute sous le chemin /metrics/hedgedoc
du service, et un autre sous /metrics/router
. On veut donc que tout le trafic vers ce service pour le chemin commençant par /metrics
soit soumis à une authentification Basic de Traefik. Pour cela on créé un second routeur. Les labels appliqués sur le conteneur pour exposer le service sont ainsi les suivants :
- snippet.yaml
traefik.enable: true traefik.http.routers.hedgedoc-app.entrypoints: websecure traefik.http.routers.hedgedoc-app.rule: Host(`md.picasoft.net`) traefik.http.routers.hedgedoc-app.service: hedgedoc-app traefik.http.routers.hedgedoc-metrics.entrypoints: websecure traefik.http.routers.hedgedoc-metrics.rule: "Host(`md.picasoft.net`) && PathPrefix(`/metrics`)" traefik.http.routers.hedgedoc-metrics.service: hedgedoc-app traefik.http.routers.hedgedoc-metrics.middlewares: "hedgedoc-metrics-auth@docker" traefik.http.middlewares.hedgedoc-metrics-auth.basicauth.users: "${METRICS_AUTH}" traefik.http.services.hedgedoc-app.loadbalancer.server.port: 3000
Note:
Pour une explication détaillée des labels utilisés, voir la documentation de Picasoft sur Traefik.
Important:
Les identifiants générés pour /metrics
sont placés dans le dossier Tech/Prometheus-Exporters-Auth
du vaultwarden.
Configuration vmagent
Du côté de vmagent
il faut préciser les identifiants en question dans le fichier de configuration Prometheus. Pour chaque configuration de service, l’objet basic_auth
permet de spécifier que l’exporter nécessite une uathentification Basic. Par exemple pour notre cas (des champs ont été retirés pour se concentrer sur ce qui nous intéresse) :
- snippet.yaml
- job_name: hedgedoc metrics_path: "/metrics/hedgedoc" scheme: "https" basic_auth: username: hedgedoc password: monpassword static_configs: - targets: - "md.picasoft.net"
L’inconvénient est que nos identifiants vont se retrouver dans le fichier de configuration, qui est versionné. Pour cela on va donc utiliser un mécanisme de vmagent
qui permet de remplacer des valeurs dans le fichier de configuration à l’aide de variables d’environnement. On utilisera donc la configuration suivante :
- snippet.yaml
- job_name: hedgedoc metrics_path: "/metrics/hedgedoc" scheme: "https" basic_auth: username: "%{HEDGEDOC_METRICS_USER}" password: "%{HEDGEDOC_METRICS_PASSWORD}" static_configs: - targets: - "md.picasoft.net"
Il ne reste plus que à fournir les 2 variables d’environnement en question à vmagent
. Pour cela on utilise le même mécanisme de fichiers de secrets que l’on utilise dans nos autres dépôts. On charge ensuite le fichier de variables dans le conteneur vmagent.
Génération du mot de passe
Après avoir créé l’utilisateur pour le service (ici hedgedoc
par exemple), on sauvegarde le mot de passe dans le dossier Tech/Prometheus-Exporters-Auth
du vaultwarden.
Ce mot de passe peut être donné en clair côté monitoring via la variable d’environnement HEDGEDOC_METRICS_PASSWORD
. Cependant, traefik s’attendant à un format particulier de la forme hedgedoc:$$apr1$$waO5zvqJ$$jrty/RULcxryemeBmH3RU0
, il faut d’abord le transformer.
Pour cela on exécutera la commande suivante
- snippet.sh
htpasswd -nb $HEDGEDOC_METRICS_USER $HEDGEDOC_METRICS_PASSWORD
Dont la sortie peut être mise dans la variable d’environnement METRICS_AUTH