Описание механизма репликации 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=30dstronghold 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_tokenstronghold 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> kvstronghold 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> kvstronghold 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>/tunestronghold read -namespace=<LOCAL_NAMESPACE> sys/mounts/<LOCAL_MOUNT_PATH>/tune