HashiCorp Nomad and Vault: Dynamic Secrets
In einer cloud-nativen Umgebung ist das Management von Geheimnissen ein kritischer Aspekt der Sicherheit. HashiCorp Vault ist ein beliebtes Tool zur Verwaltung
Wenn man eine Lösung sucht, um einen Reverse Proxy oder Load Balancer aufzusetzen, ohne dafür aber eine sehr lange Konfigurationsdatei schreiben und warten zu müssen, dann ist die Kombination von Traefik mit Consul vielleicht die richtige Lösung.
Traefik implementiert einen Zugriff auf Consul, um von dort seine Konfigurationsdaten zu beziehen. Dies erlaubt einem sämtliche Konfigurationen im Key/Value-Store von Consul abzulegen und Traefik nimmt diese Änderungen wahr und lädt sich selbstständig neu.
1logLevel = "INFO"
2defaultEntryPoints = ["http", "https"]
3
4[consul]
5 endpoint = "${consul_backend}"
6 watch = true
7 prefix = "${prefix}"
8
9[entryPoints]
10 [entryPoints.http]
11 address = ":80"
12 [entryPoints.https]
13 address = ":443"
14 [entryPoints.https.tls]
15
16[acme]
17 email = "it-is-me@example.com"
18 storage = "${prefix}/acme/account"
19 entryPoint = "https"
20 caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"
21 [acme.httpChallenge]
22 entryPoint = "http"
23 [acme.dnsChallenge]
24 provider = "dnsimple"
25 delayBeforeCheck = 0
26[[acme.domains]]
27 main = "*.example.com"
28 sans = ["example.com"]
In unserem Beispiel verwenden wir nun ein Docker whoami
Image, um die Skalierung und das Loadbalancing im Hintergrund zu veranschaulichen.
Außerden werden wir das ganze auch mittels Terraform ausrollen. Zu allererst definiert man die Variablen, um auf den Hosts dann die Docker Container zu starten. Die beiden Hosts wurden so provisioniert, dass der Docker-Port im lokalen Netz verfügbar ist.
1variable "traefik_version" {
2 default = "v1.7.11"
3}
4variable "consul_version" {
5 default = "1.5"
6}
7variable "traefik_host" {
8 default = "10.0.0.10"
9}
10variable "backend_host" {
11 default = "10.10.0.20"
12}
13variable "prefix" {
14 default = "traefik"
15}
16variable "consul_backend" {
17 default = "10.10.0.20:8500"
18}
19variable "domain" {
20 default = "example.com"
21}
Anschließend muss Consul ausgerollt werden:
1
2provider "docker" {
3 host = "tcp://${var.backend_host}:2376/"
4}
5resource "docker_image" "consul" {
6 name = "consul:${var.consul_version}"
7}
8resource "docker_container" "consul" {
9
10 image = "${docker_image.consul.latest}"
11 name = "consul"
12 must_run = true
13 restart = "always"
14
15 ports {
16 internal = 8500
17 external = 8500
18 protocol = "tcp"
19 }
20}
Auf diesem Host wird dann auch das whoami
Image laufen:
1resource "docker_image" "whoami" {
2 name = "jwilder/whoami"
3}
4resource "docker_container" "whoami" {
5
6 image = "${docker_image.whoami.latest}"
7 name = "whoami"
8 must_run = true
9 restart = "always"
10
11 ports {
12 internal = 8000
13 external = 8000
14 protocol = "tcp"
15 }
16}
Zum Schluss muss Traefik auf seinem eigenen Host definiert und ausgerollt werden:
1provider "docker" {
2 host = "tcp://${var.traefik_host}:2376/"
3}
4
5data "template_file" "traefik_config" {
6 template = "${file("templates/traefik.tpl")}"
7
8 vars {
9 consul_backend = "${var.consul_backend}"
10 prefix = "${var.prefix}"
11 }
12}
13
14resource "docker_container" "traefik" {
15 depends_on = ["consul_keys.whoami"]
16
17 image = "${docker_image.traefik.latest}"
18 name = "traefik_proxy"
19 must_run = true
20 restart = "always"
21
22 ports {
23 internal = 80
24 external = 80
25 protocol = "tcp"
26 }
27
28 ports {
29 internal = 443
30 external = 443
31 protocol = "tcp"
32 }
33
34 upload {
35 content = "${join(",", data.template_file.traefik_config.*.rendered)}"
36 file = "/etc/traefik/traefik.toml"
37 }
38
39 volumes {
40 host_path = "/srv/traefik"
41 container_path = "/srv/"
42 read_only = false
43 }
44}
Damit nun alle Services miteinander reden können, muss diese Information in Consul abgelegt werden. Auch hier wird Terraform dafür verwendet, diese Daten anzulegen und zu warten:
1resource "consul_keys" "whoami" {
2 key {
3 path = "${var.prefix}/acme/account/"
4 value = ""
5 }
6
7 key {
8 path = "${var.prefix}/backends/whoami/servers/server1/url"
9 value = "http://${var.backend_host}:8000/"
10 }
11
12 key {
13 path = "${var.prefix}/backends/whoami/servers/server1/weight"
14 value = "10"
15 }
16
17 key {
18 path = "${var.prefix}/frontends/frontend1/backend"
19 value = "whoami"
20 }
21
22 key {
23 path = "${var.prefix}/frontends/frontend1/routes/whoami/rule"
24 value = "Host: whoami.${var.domain}"
25 }
26}
Nach diesem Konfigurationschritt lädt Traefik seine Konfiguation neu. Ein Zugriff auf <whoami.example.com> wird an Traefik und von diesem an einen whoami
Container mit der entsprechenden ID weitergeleitet.
Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.
Hier kontaktieren