ΠΡ Π₯Π°Π±Ρ!
ΠΠΎ Π΄Π΅Π½Π΅ΡΠ½Π°ΡΠ° ΡΠ΅Π°Π»Π½ΠΎΡΡ, ΠΏΠΎΡΠ°Π΄ΠΈ Π·Π³ΠΎΠ»Π΅ΠΌΠ΅Π½Π°ΡΠ° ΡΠ»ΠΎΠ³Π° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΡΠ°Π·Π²ΠΎΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈ, ΠΏΡΠ°ΡΠ°ΡΠ΅ΡΠΎ Π·Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°ΡΠ΅ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°Π·ΠΈ ΠΈ Π΅Π½ΡΠΈΡΠ΅ΡΠΈ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ Π½Π΅ Π΅ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎ ΠΌΠ΅ΡΡΠΎ. Π Π°ΡΠ½ΠΎΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΡΠ΅ Π΅ ΠΌΠ°ΠΊΠΎΡΡΠΏΠ½Π° Π·Π°Π΄Π°ΡΠ°, ΠΏΠ° Π±ΠΈ Π±ΠΈΠ»ΠΎ ΡΠ±Π°Π²ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π·Π΅ΠΌΠ°Ρ Π±Π°ΡΠ΅ΠΌ ΠΏΠΎΡΠ΅ΡΠ½ΠΈ ΡΠ΅ΠΊΠΎΡΠΈ ΠΊΠΎΠ½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΡΠΎΡΠ΅Ρ.
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°, ΡΠ΅ ΡΠΏΠΎΠ΄Π΅Π»Π°ΠΌ Π³ΠΎΡΠΎΠ²ΠΈ ΡΠΊΡΠΈΠΏΡΠΈ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΠ½ΠΈ Π°Π»Π°ΡΠΊΠΈ Π½Π° Docker ΠΈ ΡΠΏΠ°ΡΡΡΠ²Π° Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΌΠ°Π» Π΄Π΅ΠΌΠΎ ΡΡΠ°Π½Π΄ Π·Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΡΠΎΡΠ΅Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΡΠ΅ Π·Π° Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° Π½Π° ΡΠ»ΠΈΠΊΠΈΡΠ΅ ΠΈ ΡΠΏΠ°ΡΡΡΠ²Π°ΡΠ° Π½Π° Dockerfile. ΠΠ°ΡΠ½ΠΎ Π΅ Π΄Π΅ΠΊΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π·Π° ΡΠ°Π·Π²ΠΎΡ ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π΅ ΡΠ°Π·Π»ΠΈΡΠ½Π° Π·Π° ΡΠ΅ΠΊΠΎΠ³ΠΎ, ΠΏΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρ ΡΠ΅ Π΄Π°Π΄Π°ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΠΎΠΆΠ½ΠΈ ΠΎΠΏΡΠΈΠΈ.
ΠΠΎΠΌΡΠ½Π°Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ°
ΠΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΡΠΊΡΠΈΠΏΡΠΈ ΠΊΠΎΠΈ Π²ΡΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° Docker ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. ΠΠ΅ΠΊΠΎΠΈ ΠΎΠ΄ Π½ΠΈΠ² Π²Π΅ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° (
Π₯Π°Π΄ΠΎΠ»ΠΈΠ½Ρ
ΠΡΠΈΠ»ΠΈΡΠ½ΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π° Π°Π»Π°ΡΠΊΠ° Π·Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° ΠΊΠΎΡΠ° ΠΏΠΎΠΌΠ°Π³Π° ΠΏΡΠ²ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅Π½ΠΈ ΠΈΡΠΏΡΠ°Π²Π½ΠΎΡΡΠ° ΠΈ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° Π½Π° ΡΠΏΠ°ΡΡΡΠ²Π°ΡΠ° Π·Π° Dockerfile (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ°ΠΌΠΎ Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈ Π½Π° ΡΠ»ΠΈΠΊΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ sudo).
Dockle
Π£ΡΠ»ΡΠΆΠ½Π° Π°Π»Π°ΡΠΊΠ° Π·Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° ΠΊΠΎΡΠ° ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΡΠ»ΠΈΠΊΠ° (ΠΈΠ»ΠΈ Π½Π° Π·Π°ΡΡΠ²Π°Π½Π° ΡΠ»ΠΈΠΊΠ° tarball) ΠΊΠΎΡΠ° ΡΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΈΡΠΏΡΠ°Π²Π½ΠΎΡΡΠ° ΠΈ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° Π½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΡΠ»ΠΈΠΊΠ° ΠΊΠ°ΠΊΠΎ ΡΠ°ΠΊΠ²Π° ΠΏΡΠ΅ΠΊΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Π½Π΅ΡΠ·ΠΈΠ½ΠΈΡΠ΅ ΡΠ»ΠΎΠ΅Π²ΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° - ΠΊΠΎΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°Π½ΠΈ, ΠΊΠΎΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠ΅ Π²ΠΎ ΡΠΏΠΎΡΡΠ΅Π±Π°, ΠΊΠΎΠΈ Π²ΠΎΠ»ΡΠΌΠ΅Π½ΠΈ ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ°Π½ΠΈ , ΠΏΡΠΈΡΡΡΡΠ²ΠΎ Π½Π° ΠΏΡΠ°Π·Π½Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°, ΠΈΡΠ½. Π΄. ΠΠΎΠ΄Π΅ΠΊΠ° Π±ΡΠΎΡΠΎΡ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρ Π³ΠΎΠ»Π΅ΠΌ ΠΈ ΡΠ΅ Π·Π°ΡΠ½ΠΎΠ²Π° Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ ΠΏΡΠ΅ΠΏΠΎΡΠ°ΠΊΠΈ
Π’ΡΠΈΠ²ΠΈ
ΠΠ²Π°Π° Π°Π»Π°ΡΠΊΠ° Π΅ Π½Π°ΡΠΎΡΠ΅Π½Π° ΠΊΠΎΠ½ Π½Π°ΠΎΡΠ°ΡΠ΅ Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΏΡΠΎΠΏΡΡΡΠΈ - ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠΎ ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π½Π° ΠΠ‘ (ΠΏΠΎΠ΄Π΄ΡΠΆΠ°Π½ΠΈ ΡΠ΅ Alpine, RedHat (EL), CentOS, Debian GNU, Ubuntu) ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠ° (Gemfile.lock, Pipfile.lock, composer.lock, ΠΏΠ°ΠΊΠ΅Ρ-Π·Π°ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ .json , yarn.lock, Cargo.lock). Trivy ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ ΡΠΊΠ΅Π½ΠΈΡΠ° ΠΈ ΡΠ»ΠΈΠΊΠ°ΡΠ° Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ ΠΈ Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΡΠ»ΠΈΠΊΠ°, Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΡΠΊΠ΅Π½ΠΈΡΠ° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΏΡΠ΅Π½Π΅ΡΠ΅Π½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° .tar ΡΠΎ ΡΠ»ΠΈΠΊΠ°ΡΠ° Π½Π° Docker.
ΠΠΏΡΠΈΠΈ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΊΠΎΠΌΡΠ½Π°Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ
ΠΠ° Π΄Π° Π³ΠΈ ΠΈΡΠΏΡΠΎΠ±Π°ΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π²ΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈ, ΡΠ΅ Π΄Π°Π΄Π°ΠΌ ΡΠΏΠ°ΡΡΡΠ²Π° Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΠΊΠΎΠΌΡΠ½Π°Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ ΠΏΠΎΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ.
ΠΠ»Π°Π²Π½Π°ΡΠ° ΠΈΠ΄Π΅ΡΠ° Π΅ Π΄Π° ΡΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ° ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°ΡΠ° Π·Π° Dockerfiles ΠΈ Docker ΡΠ»ΠΈΠΊΠΈΡΠ΅ ΡΡΠΎ ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Π°Ρ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·Π²ΠΎΡΠΎΡ.
Π‘Π°ΠΌΠ°ΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ ΡΠ»Π΅Π΄Π½ΠΈΠ²Π΅ ΡΠ΅ΠΊΠΎΡΠΈ:
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΈΡΠΏΡΠ°Π²Π½ΠΎΡΡΠ° ΠΈ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° Π½Π° ΡΠΏΠ°ΡΡΡΠ²Π°ΡΠ° Π½Π° Dockerfile ΡΠΎ ΠΏΠΎΠΌΠΎΡΠ½Π° Π°Π»Π°ΡΠΊΠ° Π·Π° Π»ΠΈΠ½ΡΠ΅Ρ Π₯Π°Π΄ΠΎΠ»ΠΈΠ½Ρ
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΈΡΠΏΡΠ°Π²Π½ΠΎΡΡΠ° ΠΈ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° Π½Π° ΠΊΡΠ°ΡΠ½ΠΈΡΠ΅ ΠΈ ΡΡΠ΅Π΄Π½ΠΈΡΠ΅ ΡΠ»ΠΈΠΊΠΈ - Π°Π»Π°ΡΠΊΠ° Dockle
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π° ΠΎΠΏΡΡΠΎ ΠΏΠΎΠ·Π½Π°ΡΠΈ ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡΠΈ (CVE) Π²ΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ»ΠΈΠΊΠ° ΠΈ Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π½Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ - ΠΎΠ΄ Π°Π»Π°ΡΠΊΠ°ΡΠ° Π’ΡΠΈΠ²ΠΈ
ΠΠΎΠ΄ΠΎΡΠ½Π° Π²ΠΎ ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ Π΄Π°Π΄Π°ΠΌ ΡΡΠΈ ΠΎΠΏΡΠΈΠΈ Π·Π° ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ²ΠΈΠ΅ ΡΠ΅ΠΊΠΎΡΠΈ:
ΠΡΠ²ΠΈΠΎΡ Π΅ ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ CI / CD ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ Π½Π° GitLab (ΡΠΎ ΠΎΠΏΠΈΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΠΏΠΎΠ΄ΠΈΠ³Π°ΡΠ΅ ΡΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ).
ΠΡΠΎΡΠΈΠΎΡ Π΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ° Π½Π° ΡΠΊΠΎΠ»ΠΊΠ°.
Π’ΡΠ΅ΡΠΈΠΎΡ Π΅ ΡΠΎ ΠΈΠ·Π³ΡΠ°Π΄Π±Π° Π½Π° Docker ΡΠ»ΠΈΠΊΠ° Π·Π° ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ Π½Π° Docker ΡΠ»ΠΈΠΊΠΈ.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΠΎΠΏΡΠΈΡΠ°ΡΠ° ΡΡΠΎ Π½Π°ΡΠΌΠ½ΠΎΠ³Ρ Π²ΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°, Π΄Π° ΡΠ° ΠΏΡΠ΅Π½Π΅ΡΠ΅ΡΠ΅ Π²ΠΎ Π²Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΈ Π΄Π° ΡΠ° ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΠΈΡΠ΅ Π½Π° Π²Π°ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈ.
Π‘ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠΏΠ°ΡΡΡΠ²Π° ΡΠ΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ:
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° Π½Π° GitLab CI/CD
ΠΠΎ ΠΏΡΠ²Π°ΡΠ° ΠΎΠΏΡΠΈΡΠ°, ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π°Ρ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ GitLab ΠΊΠ°ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠ²Π΄Π΅ ΡΠ΅ Π³ΠΈ ΠΏΠΎΠΌΠΈΠ½Π΅ΠΌΠ΅ ΡΠ΅ΠΊΠΎΡΠΈΡΠ΅ ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ ΡΡΠ΅Π΄ΠΈΠ½Π° Π·Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ ΡΠΎ GitLab ΠΎΠ΄ Π½ΡΠ»Π°, Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ Π°Π»Π°ΡΠΊΠΈ Π·Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ΅ΡΡ Dockerfile ΠΈ ΡΠ»ΡΡΠ°ΡΠ½Π° ΡΠ»ΠΈΠΊΠ° - Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° JuiceShop.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° GitLab
1. ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ Docker:
sudo apt-get update && sudo apt-get install docker.io
2. ΠΠΎΠ΄Π°ΡΡΠ΅ Π³ΠΎ ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π²ΠΎ docker Π³ΡΡΠΏΠ°ΡΠ° Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ docker Π±Π΅Π· Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ sudo:
sudo addgroup <username> docker
3. ΠΠ°ΡΠ΄Π΅ΡΠ΅ ΡΠ° Π²Π°ΡΠ°ΡΠ° IP Π°Π΄ΡΠ΅ΡΠ°:
ip addr
4. ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ ΠΈ ΡΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ Π³ΠΎ GitLab Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ, Π·Π°ΠΌΠ΅Π½ΡΠ²Π°ΡΡΠΈ ΡΠ° IP Π°Π΄ΡΠ΅ΡΠ°ΡΠ° Π²ΠΎ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ ΡΠΎ Π²Π°ΡΠ°:
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-Π±ΠΈΡΠ΅Π½):
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-ΡΠΎ ΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΡ Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡΠ°:
11. Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ Runner ΡΠΎ Π·Π°ΠΌΠ΅Π½Π° Π½Π° URL-ΡΠΎ ΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΡ Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡΠ°:
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 Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°.
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ
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)
ΠΠ°ΠΏΠΎΠΌΠ΅Π½Π°: Trivy Π±Π°ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΎ Π²ΡΡΠ΅ΠΆΠΈ Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ° ΠΈ ΠΎΠ΄ΠΈ. ΠΠΎ ΡΠΏΡΠΎΡΠΈΠ²Π½ΠΎ, ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ»ΠΈΠΊΠΈ Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° RedHat ΠΈ Π΄ΠΎΠ±ΠΈΠ²Π°ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°ΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡ.
2. ΠΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ΡΠΎ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅ Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ, ΡΠΏΠΎΡΠ΅Π΄ ΡΠΏΠ°ΡΡΡΠ²Π°ΡΠ° Π²ΠΎ Π½Π°ΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, GitLab Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ Π³ΠΎ Π·Π°ΠΏΠΎΡΠ½Π΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΠΈ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅. ΠΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ°ΡΠ° CI / CD β Pipelines, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡΠ΅ Π½Π°ΠΏΡΠ΅Π΄ΠΎΠΊΠΎΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅.
ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ΅ΡΠΈΡΠΈ Π·Π°Π΄Π°ΡΠΈ. Π’ΡΠΈ ΠΎΠ΄ Π½ΠΈΠ² ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π²ΠΎ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ΡΠΎ, Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΎΡ (ΠΠ·Π²Π΅ΡΡΠ°Ρ) ΡΠΎΠ±ΠΈΡΠ° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ ΠΎΠ΄ ΡΠ°ΡΡΡΠ»Π°Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΎΠ΄ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅.
Π‘ΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎ, Trivy Π³ΠΎ Π·Π°ΠΏΠΈΡΠ° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π°ΠΊΠΎ ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ ΠΠ ΠΠ’ΠΠ§ΠΠ ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡΠΈ Π½Π° ΡΠ»ΠΈΠΊΠ°ΡΠ° ΠΈΠ»ΠΈ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈΡΠ΅. ΠΠΎ ΠΈΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅, Hadolint ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π³ΠΎ Π²ΡΠ°ΡΠ° Success Π²ΠΎ ΠΊΠΎΠ΄ΠΎΡ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΠΈΠΌΠ° Π·Π°Π±Π΅Π»Π΅ΡΠΊΠΈ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΡΠ²Π° ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π΄Π° ΠΏΡΠ΅ΡΡΠ°Π½Π΅.
ΠΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ Π²Π°ΡΠΈΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π±Π°ΡΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΠΈΠ·Π»Π΅Π·Π½Π° ΡΠΈΡΡΠ° ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΎΠ²ΠΈΠ΅ ΡΡΠ»ΡΠΆΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ°, Π³ΠΎ Π·Π°ΠΏΠΈΡΠ°Π°Ρ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΠΊΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΠΎΡΠΊΡΠΈΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΠΊΡΠΈΡΠΈΡΠ½ΠΎΡΡ. ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° ΡΠ΅ ΠΏΡΠ΅ΡΡΠ°Π½Π΅ ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ Trivy ΠΎΡΠΊΡΠΈΠ΅ ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡ ΡΠΎ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎΡΡ ΡΡΠΎ ΡΠ° Π½Π°Π²Π΅Π΄ΠΎΠ²ΠΌΠ΅ Π²ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° SHOWSTOPPER Π²ΠΎ .gitlab-ci.yml.
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΠ΅ΠΊΠΎΡΠ° Π°Π»Π°ΡΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ Π½Π° ΡΠ΅ΠΊΠΎΡΠ° Π·Π°Π΄Π°ΡΠ° Π·Π° ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅, Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΎ json-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅ Π²ΠΎ Π΄Π΅Π»ΠΎΡ Π·Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈΠ»ΠΈ Π²ΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ HTML ΠΈΠ·Π²Π΅ΡΡΠ°Ρ (ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠΎΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρ):
3. ΠΠ° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π°Ρ ΠΈΠ·Π²Π΅ΡΡΠ°ΠΈΡΠ΅ Π·Π° ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ Π²ΠΎ ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΡΠΈΡΠ»ΠΈΠ²Π° ΡΠΎΡΠΌΠ°, ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΌΠ°Π»Π° Python ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΡΠΈ json-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π²ΠΎ Π΅Π΄Π½Π° HTML-Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ ΡΠ°Π±Π΅Π»Π° Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΈ.
ΠΠ²Π°Π° ΡΠΊΡΠΈΠΏΡΠ° ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ° ΡΠΎ ΠΏΠΎΡΠ΅Π±Π½Π° Π·Π°Π΄Π°ΡΠ° Π·Π° ΠΠ·Π²Π΅ΡΡΠ°Ρ, Π° Π½Π΅ΡΠ·ΠΈΠ½ΠΈΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ Π΅ HTML-Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ. ΠΠ·Π²ΠΎΡΠΎΡ Π½Π° ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° Π΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΠΈ Π½Π° Π²Π°ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈ, Π±ΠΎΠΈ ΠΈΡΠ½.
Π‘ΠΊΡΠΈΠΏΡΠ° Π½Π° ΡΠΊΠΎΠ»ΠΊΠ°
ΠΡΠΎΡΠ°ΡΠ° ΠΎΠΏΡΠΈΡΠ° Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½Π° Π·Π° ΡΠ»ΡΡΠ°ΠΈ ΠΊΠΎΠ³Π° ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΡΠ»ΠΈΠΊΠΈΡΠ΅ Π½Π° Docker ΠΊΠΎΠΈ Π½Π΅ ΡΠ΅ Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ CI / CD, ΠΈΠ»ΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΈΠΌΠ°ΡΠ΅ ΡΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π²ΠΎ ΡΠΎΡΠΌΠ° ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ. ΠΠ²Π°Π° ΠΎΠΏΡΠΈΡΠ° Π΅ ΠΏΠΎΠΊΡΠΈΠ΅Π½Π° ΡΠΎ Π³ΠΎΡΠΎΠ²Π° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΡΠΊΠΎΠ»ΠΊΠ° ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ Π½Π° ΡΠΈΡΡΠ° Π²ΠΈΡΡΡΠ΅Π»Π½Π° (ΠΈΠ»ΠΈ Π΄ΡΡΠΈ ΠΈ ΡΠ΅Π°Π»Π½Π°) ΠΌΠ°ΡΠΈΠ½Π°. Π‘ΠΊΡΠΈΠΏΡΠ°ΡΠ° Π³ΠΈ ΡΠ»Π΅Π΄ΠΈ ΠΈΡΡΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΊΠ°ΠΊΠΎ gitlab-runner ΠΏΠΎΠ³ΠΎΡΠ΅.
ΠΠ° ΡΡΠ΅Π½Π°ΡΠΈΠΎΡΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ, Docker ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΈ ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Π²ΠΎ Π³ΡΡΠΏΠ°ΡΠ° docker.
Π‘Π°ΠΌΠΎΡΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ ΠΎΠ²Π΄Π΅:
ΠΠ° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ°, ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄ΡΠ²Π°Π°Ρ ΠΊΠΎΡΠ° ΡΠ»ΠΈΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠΊΠ΅Π½ΠΈΡΠ° ΠΈ ΠΊΠ°ΠΊΠ²Π° ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎΡΡ Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π°Ρ Π°Π»Π°ΡΠΊΠ°ΡΠ° Trivy Π΄Π° ΠΈΠ·Π»Π΅Π·Π΅ ΡΠΎ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π·Π° Π³ΡΠ΅ΡΠΊΠ°.
ΠΠ° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠΊΡΠΈΠΏΡΠ°ΡΠ°, ΡΠΈΡΠ΅ Π°Π»Π°ΡΠΊΠΈ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ ΠΏΡΠ΅Π·Π΅ΠΌΠ΅Π½ΠΈ Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ docker_tools, ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ΄ Π½ΠΈΠ²Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° - Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ docker_tools/json, Π° HTML ΡΠΎ ΠΈΠ·Π²Π΅ΡΡΠ°ΡΠΎΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ.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
ΠΠΎΠΊΠ΅Ρ ΡΠ»ΠΈΠΊΠ° ΡΠΎ ΡΠΈΡΠ΅ ΠΊΠΎΠΌΡΠ½Π°Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ
ΠΠ°ΠΊΠΎ ΡΡΠ΅ΡΠ° Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°, ΡΠΎΡΡΠ°Π²ΠΈΠ² Π΄Π²Π΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ Dockerfiles Π·Π° Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π°ΠΌ ΡΠ»ΠΈΠΊΠ° ΡΠΎ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΠ½ΠΈ Π°Π»Π°ΡΠΊΠΈ. ΠΠ΄Π΅Π½ 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, ΡΡΠΎ ΠΌΠΈΡΠ»Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΏΠΎΠΊΡΠΈΠ²Π° ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ Π±Π°ΡΠ°ΡΠ° Π·Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡ Π½Π° ΡΠ»ΠΈΠΊΠ°ΡΠ°. ΠΠΎΡΡΠΎΡΠ°Ρ ΠΌΠ½ΠΎΠ³Ρ Π΄ΡΡΠ³ΠΈ ΠΏΠ»Π°ΡΠ΅Π½ΠΈ ΠΈ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΈ Π°Π»Π°ΡΠΊΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ°Ρ Π΄Π° Π³ΠΈ Π²ΡΡΠ°Ρ ΠΈΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, Π΄Π° ΡΡΡΠ°Π°Ρ ΡΠ±Π°Π²ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ°ΠΈ ΠΈΠ»ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ ΡΠΈΡΡΠΎ Π²ΠΎ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°, Π΄Π° Π³ΠΈ ΠΏΠΎΠΊΡΠΈΠ²Π°Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ Π·Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΠΈΡΠ½. ΠΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΎΠ²ΠΈΠ΅ Π°Π»Π°ΡΠΊΠΈ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΠ΄ΠΎΡΠ½Π°.
ΠΠΎΠ·ΠΈΡΠΈΠ²Π½Π°ΡΠ° ΡΡΡΠ°Π½Π° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ Π°Π»Π°ΡΠΊΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ ΡΠΎΠ° ΡΡΠΎ ΡΠΈΡΠ΅ ΡΠΈΠ΅ ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ ΡΠΎ Π½ΠΈΠ² ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ»ΠΈΡΠ½ΠΈ Π°Π»Π°ΡΠΊΠΈ Π·Π° Π΄Π° Π½Π°ΡΠ΄Π΅ΡΠ΅ ΡΡΠΎ ΡΠΎΡΠ½ΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ° Π½Π° Π²Π°ΡΠΈΡΠ΅ Π±Π°ΡΠ°ΡΠ° ΠΈ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΠΈ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ. Π‘Π΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΡΠΈΡΠ΅ ΠΏΡΠΎΠ½Π°ΡΠ΄Π΅Π½ΠΈ ΠΏΡΠΎΠΏΡΡΡΠΈ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΡΠ°Ρ Π·Π° ΠΏΡΠΈΠΌΠ΅Π½Π»ΠΈΠ²ΠΎΡΡ Π²ΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈ, Π½ΠΎ ΠΎΠ²Π° Π΅ ΡΠ΅ΠΌΠ° Π·Π° ΠΈΠ΄Π½Π° Π³ΠΎΠ»Π΅ΠΌΠ° ΡΡΠ°ΡΠΈΡΠ°.
Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΎΠ²ΠΈΠ΅ ΡΠΏΠ°ΡΡΡΠ²Π°, ΡΠΊΡΠΈΠΏΡΠΈ ΠΈ Π°Π»Π°ΡΠΊΠΈ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ ΠΈ ΡΠ΅ ΡΡΠ°Π½Π°Ρ ΠΏΠΎΡΠ΅ΡΠ½Π° ΡΠΎΡΠΊΠ° Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΏΠΎΡΠΈΠ³ΡΡΠ½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π²ΠΎ ΠΎΠ±Π»Π°ΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡΠ°ΡΠ°.
ΠΠ·Π²ΠΎΡ: www.habr.com