├── .gitattributes
├── .gitignore
├── Makefile
├── Readme.md
├── assets
├── faraday_1.png
├── gitea_1.png
├── gitea_2.png
├── gitea_3.png
├── jenkins_1.png
├── jenkins_2.png
├── jenkins_3.png
├── jenkins_4.png
├── jenkins_5.png
├── jenkins_6.png
├── jenkins_7.png
├── jenkins_secret.png
├── jenkins_secret_1.png
├── pipe_1.png
├── pipe_2.png
├── pipe_3.png
├── pipe_4.png
├── pipe_5.png
├── pipeline_diagram.png
├── preview.jpg
├── preview1.jpg
├── project_1.png
├── project_2.png
├── project_3.png
├── project_alt_1.png
├── project_alt_2.png
├── project_alt_3.png
├── secret_1.png
├── secret_2.png
└── secret_3.png
├── docker-compose.yml
├── jenkins
├── Dockerfile
├── jenkins-casc.yaml
└── plugins.txt
└── nginx
├── Dockerfile
└── nginx.conf
/.gitattributes:
--------------------------------------------------------------------------------
1 | Makefile linguist-vendored
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .vagrant
3 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | all: up
2 |
3 | rebuild: clean up
4 |
5 | up:
6 | docker-compose up -d --build
7 |
8 | down:
9 | docker-compose down
10 |
11 | clean:
12 | docker-compose down -v
13 |
14 | creds:
15 | docker-compose logs faraday | findstr Admin
16 |
17 | change_creds:
18 | docker-compose exec faraday faraday-manage change-password
19 |
20 | .PHONY: up down clean creds change_creds
21 |
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |

4 |
5 |
6 |
7 |
8 |
9 |

10 |

11 |
)
12 |

13 |
14 |
15 |
16 | Кейс интеграции `статического` (SAST), `динамического` (DAST) и `интерактивного` (IAST) анализа в процессы безопасной разработки.
17 |
18 | Стенд развёртывается через систему контейнеризации `Docker` и содержит следующие сервисы:
19 |
20 | - `Gitea` (система контроля версий);
21 | - `Jenkins` (система непрерывной интеграции, CI/CD);
22 | - `Faraday` (система управления уязвимостями).
23 |
24 | Для анализа уязвимых приложений в стенде используются:
25 |
26 | - средства статического анализа (SAST): `Bandit`;
27 | - средства динамического анализа (DAST): `OWASP ZAP`;
28 | - разработанное средство интерактивного анализа (IAST): `Immunity IAST`.
29 |
30 | В рамках динамического и интерактивного анализа анализируемые приложения запускаются через `Docker` в отдельной сети.
31 |
32 | Для автоматизации взаимодействия с анализируемыми приложениями используется `Selenium`.
33 |
34 | Схема работы тестового стенда:
35 |
36 |
37 |
38 | ## 📚 Содержание
39 |
40 |
41 | * [📚 Содержание](#-содержание)
42 | * [🛠️ Развёртывание тестового стенда](#-развёртывание-тестового-стенда)
43 | * [🌿 Первоначальная настройка Gitea](#-первоначальная-настройка-gitea)
44 | * [🤖 Первоначальная настройка Jenkins](#-первоначальная-настройка-jenkins)
45 | * [📊 Первоначальная настройка Faraday](#-первоначальная-настройка-faraday)
46 | * [📂 Добавление анализируемых проектов](#-добавление-анализируемых-проектов)
47 | * [🔰 Добавление репозитория в Gitea](#-добавление-репозитория-в-gitea)
48 | * [:octocat: Альтернативный способ: миграция репозитория](#octocat-альтернативный-способ-миграция-репозитория)
49 | * [🚀 Создание CI/CD-конвейера в Jenkins](#-создание-cicd-конвейера-в-jenkins)
50 | * [💾 Требования к git-репозиторию](#-требования-к-git-репозиторию)
51 |
52 |
53 | ## 🛠️ Развёртывание тестового стенда
54 |
55 | > [!IMPORTANT]
56 | > Для запуска тестового стенда в вашей системе должны быть установлены `Docker`, `Docker Compose` и `Make`.
57 |
58 | 1. Добавьте в файл `hosts` следующее содержимое:
59 |
60 | ```
61 | 127.0.0.1 gitea.devops.local
62 | 127.0.0.1 jenkins.devops.local
63 | 127.0.0.1 faraday.devops.local
64 | ```
65 |
66 | > [!TIP]
67 | > Где находится файл hosts?
68 | >
69 | > В Windows: `C:\Windows\System32\drivers\etc\hosts`
70 | >
71 | > В Linux: `/etc/hosts`
72 |
73 | 2. Запустите тестовый стенд следующей командой:
74 |
75 | ```shell
76 | make
77 | ```
78 |
79 | > [!NOTE]
80 | > Сервисы тестового стенда будут доступны по локальным доменным именам, указанным в файле `hosts`.
81 |
82 | ## 🌿 Первоначальная настройка Gitea
83 |
84 | 1. Перейдите по адресу `gitea.devops.local`.
85 |
86 | 2. Установите настройки сервиса и нажмите кнопку `Install Gitea`.
87 |
88 |
89 | 👀 Как это выглядит?
90 |
91 |
92 |
93 | 
94 |
95 | 
96 |
97 |
98 |
99 |
100 |
101 | 3. Перейдите на вкладку `Register Account`, введите данные для административного аккаунта и нажмите кнопку `Register Account`.
102 |
103 |
104 | 👀 Пример
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | ## 🤖 Первоначальная настройка Jenkins
115 |
116 | > [!NOTE]
117 | > При развёртывании Jenkins автоматически создаются 3 пользователя:
118 | > - Админ: `admin:admin`
119 | > - Разработчик: `developer:developer`
120 | > - Наблюдатель: `viewer:viewer`
121 |
122 | 1. Перейдите по адресу `jenkins.devops.local`.
123 |
124 | 2. Перейдите в `Manage Jenkins` -> `System` -> `Gitea Servers`.
125 |
126 |
127 | 👀 Где это?
128 |
129 |
130 |
131 | 
132 |
133 | 
134 |
135 |
136 |
137 |
138 |
139 | 3. Добавьте сервер.
140 |
141 |
142 | 👀 Как это выглядит?
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 | 4. Укажите название сервера и адрес `http://gitea:3000`.
153 |
154 |
155 | 👀 Пример
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 | 5. Создайте учётные данные для Gitea сервера (`Manage hooks` -> `Add`).
166 |
167 |
168 | 👀 Пример
169 |
170 |
171 |
172 | 
173 |
174 |
175 |
176 |
177 |
178 | 6. После этого нажмите кнопку `Save`.
179 |
180 |
181 | 👀 Где она?
182 |
183 |
184 |
185 | На скриншоте ниже, внизу:
186 |
187 | 
188 |
189 |
190 |
191 |
192 |
193 | ## 📊 Первоначальная настройка Faraday
194 |
195 | 1. Для получения учётных данных для `Faraday` выполните следующую команду в терминале:
196 |
197 | ```shell
198 | make creds
199 | ```
200 |
201 | При повторных запусках стека приложений учётные данные могут теряться. В таком случае смените пароль пользователя `faraday` командой:
202 |
203 | ```shell
204 | make change_creds
205 | ```
206 |
207 | 2. Перейдите и авторизуйтесь по адресу `faraday.devops.local`.
208 |
209 | 3. Добавьте секреты в `Jenkins` для авторизации в `Faraday` (`Manage Jenkins` -> `Credentials` -> `Add credentials`).
210 |
211 |
212 | 👀 Где это?
213 |
214 |
215 |
216 |
217 |
218 | 
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 | Выберите тип `Secret text` и добавьте 3 значения: `адрес сервиса`, `логин` и `пароль`.
227 |
228 |
229 | 👀 Пример
230 |
231 |
232 |
233 |
234 |
235 | 
236 |
237 | 
238 |
239 | 
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 | > [!NOTE]
248 | > Создаются именно секреты, чтобы учётные данные системы управления уязвимостей не попадали в логи сборок.
249 |
250 |
251 | 👀 Результат должен получиться таким
252 |
253 |
254 |
255 | 
256 |
257 |
258 |
259 |
260 |
261 | ## 📂 Добавление анализируемых проектов
262 |
263 | ### 🔰 Добавление репозитория в Gitea
264 |
265 | 1. Создайте репозизторий в `Gitea`.
266 |
267 |
268 | 👀 Куда жать?
269 |
270 |
271 |
272 |
273 |
274 | 
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 | 2. Укажите данные для создания нового репозитория.
283 |
284 |
285 | 👀 Пример
286 |
287 |
288 |
289 | 
290 |
291 |
292 |
293 |
294 |
295 | Укажите данные для нового репозитория и нажмите кнопку `Create Repository`.
296 |
297 | 3. Следуйте командам на скриншоте для отправки локального `git`-репозитория в `Gitea`:
298 |
299 |
300 | 👀 Пример
301 |
302 |
303 |
304 | 
305 |
306 |
307 |
308 |
309 |
310 | ### :octocat: Альтернативный способ: миграция репозитория
311 |
312 | Для примера мигрируем проект уязвимого Django-приложения [Vulnerable Polls](https://github.com/kaakaww/vuln_django_play).
313 |
314 | 1. При добавлении нового репозитория перейдите по ссылке `Migrate repository`:
315 |
316 |
317 | 👀 Где это?
318 |
319 |
320 |
321 | 
322 |
323 |
324 |
325 |
326 |
327 | 2. Выберите платформу, откуда нужно мигрировать репозиторий.
328 |
329 |
330 | 👀 Как это выглядит?
331 |
332 |
333 |
334 | 
335 |
336 |
337 |
338 |
339 |
340 | 3. Укажите адрес репозитория, его новое название и нажмите кнопку `Migrate Repository`.
341 |
342 |
343 | 👀 Пример
344 |
345 |
346 |
347 | 
348 |
349 |
350 |
351 |
352 |
353 | ### 🚀 Создание CI/CD-конвейера в Jenkins
354 |
355 | 1. Нажмите `New Item` в левом меню:
356 |
357 |
358 | 👀 Где?
359 |
360 |
361 |
362 |
363 |
364 | 
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 | 2. Укажите имя конвейера и выберите `Multibranch Pipeline`.
373 |
374 |
375 | 👀 Пример
376 |
377 |
378 |
379 | 
380 |
381 |
382 |
383 |
384 |
385 | 3. Укажите настройки нового конвейера.
386 |
387 |
388 | 👀 Детали
389 |
390 |
391 |
392 | 
393 |
394 | Нажмите `Add source` в `Branch Sources`:
395 |
396 |
397 |
398 | 
399 |
400 |
401 |
402 | Затем выберите учётные данные Gitea, созданные ранее. После этого в `Owner` укажите имя пользователя Gitea, затем выберите git-репозиторий:
403 |
404 |
405 |
406 | 
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 | ## 💾 Требования к git-репозиторию
415 |
416 | Чтобы подключать проекты к тестовому стенду, git-репозитории следует привести к следующему виду:
417 |
418 | 1. `Jenkinsfile` в корне репозитория
419 |
420 |
421 | 👀 Пример содержимого файла
422 |
423 |
424 |
425 | ```groovy
426 |
427 | ```
428 |
429 |
430 |
431 |
--------------------------------------------------------------------------------
/assets/faraday_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/faraday_1.png
--------------------------------------------------------------------------------
/assets/gitea_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/gitea_1.png
--------------------------------------------------------------------------------
/assets/gitea_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/gitea_2.png
--------------------------------------------------------------------------------
/assets/gitea_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/gitea_3.png
--------------------------------------------------------------------------------
/assets/jenkins_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_1.png
--------------------------------------------------------------------------------
/assets/jenkins_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_2.png
--------------------------------------------------------------------------------
/assets/jenkins_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_3.png
--------------------------------------------------------------------------------
/assets/jenkins_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_4.png
--------------------------------------------------------------------------------
/assets/jenkins_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_5.png
--------------------------------------------------------------------------------
/assets/jenkins_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_6.png
--------------------------------------------------------------------------------
/assets/jenkins_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_7.png
--------------------------------------------------------------------------------
/assets/jenkins_secret.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_secret.png
--------------------------------------------------------------------------------
/assets/jenkins_secret_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/jenkins_secret_1.png
--------------------------------------------------------------------------------
/assets/pipe_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/pipe_1.png
--------------------------------------------------------------------------------
/assets/pipe_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/pipe_2.png
--------------------------------------------------------------------------------
/assets/pipe_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/pipe_3.png
--------------------------------------------------------------------------------
/assets/pipe_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/pipe_4.png
--------------------------------------------------------------------------------
/assets/pipe_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/pipe_5.png
--------------------------------------------------------------------------------
/assets/pipeline_diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/pipeline_diagram.png
--------------------------------------------------------------------------------
/assets/preview.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/preview.jpg
--------------------------------------------------------------------------------
/assets/preview1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/preview1.jpg
--------------------------------------------------------------------------------
/assets/project_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/project_1.png
--------------------------------------------------------------------------------
/assets/project_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/project_2.png
--------------------------------------------------------------------------------
/assets/project_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/project_3.png
--------------------------------------------------------------------------------
/assets/project_alt_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/project_alt_1.png
--------------------------------------------------------------------------------
/assets/project_alt_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/project_alt_2.png
--------------------------------------------------------------------------------
/assets/project_alt_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/project_alt_3.png
--------------------------------------------------------------------------------
/assets/secret_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/secret_1.png
--------------------------------------------------------------------------------
/assets/secret_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/secret_2.png
--------------------------------------------------------------------------------
/assets/secret_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/light-hat/devsecops-stand/1a7be7c908bbb963630e83aa3d9711f2451e15be/assets/secret_3.png
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 | nginx:
3 | build: ./nginx/
4 | ports:
5 | - "80:80"
6 | restart: always
7 | networks:
8 | - devsecops_network
9 | gitea:
10 | image: gitea/gitea:latest
11 | container_name: gitea
12 | environment:
13 | - USER_UID=1000
14 | - USER_GID=1000
15 | - GITEA__database__DB_TYPE=postgres
16 | - GITEA__database__HOST=gitea_db
17 | - GITEA__database__NAME=gitea
18 | - GITEA__database__USER=gitea
19 | - GITEA__database__PASSWD=postgres
20 | restart: always
21 | expose:
22 | - 3000
23 | volumes:
24 | - "gitea:/data"
25 | networks:
26 | - devsecops_network
27 | gitea_db:
28 | image: postgres:14
29 | container_name: gitea_database
30 | environment:
31 | - POSTGRES_USER=gitea
32 | - POSTGRES_PASSWORD=postgres
33 | - POSTGRES_DB=gitea
34 | restart: always
35 | expose:
36 | - 5432
37 | volumes:
38 | - "gitea_database:/var/lib/postgresql/data"
39 | networks:
40 | - devsecops_network
41 | jenkins:
42 | build: ./jenkins/
43 | restart: always
44 | user: root
45 | expose:
46 | - "8080"
47 | - "50000"
48 | volumes:
49 | - "jenkins_home:/var/jenkins_home"
50 | - "/var/run/docker.sock:/var/run/docker.sock"
51 | networks:
52 | - devsecops_network
53 | faraday_db:
54 | image: postgres:12.7-alpine
55 | restart: always
56 | container_name: faraday_faraday_db
57 | environment:
58 | - POSTGRES_USER=postgres
59 | - POSTGRES_PASSWORD=postgres
60 | - POSTGRES_DB=faraday
61 | expose:
62 | - '5432'
63 | volumes:
64 | - "faraday_db:/var/lib/postgresql/data"
65 | networks:
66 | - devsecops_network
67 | redis:
68 | image: 'redis:6.2-alpine'
69 | container_name: faraday_redis
70 | expose:
71 | - '6379'
72 | restart: always
73 | networks:
74 | - devsecops_network
75 | faraday:
76 | image: faradaysec/faraday:latest
77 | restart: always
78 | container_name: faraday_app
79 | entrypoint: "/entrypoint.sh"
80 | volumes:
81 | - "faraday:/home/faraday/.faraday"
82 | environment:
83 | - PGSQL_USER=postgres
84 | - PGSQL_PASSWD=postgres
85 | - PGSQL_HOST=faraday_db
86 | - PGSQL_DBNAME=faraday
87 | - REDIS_SERVER=redis
88 | depends_on:
89 | - faraday_db
90 | - redis
91 | expose:
92 | - "5985"
93 | networks:
94 | - devsecops_network
95 |
96 | volumes:
97 | gitea:
98 | gitea_database:
99 | jenkins_home:
100 | faraday:
101 | faraday_db:
102 |
103 | networks:
104 | devsecops_network:
105 |
--------------------------------------------------------------------------------
/jenkins/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM jenkins/jenkins:lts-jdk17
2 |
3 | USER root
4 |
5 | RUN apt-get update && \
6 | apt-get install -y docker.io docker-compose && \
7 | rm -rf /var/lib/apt/lists/*
8 |
9 | USER jenkins
10 |
11 | COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
12 |
13 | RUN jenkins-plugin-cli --plugin-file /usr/share/jenkins/ref/plugins.txt
14 |
15 | ENV JAVA_OPTS="-Djenkins.install.runSetupWizard=false"
16 |
17 | COPY jenkins-casc.yaml /var/jenkins_home/casc_configs/jenkins.yaml
18 |
19 | ENV CASC_JENKINS_CONFIG="/var/jenkins_home/casc_configs/jenkins.yaml"
20 |
--------------------------------------------------------------------------------
/jenkins/jenkins-casc.yaml:
--------------------------------------------------------------------------------
1 | jenkins:
2 | systemMessage: "Jenkins сконфигурирован автоматически при помощи JCasC."
3 |
4 | securityRealm:
5 | local:
6 | allowsSignup: false
7 | users:
8 | - id: "admin"
9 | password: "admin"
10 |
11 | - id: "developer"
12 | password: "developer"
13 |
14 | - id: "viewer"
15 | password: "viewer"
16 |
17 | authorizationStrategy:
18 | projectMatrix:
19 | entries:
20 | - user:
21 | name: admin
22 | permissions:
23 | - Overall/Administer
24 | - user:
25 | name: developer
26 | permissions:
27 | - Overall/Read
28 | - Job/Build
29 | - user:
30 | name: viewer
31 | permissions:
32 | - Overall/Read
33 |
34 | tool:
35 | git:
36 | installations:
37 | - name: "Default"
38 | home: "/usr/bin/git"
39 | maven:
40 | installations:
41 | - name: maven3
42 | properties:
43 | - installSource:
44 | installers:
45 | - maven:
46 | id: "3.8.4"
47 |
48 | jobs:
49 | - script: >
50 | pipelineJob('Template DevSecOps pipeline') {
51 | definition {
52 | cps {
53 | script('''
54 | pipeline {
55 | agent any
56 | stages {
57 | stage('Checkout') {
58 | steps {
59 | sh 'git clone https://github.com/jinghao1/DockerVulspace || true'
60 | }
61 | }
62 | stage('SAST (Bandit)') {
63 | agent {
64 | docker {
65 | image 'python:3.10'
66 | reuseNode true
67 | }
68 | }
69 | steps {
70 | echo 'Preparing environment...'
71 | sh 'pip install bandit'
72 | sh 'ls -la'
73 |
74 | echo 'Runnig SAST...'
75 | sh 'python3 -m bandit -r . -f xml -o bandit_sast.xml || true'
76 |
77 | echo 'Here is the report...'
78 | sh 'cat bandit_sast.xml || true'
79 |
80 | archiveArtifacts artifacts: 'bandit_sast.xml', allowEmptyArchive: true, fingerprint: true
81 | }
82 | }
83 | stage('Run application') {
84 | steps {
85 | sh 'docker network create dast_scan || true'
86 | sh 'docker run -d --name test --network dast_scan nginx'
87 | }
88 | }
89 | stage('DAST (OWASP ZAP)') {
90 | agent {
91 | docker {
92 | image 'zaproxy/zap-stable'
93 | args '--network dast_scan'
94 | reuseNode true
95 | }
96 | }
97 | steps {
98 | echo 'Preparing environment...'
99 | sh 'mkdir /zap/wrk/'
100 | sh 'cp -r * /zap/wrk/'
101 |
102 | echo 'Runnig DAST...'
103 | sh 'zap-baseline.py -t http://test -x zap_dast.xml || echo 0'
104 | sh 'cp /zap/wrk/zap_dast.xml .'
105 |
106 | echo 'Here is the report...'
107 | sh 'cat /zap/wrk/zap_dast.xml'
108 |
109 | archiveArtifacts artifacts: 'zap_dast.xml', allowEmptyArchive: true, fingerprint: true
110 | }
111 | }
112 | stage('Stop application') {
113 | steps {
114 | sh 'docker stop test && docker rm test'
115 | }
116 | }
117 | stage('Upload reports') {
118 | agent {
119 | docker {
120 | image 'python:3.10'
121 | args '--network host'
122 | reuseNode true
123 | }
124 | }
125 | steps {
126 | sh 'pip install faraday-cli'
127 | sh 'faraday-cli auth -f http://faraday.devops.local -i -u faraday -p faraday_test'
128 | sh 'faraday-cli tool report bandit_sast.xml -w test_workspace'
129 | sh 'faraday-cli tool report zap_dast.xml -w test_workspace'
130 | }
131 | }
132 | stage('Crowler') {
133 | agent {
134 | docker {
135 | image 'python:3.10'
136 | args '--network host'
137 | reuseNode true
138 | }
139 | }
140 | steps {
141 | sh 'apt install wget'
142 | sh 'wget -r -np -k http://gitea.devops.local || true'
143 | }
144 | }
145 | stage('Selenium') {
146 | agent {
147 | docker {
148 | image 'node:18-alpine'
149 | args '--network host'
150 | reuseNode true
151 | }
152 | }
153 | steps {
154 | sh 'npm install -g selenium-side-runner'
155 | sh 'selenium-side-runner'
156 | }
157 | }
158 | }
159 | post {
160 | always {
161 | sh 'docker stop test || true'
162 | sh 'docker rm test || true'
163 | }
164 | }
165 | }
166 | ''')
167 | }
168 | }
169 | }
170 |
--------------------------------------------------------------------------------
/jenkins/plugins.txt:
--------------------------------------------------------------------------------
1 | git
2 | workflow-aggregator
3 | configuration-as-code
4 | matrix-auth
5 | job-dsl
6 | docker-plugin
7 | docker-workflow
8 | credentials-binding
9 | pipeline-stage-view
10 | dependency-check-jenkins-plugin
11 | gitea
12 | branch-api
--------------------------------------------------------------------------------
/nginx/Dockerfile:
--------------------------------------------------------------------------------
1 | # Базовый слой для зависимостей
2 | FROM nginx
3 |
4 | # Устанавливаем curl для healthcheck
5 | RUN apt -y update && apt -y install curl
6 |
7 | # Удаляем дефолтный конфиг
8 | RUN rm /etc/nginx/conf.d/default.conf
9 |
10 | # Пробрасываем конфиг
11 | COPY nginx.conf /etc/nginx/conf.d/
--------------------------------------------------------------------------------
/nginx/nginx.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 | server_name gitea.devops.local;
4 |
5 | location / {
6 | proxy_pass http://gitea:3000;
7 | proxy_set_header Host $host;
8 | proxy_set_header X-Real-IP $remote_addr;
9 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
10 | }
11 | }
12 |
13 | server {
14 | listen 80;
15 | server_name jenkins.devops.local;
16 |
17 | location / {
18 | proxy_pass http://jenkins:8080;
19 | proxy_set_header Host $host;
20 | proxy_set_header X-Real-IP $remote_addr;
21 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
22 | }
23 | }
24 |
25 | server {
26 | listen 80;
27 | server_name faraday.devops.local;
28 |
29 | location / {
30 | proxy_pass http://faraday:5985;
31 | proxy_set_header Host $host;
32 | proxy_set_header X-Real-IP $remote_addr;
33 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------