Хранение чувствительной информации с выбранным способом хранения «hvac»

Алгоритм работы

Способ хранения паролей выбирается на этапе установки Termidesk VDI. Способ хранения паролей «hvac» подразумевает, что будет использоваться хранилище OpenBao или Hashicorp Vault. Хранилище при этом должно быть заранее создано и настроено. При использовании Hashicorp Vault со схемой AD поддерживается автоматическое обновление паролей.

Termidesk VDI не выполняет ротацию паролей и другой чувствительной информации в хранилище: это возлагается на администраторов хранилища.

До начала установки Termidesk VDI администратору необходимо создать в хранилище контейнеры для хранения чувствительной информации. Эти контейнеры используются для подключения к элементам инфраструктуры, например для хранения учетных данных для подключения к MS AD. Формат хранения объектов и контейнеров в Termidesk VDI должен соответствовать формату, принятому в хранилище.

Администратором подготавливается конфигурационный файл Termidesk VDI termidesk.conf, в котором указываются значения для:

  • SECRETS_OPENBAO_URL;

  • DJANGO_SECRET_KEY;

  • SECRETS_OPENBAO_ROLE_ID;

  • SECRETS_OPENBAO_TOKEN;

  • SECRETS_OPENBAO_DB_PATH и SECRETS_OPENBAO_RABBITMQ_PATH;

  • METRICS_ACCESS_KEY;

  • HEALTH_CHECK_KEY;

  • опционально, для подключения к хранилищу по протоколу SSL:

    • SECRETS_OPENBAO_CLIENT_CERT;

    • SECRETS_OPENBAO_CLIENT_KEY;

    • SECRETS_OPENBAO_SERVER_CERT.

Хранение RSA-ключей (id_rsa и id_rsa.pub) может выполняться в отдельных объектах, заданных в хранилище.

Ограничений на длину имени хранимого объекта нет, однако есть ограничения в Termidesk VDI:

  • если путь к объекту задается в веб-интерфейсе Termidesk VDI («Портал администратора»), то он должен быть меньше 255 символов;

  • если путь к объекту задается на этапе установки Termidesk VDI, то он должен быть меньше 512 символов. При этом ограничений на длину строки параметра в конфигурационном файле termidesk.conf нет.

Алгоритм работы Termidesk VDI с хранилищем после установки Termidesk VDI или старта службы termidesk-vdi:

  • первичный одноразовый токен доступа читается из файловой системы первой службой, получившей доступ к нему (termidesk-celery-beat или termidesk-celery-worker). Путь расположения файла указан в SECRETS_OPENBAO_TOKEN;

  • первичный одноразовый токен доступа преобразуется к открытому виду (извлекается SECRET_ID) и используется для первичного подключения к хранилищу. При этом:

    • на основе SECRET_ID подготавливается новый «упакованный» (wrapped) токен и записывается в файл, указанный в SECRETS_OPENBAO_TOKEN. Этот токен используется службами, получившими доступ к нему;

    • при запуске служб «упакованный» токен обновляется на новый. Далее отдельный процесс отслеживает время жизни «упакованного» токена и, при истечении времени (время жизни задается в параметре SECRETS_OPENBAO_WRAP_TTL), обновляет его на новый. При штатной остановке службы «упакованный» токен также обновляется;

  • используя полученный SECRET_ID и значение, заданное в SECRETS_OPENBAO_ROLE_ID, «Универсальный диспетчер» аутентифицируется для взаимодействия с хранилищем и получает ACCESS_TOKEN. ACCESS_TOKEN предоставляет доступ ко всей чувствительной информации, расположенной в хранилище для роли Termidesk VDI;

  • при старте службы termidesk-vdi и перед подключением к БД и брокеру сообщений выполняется запрос информации из хранилища для получения:

    • DJANGO_SECRET_KEY;

    • SECRETS_OPENBAO_DB_PATH;

    • SECRETS_OPENBAO_RABBITMQ_PATH;

    • METRICS_ACCESS_KEY;

    • HEALTH_CHECK_KEY;

    • другой чувствительной информации (например для подключения к объектам инфраструктуры);

  • после получения из хранилища DJANGO_SECRET_KEY и всей перечисленной выше чувствительной информации во внутренней структуре Termidesk VDI (временной памяти tmpfs) значения устанавливаются в полученные из хранилища и используются для взаимодействия с компонентами.

Время действия ACCESS_TOKEN определяется политикой хранилища, но до момента истечения его срока жизни выполняется процесс обновления со стороны Termidesk VDI. Алгоритм работы Termidesk VDI при обновлении ACCESS_TOKEN:

  • проверка валидности ACCESS_TOKEN выполняется отдельным процессом, запускаемым после его получения (получение описано в алгоритме выше);

  • периодичность проверки задается параметром SECRETS_OPENBAO_WATCHDOG_INTERVAL, заданным в termidesk.conf;

  • если оставшееся время действия ACCESS_TOKEN меньше значения, определенного в параметре SECRETS_OPENBAO_TTL_DEADLINE конфигурационного файла termidesk.conf, то начинается процесс обновления:

    • из внутренней структуры Termidesk VDI читается SECRET_ID и преобразуется к «упакованному» (wrapped) виду. Время действия такого «упакованного» токена определяется параметром SECRETS_OPENBAO_WRAP_TTL;

    • SECRET_ID удаляется из внутренней структуры Termidesk VDI;

    • процесс повторяется: происходит преобразование токена к открытому виду (извлечению SECRET_ID) и получение ACCESS_TOKEN.

Хранение данных в контейнерах и примеры

Чувствительная информация (имена учетных записей, пароли, открытые и закрытые ключи, keytab-файлы, токены) хранится в контейнерах, пути к которым задаются вручную.

