├── .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 | ![](assets/gitea_1.png) 94 | 95 | ![](assets/gitea_2.png) 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 | ![](assets/jenkins_2.png) 132 | 133 | ![](assets/jenkins_3.png) 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 | ![](assets/jenkins_6.png) 173 | 174 |
175 | 176 |
177 | 178 | 6. После этого нажмите кнопку `Save`. 179 | 180 |
181 | 👀 Где она? 182 | 183 |
184 | 185 | На скриншоте ниже, внизу: 186 | 187 | ![](assets/jenkins_7.png) 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 | ![](assets/jenkins_secret.png) 219 | 220 |
221 | 222 |
223 | 224 |
225 | 226 | Выберите тип `Secret text` и добавьте 3 значения: `адрес сервиса`, `логин` и `пароль`. 227 | 228 |
229 | 👀 Пример 230 | 231 |
232 | 233 |
234 | 235 | ![](assets/secret_1.png) 236 | 237 | ![](assets/secret_2.png) 238 | 239 | ![](assets/secret_3.png) 240 | 241 |
242 | 243 |
244 | 245 |
246 | 247 | > [!NOTE] 248 | > Создаются именно секреты, чтобы учётные данные системы управления уязвимостей не попадали в логи сборок. 249 | 250 |
251 | 👀 Результат должен получиться таким 252 | 253 |
254 | 255 | ![](assets/jenkins_secret_1.png) 256 | 257 |
258 | 259 |
260 | 261 | ## 📂 Добавление анализируемых проектов 262 | 263 | ### 🔰 Добавление репозитория в Gitea 264 | 265 | 1. Создайте репозизторий в `Gitea`. 266 | 267 |
268 | 👀 Куда жать? 269 | 270 |
271 | 272 |
273 | 274 | ![](assets/project_1.png) 275 | 276 |
277 | 278 |
279 | 280 |
281 | 282 | 2. Укажите данные для создания нового репозитория. 283 | 284 |
285 | 👀 Пример 286 | 287 |
288 | 289 | ![](assets/project_2.png) 290 | 291 |
292 | 293 |
294 | 295 | Укажите данные для нового репозитория и нажмите кнопку `Create Repository`. 296 | 297 | 3. Следуйте командам на скриншоте для отправки локального `git`-репозитория в `Gitea`: 298 | 299 |
300 | 👀 Пример 301 | 302 |
303 | 304 | ![](assets/project_3.png) 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 | ![](assets/project_alt_1.png) 322 | 323 |
324 | 325 |
326 | 327 | 2. Выберите платформу, откуда нужно мигрировать репозиторий. 328 | 329 |
330 | 👀 Как это выглядит? 331 | 332 |
333 | 334 | ![](assets/project_alt_2.png) 335 | 336 |
337 | 338 |
339 | 340 | 3. Укажите адрес репозитория, его новое название и нажмите кнопку `Migrate Repository`. 341 | 342 |
343 | 👀 Пример 344 | 345 |
346 | 347 | ![](assets/project_alt_3.png) 348 | 349 |
350 | 351 |
352 | 353 | ### 🚀 Создание CI/CD-конвейера в Jenkins 354 | 355 | 1. Нажмите `New Item` в левом меню: 356 | 357 |
358 | 👀 Где? 359 | 360 |
361 | 362 |
363 | 364 | ![](assets/pipe_1.png) 365 | 366 |
367 | 368 |
369 | 370 |
371 | 372 | 2. Укажите имя конвейера и выберите `Multibranch Pipeline`. 373 | 374 |
375 | 👀 Пример 376 | 377 |
378 | 379 | ![](assets/pipe_2.png) 380 | 381 |
382 | 383 |
384 | 385 | 3. Укажите настройки нового конвейера. 386 | 387 |
388 | 👀 Детали 389 | 390 |
391 | 392 | ![](assets/pipe_3.png) 393 | 394 | Нажмите `Add source` в `Branch Sources`: 395 | 396 |
397 | 398 | ![](assets/pipe_4.png) 399 | 400 |
401 | 402 | Затем выберите учётные данные Gitea, созданные ранее. После этого в `Owner` укажите имя пользователя Gitea, затем выберите git-репозиторий: 403 | 404 |
405 | 406 | ![](assets/pipe_5.png) 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 | --------------------------------------------------------------------------------