Предлагаем вашему вниманию проектную работу Кирилла Малютина, выпускника курса по DevSecOps. Он спроектировал Jenkins pipeline для автоматизации сканирования образов и контейнеров ПО.


Цель моей проектной работы – создать автоматизированный конвейер поиска уязвимостей и недостатков конфигурации при исследовании образов и контейнеров ПО для Отдела ИБ условной организации для экономии рабочего времени и стандартизации процесса. Под стандартизацией понимается применение в процессе исследования выбранных инструментов и технологий с их настройками, а также получение необходимых артефактов.

В качестве объекта исследования выбраны образы контейнеров в виде tar-архивов.

План работ

  1. Подобрать соответствующие задаче инструменты сканирования образов контейнеров и автоматизации распределения задач.
  2. Установить на тестовый сервер выбранные инструменты.
  3. Составить pipeline автоматизации задач поиска уязвимостей и недостатков конфигурации при исследовании образов контейнеров.
  4. Протестировать работу pipeline.

Инструменты и технологии

  1. Jenkins (https://www.jenkins.io/) – в качестве сервера непрерывной интеграции. Популярное ПО с открытым исходным кодом. Активно поддерживается и развивается, имеет множество плагинов для интеграции с другими системами. Разработчики не покидали рынок РФ и не блокируют доступ к своему проекту.
  2. Docker (https://www.docker.com/) – самая популярная платформа контейнеризации. Разработчики не покидали рынок РФ и не блокируют доступ к своему ПО. В качестве тестового взят образ Sonarqube Community версии 9.2.2 от 14.12.2021 года с известными уязвимостями безопасности.
  3. Trivy (https://github.com/aquasecurity/trivy) – в качестве сканера уязвимостей безопасности компонентов docker-образов. Популярное ПО с открытым исходным кодом. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.
  4. Docker Bench for Security (https://github.com/docker/docker-bench-security) – в качестве инструмента проверки недостатков конфигурации безопасности docker-образов и контейнеров. Набор скриптов с открытым исходным кодом. Проверки осуществляются на основе документа CIS Docker Benchmark v1.4.0. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.
  5. Nmap (https://nmap.org/) – в качестве сканера сетевых портов контейнеров. Популярная утилита с открытым исходным кодом. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.

Реализация идеи

После установки всех выбранных инструментов в docker создана новая сеть “test-net” типа “мост” для назначения статического ip-адреса 192.168.0.2 исследуемому контейнеру и последующего сканирования. Далее был создан новый pipeline в jenkins. Для проекта выбран параметризированный вид сборки для передачи необходимых значений в виде переменных скрипту конвейера:

Проект «Jenkins pipeline сканирования образов и контейнеров ПО» курса «Внедрение и работа в DevSecOps»

В сборку добавлены следующие параметры:

  • dockertar, принимающий абсолютный путь до исследуемого tar-архива с docker-образом;
  • dockerparam, принимающий необходимые параметры запуска контейнера из исследуемого docker-образа;
  • image, принимающий имя исследуемого docker-образа.

Далее составлен скрипт автоматизации выполнения всех намеченных действий конвейера:

pipeline {
    agent any
    stages {
        stage('Load image') {
            steps {
                sh "docker load --input $dockertar"
            }
        }
        stage('Run container') {
            steps {
                sh "docker run -d --pull=never  --network test-net --ip 192.168.0.2 $dockerparam $image"
            }
        }
        stage('Trivy scan') {
            steps {
                sh 'trivy image --format template --template "@/usr/local/share/trivy/templates/html.tpl" -o /tmp/trivy.html $image'
            }
        }
        stage('Docker bench scan') {
            steps {
                sh '/tmp/docker-bench-security/docker-bench-security.sh -c container_images,container_runtime >> /tmp/docker-bench.txt'
            }
        }
        stage('nmap scan') {
            steps {
                sh 'nmap -A -v -p- 192.168.0.2 >> /tmp/nmap.txt'
            }
        }
    }
}

Этапы скрипта pipeline:

  • ‘Load image’ – создание docker-образа из tar архива;
  • ‘Run container’ – запуск контейнера с необходимыми параметрами;
  • ‘Trivy scan’ – задача поиска уязвимостей docker-образа сканером Trivy с сохранением отчета в html формате;
  • ‘Docker bench scan’ – задача сканирования конфигурации docker-образа и контейнера инструментом Docker Bench for Security;
  • ‘nmap scan’ – сканирование инструментом nmap сетевых портов, используемых контейнером, с применением скриптов.

Тестирование работы pipeline

Для тестирования работы pipeline был выбран docker образ sonarqube:9.2.2-community. В конвейер переданы следующие значения параметров:

  • dockertar=/tmp/sonarqube9.2.2.tar;
  • dockerparam=—name sonarqube;
  • image=sonarqube:9.2.2-community.

После запуска pipeline все этапы скрипта отработали без ошибок, полное время выполнения — 3 минуты 22 секунды:

Проект «Jenkins pipeline сканирования образов и контейнеров ПО» курса «Внедрение и работа в DevSecOps»

Результаты работы pipeline

В качестве результатов работы конвейера на сервере сохранены следующие артефакты:

  1. Отчет сканирования уязвимостей компонентов docker-образа sonarqube:9.2.2-community инструментом Trivy в формате html. Всего обнаружено 82 уязвимости в компонентах образа ОС alpine и 42 уязвимости в jar-компонентах приложения Sonarqube 9.2.2.:
Проект «Jenkins pipeline сканирования образов и контейнеров ПО» курса «Внедрение и работа в DevSecOps»
  1. Отчет сканирования конфигураций docker-образа и контейнера sonarqube:9.2.2-community инструментом Docker Bench for Security в формате txt. Обнаружены следующие недостатки конфигурации безопасности:
  • приложение в контейнере запускается от имени супер-пользователя root;
  • в образе отсутствует инструмент проверки состояния контейнера Healthcheck;
  • для контейнера не запущен AppArmor-профиль;
  • для контейнера не запущен SELinux-профиль;
  • контейнер запущен без ограничений использования ресурсов памяти, процессора;
  • файловая система контейнера смонтирована в режиме чтения/записи;
  • контейнер не ограничен в получении дополнительных привилегий.
Проект «Jenkins pipeline сканирования образов и контейнеров ПО» курса «Внедрение и работа в DevSecOps»
  1. Отчет сканирования сетевых портов docker-контейнера sonarqube:9.2.2-community инструментом nmap в формате txt. Контейнер открывает сетевой порт 9000 для прослушивания внешних подключений по протоколу tcp. Скрипты nmap не выявили уязвимости приложения.
Проект «Jenkins pipeline сканирования образов и контейнеров ПО» курса «Внедрение и работа в DevSecOps»

Итоги. Развитие проекта

В рамках проектной работы создан и протестирован конвейер, который находит уязвимости и недостатки конфигурации при исследовании docker-образов и контейнеров. Тем самым задача автоматизируется для экономии рабочего времени и стандартизации процесса с применением выбранных инструментов, их настройки и получения необходимых артефактов.

Возможные варианты дальнейшей доработки проекта:

  • добавление новых инструментов в зависимости от поставленных задач;
  • масштабирование проекта;
  • обработка результатов сканирования для дальнейших шагов по обновлению/конфигурации docker-образов и контейнеров при их использовании в организации;
  • применение данного подхода автоматизации в других задачах.

Интересует DevSecOps? Добро пожаловать на курс!