Pull to refresh

Пакуем секреты правильно

Reading time3 min
Views14K

Безопасное хранение и передача секретов (токенов, паролей и т.п.) между пользователями и сервисами – это один из вызовов, с которыми сталкиваются разработчики и DevOps инженеры. Традиционное централизованное хранение в менеджерах паролей, например, полностью проблему не решает, а лишь смещает её в сторону управления мастер-паролями, которые, к тому же, становятся «ключами к царству» и компроментация которых может иметь катастрофические последствия. Данную проблему «курицы и яйца» ещё иногда называют проблемой «нулевого секрета» (Secret Zero Problem). В этой заметке я расскажу о попытке решить эту проблему при помощи механизма обёртки ответа (Response Wrapping).

Для повышения безопасности мы не будем передавать секреты напрямую, мы будем передавать лишь ссылку на секрет - обёрточный токен (Wrapping Token). Сам секрет будет храниться в безопасности, в специализированной системе управления секретами (Secrets Management Service). Повышение безопасности обеспечивается за счет ряда полезных свойств токена, а именно:

  1. Обëрточный токен — это не секрет сам по себе, а лишь ссылка, дающая доступ к настоящему секрету

  2. Токен может (и должен!) обладать очень коротким временем жизни (TTL – Time to Live), что делает атаку на подобную «движущуюся цель» более сложной

  3. И, наконец, если злоумышленник перехватит токен и всё-таки заполучит секрет, то это будет немедленно обнаружено. Во-первых, обëрточный токен может быть использован только один раз, после чего он «протухает», а во-вторых - система управления секретами обеспечивает надёжный аудит всех действий пользователей

Функционал Response Wrapping обеспечивают многие решения по управлению секретами. Рассмотрим практический пример на примере популярного HashiCorp Vault. В нашем простейшем сценарии у нас есть Vault сервис, и нам нужно передать учётные данные вида пользователь/пароль удалённому пользователю или сервису, который ничего не знает о Vault и никак с ним не интегрирован. Vault можно легко установить и настроить или воспользоваться SaaS сервисом. Коммуницировать с Vault можно напрямую через API, Vault CLI или Web UI. Чтобы начать работать через CLI, на стороне администратора необходимо задать пару переменных окружения:

Адрес Vault сервера, пусть в нашем примере он будет локальный

export VAULT_ADDR=http://127.0.0.1:8200

Администраторский токен доступа к Vault

export VAULT_TOKEN="hvs.CAESIJT1q5lEjIWux1Tjx"

Vault поддерживает великое множество различных плагинов (engines), для приведённого примера нам понадобится самый базовый – хранение Key/Value (KV) пар.

Активируем плагин KV:

$ vault secrets enable -path=secret -description="wraper-test" kv-v2 

В нашем упражнении мы создадим и передадим удаленному клиенту секрет вида

username: "webapp"

password: "my-long-password"

запишем наш секрет используя включённый KV плагин:

$ vault kv put secret/dev username="webapp" password="my-long-password"

Теперь создадим wrapper token c TTL 2 минуты. Этого времени должно быть достаточно, чтоб клиент успел извлечь секрет из Vault:

$ vault kv get -wrap-ttl=120 secret/dev

Вариант ответа:

Key Value
--- -----
wrapping_token: hvs.CAGh2cy5uYzZsZEMpiR25LZXpjczA

wrapping_accessor: 3dyFk8GHlmLNvKEjxcL9TDz2
wrapping_token_ttl: 2m
wrapping_token_creation_time: 2022-04-05 21:09:08.2289 -0700 PDT wrapping_token_creation_path: secret/data/dev

Полученный wrapping_tokenмы можем передать получателю при помощи e-mail или в чате, особо не беспокоясь о возможном перехвате. Наш клиент, как помним, ничего не знает о Vault, но, надеемся, обладает базовыми навыками в Unix shell и может воспользоваться командами curl и jq. При помощи указанных команд, адреса Vault $VAULT_ADDR и полученного токена, извлечь секрет из Vault проще простого:

$ curl -s --header "X-Vault-Token: hvs.CAGh2cy5uYzZsZEMpiR25LZXpjczA" --request POST $VAULT_ADDR/v1/sys/wrapping/unwrap | jq ".data.data"

Результат на стороне клиента:

{

"password": "my-long-password",

"username": "webapp"

}

Как видим, секрет извлекается из Vault непосредственно клиентом. В более продвинутых сценариях генерацию пароля можно так же переложить на Vault, тогда этот секрет не будет знать даже отправитель. Всё это довольно легко интегрируется в пайпланы автоматизации.

Tags:
Hubs:
Total votes 12: ↑12 and ↓0+12
Comments6

Articles