Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker

Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€!

Π’ соврСмСнной Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ·-Π·Π° Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°ΡŽΡ‰Π΅ΠΉ Ρ€ΠΎΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² процСссах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π΅ Π½Π° послСднСм мСстС стоит вопрос обСспСчСния бСзопасности Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… этапов ΠΈ сущностСй, связанных с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ. ΠžΡΡƒΡ‰Π΅ΡΡ‚Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π² Ρ€ΡƒΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ являСтся Ρ‚Ρ€ΡƒΠ΄ΠΎΡ‘ΠΌΠΊΠΈΠΌ занятиСм, поэтому Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ хотя Π±Ρ‹ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ шаги ΠΊ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ этого процСсса.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я подСлюсь Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ скриптами для внСдрСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ обСспСчСния бСзопасности Docker ΠΈ инструкциСй, ΠΊΠ°ΠΊ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ нСбольшой Π΄Π΅ΠΌΠΎ-стСнд для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ этого процСсса. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ процСсс тСстирования бСзопасности ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈ инструкций Dockerfile. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ инфраструктура Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ внСдрСния Ρƒ всСх Ρ€Π°Π·Π½Ρ‹Π΅, поэтому Π½ΠΈΠΆΠ΅ я ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ нСсколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности

БущСствуСт большоС количСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ скриптов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… аспСктов Docker-инфраструктуры. Π§Π°ΡΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° описана Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ (https://habr.com/ru/company/swordfish_security/blog/518758/#docker-security), Π° Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ я Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° Ρ‚Ρ€Π΅Ρ… ΠΈΠ· Π½ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ бСзопасности Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ², строящихся Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Помимо этого я Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°ΠΆΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ эти Ρ‚Ρ€ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π² ΠΎΠ΄ΠΈΠ½ pipeline для осущСствлСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ бСзопасности.

Hadolint
https://github.com/hadolint/hadolint

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ простая консольная ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°, которая ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ инструкций Dockerfile-ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использованиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… рССстров ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈΠ»ΠΈ использованиС sudo).

Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker

Dockle
https://github.com/goodwithtech/dockle

Консольная ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ с ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (ΠΈΠ»ΠΈ с сохранСнным tar-Π°Ρ€Ρ…ΠΈΠ²ΠΎΠΌ ΠΎΠ±Ρ€Π°Π·Π°), которая провСряСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ, анализируя Π΅Π³ΠΎ слои ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ – ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ созданы, ΠΊΠ°ΠΊΠΈΠ΅ инструкции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΎΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹, присутствиС пустого пароля ΠΈ Ρ‚. Π΄. Пока количСство ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ большоС ΠΈ базируСтся Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… собствСнных ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ… ΠΈ рСкомСндациях CIS (Center for Internet Security) Benchmark для Docker.
Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker

Trivy
https://github.com/aquasecurity/trivy

Π­Ρ‚Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π½Π°Ρ†Π΅Π»Π΅Π½Π° Π½Π° Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ уязвимостСй Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ² – ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ сборок ОБ (ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu) ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² зависимостях (Gemfile.lock, Pipfile.lock, composer.lock, package-lock.json, yarn.lock, Cargo.lock). Trivy ΡƒΠΌΠ΅Π΅Ρ‚ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π· Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ сканированиС Π½Π° основании ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ .tar Ρ„Π°ΠΉΠ»Π° с Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… условиях описанныС прилоТСния, я ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ инструкции ΠΏΠΎ установкС всСх ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ процСсса.

Основная идСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ содСрТимого Dockerfile ΠΈ Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° состоит ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… шагов:

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° коррСктности ΠΈ бСзопасности инструкций Dockerfile β€” ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ Π»ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠΌ Hadolint
  2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° коррСктности ΠΈ бСзопасности ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² β€” ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ Dockle
  3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия общСизвСстных уязвимостСй (CVE) Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΠΎΠ±Ρ€Π°Π·Π΅ ΠΈ рядС зависимостСй β€” ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ Trivy

Π”Π°Π»ΡŒΡˆΠ΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ‚Ρ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° внСдрСния этих шагов:
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ β€” ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ CI/CD pipeline Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ GitLab (с описаниСм процСсса поднятия тСстового инстанса).
Π’Ρ‚ΠΎΡ€ΠΎΠΉ β€” с использованиСм shell-скрипта.
Π’Ρ€Π΅Ρ‚ΠΈΠΉ β€” с построСниСм Docker-ΠΎΠ±Ρ€Π°Π·Π° для сканирования Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ².
Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ большС Π²Π°ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, пСрСнСсти Π΅Π³ΠΎ Π½Π° свою инфраструктуру ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ свои Π½ΡƒΠΆΠ΄Ρ‹.

