Skip to content

Хранилище секретов для бедных #93

@kulakovt

Description

@kulakovt

Проблема

Для нужд различных сервисов интеграции необходимо предоставить наборы контекстных настроек. В этих настройках могут храниться как секретные данные (API-ключи для доступа к социальным сетям) так и просто конфигурационные значения (адрес репозитория с Аудитом). Для простоты можно считать что все данные секретные.

Если необходимо просто настроить приложение без всякой секретности, то скорее всего следует предпочесть просто файл настроек приложения.

К хранилищу настроек предъявляются следующие требования:

  • секретность - значения не должны быть видны всем желающим
  • доступность - развёрнутый сервер должен иметь доступ к хранилищу и возможность прочитать все настройки
  • надёжность - хранилище должно быть доступно в произвольных момент времени
  • редактируемость - изменения в настройках должны легко вноситься администраторами системы

Стандартное решение

По хорошему, мы конечно должны воспользоваться для этих целей Azure Key Vault'ом или подобным сервисом. Но нам не хочется заводить новый сервис и тратить ресурсы на его поддержку. Кажется что можно обойтись более простыми и понятными инструментами.

Бесплатное решение

Нам может помочь шифрование. Файл с настройками шифреутся публичным ключом и выкладывается в общедоступное место (например в репозиторий GitHub или Gist). Приватный ключ есть только у хостинга Azure. Она должна его любезно сообщить запускаемому приложению. Приложение на старте скачивает файл настроек с известного места, расшифровывает его, используя приватный ключ, и загружает настройки. Подобный метод используется в билд системах (например AppVeyor, TravisCI).

Настройки для каждого из сообществ будут контролироваться разными людьми (лидерами конкретного сообщества). Настройки самого приложения могут редактироваться администратором системы. По-хорошему для разных людей нужны разные ключи шифрования. Но чтобы не усложнять систему на этом этапе, можно ограничиться одним ключом. Для удобства редактирования и возможности разграничения прав доступа в будущем, стоит всё-таки разделить настройки по отдельным файлам. Как минимум отдельный файл для каждого сообщества.

Весь этот процесс должен быть скрыт от основной логики приложения за инфраструктурным слоем. И для сервисов данные могут поставляться в привычном виде стандартных Confiuration'ов. Этого можно добиться например с помощью самописного Configuration Provider'а.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions