0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p><em>Предлагаем вашему вниманию проектную работу<strong>Кирилла Малютина</strong>, выпускника<a>курса по DevSecOps</a>. Он спроектировал<strong>Jenkins pipeline</strong>для автоматизации сканирования образов и контейнеров ПО.</em></p>
1
<p><em>Предлагаем вашему вниманию проектную работу<strong>Кирилла Малютина</strong>, выпускника<a>курса по DevSecOps</a>. Он спроектировал<strong>Jenkins pipeline</strong>для автоматизации сканирования образов и контейнеров ПО.</em></p>
2
<p>Цель моей проектной работы - создать автоматизированный конвейер поиска уязвимостей и недостатков конфигурации при исследовании образов и контейнеров ПО для Отдела ИБ условной организации для экономии рабочего времени и стандартизации процесса. Под стандартизацией понимается применение в процессе исследования выбранных инструментов и технологий с их настройками, а также получение необходимых артефактов.</p>
2
<p>Цель моей проектной работы - создать автоматизированный конвейер поиска уязвимостей и недостатков конфигурации при исследовании образов и контейнеров ПО для Отдела ИБ условной организации для экономии рабочего времени и стандартизации процесса. Под стандартизацией понимается применение в процессе исследования выбранных инструментов и технологий с их настройками, а также получение необходимых артефактов.</p>
3
<p>В качестве объекта исследования выбраны образы контейнеров в виде tar-архивов.</p>
3
<p>В качестве объекта исследования выбраны образы контейнеров в виде tar-архивов.</p>
4
<p><strong>План работ</strong></p>
4
<p><strong>План работ</strong></p>
5
<ol><li>Подобрать соответствующие задаче инструменты сканирования образов контейнеров и автоматизации распределения задач.</li>
5
<ol><li>Подобрать соответствующие задаче инструменты сканирования образов контейнеров и автоматизации распределения задач.</li>
6
<li>Установить на тестовый сервер выбранные инструменты.</li>
6
<li>Установить на тестовый сервер выбранные инструменты.</li>
7
<li>Составить pipeline автоматизации задач поиска уязвимостей и недостатков конфигурации при исследовании образов контейнеров.</li>
7
<li>Составить pipeline автоматизации задач поиска уязвимостей и недостатков конфигурации при исследовании образов контейнеров.</li>
8
<li>Протестировать работу pipeline.</li>
8
<li>Протестировать работу pipeline.</li>
9
</ol><p><strong>Инструменты и технологии</strong></p>
9
</ol><p><strong>Инструменты и технологии</strong></p>
10
<ol><li><strong>Jenkins</strong>(<a>https://www.jenkins.io/</a>) - в качестве сервера непрерывной интеграции. Популярное ПО с открытым исходным кодом. Активно поддерживается и развивается, имеет множество плагинов для интеграции с другими системами. Разработчики не покидали рынок РФ и не блокируют доступ к своему проекту.</li>
10
<ol><li><strong>Jenkins</strong>(<a>https://www.jenkins.io/</a>) - в качестве сервера непрерывной интеграции. Популярное ПО с открытым исходным кодом. Активно поддерживается и развивается, имеет множество плагинов для интеграции с другими системами. Разработчики не покидали рынок РФ и не блокируют доступ к своему проекту.</li>
11
<li><strong>Docker</strong>(<a>https://www.docker.com/</a>) - самая популярная платформа контейнеризации. Разработчики не покидали рынок РФ и не блокируют доступ к своему ПО. В качестве тестового взят образ Sonarqube Community версии 9.2.2 от 14.12.2021 года с известными уязвимостями безопасности.</li>
11
<li><strong>Docker</strong>(<a>https://www.docker.com/</a>) - самая популярная платформа контейнеризации. Разработчики не покидали рынок РФ и не блокируют доступ к своему ПО. В качестве тестового взят образ Sonarqube Community версии 9.2.2 от 14.12.2021 года с известными уязвимостями безопасности.</li>
12
<li><strong>Trivy</strong>(<a>https://github.com/aquasecurity/trivy</a>) - в качестве сканера уязвимостей безопасности компонентов docker-образов. Популярное ПО с открытым исходным кодом. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.</li>
12
<li><strong>Trivy</strong>(<a>https://github.com/aquasecurity/trivy</a>) - в качестве сканера уязвимостей безопасности компонентов docker-образов. Популярное ПО с открытым исходным кодом. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.</li>
13
<li><strong>Docker Bench for Security</strong>(<a>https://github.com/docker/docker-bench-security</a>) - в качестве инструмента проверки недостатков конфигурации безопасности docker-образов и контейнеров. Набор скриптов с открытым исходным кодом. Проверки осуществляются на основе документа CIS Docker Benchmark v1.4.0. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.</li>
13
<li><strong>Docker Bench for Security</strong>(<a>https://github.com/docker/docker-bench-security</a>) - в качестве инструмента проверки недостатков конфигурации безопасности docker-образов и контейнеров. Набор скриптов с открытым исходным кодом. Проверки осуществляются на основе документа CIS Docker Benchmark v1.4.0. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.</li>
14
<li><strong>Nmap</strong>(<a>https://nmap.org/</a>) - в качестве сканера сетевых портов контейнеров. Популярная утилита с открытым исходным кодом. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.</li>
14
<li><strong>Nmap</strong>(<a>https://nmap.org/</a>) - в качестве сканера сетевых портов контейнеров. Популярная утилита с открытым исходным кодом. Разработчики не блокируют доступ к своему проекту для пользователей из РФ.</li>
15
</ol><p><strong>Реализация идеи</strong></p>
15
</ol><p><strong>Реализация идеи</strong></p>
16
<p>После установки всех выбранных инструментов в docker создана новая сеть “test-net” типа “мост” для назначения статического ip-адреса 192.168.0.2 исследуемому контейнеру и последующего сканирования. Далее был создан новый pipeline в jenkins. Для проекта выбран параметризированный вид сборки для передачи необходимых значений в виде переменных скрипту конвейера:</p>
16
<p>После установки всех выбранных инструментов в docker создана новая сеть “test-net” типа “мост” для назначения статического ip-адреса 192.168.0.2 исследуемому контейнеру и последующего сканирования. Далее был создан новый pipeline в jenkins. Для проекта выбран параметризированный вид сборки для передачи необходимых значений в виде переменных скрипту конвейера:</p>
17
<p>В сборку добавлены следующие параметры:</p>
17
<p>В сборку добавлены следующие параметры:</p>
18
<ul><li><strong>dockertar</strong>, принимающий абсолютный путь до исследуемого tar-архива с docker-образом;</li>
18
<ul><li><strong>dockertar</strong>, принимающий абсолютный путь до исследуемого tar-архива с docker-образом;</li>
19
<li><strong>dockerparam</strong>, принимающий необходимые параметры запуска контейнера из исследуемого docker-образа;</li>
19
<li><strong>dockerparam</strong>, принимающий необходимые параметры запуска контейнера из исследуемого docker-образа;</li>
20
<li><strong>image</strong>, принимающий имя исследуемого docker-образа.</li>
20
<li><strong>image</strong>, принимающий имя исследуемого docker-образа.</li>
21
</ul><p>Далее составлен скрипт автоматизации выполнения всех намеченных действий конвейера:</p>
21
</ul><p>Далее составлен скрипт автоматизации выполнения всех намеченных действий конвейера:</p>
22
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' } } } }<p>Этапы скрипта pipeline:</p>
22
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' } } } }<p>Этапы скрипта pipeline:</p>
23
<ul><li><strong>‘Load image’</strong>- создание docker-образа из tar архива;</li>
23
<ul><li><strong>‘Load image’</strong>- создание docker-образа из tar архива;</li>
24
<li><strong>‘Run container’</strong>- запуск контейнера с необходимыми параметрами;</li>
24
<li><strong>‘Run container’</strong>- запуск контейнера с необходимыми параметрами;</li>
25
<li><strong>‘Trivy scan’</strong>- задача поиска уязвимостей docker-образа сканером Trivy с сохранением отчета в html формате;</li>
25
<li><strong>‘Trivy scan’</strong>- задача поиска уязвимостей docker-образа сканером Trivy с сохранением отчета в html формате;</li>
26
<li><strong>‘Docker bench scan’</strong>- задача сканирования конфигурации docker-образа и контейнера инструментом Docker Bench for Security;</li>
26
<li><strong>‘Docker bench scan’</strong>- задача сканирования конфигурации docker-образа и контейнера инструментом Docker Bench for Security;</li>
27
<li><strong>‘nmap scan’</strong>- сканирование инструментом nmap сетевых портов, используемых контейнером, с применением скриптов.</li>
27
<li><strong>‘nmap scan’</strong>- сканирование инструментом nmap сетевых портов, используемых контейнером, с применением скриптов.</li>
28
</ul><p><strong>Тестирование работы pipeline</strong></p>
28
</ul><p><strong>Тестирование работы pipeline</strong></p>
29
<p>Для тестирования работы pipeline был выбран docker образ sonarqube:9.2.2-community. В конвейер переданы следующие значения параметров:</p>
29
<p>Для тестирования работы pipeline был выбран docker образ sonarqube:9.2.2-community. В конвейер переданы следующие значения параметров:</p>
30
<ul><li><strong>dockertar</strong>=/tmp/sonarqube9.2.2.tar;</li>
30
<ul><li><strong>dockertar</strong>=/tmp/sonarqube9.2.2.tar;</li>
31
<li><strong>dockerparam</strong>=-name sonarqube;</li>
31
<li><strong>dockerparam</strong>=-name sonarqube;</li>
32
<li><strong>image</strong>=sonarqube:9.2.2-community.</li>
32
<li><strong>image</strong>=sonarqube:9.2.2-community.</li>
33
</ul><p>После запуска pipeline все этапы скрипта отработали без ошибок, полное время выполнения - 3 минуты 22 секунды:</p>
33
</ul><p>После запуска pipeline все этапы скрипта отработали без ошибок, полное время выполнения - 3 минуты 22 секунды:</p>
34
<p><strong>Результаты работы pipeline</strong></p>
34
<p><strong>Результаты работы pipeline</strong></p>
35
<p>В качестве результатов работы конвейера на сервере сохранены следующие артефакты:</p>
35
<p>В качестве результатов работы конвейера на сервере сохранены следующие артефакты:</p>
36
<ol><li>Отчет сканирования уязвимостей компонентов docker-образа sonarqube:9.2.2-community инструментом Trivy в формате html. Всего обнаружено 82 уязвимости в компонентах образа ОС alpine и 42 уязвимости в jar-компонентах приложения Sonarqube 9.2.2.:</li>
36
<ol><li>Отчет сканирования уязвимостей компонентов docker-образа sonarqube:9.2.2-community инструментом Trivy в формате html. Всего обнаружено 82 уязвимости в компонентах образа ОС alpine и 42 уязвимости в jar-компонентах приложения Sonarqube 9.2.2.:</li>
37
</ol><ol><li>Отчет сканирования конфигураций docker-образа и контейнера sonarqube:9.2.2-community инструментом Docker Bench for Security в формате txt. Обнаружены следующие недостатки конфигурации безопасности:</li>
37
</ol><ol><li>Отчет сканирования конфигураций docker-образа и контейнера sonarqube:9.2.2-community инструментом Docker Bench for Security в формате txt. Обнаружены следующие недостатки конфигурации безопасности:</li>
38
</ol><ul><li>приложение в контейнере запускается от имени супер-пользователя root;</li>
38
</ol><ul><li>приложение в контейнере запускается от имени супер-пользователя root;</li>
39
<li>в образе отсутствует инструмент проверки состояния контейнера Healthcheck;</li>
39
<li>в образе отсутствует инструмент проверки состояния контейнера Healthcheck;</li>
40
<li>для контейнера не запущен AppArmor-профиль;</li>
40
<li>для контейнера не запущен AppArmor-профиль;</li>
41
<li>для контейнера не запущен SELinux-профиль;</li>
41
<li>для контейнера не запущен SELinux-профиль;</li>
42
<li>контейнер запущен без ограничений использования ресурсов памяти, процессора;</li>
42
<li>контейнер запущен без ограничений использования ресурсов памяти, процессора;</li>
43
<li>файловая система контейнера смонтирована в режиме чтения/записи;</li>
43
<li>файловая система контейнера смонтирована в режиме чтения/записи;</li>
44
<li>контейнер не ограничен в получении дополнительных привилегий.</li>
44
<li>контейнер не ограничен в получении дополнительных привилегий.</li>
45
</ul><ol><li>Отчет сканирования сетевых портов docker-контейнера sonarqube:9.2.2-community инструментом nmap в формате txt. Контейнер открывает сетевой порт 9000 для прослушивания внешних подключений по протоколу tcp. Скрипты nmap не выявили уязвимости приложения.</li>
45
</ul><ol><li>Отчет сканирования сетевых портов docker-контейнера sonarqube:9.2.2-community инструментом nmap в формате txt. Контейнер открывает сетевой порт 9000 для прослушивания внешних подключений по протоколу tcp. Скрипты nmap не выявили уязвимости приложения.</li>
46
</ol><p><strong>Итоги. Развитие проекта</strong></p>
46
</ol><p><strong>Итоги. Развитие проекта</strong></p>
47
<p>В рамках проектной работы создан и протестирован конвейер, который находит уязвимости и недостатки конфигурации при исследовании docker-образов и контейнеров. Тем самым задача автоматизируется для экономии рабочего времени и стандартизации процесса с применением выбранных инструментов, их настройки и получения необходимых артефактов.</p>
47
<p>В рамках проектной работы создан и протестирован конвейер, который находит уязвимости и недостатки конфигурации при исследовании docker-образов и контейнеров. Тем самым задача автоматизируется для экономии рабочего времени и стандартизации процесса с применением выбранных инструментов, их настройки и получения необходимых артефактов.</p>
48
<p>Возможные варианты дальнейшей доработки проекта:</p>
48
<p>Возможные варианты дальнейшей доработки проекта:</p>
49
<ul><li>добавление новых инструментов в зависимости от поставленных задач;</li>
49
<ul><li>добавление новых инструментов в зависимости от поставленных задач;</li>
50
<li>масштабирование проекта;</li>
50
<li>масштабирование проекта;</li>
51
<li>обработка результатов сканирования для дальнейших шагов по обновлению/конфигурации docker-образов и контейнеров при их использовании в организации;</li>
51
<li>обработка результатов сканирования для дальнейших шагов по обновлению/конфигурации docker-образов и контейнеров при их использовании в организации;</li>
52
<li>применение данного подхода автоматизации в других задачах.</li>
52
<li>применение данного подхода автоматизации в других задачах.</li>
53
</ul><p><em>Интересует DevSecOps?<a>Добро пожаловать на курс</a>!</em></p>
53
</ul><p><em>Интересует DevSecOps?<a>Добро пожаловать на курс</a>!</em></p>
54
54