ВсС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ инструкции Ρ‚Π°ΠΊΠΆΠ΅ находятся Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ: https://github.com/Swordfish-Security/docker_cicd

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² GitLab CI/CD

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ систСмы Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² GitLab. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΡ€ΠΎΠΉΠ΄Π΅ΠΌ ΠΏΠΎ шагам ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с нуля тСстовоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ с GitLab, ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ процСсс сканирования ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ запуск ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ тСстового Dockerfile ΠΈ случайного ΠΎΠ±Ρ€Π°Π·Π° β€” прилоТСния JuiceShop.

Установка GitLab
1. Π‘Ρ‚Π°Π²ΠΈΠΌ Docker:

sudo apt-get update && sudo apt-get install docker.io

2. ДобавляСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ docker, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄ΠΎΠΊΠ΅Ρ€ΠΎΠΌ Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· sudo:

sudo addgroup <username> docker

3. Находим свой IP:

ip addr

4. Π‘Ρ‚Π°Π²ΠΈΠΌ ΠΈ запускаСм GitLab Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, замСняя IP адрСс Π² hostname Π½Π° свой:

docker run --detach 
--hostname 192.168.1.112 
--publish 443:443 --publish 80:80 
--name gitlab 
--restart always 
--volume /srv/gitlab/config:/etc/gitlab 
--volume /srv/gitlab/logs:/var/log/gitlab 
--volume /srv/gitlab/data:/var/opt/gitlab 
gitlab/gitlab-ce:latest

Π–Π΄Ρ‘ΠΌ, ΠΏΠΎΠΊΠ° GitLab Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠΎ установкС (ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° процСссом Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π²ΠΎΠ΄ Π»ΠΎΠ³-Ρ„Π°ΠΉΠ»Π°: docker logs -f gitlab).

5. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ свой Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ IP ΠΈ Π²ΠΈΠ΄ΠΈΠΌ страницу с ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root:
Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker
Π—Π°Π΄Π°Ρ‘ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ Π·Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² GitLab.

6. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ cicd-test ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ стартовым Ρ„Π°ΠΉΠ»ΠΎΠΌ README.md:
Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker
7. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ GitLab Runner: Π°Π³Π΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎ запросу Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС β€” ΠΏΠΎΠ΄ Linux 64-bit):

sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

8. Π”Π΅Π»Π°Π΅ΠΌ Π΅Π³ΠΎ исполняСмым:

sudo chmod +x /usr/local/bin/gitlab-runner

9. ДобавляСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ОБ для Runner-Π° ΠΈ запускаСм сСрвис:

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

Π”ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

local@osboxes:~$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
Runtime platform arch=amd64 os=linux pid=8438 revision=0e5417a3 version=12.0.1
local@osboxes:~$ sudo gitlab-runner start
Runtime platform arch=amd64 os=linux pid=8518 revision=0e5417a3 version=12.0.1

