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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Безопасное хранение и передача секретов (токенов, паролей и т.п.) между пользователями и сервисами – это один из вызовов, с которыми сталкиваются разработчики и 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, тогда этот секрет не будет знать даже отправитель. Всё это довольно легко интегрируется в пайпланы автоматизации.

Источник: https://habr.com/ru/post/698738/


Интересные статьи

Интересные статьи

В скандалы, связанные с обработкой персональных данных пользователей, регулярно попадают как гиганты IT-рынка, так и небольшие компании. Но если условный Google может опр...
Мы работаем удалённо с 2013 года и знаем, в каких местах новички-удалёнщики бьются головой. В статье 5 глупых ошибок, которые мы совершили, пока искали идеальный набор приложений для онлайн-офиса...
Привет, Хабр! Представляю вашему вниманию перевод статьи «Your statement is 100% correct but misses the entire point». Представьте, что где-то в Интернете обсуждают языки программирования. Оди...
1С Битрикс: Управление сайтом (БУС) - CMS №1 в России по версии портала “Рейтинг Рунета” за 2018 год. На рынке c 2003 года. За это время БУС не стоял на месте, обрастал новой функциональностью...
Один из самых острых вопросов при разработке на Битрикс - это миграции базы данных. Какие же способы облегчить эту задачу есть на данный момент?