Описание механизма репликации KV1/KV2 в Stronghold

Под механизмом репликации понимается автоматическое копирование секретов между несколькими экземплярами Stronghold в режиме master-slave с использованием pull-модели.

Репликация поддерживается только для хранилищ KV1 и KV2.

Синхронизация данных выполняется периодически по расписанию или в соответствии с индивидуальными настройками конкретного хранилища KV1/KV2.

Для работы механизма репликации необходимо:

  • обеспечить сетевую связанность с удалённым кластером Stronghold;
  • настроить корректное TLS-соединение, если оно используется;
  • получить токен для доступа к удалённому кластеру;
  • выдать этому токену права list и read для хранилищ KV1/KV2 на удалённом кластере.

Для включения репликации необходимо задать параметры репликации при монтировании нового хранилища KV1/KV2.

Важно учитывать:

  • названия удалённого и локального mount path могут не совпадать;
  • репликация может быть настроена между разными неймспейсами на локальном и удалённом кластерах;
  • можно настроить репликацию нескольких локальных хранилищ с разными именами на одно удалённое хранилище;
  • если для локального хранилища настроена репликация, оно работает только в режиме read-only.

Запись, изменение и удаление секретов в локальном реплицируемом хранилище невозможны. Все изменения должны выполняться в исходном master-хранилище.

После следующего запуска синхронизации изменения из удалённого хранилища будут применены к локальному.

При отключении репликации статус read-only снимается, и операции добавления, изменения и удаления секретов становятся доступны локально.

При повторном включении репликации все локальные изменения будут удалены или перезаписаны данными из исходного хранилища.

Настройка репликации KV1/KV2

Настройка выполняется на стороне потребителя, то есть на slave-кластере Stronghold, при монтировании нового хранилища KV1/KV2.

Настройки включают следующие параметры:

  • адрес удалённого кластера Stronghold;
  • токен для доступа к удалённому кластеру;
  • wrapping token для безопасной передачи токена доступа;
  • TLS-сертификат или путь к сертификату для подключения к удалённому кластеру;
  • namespace path, в котором находится удалённое хранилище KV1/KV2;
  • mount path удалённого хранилища KV1/KV2;
  • список secret path для репликации;
  • период запуска репликации;
  • включение или отключение репликации;
  • версию KV-хранилища.

Версия локального и удалённого KV-хранилища должна совпадать. Нельзя настроить репликацию kv1 в kv2 или kv2 в kv1.

Как создать токен для репликации

Токен для доступа к удалённому кластеру должен иметь права list и read для реплицируемых секретов.

Если выданный токен поддерживает самопродление, Stronghold автоматически продлевает его на 30 дней, когда оставшийся TTL становится меньше 7 дней и не превышен параметр maxTTL.

Ниже приведён пример создания политики и токена для репликации из mount dev-secrets, расположенного в неймспейсе ns_path_1:

  • Stronghold в Deckhouse Platform
  • Stronghold в Linux
d8 stronghold policy write -namespace=ns_path_1 replicate-dev-secrets - <<'EOF'
# Разрешить токену получать список и читать секреты в dev-secrets.
path "dev-secrets/*" {
  capabilities = ["read", "list"]
}

# Разрешить токену читать настройки mount dev-secrets.
path "sys/mounts/dev-secrets" {
  capabilities = ["read"]
}

# Разрешить токену читать собственные свойства.
path "auth/token/lookup-self" {
  capabilities = ["read"]
}

# Разрешить токену продлевать себя.
path "auth/token/renew-self" {
  capabilities = ["update"]
}
EOF

d8 stronghold token create -namespace=ns_path_1 -policy=replicate-dev-secrets -orphan=true -period=30d
stronghold policy write -namespace=ns_path_1 replicate-dev-secrets - <<'EOF'
# Разрешить токену получать список и читать секреты в dev-secrets.
path "dev-secrets/*" {
  capabilities = ["read", "list"]
}

# Разрешить токену читать настройки mount dev-secrets.
path "sys/mounts/dev-secrets" {
  capabilities = ["read"]
}

# Разрешить токену читать собственные свойства.
path "auth/token/lookup-self" {
  capabilities = ["read"]
}

# Разрешить токену продлевать себя.
path "auth/token/renew-self" {
  capabilities = ["update"]
}
EOF

stronghold token create -namespace=ns_path_1 -policy=replicate-dev-secrets -orphan=true -period=30d

Создание токена обёртывания (wrapping token)

Wrapping token позволяет настроить репликацию, не передавая сам токен доступа на кластер-потребитель.

Wrapping token — это одноразовый токен с ограниченным TTL, внутри которого передаётся реальный токен доступа. При настройке репликации на кластер-потребитель передаётся именно токен обёртывания, после чего кластер-потребитель выполняет unwrap на кластере-источнике и получает реальный токен для репликации.

Пример создания токена обёртывания на исходном кластере:

  • Stronghold в Deckhouse Platform
  • Stronghold в Linux
d8 stronghold token create -namespace=ns_path_1 -policy=replicate-dev-secrets -orphan=true -period=30d -wrap-ttl=5m -field=wrapping_token
stronghold token create -namespace=ns_path_1 -policy=replicate-dev-secrets -orphan=true -period=30d -wrap-ttl=5m -field=wrapping_token

Полученный wrapping token нужно передать при настройке репликации на кластере-потребителе.

Настройка репликации через CLI

Без TLS

Чтобы смонтировать реплицируемое KV-хранилище, которое подключается к кластеру-источнику без TLS, выполните на кластере-потребителе команду:

  • Stronghold в Deckhouse Platform
  • Stronghold в Linux
