Vault: Storage - Migration weg vom Consul-Backend hin zum Raft-Backend

Ausgangspunkt ist ein Single-Node Vault/Consul Cluster in einem Docker-Setup. Dieses soll migriert werden auf den internen Raft-Storage von Vault. Der Consul-Container hat den Hostnamen "consul", der Vault-Container wenig überraschend "vault".

Die bisherige Consul-Konfiguration sieht so aus:

  {
      "retry_join" : ["127.0.0.1"],
      "data_dir": "/consul/data",
      "log_level": "INFO",
      "server": true,
      "node_name": "vault",
      "addresses": {
          "http": "0.0.0.0"
  },
  "bind_addr": "127.0.0.1",
  "bootstrap_expect": 1,
  "ui_config": {
      "enabled": true
  },
  "encrypt": "...",
  "acl": {
      "enabled": true,
      "default_policy": "deny",
      "down_policy": "extend-cache",
      "enable_token_persistence": true
  }
}

Wichtig ist, dass die Migration mit einem ausreichend-berechtigtem Token durchgeführt wird. Vor allem, wenn wie bei mir, die "default_policy" auf "deny" steht. Entweder man stellt einfach die policy auf "allow" oder gibt dem "anonymous"-Token das Schreibrecht auf den Keyprefix "vault/".

Für die Migration wird dann noch eine spezielle Konfigurationsdatei "migrate.hcl" benötigt:

storage_source "consul" {
    address = "http://consul:8500"
    path    = "vault"
}

storage_destination "raft" {
    path = "/vault/data/raft"
    node_id = "9444ac3b-d192-9330-b253-b3d6dea5b42b"
}

cluster_addr = "https://127.0.0.1:8200"

Mit der Migrationsdatei wir als Datenquelle der Consul-Knoten definiert. Als Ziel ein Verzeichnis im Dateisystem. Die "node_id" bekommt man aus dem Consul-Cluster.

Migration durchführen:

Die Daten sollen in ein neues Docker-Volume "vault_data" gespeichert werden. Dieses wird für die Migration in den temporären Vault-Container gemountet. Als Mountpoint wird der Pfad aus der "migrate.hcl" genommen. Natürlich muss der temporäre Vault-Container im gleichen Netzwerk laufen wie Consul.

docker run --rm -it hashicorp/vault:1.15 vault operator migrate -v vault_data:/vault/data -config=/tmp/migrate.hcl -log-level=DEBUG

Danach kann man Vault mit einer angepassten storage_source Konfiguration starten:

storage "raft" {
    path = "/vault/data/raft/"
    node_id = "9444ac3b-d192-9330-b253-b3d6dea5b42b"
}

Nach der Umstellung startete Vault mit dem internen Raft-Storage-Backend ohne Probleme.

Quellen und Links:

[1]https://developer.hashicorp.com/vault/docs/concepts/integrated-storage/migrate-consul-storage