10. Π’Π΅ΠΏΠ΅Ρ€ΡŒ рСгистрируСм Runner, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΌΠΎΠ³ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с нашим инстансом GitLab.
Для этого ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ страницу Settings-CI/CD (http://OUR_ IP_ADDRESS/root/cicd-test/-/settings/ci_cd) ΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Runners Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ URL ΠΈ Registration token:
Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker
11. РСгистрируСм Runner, подставляя URL ΠΈ Registration token:

sudo gitlab-runner register 
--non-interactive 
--url "http://<URL>/" 
--registration-token "<Registration Token>" 
--executor "docker" 
--docker-privileged 
--docker-image alpine:latest 
--description "docker-runner" 
--tag-list "docker,privileged" 
--run-untagged="true" 
--locked="false" 
--access-level="not_protected"

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ GitLab, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ инструкции для старта Π½Π°ΡˆΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚. Π’ Π΄Π°Π½Π½ΠΎΠΌ дСмонстрационном случаС Ρƒ нас Π½Π΅Ρ‚ шагов сборки прилоТСния ΠΈ Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ шагам сканирования ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹ ΠΈ Dockerfile для Π°Π½Π°Π»ΠΈΠ·Π°.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ pipeline

1. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Ρ„Π°ΠΉΠ»Ρ‹ mydockerfile.df (это Π½Π΅ΠΊΠΈΠΉ тСстовый Dockerfile, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ) ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» GitLab CI/CD процСсса .gitlab-cicd.yml, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСчисляСт инструкции для сканСров (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°).

YAML-Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ содСрТит инструкции ΠΏΠΎ запуску Ρ‚Ρ€Π΅Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ (Hadolint, Dockle ΠΈ Trivy), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Dockerfile ΠΈ ΠΎΠ±Ρ€Π°Π·, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ DOCKERFILE. ВсС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΈΠ· рСпозитория: https://github.com/Swordfish-Security/docker_cicd/

Π’Ρ‹Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΈΠ· mydockerfile.df (это абстрактный Ρ„Π°ΠΉΠ» с Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… инструкций Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для дСмонстрации Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹). ΠŸΡ€ΡΠΌΠ°Ρ ссылка Π½Π° Ρ„Π°ΠΉΠ»: mydockerfile.df

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ mydockerfile.df

FROM amd64/node:10.16.0-alpine@sha256:f59303fb3248e5d992586c76cc83e1d3700f641cbcd7c0067bc7ad5bb2e5b489 AS tsbuild
COPY package.json .
COPY yarn.lock .
RUN yarn install
COPY lib lib
COPY tsconfig.json tsconfig.json
COPY tsconfig.app.json tsconfig.app.json
RUN yarn build
FROM amd64/ubuntu:18.04@sha256:eb70667a801686f914408558660da753cde27192cd036148e58258819b927395
LABEL maintainer="Rhys Arkins <[email protected]>"
LABEL name="renovate"
...
COPY php.ini /usr/local/etc/php/php.ini
RUN cp -a /tmp/piik/* /var/www/html/
RUN rm -rf /tmp/piwik
RUN chown -R www-data /var/www/html
ADD piwik-cli-setup /piwik-cli-setup
ADD reset.php /var/www/html/
## ENTRYPOINT ##
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
USER root

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ YAML выглядит Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (сам Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΏΠΎ прямой ссылкС здСсь: .gitlab-ci.yml):

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ .gitlab-ci.yml

variables:
    DOCKER_HOST: "tcp://docker:2375/"
    DOCKERFILE: "mydockerfile.df" # name of the Dockerfile to analyse   
    DOCKERIMAGE: "bkimminich/juice-shop" # name of the Docker image to analyse
    # DOCKERIMAGE: "knqyf263/cve-2018-11235" # test Docker image with several CRITICAL CVE
    SHOWSTOPPER_PRIORITY: "CRITICAL" # what level of criticality will fail Trivy job
    TRIVYCACHE: "$CI_PROJECT_DIR/.cache" # where to cache Trivy database of vulnerabilities for faster reuse
    ARTIFACT_FOLDER: "$CI_PROJECT_DIR"
 
services:
    - docker:dind # to be able to build docker images inside the Runner
 
stages:
    - scan
    - report
    - publish
 
HadoLint:
    # Basic lint analysis of Dockerfile instructions
    stage: scan
    image: docker:git
 
    after_script:
    - cat $ARTIFACT_FOLDER/hadolint_results.json
 
    script:
    - export VERSION=$(wget -q -O - https://api.github.com/repos/hadolint/hadolint/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
    - wget https://github.com/hadolint/hadolint/releases/download/v${VERSION}/hadolint-Linux-x86_64 && chmod +x hadolint-Linux-x86_64
     
    # NB: hadolint will always exit with 0 exit code
    - ./hadolint-Linux-x86_64 -f json $DOCKERFILE > $ARTIFACT_FOLDER/hadolint_results.json || exit 0
 
    artifacts:
        when: always # return artifacts even after job failure       
        paths:
        - $ARTIFACT_FOLDER/hadolint_results.json
 
Dockle:
    # Analysing best practices about docker image (users permissions, instructions followed when image was built, etc.)
    stage: scan   
    image: docker:git
 
    after_script:
    - cat $ARTIFACT_FOLDER/dockle_results.json
 
    script:
    - export VERSION=$(wget -q -O - https://api.github.com/repos/goodwithtech/dockle/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
    - wget https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.tar.gz && tar zxf dockle_${VERSION}_Linux-64bit.tar.gz
    - ./dockle --exit-code 1 -f json --output $ARTIFACT_FOLDER/dockle_results.json $DOCKERIMAGE   
     
    artifacts:
        when: always # return artifacts even after job failure       
        paths:
        - $ARTIFACT_FOLDER/dockle_results.json
 
Trivy:
    # Analysing docker image and package dependencies against several CVE bases
    stage: scan   
    image: docker:git
 
    script:
    # getting the latest Trivy
    - apk add rpm
    - export VERSION=$(wget -q -O - https://api.github.com/repos/knqyf263/trivy/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
    - wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz && tar zxf trivy_${VERSION}_Linux-64bit.tar.gz
     
    # displaying all vulnerabilities w/o failing the build
    - ./trivy -d --cache-dir $TRIVYCACHE -f json -o $ARTIFACT_FOLDER/trivy_results.json --exit-code 0 $DOCKERIMAGE    
    
    # write vulnerabilities info to stdout in human readable format (reading pure json is not fun, eh?). You can remove this if you don't need this.
    - ./trivy -d --cache-dir $TRIVYCACHE --exit-code 0 $DOCKERIMAGE    
 
    # failing the build if the SHOWSTOPPER priority is found
    - ./trivy -d --cache-dir $TRIVYCACHE --exit-code 1 --severity $SHOWSTOPPER_PRIORITY --quiet $DOCKERIMAGE
         
    artifacts:
        when: always # return artifacts even after job failure
        paths:
        - $ARTIFACT_FOLDER/trivy_results.json
 
    cache:
        paths:
        - .cache
 
Report:
    # combining tools outputs into one HTML
    stage: report
    when: always
    image: python:3.5
     
    script:
    - mkdir json
    - cp $ARTIFACT_FOLDER/*.json ./json/
    - pip install json2html
    - wget https://raw.githubusercontent.com/shad0wrunner/docker_cicd/master/convert_json_results.py
    - python ./convert_json_results.py
     
    artifacts:
        paths:
        - results.html

ΠŸΡ€ΠΈ нСобходимости Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ сохранСнныС ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² Π²ΠΈΠ΄Π΅ .tar-Π°Ρ€Ρ…ΠΈΠ²Π° (ΠΎΠ΄Π½Π°ΠΊΠΎ потрСбуСтся Π² YAML Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΡƒΡ‚ΠΈΠ»ΠΈΡ‚)

NB: Trivy Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ для своСго запуска установлСнныС rpm ΠΈ git. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ошибки ΠΏΡ€ΠΈ сканировании RedHat-based ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Π±Π°Π·Ρ‹ уязвимостСй.

2. ПослС добавлСния Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π² соотвСтствии с инструкциями Π² нашСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, GitLab автоматичСски Π½Π°Ρ‡Π½Ρ‘Ρ‚ процСсс сборки ΠΈ сканирования. На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ CI/CD β†’ Pipelines ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ…ΠΎΠ΄ выполнСния инструкций.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Π’Ρ€ΠΈ ΠΈΠ· Π½ΠΈΡ… Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ нСпосрСдствСнно сканированиСм ΠΈ послСдняя (Report) собираСт простой ΠΎΡ‚Ρ‡Ρ‘Ρ‚ ΠΈΠ· Ρ€Π°Π·Ρ€ΠΎΠ·Π½Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ сканирования.
Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker
По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Trivy останавливаСт своё Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Ссли Π±Ρ‹Π»ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ CRITICAL уязвимости Π² ΠΎΠ±Ρ€Π°Π·Π΅ ΠΈΠ»ΠΈ зависимостях. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя Hadolint всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Success ΠΊΠΎΠ΄ выполнСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΅Π³ΠΎ выполнСния всСгда Π΅ΡΡ‚ΡŒ замСчания, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ остановкС сборки.

Π’ зависимости ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π²Ρ‹Ρ…ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ критичности, останавливали Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ процСсс сборки. Π’ нашСм случаС сборка остановится, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Trivy ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ с ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ SHOWSTOPPER Π² .gitlab-ci.yml.
Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π»ΠΎΠ³Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, нСпосрСдствСнно Π² json-Ρ„Π°ΠΉΠ»Π°Ρ… Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ artifacts ΠΈΠ»ΠΈ Π² простом HTML-ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π΅ (ΠΎ Π½Π΅ΠΌ Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅):
Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker

3. Для прСдставлСния ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠ² ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Π² Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСбольшой скрипт Π½Π° Python для ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Ρ‘Ρ… json-Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΎΠ΄ΠΈΠ½ HTML-Ρ„Π°ΠΉΠ» с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Π΄Π΅Ρ„Π΅ΠΊΡ‚ΠΎΠ².
Π­Ρ‚ΠΎΡ‚ скрипт запускаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Report, Π° Π΅Π³ΠΎ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΌ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠΌ являСтся HTML-Ρ„Π°ΠΉΠ» с ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠΌ. Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊ скрипта Ρ‚Π°ΠΊΠΆΠ΅ Π»Π΅ΠΆΠΈΡ‚ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ свои Π½ΡƒΠΆΠ΄Ρ‹, Ρ†Π²Π΅Ρ‚Π° ΠΈ Ρ‚. ΠΏ.
Бпособы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ внСдрСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Docker

Shell-скрипт

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для случаСв, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹ Π½Π΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… CI/CD систСмы ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ всС инструкции Π² Π²ΠΈΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСпосрСдствСнно Π½Π° хостС. Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ покрываСтся Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ shell-скриптом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π° чистой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ) машинС. Π‘ΠΊΡ€ΠΈΠΏΡ‚ выполняСт Ρ‚Π΅ ΠΆΠ΅ самыС инструкции, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ gitlab-runner.

Для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта Π² систСмС Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн Docker ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ docker.

Π‘Π°ΠΌ скрипт ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ здСсь: docker_sec_check.sh

Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ задаСтся, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±Ρ€Π°Π· Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Π΅Ρ„Π΅ΠΊΡ‚Ρ‹ ΠΊΠ°ΠΊΠΎΠΉ критичности Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Trivy с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ошибки.

Π’ процСссС выполнСния скрипта всС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ скачаны Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ docker_tools, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ β€” Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ docker_tools/json, Π° HTML с ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ„Π°ΠΉΠ»Π΅ results.html.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° скрипта

~/docker_cicd$ ./docker_sec_check.sh

[+] Setting environment variables
[+] Installing required packages
[+] Preparing necessary directories
[+] Fetching sample Dockerfile
2020-10-20 10:40:00 (45.3 MB/s) - β€˜Dockerfile’ saved [8071/8071]
[+] Pulling image to scan
latest: Pulling from bkimminich/juice-shop
[+] Running Hadolint
...
Dockerfile:205 DL3015 Avoid additional packages by specifying `--no-install-recommends`
Dockerfile:248 DL3002 Last USER should not be root
...
[+] Running Dockle
...
WARN    - DKL-DI-0006: Avoid latest tag
        * Avoid 'latest' tag
INFO    - CIS-DI-0005: Enable Content trust for Docker
        * export DOCKER_CONTENT_TRUST=1 before docker pull/build
...
[+] Running Trivy
juice-shop/frontend/package-lock.json
=====================================
Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 2, CRITICAL: 0)

+---------------------+------------------+----------+---------+-------------------------+
|       LIBRARY       | VULNERABILITY ID | SEVERITY | VERSION |             TITLE       |
+---------------------+------------------+----------+---------+-------------------------+
| object-path         | CVE-2020-15256   | HIGH     | 0.11.4  | Prototype pollution in  |
|                     |                  |          |         | object-path             |
+---------------------+------------------+          +---------+-------------------------+
| tree-kill           | CVE-2019-15599   |          | 1.2.2   | Code Injection          |
+---------------------+------------------+----------+---------+-------------------------+
| webpack-subresource | CVE-2020-15262   | LOW      | 1.4.1   | Unprotected dynamically |
|                     |                  |          |         | loaded chunks           |
+---------------------+------------------+----------+---------+-------------------------+

juice-shop/package-lock.json
============================
Total: 20 (UNKNOWN: 0, LOW: 1, MEDIUM: 6, HIGH: 8, CRITICAL: 5)

...

juice-shop/package-lock.json
============================
Total: 5 (CRITICAL: 5)

...
[+] Removing left-overs
[+] Making the output look pretty
[+] Converting JSON results
[+] Writing results HTML
[+] Clean exit ============================================================
[+] Everything is done. Find the resulting HTML report in results.html

Docker-ΠΎΠ±Ρ€Π°Π· со всСми ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ

Π’ качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ я составил Π΄Π²Π° простых Dockerfile для создания ΠΎΠ±Ρ€Π°Π·Π° с ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ бСзопасности. Один Dockerfile ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ для сканирования ΠΎΠ±Ρ€Π°Π·Π° ΠΈΠ· рСпозитория, Π²Ρ‚ΠΎΡ€ΠΎΠΉ (Dockerfile_tar) β€” ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ для сканирования tar-Ρ„Π°ΠΉΠ»Π° с ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

1. Π‘Π΅Ρ€Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Docker Ρ„Π°ΠΉΠ» ΠΈ скрипты ΠΈΠ· рСпозитория https://github.com/Swordfish-Security/docker_cicd/tree/master/Dockerfile.
2. ЗапускаСм Π΅Π³ΠΎ Π½Π° сборку:

docker build -t dscan:image -f docker_security.df .

3. ПослС окончания сборки создаСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈΠ· ΠΎΠ±Ρ€Π°Π·Π°. ΠŸΡ€ΠΈ этом ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния DOCKERIMAGE с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅Π³ΠΎ нас ΠΎΠ±Ρ€Π°Π·Π° ΠΈ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Dockerfile, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚ΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, с нашСй ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½Π° Ρ„Π°ΠΉΠ» /Dockerfile (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ трСбуСтся Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ этого Ρ„Π°ΠΉΠ»Π°):

docker run --rm -v $(pwd)/results:/results -v $(pwd)/docker_security.df:/Dockerfile -e DOCKERIMAGE="bkimminich/juice-shop" dscan:image


[+] Setting environment variables
[+] Running Hadolint
/Dockerfile:3 DL3006 Always tag the version of an image explicitly
[+] Running Dockle
WARN    - DKL-DI-0006: Avoid latest tag
        * Avoid 'latest' tag
INFO    - CIS-DI-0005: Enable Content trust for Docker
        * export DOCKER_CONTENT_TRUST=1 before docker pull/build
INFO    - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
        * not found HEALTHCHECK statement
INFO    - DKL-LI-0003: Only put necessary files
        * unnecessary file : juice-shop/node_modules/sqlite3/Dockerfile
        * unnecessary file : juice-shop/node_modules/sqlite3/tools/docker/architecture/linux-arm64/Dockerfile
        * unnecessary file : juice-shop/node_modules/sqlite3/tools/docker/architecture/linux-arm/Dockerfile
[+] Running Trivy
...
juice-shop/package-lock.json
============================
Total: 20 (UNKNOWN: 0, LOW: 1, MEDIUM: 6, HIGH: 8, CRITICAL: 5)
...
[+] Making the output look pretty
[+] Starting the main module ============================================================
[+] Converting JSON results
[+] Writing results HTML
[+] Clean exit ============================================================
[+] Everything is done. Find the resulting HTML report in results.html

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

ΠœΡ‹ рассмотрСли лишь ΠΎΠ΄ΠΈΠ½ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для сканирования Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² Docker, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π½Π° ΠΌΠΎΠΉ взгляд, вСсьма эффСктивно ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ бСзопасности ΠΎΠ±Ρ€Π°Π·ΠΎΠ². БущСствуСт Π΅Ρ‰Π΅ большоС количСство ΠΏΠ»Π°Ρ‚Π½Ρ‹Ρ… ΠΈ бСсплатных инструмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ красивыС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ чисто Π² консольном Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ систСмы управлСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ ΠΈ Ρ‚. Π΄. ΠžΠ±Π·ΠΎΡ€ этих инструмСнтов ΠΈ способов ΠΈΡ… ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, появится Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стороной Π½Π°Π±ΠΎΡ€Π° инструмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описан Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ построСны Π½Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ исходном ΠΊΠΎΠ΄Π΅ ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ инструмСнтами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ΄ ваши трСбования ΠΈ особСнности инфраструктуры. БСзусловно всС уязвимости, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΡƒΡ‡Π΅Π½Ρ‹ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… условиях, Π½ΠΎ это Ρ‚Π΅ΠΌΠ° для Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ большой ΡΡ‚Π°Ρ‚ΡŒΠΈ.

НадСюсь, данная инструкция, скрипты ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ ΠΈ станут ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ для создания Π±ΠΎΠ»Π΅Π΅ бСзопасной инфраструктуры Π² области, ΠΊΠ°ΡΠ°ΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com