d8 stronghold secrets enable -path=<LOCAL_MOUNT_PATH> -src-address=<SOURCE_ADDR> -src-wrapping-token=<WRAPPING_TOKEN> -src-namespace=<SOURCE_NAMESPACE> -src-mount-path=<SOURCE_MOUNT_PATH> -sync-period-min=<SYNC_PERIOD_MIN> -version=<KV_VERSION> -namespace=<LOCAL_NAMESPACE> kv
stronghold secrets enable -path=<LOCAL_MOUNT_PATH> -src-address=<SOURCE_ADDR> -src-wrapping-token=<WRAPPING_TOKEN> -src-namespace=<SOURCE_NAMESPACE> -src-mount-path=<SOURCE_MOUNT_PATH> -sync-period-min=<SYNC_PERIOD_MIN> -version=<KV_VERSION> -namespace=<LOCAL_NAMESPACE> kv

С TLS

Чтобы смонтировать реплицируемое KV-хранилище, которое подключается к кластеру-источнику по TLS, передайте CA-сертификат кластера-источника в -src-ca-cert:

  • Stronghold в Deckhouse Platform
  • Stronghold в Linux
d8 stronghold secrets enable -path=<LOCAL_MOUNT_PATH> -src-address=<SOURCE_ADDR> -src-wrapping-token=<WRAPPING_TOKEN> -src-namespace=<SOURCE_NAMESPACE> -src-mount-path=<SOURCE_MOUNT_PATH> -src-ca-cert=@<CA_CERT_FILE> -sync-period-min=<SYNC_PERIOD_MIN> -version=<KV_VERSION> -namespace=<LOCAL_NAMESPACE> kv
stronghold secrets enable -path=<LOCAL_MOUNT_PATH> -src-address=<SOURCE_ADDR> -src-wrapping-token=<WRAPPING_TOKEN> -src-namespace=<SOURCE_NAMESPACE> -src-mount-path=<SOURCE_MOUNT_PATH> -src-ca-cert=@<CA_CERT_FILE> -sync-period-min=<SYNC_PERIOD_MIN> -version=<KV_VERSION> -namespace=<LOCAL_NAMESPACE> kv

Замените плейсхолдеры значениями соответствующих параметров:

  • -path — имя mount path локального KV-хранилища, куда будут копироваться данные;
  • -src-address — адрес удалённого кластера Stronghold;
  • -src-token — токен для доступа к удалённому кластеру; обязателен, если не указан -src-wrapping-token;
  • -src-wrapping-token — токен обёртывания, который будет развёрнут на удалённом кластере; обязателен, если не указан -src-token;
  • -src-namespace — namespace path удалённого кластера; по умолчанию root;
  • -src-mount-path — имя mount path удалённого KV-хранилища;
  • -src-secret-path — список secret path для репликации;
  • -src-ca-cert — сертификат CA для TLS-соединения; если сертификат в файле, используйте форму @ca-cert.pem;
  • -sync-period-min — период запуска синхронизации в минутах; по умолчанию 1;
  • -version — версия KV-хранилища (1 или 2);
  • -namespace — namespace path локального кластера; по умолчанию root.

Изменение настроек репликации через CLI

Для редактирования доступны:

  • токен доступа к удалённому кластеру;
  • токен обёртывания для замены учётных данных репликации;
  • TLS-сертификат;
  • список secret path;
  • период запуска репликации;
  • включение и отключение репликации.

При изменении secret path старый путь в локальном кластере остаётся неизменным, а новый добавляется. Если старые и новые пути пересекаются, новые данные могут частично перезаписать существующие.

Пример изменения настроек. <SECRET_PATHS> — список secret path на кластере-источнике:

  • Stronghold в Deckhouse Platform
  • Stronghold в Linux
d8 stronghold secrets tune -src-wrapping-token=<WRAPPING_TOKEN> -src-secret-path=<SECRET_PATHS> -src-ca-cert=@<CA_CERT_FILE> -sync-enable=true -sync-period-min=<SYNC_PERIOD_MIN> -namespace=<LOCAL_NAMESPACE> <LOCAL_MOUNT_PATH>
stronghold secrets tune -src-wrapping-token=<WRAPPING_TOKEN> -src-secret-path=<SECRET_PATHS> -src-ca-cert=@<CA_CERT_FILE> -sync-enable=true -sync-period-min=<SYNC_PERIOD_MIN> -namespace=<LOCAL_NAMESPACE> <LOCAL_MOUNT_PATH>

Для отключения репликации:

  • Stronghold в Deckhouse Platform
  • Stronghold в Linux
d8 stronghold secrets tune -sync-enable=false -namespace=<LOCAL_NAMESPACE> <LOCAL_MOUNT_PATH>
stronghold secrets tune -sync-enable=false -namespace=<LOCAL_NAMESPACE> <LOCAL_MOUNT_PATH>

Для повторного включения:

  • Stronghold в Deckhouse Platform
  • Stronghold в Linux
d8 stronghold secrets tune -sync-enable=true -namespace=<LOCAL_NAMESPACE> <LOCAL_MOUNT_PATH>
stronghold secrets tune -sync-enable=true -namespace=<LOCAL_NAMESPACE> <LOCAL_MOUNT_PATH>

Для чтения текущих настроек:

  • Stronghold в Deckhouse Platform
  • Stronghold в Linux
d8 stronghold read -namespace=<LOCAL_NAMESPACE> sys/mounts/<LOCAL_MOUNT_PATH>/tune
stronghold read -namespace=<LOCAL_NAMESPACE> sys/mounts/<LOCAL_MOUNT_PATH>/tune

Дополнительные ресурсы