ΠΡΠΈΠ²Π΅Ρ, Π₯Π°Π±Ρ!
Π ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΡΠ½ΠΎΡΡΠΈ ΠΈΠ·-Π·Π° Π²ΠΎΠ·ΡΠ°ΡΡΠ°ΡΡΠ΅ΠΉ ΡΠΎΠ»ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π΅ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΠΌΠ΅ΡΡΠ΅ ΡΡΠΎΠΈΡ Π²ΠΎΠΏΡΠΎΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ°ΠΏΠΎΠ² ΠΈ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ. ΠΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ Π² ΡΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ΄ΠΎΡΠΌΠΊΠΈΠΌ Π·Π°Π½ΡΡΠΈΠ΅ΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΎΡΡ Π±Ρ Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°Π³ΠΈ ΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΠΏΠΎΠ΄Π΅Π»ΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌΠΈ ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ Π΄Π»Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΡΠΈΠ»ΠΈΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Docker ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ, ΠΊΠ°ΠΊ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ Π΄Π΅ΠΌΠΎ-ΡΡΠ΅Π½Π΄ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Dockerfile. ΠΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Ρ Π²ΡΠ΅Ρ
ΡΠ°Π·Π½ΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π½ΠΈΠΆΠ΅ Ρ ΠΏΡΠΈΠ²Π΅Π΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ².
Π£ΡΠΈΠ»ΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΡ
Π°ΡΠΏΠ΅ΠΊΡΠΎΠ² Docker-ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ. Π§Π°ΡΡΡ ΠΈΠ· Π½ΠΈΡ
ΡΠΆΠ΅ Π±ΡΠ»Π° ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ (
Hadolint
ΠΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½Π°Ρ ΡΡΠΈΠ»ΠΈΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΎΡΠ΅Π½ΠΈΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Dockerfile-ΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΡ ΡΠ΅Π΅ΡΡΡΠΎΠ² ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ sudo).
Dockle
ΠΠΎΠ½ΡΠΎΠ»ΡΠ½Π°Ρ ΡΡΠΈΠ»ΠΈΡΠ°, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ°Ρ Ρ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (ΠΈΠ»ΠΈ Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½Π½ΡΠΌ tar-Π°ΡΡ
ΠΈΠ²ΠΎΠΌ ΠΎΠ±ΡΠ°Π·Π°), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π° ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΠΎΠ³ΠΎ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΡ Π΅Π³ΠΎ ΡΠ»ΠΎΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ β ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΡΠΎΠ·Π΄Π°Π½Ρ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΎΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Ρ, ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΡΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈ Ρ. Π΄. ΠΠΎΠΊΠ° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΈ Π±Π°Π·ΠΈΡΡΠ΅ΡΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ
ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°Ρ
ΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡΡ
Trivy
ΠΡΠ° ΡΡΠΈΠ»ΠΈΡΠ° Π½Π°ΡΠ΅Π»Π΅Π½Π° Π½Π° Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ Π΄Π²ΡΡ ΡΠΈΠΏΠΎΠ² β ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ±ΠΎΡΠΎΠΊ ΠΠ‘ (ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu) ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ (Gemfile.lock, Pipfile.lock, composer.lock, package-lock.json, yarn.lock, Cargo.lock). Trivy ΡΠΌΠ΅Π΅Ρ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ°Π· Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, ΡΠ°ΠΊ ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π·, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ .tar ΡΠ°ΠΉΠ»Π° Ρ Docker-ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
ΠΠ°ΡΠΈΠ°Π½ΡΡ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΡΠΈΠ»ΠΈΡ
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π² ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Ρ ΠΏΡΠΈΠ²Π΅Π΄Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π²ΡΠ΅Ρ ΡΡΠΈΠ»ΠΈΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΏΡΠΎΡΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄ΡΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Dockerfile ΠΈ Docker-ΠΎΠ±ΡΠ°Π·ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
Π‘Π°ΠΌΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°Π³ΠΎΠ²:
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Dockerfile β ΡΡΠΈΠ»ΠΈΡΠΎΠΉ Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌ Hadolint
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² β ΡΡΠΈΠ»ΠΈΡΠΎΠΉ Dockle
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ (CVE) Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΠΎΠ±ΡΠ°Π·Π΅ ΠΈ ΡΡΠ΄Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ β ΡΡΠΈΠ»ΠΈΡΠΎΠΉ Trivy
ΠΠ°Π»ΡΡΠ΅ Π² ΡΡΠ°ΡΡΠ΅ Ρ ΠΏΡΠΈΠ²Π΅Π΄Ρ ΡΡΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ° Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ
ΡΠ°Π³ΠΎΠ²:
ΠΠ΅ΡΠ²ΡΠΉ β ΠΏΡΡΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ CI/CD pipeline Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ GitLab (Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΠΎΠ΄Π½ΡΡΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠ°).
ΠΡΠΎΡΠΎΠΉ β Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ shell-ΡΠΊΡΠΈΠΏΡΠ°.
Π’ΡΠ΅ΡΠΈΠΉ β Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ΠΌ Docker-ΠΎΠ±ΡΠ°Π·Π° Π΄Π»Ρ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Docker-ΠΎΠ±ΡΠ°Π·ΠΎΠ².
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ±ΡΠ°ΡΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΊΠΎΡΠΎΡΡΠΉ Π±ΠΎΠ»ΡΡΠ΅ Π²Π°ΠΌ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ, ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π΅Π³ΠΎ Π½Π° ΡΠ²ΠΎΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ ΠΈ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ ΡΠ²ΠΎΠΈ Π½ΡΠΆΠ΄Ρ.
ΠΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠ°ΠΊΠΆΠ΅ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ:
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² 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:
ΠΠ°Π΄Π°ΡΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈ Π·Π°Ρ
ΠΎΠ΄ΠΈΠΌ Π² GitLab.
6. Π‘ΠΎΠ·Π΄Π°ΡΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ cicd-test ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΡΠ°ΡΡΠΎΠ²ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ README.md:
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:
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. ΠΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ:
ΠΡΠ΄Π΅ΡΠΆΠΊΠ° ΠΈΠ· 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
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) ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΎΡΡΡΡ ΠΈΠ· ΡΠ°Π·ΡΠΎΠ·Π½Π΅Π½Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ² Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΠΈ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Trivy ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ²ΠΎΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Π±ΡΠ»ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Ρ CRITICAL ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΎΠ±ΡΠ°Π·Π΅ ΠΈΠ»ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ
. Π ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ Hadolint Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Success ΠΊΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Π³Π΄Π° Π΅ΡΡΡ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΡ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΠ±ΠΎΡΠΊΠΈ.
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ
ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π²ΡΡ
ΠΎΠ΄Π°, ΡΡΠΎΠ±Ρ ΡΡΠΈ ΡΡΠΈΠ»ΠΈΡΡ ΠΏΡΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΊΡΠΈΡΠΈΡΠ½ΠΎΡΡΠΈ, ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΠΈ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ±ΠΎΡΠΊΠ° ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Trivy ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ Ρ ΠΊΡΠΈΡΠΈΡΠ½ΠΎΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠΊΠ°Π·Π°Π»ΠΈ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ SHOWSTOPPER Π² .gitlab-ci.yml.
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠΈΠ»ΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² Π»ΠΎΠ³Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΊΠ°Π½ΠΈΡΡΡΡΠ΅ΠΉ Π·Π°Π΄Π°ΡΠΈ, Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² json-ΡΠ°ΠΉΠ»Π°Ρ
Π² ΡΠ°Π·Π΄Π΅Π»Π΅ artifacts ΠΈΠ»ΠΈ Π² ΠΏΡΠΎΡΡΠΎΠΌ HTML-ΠΎΡΡΡΡΠ΅ (ΠΎ Π½Π΅ΠΌ ΡΡΡΡ Π½ΠΈΠΆΠ΅):
3. ΠΠ»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΡΡΡΠΎΠ² ΡΡΠΈΠ»ΠΈΡ Π² ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎΡΠΈΡΠ°Π΅ΠΌΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ Π½Π° Python Π΄Π»Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΠΈ ΡΡΡΡ
json-ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΠΎΠ΄ΠΈΠ½ HTML-ΡΠ°ΠΉΠ» Ρ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ Π΄Π΅ΡΠ΅ΠΊΡΠΎΠ².
ΠΡΠΎΡ ΡΠΊΡΠΈΠΏΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ Report, Π° Π΅Π³ΠΎ ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΌ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ HTML-ΡΠ°ΠΉΠ» Ρ ΠΎΡΡΡΡΠΎΠΌ. ΠΡΡ
ΠΎΠ΄Π½ΠΈΠΊ ΡΠΊΡΠΈΠΏΡΠ° ΡΠ°ΠΊΠΆΠ΅ Π»Π΅ΠΆΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ ΡΠ²ΠΎΠΈ Π½ΡΠΆΠ΄Ρ, ΡΠ²Π΅ΡΠ° ΠΈ Ρ. ΠΏ.
Shell-ΡΠΊΡΠΈΠΏΡ
ΠΡΠΎΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Docker-ΠΎΠ±ΡΠ°Π·Ρ Π½Π΅ Π² ΡΠ°ΠΌΠΊΠ°Ρ CI/CD ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅ΡΡ Π²ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² Π²ΠΈΠ΄Π΅, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π½Π° Ρ ΠΎΡΡΠ΅. ΠΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΠΎΠΊΡΡΠ²Π°Π΅ΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌ shell-ΡΠΊΡΠΈΠΏΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Π½Π° ΡΠΈΡΡΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ) ΠΌΠ°ΡΠΈΠ½Π΅. Π‘ΠΊΡΠΈΠΏΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ΅ ΠΆΠ΅ ΡΠ°ΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΡΡΠΎ ΠΈ Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ gitlab-runner.
ΠΠ»Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΡΠΊΡΠΈΠΏΡΠ° Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Docker ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π² Π³ΡΡΠΏΠΏΠ΅ docker.
Π‘Π°ΠΌ ΡΠΊΡΠΈΠΏΡ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ Π·Π΄Π΅ΡΡ:
Π Π½Π°ΡΠ°Π»Π΅ ΡΠ°ΠΉΠ»Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ Π·Π°Π΄Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡΠ°Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π΄Π΅ΡΠ΅ΠΊΡΡ ΠΊΠ°ΠΊΠΎΠΉ ΠΊΡΠΈΡΠΈΡΠ½ΠΎΡΡΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ Π²ΡΡ ΠΎΠ΄ ΠΈΠ· ΡΡΠΈΠ»ΠΈΡΡ 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 ΡΠ°ΠΉΠ» ΠΈ ΡΠΊΡΠΈΠΏΡΡ ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
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