Аннотация 3
ГЛОССАРИЙ 6
ВВЕДЕНИЕ 7
1 Постановка задачи 10
1.1 Актеры системы 10
1.2 Функциональные и нефункциональные требования 10
1.3 Сценарии вариантов использования 11
1.4 Модель предметной области 16
1.5 Технологии и инструменты 17
2 Руководство программиста 21
2.1 Архитектура системы 21
2.1.1 Архитектура веб-приложения 21
2.1.2 Архитектура консольного приложения 24
2.2 Доставка секретов 26
2.3 Шифрование секретов 28
2.4 Развертывание системы 30
2.4.1 Способы развертывания системы 30
2.4.2 Инструмент контейнеризации Docker 31
2.4.3 Создание образов Docker 33
2.5 Выкладывание консольного приложения в репозиторий 36
3 Руководство пользователя 38
3.1 Описание синтаксиса команд 38
3.2 Примеры вариантов использования 40
ЗАКЛЮЧЕНИЕ 47
В современном «подключенном» мире программы расширенной киберзащиты служат на благо каждого пользователя. На индивидуальном уровне атака со взломом киберзащиты может привести к разнообразным последствиям, начиная с кражи личной информации и заканчивая вымогательством денег или потерей ценных данных.
Успешный подход в сфере кибербезопасности выражается в виде эффективной защиты данных, которые необходимо обезопасить. Сотрудники, рабочие и технологии должны дополнять друг друга в организациях, чтобы обеспечить эффективную защиту от кибератак.
Пользователи должны понимать и соблюдать основные принципы информационной безопасности, такие как выбор надежных паролей, внимательное отношение к вложениям в электронных письмах, резервное копирование данных и так далее. Технологии также являются важнейшим элементов, предоставляющим организациям и отдельным пользователям инструменты необходимые для защиты от кибератак [2].
Одной из важных задач по защите конфиденциальных данных является задача использования секретов при развертывании приложения.
Так при разработке нового приложения программисты имеют дело с секретной информацией, к которой можно отнести:
• Имена пользователей и пароли;
• TLS сертификаты и ключи;
• Токены API;
• Имя базы данных или внутреннего сервера.
Сохранять эту информацию в исходном коде приложения, а тем более в публично доступной СКВ - очень плохая идея.
Так как в процессе работы приложения секреты хранятся в переменных окружения, то можно сразу добавить эти секреты в окружение, используя соответствующие команды терминала, например export. Для долговременного хранения секретов, необходимо создать отдельный конфигурационный файл со всей чувствительной информацией и добавить его, например, в файл .gitignore (Git) или .hgignore (mercurial), чтобы избежать автоматического добавления в репозиторий СКВ. В качестве такого конфигурационного файла можно использовать .env файл, в котором будут описаны необходимые переменные окружения, содержащие параметры приложения и секретные ключи.
Такой подход позволит многократно использовать .env файл, чтобы не вводить переменные окружения вручную перед каждым запуском приложения, передавать этот файл между машинами, а также скрыть секретную информацию, используемую для настройки приложения.
Однако и у этого подхода есть свои недостатки, среди самых очевидных - полностью ручное управление файлами, содержащими секретную информацию. Так, например, развертывание приложения на новом стенде или стендах, а также актуализация секретов требует непосредственного вмешательства программиста, а именно создание новых конфигурационных файлов или изменение их содержимого. Если изменение секретов доверить машинам еще рано, то хранение и распространение, а в общем случае управление конфигурационными файлами, содержащими эти самые секреты можно автоматизировать с их помощью.
В настоящее время существует достаточно готовых инструментов для решения этих задач. Среди самых распространенных можно выделить Docker secrets и Ansible Vault. Основным недостатком этих и им подобных программных продуктов является то, что для их работы необходима собственная инфраструктура, настройка которой отнимает дополнительное время при работе над разработкой приложения. Вне зависимости от масштаба разрабатываемого приложения необходимо выполнить установку этих инструментов и настроить соответствующие конфигурационные файлы, что является избыточным для определенных типов проектов.
Ввиду всего вышесказанного возникла идея создания собственного инструмента, позволяющего организовать автоматизированный процесс управления секретной информацией как для развертывания приложений, так и для решения других задач, связанных с секретной информацией.
Во избежание основного недостатка рассмотренных выше систем было принято решение использовать стандартные инструменты установки и управления программными пакетами. Так как основным языком разрабатываемой системы является язык программирования Python, таким инструментом может выступить пакетный менеджер pip, одним из главных преимуществ которого является простота интерфейса командной строки, которая позволяет установить пакеты Python одной командой из каталога программного обеспечения.
Централизованное управление секретами будет осуществляться с помощью облачного веб-сервиса, в котором будет реализован основной функционал, отвечающий за управление секретами как в контексте пользователя, так и в контексте группы. Упрощение инфраструктуры приложения пользователя можно добиться за счет того, что оно будет реализовано в качестве консольного приложения.
Основными операциями, выполняемыми в данной системе, будут операции по управлению пользователями, группами и секретами. Для взаимодействия с секретами пользователю необходимо будет выполнить аутентификацию с помощью собственного логина и пароля, а также сгенерировать собственный SSH-ключ и сохранить его публичную часть в системе. Это позволить исключить из процесса управления секретами операцию аутентификации пользователя при любой операции над хранилищем секретов, а также обеспечит защищенный канал связи между клиентским приложением и сервером.
Основной задачей данной работы является проектирование и реализация данной системы.
В рамках данной работы были разработаны веб-приложение для автоматизации управления корпоративными секретами и консольное приложения пользователя для взаимодействия с веб-приложением через интерфейс командной строки. Были решены все поставленные задачи, соответствующие реализации сформулированных требований. Потенциал разработанной системы позволяет производить дальнейшее развитие ее функциональности.