В контейнерах может содержаться как динамически обновляемая чувствительная информация, так и статическая. Поэтому в Termidesk VDI для определения типа информации используются префиксы при задании пути к контейнеру хранения:

  • hvac-ad:// - префикс используется для динамически обновляемой чувствительной информации. Может быть задан как для хранилища Hashicorp Vault, так и для OpenBao, но последний требует специфической настройки;

  • hvac-kv:// - префикс используется для статической чувствительной информации. Может быть задан как для хранилища OpenBao, так и для Hashicorp Vault;

  • hvac-pki:// - префикс используется для информации о сертификатах. Может быть задан как для хранилища OpenBao, так и для Hashicorp Vault.

Помимо указания префикса должна использоваться точка монтирования (mount point), заданная администратором в хранилище.

Для корректной работы Termidesk VDI со статической чувствительной информацией в хранилище должна быть повторена структура данных Active Directory. Контейнер, содержащий чувствительную информацию, должен содержать параметры:

  • current_password - пароль учетной записи;

  • username - имя учетной записи.

Пример:

{
    'current_password': '?@09AZ3PlvTzMKhsvZ91YFyVjVRHceYQ34eizKcKhVNHPjQJ46kvGGdsBPSkRcE9',
    'username': 'adfs-s'
},

Таким образом общий формат указания пути к контейнеру хранениятчувствительной информации в Termidesk VDI выглядит следующим образом:

Символ «/» определяет, что должно быть возвращено все содержимое контейнера.

Если нужно вернуть значение конкретной переменной (key) контейнера, символ «/» не используется.

  • если нужно вернуть всю информацию из контейнера:

<префикс> <точка_монтирования#> <путь_к_контейнеру>/
  • если нужно вернуть только значение конкретного параметра:

<префикс> <точка_монтирования#> <путь_к_параметру_в_хранилище>

Допустим, в хранилище создан контейнер со статической информацией termidesk и точкой монтирования secret:

vault kv get secret/termidesk

Контейнер содержит следующие параметры:

========== Data ==========
Key                 Value
---                 -----
current_password    my_password
username            Администратор

В этом случае в Termidesk VDI следует указывать:

  • для возврата всех параметров: hvac-kv://secret#termidesk/ (будет возвращено: {'current_password': 'my_password', 'username': 'Администратор'});

  • для возврата значения параметра username: hvac-kv://secret#termidesk/username (будет возвращено: 'Администратор').

Схема взаимодействия с хранилищем приведена на рисунке (см. рисунок Схема взаимодействия с хранилищем).

image
Рисунок 1. Схема взаимодействия с хранилищем

Дополнительные примеры приведены в таблице (см. таблицу Примеры указания путей к чувствительной информации в Termidesk).

Таблица 1. Примеры указания путей к чувствительной информации в Termidesk
Команда в хранилище Указание пути в Termidesk

Команда записи роли в хранилище:

vault write ad/roles/vvddaa service_account_name="vvddaa@domain.local"

hvac-ad://ad#vvddaa/

Где:

hvac-ad:// - префикс;

ad# - точка монтирования;

vvddaa/ - путь к роли

Команда записи сертификата в хранилище:

vault kv put secret/termidesk-admin/ssl-cert-snakeoil pem=@astra.local.pem

Команды вида vault kv put перезаписывают контейнер сразу целиком, поэтому если задание сертификата и ключа будет разделено на разные команды, то в контейнере окажется только то, что добавлялось последним

hvac-kv://secret#termidesk-admin/ssl-cert-snakeoil/pem

Где:

hvac-kv:// - префикс;

secret# - точка монтирования;

termidesk-admin/ssl-cert-snakeoil/ - путь к контейнеру;

pem - сертификат

Сгенерированный на контроллере домена keytab-файл должен быть преобразован к формату BASE64 для использования в хранилище:

base64 termidesk.keytab > termidesk.keytab.b64

Команда записи keytab-файла в хранилище:

vault kv put secret/termidesk-admin/keytabs termidesk=@kerberos.keytab.b64

Пример команды для преобразования файла и одновременной записи в хранилище:

vault kv put secret/termidesk-admin/keytabs termidesk="$(base64 -w 0 termidesk.keytab)"

hvac-kv://secret#termidesk-admin/keytabs/termidesk

Где:

hvac-kv:// - префикс;

secret# - точка монтирования;

termidesk-admin/keytabs/ - путь к контейнеру;

termidesk - keytab-файл

Пример команды записи данных для подключения к СУБД в хранилище:

vault kv put secret/postgresql username=termidesk current_password=ksedimret

hvac-kv://secret#/postgresql/

Где:

hvac-kv:// - префикс;

secret# - точка монтирования;

postgresql/ - путь к контейнеру;

username=termidesk - пользователь для подключения к СУБД;

current_password=ksedimret - пароль для подключения к СУБД

Пример команды записи данных для подключения к RabbitMQ в хранилище:

vault kv put secret/rabbitmq username=termidesk current_password=ksedimret

Поддерживается указание до трех пар имени и пароля пользователя для подключения к RabbitMQ.

Пример использования:

vault kv put secret/rabbitmq username=termidesk1 current_password=ksedimret1 username=termidesk2 current_password=ksedimret2 username=termidesk3 current_password='qqq  111!#$%^&*()[]{}'

hvac-kv://secret#/rabbitmq/

Где:

hvac-kv:// - префикс;

secret# - точка монтирования;

rabbitmq/ - путь к контейнеру;

username=termidesk - пользователь для подключения к RabbitMQ;

current_password=ksedimret - пароль для подключения к RabbitMQ