Для понимания, что написано дальше следует прочитать файл DevSecOps_2023_Задание.pdf
Подробнее
flask_app -- наше приложение
iac -- наше описание инфраструктуры приложения
boys_leak_repo -- слитый репозиторий команды Boys
Подробнее
Инфраструктура компании DORA FOND состоит из 4 серверов. Для их создания в облаке Timeweb Cloud использовалась утилита Terraform, которая автоматически создала все 4 сервера, и добавила ssh ключи администраторов для доступа к ним. В папке terraform в файле main.tf есть более подробное описание.
Чтобы запустить исполнение Terraform манифеста нужно ввести всего одну команду (её исполнение занимает около 20 секунд, создание серверов около минуты):
$ terraform apply
Технические хар-ки серверов:
Gitlab
cpu | ram | disk |
---|---|---|
4 cores | 6 Gb | 50 Gb |
Gitlab runner
cpu | ram | disk |
---|---|---|
2 cores | 4 Gb | 30 Gb |
Stage
cpu | ram | disk |
---|---|---|
2 cores | 4 Gb | 30 Gb |
Production
cpu | ram | disk |
---|---|---|
2 cores | 4 Gb | 30 Gb |
Ниже схематично изображена инфраструктура:
Далее, была проведена первичная настройка, и установка дополнительного ПО с помощью Ansible.
Был описан Playbook, и подготовлены конфигурационные файлы для установки и настройки ПО, а именно:
- Установка Docker и Docker Compose на всех серверах;
- Создание новых пользователей на всех серверах;
- Добавление ssh ключей для новых пользователей;
- Копирование файлов gitlab для его разворачивания на сервере одноименном сервере;
- Копирование гит репозитория defectdojo для его разворачивания на сервере Gitlab;
- Копирование файлов HashiCorp Vault для его разорачивания на сервере Gitlab;
- Копирование файлов Nginx для его разворачивания на сервере Gitlab;
- Копирование файлов dockerhub mirror для его разворачивания на сервере Gitlab;
- Получение ssl сертификатов с помощью Let's Encrypt Certbot;
- Разворачивание Nginx;
- Разворачивание GitLab;
- Разворачивание DefectDojo;
- Разворачивание HashiCorp Vault;
- Разворачивание DockerHub proxy mirror;
- Скачивание и установка пакета gitlab-runner на одноименном сервере;
- Создание файла daemon.json из шаблона, для скачивания докер образов из зеркала DockerHub на сервере Gitlab Runner;
- Конфигурирование ssh на всех серверах.
Исполнение данного плейбука занимает около 16 минут, после чего инфраструктура будет готова к работе.
Чтобы запустить плейбук, нужно заполнить файл inventory_init.ini, а так же добавить доменные A записи к соответствующим серверам, после чего исполнить команду:
$ ansible-playbook -i inventory/inventory_init.ini configure_servers.yaml
После его исполнения следует проверить подключения к серверам с помощью следующей команды (перед её выполнение следует заполнить файл inventory.ini, по аналогии с inventory_init.ini):
$ ansible all -i inventory/inventory.ini -m ping -v
Если все сервера ответили, то инфраструктура готова, и можно приступать к выстраиванию процессов DevSecOps.
Подробнее
Для автоматической доставки приложения на сервера было подготовлено:
- Репозиторий с исходным кодом приложения (flask_app);
- Репозиторий IAC, с описанием инфраструктуры приложения как кода, а так же Ansible Roles, по её разворачиванию (iac);
- В каждом из этих этих репозиториев был настроен процесс CI/CD, с помощью которого автоматически:
- Проводится сканирование исходного кода на уязвимости, и загрузка результатов сканирования в DefectDojo;
- Сборка docker образа приложения;
- Сканирование докер образа на уязвимости, и загрузка результатом сканирования в DefectDojo;
- Тестирование работоспобности приложения;
- Деплой приложения на один из контуров (если изменения были в ветке develop, то на Stage, если в мастер, то на Production)
На схеме ниже можно более наглядно увидеть данный процесс:
Теперь более подробно про содержание репозиториев iac и flask_app, начнем с последнего:
В репозитори flask_app содержится:
- Исходный код приложения;
- Dockerfile с инструкциями по сборке докер образа из исходного кода;
- Файл .gitlab-ci.yml, в котором описан процесс CI/CD.
В репозитории iac содержится следующее:
- Файл docker-compose.yaml, с описанием архитектуры приложения;
- Dockerfile, в котором описаны инструкции по сборке openreasty;
- Ansible Role deploy_project -- роль, в которой описано, как правильно развернуть новую версию приложения на соответстувющем контуре;
- Шаблоны конфигурационных файлов Openreasty, и шаблон скрипта, для получения ssl сертификатов Let's Encrypt
- Файл .gitlab-ci.yml, в котором описан процесс CI/CD.
Давайте более подробно про Ansible Role deploy_project:
- Она копирует файлы docker-compose.yaml и создает файл из шаблона init-letsencrypt.sh;
- Получает Vault token из параметров role_id и secret_id;
- Делает запрос в Vault по токену, и получает секреты для базы данных postgresql;
- Пуллит новые докер образы из частного docker registry, и создает новые контейнеры на их основе.
Переменные для этой роли задаются в папке inventory, и далее в соответствующей контуру папке [stage|prod]. В ней будет файл inventory, и папка group_vars, в файле описаны хосты, с которыми надо взаимодейстовать, а в папке содержаться yaml файлы, в которых заданы переменные.