
ΠΠ΄ΡΠ°Π²Π΅ΠΉ, Π₯Π°Π±Ρ!
Π ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π°ΡΠ° ΡΠ΅Π°Π»Π½ΠΎΡΡ, ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°ΡΠ°ΡΠ° ΡΠ΅ ΡΠΎΠ»Ρ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡΡΠ° Π² ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, Π²Π°ΠΆΠ΅Π½ Π΅ Π²ΡΠΏΡΠΎΡΡΡ Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π΅ΡΠ°ΠΏΠΈ ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ vα»i ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅. ΠΡΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΡΠ½ΠΎ Π΅ ΡΡΡΠ΄ΠΎΠ΅ΠΌΠΊΠ° Π·Π°Π΄Π°ΡΠ°, Π·Π°ΡΠΎΠ²Π° Π΅ Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΡΡ ΠΏΠΎΠ½Π΅ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΈ ΡΡΡΠΏΠΊΠΈ ΠΊΡΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠΏΠΎΠ΄Π΅Π»Ρ Π³ΠΎΡΠΎΠ²ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° Docker ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅ ΠΌΠ°Π»ΡΠΊ Π΄Π΅ΠΌΠΎ-ΡΡΠ΅Π½Π΄ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ. ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ, Π·Π° Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅ ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Dockerfile. Π―ΡΠ½ΠΎ Π΅, ΡΠ΅ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π΅ ΡΠ°Π·Π»ΠΈΡΠ½Π° Π·Π° Π²ΡΠΈΡΠΊΠΈ, Π·Π°ΡΠΎΠ²Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ°.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ°
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° Docker ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. Π§Π°ΡΡ ΠΎΡ ΡΡΡ Π²Π΅ΡΠ΅ Π±Π΅ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΡΠ°ΡΠΈΡ (), Π° Π² ΡΠΎΠ·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π» Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΡΠ΅ ΡΠΏΡΠ° Π½Π° ΡΡΠΈ ΠΎΡ ΡΡΡ , ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠΊΡΠΈΠ²Π°Ρ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π½Π° Docker ΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅, ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ΅ Π΄Π°ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°ΠΊ ΡΠ΅Π·ΠΈ ΡΡΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ²ΡΡΠ·Π°Π½ΠΈ Π² Π΅Π΄ΠΈΠ½ pipeline Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ.
Hadolint
ΠΠΎΡΡΠ° ΠΏΡΠΎΡΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π½Π° ΡΡΠΈΠ»ΠΈΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π² ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½Π°ΡΠ° ΠΎΡΠ΅Π½ΠΊΠ° Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡΡΠ° ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π² Dockerfile-ΠΈΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΡΠ°ΠΌΠΎ Π½Π° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈ Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° sudo).

Dockle
ΠΠΎΠ½Π·ΠΎΠ»Π½Π° ΡΡΠΈΠ»ΠΈΡΠ°, ΡΠ°Π±ΠΎΡΠ΅ΡΠ° Ρ ΠΎΠ±ΡΠ°Π·Π° (ΠΈΠ»ΠΈ ΡΡΡ Π·Π°ΠΏΠ°Π·Π΅Π½ tar Π°ΡΡ
ΠΈΠ² Π½Π° ΠΎΠ±ΡΠ°Π·Π°), ΠΊΠΎΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡΡΠ° ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΎΠ±ΡΠ°Π·, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΡΠ»ΠΎΠ΅Π²Π΅ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ β ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΡΠ° ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ, ΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ, ΠΊΠ°ΠΊΠ²ΠΈ ΡΠΎΠΌΠΎΠ²Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ, Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠ°Π·Π½Π° ΠΏΠ°ΡΠΎΠ»Π° ΠΈ Ρ.Π½. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π±ΡΠΎΡΡ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΡΠ΅ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»ΡΠΌ ΠΈ Π΅ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ ΠΏΡΠ΅ΠΏΠΎΡΡΠΊΠΈ. Π·Π° Docker.

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.io2. ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π² Π³ΡΡΠΏΠ°ΡΠ° docker, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ Docker Π±Π΅Π· sudo:
sudo addgroup docker3. ΠΠ°ΠΌΠ΅ΡΠ΅ΡΠ΅ ΡΠ²ΠΎΡ IP:
ip addr4. ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ 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-amd648. ΠΡΠ°Π²ΠΈΠΌ Π³ΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ:
sudo chmod +x /usr/local/bin/gitlab-runner9. ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π½Π° ΠΠ‘ Π·Π° 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:///"
--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 <rhys@arkins.net>"
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
ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ:
DOCKER_HOST: "tcp://docker:2375/"
DOCKERFILE: "mydockerfile.df" # ΠΈΠΌΠ΅ Π½Π° Dockerfile Π·Π° Π°Π½Π°Π»ΠΈΠ·
DOCKERIMAGE: "bkimminich/juice-shop" # ΠΈΠΌΠ΅ Π½Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·
# DOCKERIMAGE: "knqyf263/cve-2018-11235" # ΡΠ΅ΡΡΠΎΠ²ΠΎ Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΈ CVE
SHOWSTOPPER_PRIORITY: "ΠΠ ΠΠ’ΠΠ§ΠΠ" # ΠΊΠ°ΠΊΠ²ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° ΠΊΡΠΈΡΠΈΡΠ½ΠΎΡΡ ΡΠ΅ ΠΏΡΠΎΠ²Π°Π»ΠΈ Π·Π°Π΄Π°ΡΠ°ΡΠ° Π½Π° Trivy
TRIVYCACHE: "$CI_PROJECT_DIR/.cache" # ΠΊΡΠ΄Π΅ Π΄Π° ΠΊΠ΅ΡΠΈΡΠ°ΠΌΠ΅ Trivy Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π·Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π·Π° ΠΏΠΎ-Π±ΡΡΠ·ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅
ARTIFACT_FOLDER: "$CI_PROJECT_DIR"
ΡΡΠ»ΡΠ³ΠΈ:
- docker:dind # Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌΠ΅ docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π²ΡΡΡΠ΅ Π² Runner
Π΅ΡΠ°ΠΏΠΈ:
- ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅
- ΠΎΡΡΠ΅Ρ
- ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅
HadoLint:
# ΠΡΠ½ΠΎΠ²Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² Dockerfile
Π΅ΡΠ°ΠΏ: ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅: docker:git
ΡΠ»Π΅Π΄_ΡΠΊΡΠΈΠΏΡ:
- cat $ARTIFACT_FOLDER/hadolint_results.json
ΡΠΊΡΠΈΠΏΡ:
- 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 Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΠΈΠ·Π»Π΅Π·Π΅ Ρ ΠΊΠΎΠ΄ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄ 0
- ./hadolint-Linux-x86_64 -f json $DOCKERFILE > $ARTIFACT_FOLDER/hadolint_results.json || exit 0
Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ:
ΠΊΠΎΠ³Π°ΡΠΎ: Π²ΠΈΠ½Π°Π³ΠΈ # Π²ΡΡΠ½Π΅ΡΠ΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ Π΄ΠΎΡΠΈ ΡΠ»Π΅Π΄ ΠΏΡΠΎΠ²Π°Π» Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°
ΠΏΡΡΠΈΡΠ°:
- $ARTIFACT_FOLDER/hadolint_results.json
Dockle:
# ΠΠ½Π°Π»ΠΈΠ· Π½Π° Π΄ΠΎΠ±ΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π·Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ (ΠΏΡΠ°Π²Π° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅, ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠ»Π΅Π΄Π²Π°Π½ΠΈ ΠΏΡΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Ρ.Π½.)
Π΅ΡΠ°ΠΏ: ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅: docker:git
ΡΠ»Π΅Π΄_ΡΠΊΡΠΈΠΏΡ:
- cat $ARTIFACT_FOLDER/dockle_results.json
ΡΠΊΡΠΈΠΏΡ:
- 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
Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ:
ΠΊΠΎΠ³Π°ΡΠΎ: Π²ΠΈΠ½Π°Π³ΠΈ # Π²ΡΡΠ½Π΅ΡΠ΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ Π΄ΠΎΡΠΈ ΡΠ»Π΅Π΄ ΠΏΡΠΎΠ²Π°Π» Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°
ΠΏΡΡΠΈΡΠ°:
- $ARTIFACT_FOLDER/dockle_results.json
Trivy:
# ΠΠ½Π°Π»ΠΈΠ· Π½Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠΏΡΡΠΌΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ CVE Π±Π°Π·ΠΈ
Π΅ΡΠ°ΠΏ: ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅: docker:git
ΡΠΊΡΠΈΠΏΡ:
# ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π½Π°ΠΉ-Π½ΠΎΠ²ΠΈΡ 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
# ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π±Π΅Π· ΠΏΡΠΎΠ²Π°Π» Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ
- ./trivy -d --cache-dir $TRIVYCACHE -f json -o $ARTIFACT_FOLDER/trivy_results.json --exit-code 0 $DOCKERIMAGE
# Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ ΠΈΠ·Ρ
ΠΎΠ΄ Π² ΡΠ΅ΡΠΈΠΌ ΡΠΎΡΠΌΠ°Ρ (ΡΠ΅ΡΠ΅Π½Π΅ΡΠΎ Π½Π° ΡΠΈΡΡ json Π½Π΅ Π΅ Π·Π°Π±Π°Π²Π½ΠΎ, Π½Π°Π»ΠΈ?). ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π΅ΡΠ΅ ΡΠΎΠ²Π°, Π°ΠΊΠΎ Π½Π΅ Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ.
- ./trivy -d --cache-dir $TRIVYCACHE --exit-code 0 $DOCKERIMAGE
# ΠΏΡΠΎΠ²Π°Π» Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ, Π°ΠΊΠΎ ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ SHOWSTOPPER
- ./trivy -d --cache-dir $TRIVYCACHE --exit-code 1 --severity $SHOWSTOPPER_PRIORITY --quiet $DOCKERIMAGE
Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ:
ΠΊΠΎΠ³Π°ΡΠΎ: Π²ΠΈΠ½Π°Π³ΠΈ # Π²ΡΡΠ½Π΅ΡΠ΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ Π΄ΠΎΡΠΈ ΡΠ»Π΅Π΄ ΠΏΡΠΎΠ²Π°Π» Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°
ΠΏΡΡΠΈΡΠ°:
- $ARTIFACT_FOLDER/trivy_results.json
ΠΊΠ΅Ρ:
ΠΏΡΡΠΈΡΠ°:
- .cache
ΠΡΡΠ΅Ρ:
# ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄ΠΈΡΠ΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π² Π΅Π΄ΠΈΠ½ HTML
Π΅ΡΠ°ΠΏ: ΠΎΡΡΠ΅Ρ
ΠΊΠΎΠ³Π°ΡΠΎ: Π²ΠΈΠ½Π°Π³ΠΈ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅: python:3.5
ΡΠΊΡΠΈΠΏΡ:
- 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
Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ:
ΠΏΡΡΠΈΡΠ°:
- results.htmlΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΡΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠΊΠ°Π½ΠΈΡΠ°ΡΠ΅ ΠΈ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ ΠΎΠ±ΡΠ°Π·ΠΈ Π² .tar Π°ΡΡ ΠΈΠ² (Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π²Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΡΡΠΈΠ»ΠΈΡΠΈΡΠ΅ Π² YAML ΡΠ°ΠΉΠ»Π°)
NB: Trivy ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ rpm ΠΈ git. Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠ²ΡΡ Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈ, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° RedHat, ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ.
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
[+] ΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°
[+] ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ
[+] ΠΠΎΠ΄Π³ΠΎΡΠ²ΡΠ½Π΅ Π½Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ
[+] ΠΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Dockerfile
2020-10-20 10:40:00 (45.3 MB/s) - βDockerfileβ ΡΠΏΠ΅ΡΡΠ΅Π½ [8071/8071]
[+] ΠΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅
latest: ΠΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ ΠΎΡ bkimminich\/juice-shop
[+] ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Hadolint
...
Dockerfile:205 DL3015 ΠΠ·Π±ΡΠ³Π²Π°ΠΉΡΠ΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΊΠ°ΡΠΎ ΡΠΊΠ°ΠΆΠ΅ΡΠ΅ `--no-install-recommends`
Dockerfile:248 DL3002 ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ USER Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ root
...
[+] ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Dockle
...
WARN - DKL-DI-0006: ΠΠ·Π±ΡΠ³Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ°Π³
* ΠΠ·Π±ΡΠ³Π²Π°ΠΉΡΠ΅ 'latest' ΡΠ°Π³Π°
INFO - CIS-DI-0005: ΠΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ Π΄ΠΎΠ²Π΅ΡΠΈΠ΅ Π² ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π·Π° Docker
* export DOCKER_CONTENT_TRUST=1 ΠΏΡΠ΅Π΄ΠΈ docker pull/build
...
[+] ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Trivy
juice-shop\/frontend\/package-lock.json
=====================================
ΠΠ±ΡΠΎ: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 2, CRITICAL: 0)
+---------------------+------------------+----------+---------+-------------------------+
| ΠΠΠΠΠΠΠ’ΠΠΠ | ID Π½Π° Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ | Π‘ΠΠ ΠΠΠΠΠΠ‘Π’ | ΠΠΠ Π‘ΠΠ― | ΠΠΠΠΠΠΠΠ |
+---------------------+------------------+----------+---------+-------------------------+
| object-path | CVE-2020-15256 | ΠΠΠ‘ΠΠΠ | 0.11.4 | ΠΠ°ΠΌΡΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠΎΡΠΈΠΏΠΈ |
| | | | | object-path |
+---------------------+------------------+ +---------+-------------------------+
| tree-kill | CVE-2019-15599 | | 1.2.2 | ΠΠ½ΠΆΠ΅ΠΊΡΠΈΡ Π½Π° ΠΊΠΎΠ΄ |
+---------------------+------------------+----------+---------+-------------------------+
| webpack-subresource | CVE-2020-15262 | ΠΠΠ‘ΠΠ | 1.4.1 | ΠΠ΅ Π·Π°ΡΠΈΡΠ΅Π½ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ |
| | | | | Π·Π°ΡΠ΅Π΄Π΅Π½ΠΈ ΡΠ°ΡΡΠΈ |
+---------------------+------------------+----------+---------+-------------------------+
juice-shop\/package-lock.json
============================
ΠΠ±ΡΠΎ: 20 (UNKNOWN: 0, LOW: 1, MEDIUM: 6, HIGH: 8, CRITICAL: 5)
...
juice-shop\/package-lock.json
============================
ΠΠ±ΡΠΎ: 5 (CRITICAL: 5)
...
[+] ΠΡΠ΅ΠΌΠ°Ρ
Π²Π°Π½Π΅ Π½Π° ΠΎΡΡΠ°ΡΡΡΠΈ
[+] ΠΠΎΠ΄ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π°
[+] ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° JSON ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ
[+] ΠΠ°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ Π² HTML
[+] Π§ΠΈΡΡΠΎ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ ============================================================
[+] ΠΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ. ΠΠ°ΠΌΠ΅ΡΠ΅ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ½ΠΈΡ HTML ΠΎΡΡΠ΅Ρ Π² results.htmlDocker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΡΠΈΠ»ΠΈΡΠ°ΠΌΠΈ
ΠΠ°ΡΠΎ ΡΡΠ΅ΡΠ° Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΡΡΡΡΠ°Π²ΠΈΡ Π΄Π²Π° ΠΏΡΠΎΡΡΠΈ 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
[+] ΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° ΡΡΠ΅Π΄Π°
[+] ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Hadolint
\/Dockerfile:3 DL3006 ΠΠΈΠ½Π°Π³ΠΈ ΠΌΠ°ΡΠΊΠΈΡΠ°ΠΉΡΠ΅ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ²Π½ΠΎ
[+] ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Dockle
WARN - DKL-DI-0006: ΠΠ·Π±ΡΠ³Π²Π°ΠΉΡΠ΅ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΠΊΠ°
* ΠΠ·Π±ΡΠ³Π²Π°ΠΉΡΠ΅ 'latest' ΠΌΠ°ΡΠΊΠ°
INFO - CIS-DI-0005: ΠΠΊΠ»ΡΡΠ΅ΡΠ΅ Π΄ΠΎΠ²Π΅ΡΠΈΠ΅ Π² ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π·Π° Docker
* Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΠΉΡΠ΅ DOCKER_CONTENT_TRUST=1 ΠΏΡΠ΅Π΄ΠΈ docker pull\/build
INFO - CIS-DI-0006: ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ HEALTHCHECK ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΊΡΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
* Π½Π΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ HEALTHCHECK
INFO - DKL-LI-0003: ΠΠΎΡΡΠ°Π²ΡΠΉΡΠ΅ ΡΠ°ΠΌΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
* Π½Π΅Π½ΡΠΆΠ΅Π½ ΡΠ°ΠΉΠ» : juice-shop\/node_modules\/sqlite3\/Dockerfile
* Π½Π΅Π½ΡΠΆΠ΅Π½ ΡΠ°ΠΉΠ» : juice-shop\/node_modules\/sqlite3\/tools\/docker\/architecture\/linux-arm64\/Dockerfile
* Π½Π΅Π½ΡΠΆΠ΅Π½ ΡΠ°ΠΉΠ» : juice-shop\/node_modules\/sqlite3\/tools\/docker\/architecture\/linux-arm\/Dockerfile
[+] ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Trivy
...\njuice-shop\/package-lock.json
============================
ΠΠ±Ρo: 20 (UNKNOWN: 0, LOW: 1, MEDIUM: 6, HIGH: 8, CRITICAL: 5)
...
[+] ΠΡΠ°Π²ΠΈΠΌ ΠΈΠ·Ρ
ΠΎΠ΄Π° Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ
ΡΠ±Π°Π²ΠΎ
[+] Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ» ============================================================
[+] ΠΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅ Π½Π° JSON ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ
[+] ΠΠ°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ HTML
[+] Π§ΠΈΡΡΠΎ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ ============================================================
[+] ΠΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ. ΠΠ°ΠΌΠ΅ΡΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ HTML Π΄ΠΎΠΊΠ»Π°Π΄ Π² results.htmlΠ Π΅Π·ΡΠ»ΡΠ°ΡΠΈ
Π Π°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ Docker, ΠΊΠΎΠΉΡΠΎ, ΠΏΠΎ ΠΌΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, ΠΌΠ½ΠΎΠ³ΠΎ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠΊΡΠΈΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° ΡΠ°ΡΡ ΠΎΡ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ°. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΎΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ»Π°ΡΠ΅Π½ΠΈ ΠΈ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, Π΄Π° ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΊΡΠ°ΡΠΈΠ²ΠΈ ΠΎΡΡΠ΅ΡΠΈ ΠΈΠ»ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ ΡΠΈΡΡΠΎ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ, Π΄Π° ΠΎΠ±Ρ Π²Π°ΡΠ°Ρ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈ Ρ.Π½. ΠΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΡΠ΅Π·ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ Π½Π°ΡΠΈΠ½ΠΈ Π·Π° ΡΡΡ Π½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ.
ΠΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½Π°ΡΠ° ΡΡΡΠ°Π½Π° Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² ΡΡΠ°ΡΠΈΡΡΠ°, Π΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅ ΡΠ° ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ Π½Π° Π±Π°Π·Π° Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Ρ ΡΡΡ ΠΈ Ρ Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, Π·Π° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΎΡΠ½ΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π²Π°ΡΠΈΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡ ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π²ΡΠΈΡΠΊΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π±ΡΠ΄Π°Ρ ΠΎΡΠΊΡΠΈΡΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠΎΡΡΠ΅Π½ΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌΠΎΡΡ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ, Π½ΠΎ ΡΠΎΠ²Π° Π΅ ΡΠ΅ΠΌΠ° Π·Π° Π±ΡΠ΄Π΅ΡΠ° Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ°ΡΠΈΡ.
ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ, ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΈ ΡΡΠΈΠ»ΠΈΡΠΈ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ ΠΈ ΡΠ΅ ΡΡΠ°Π½Π°Ρ ΠΎΡΠΏΡΠ°Π²Π½Π° ΡΠΎΡΠΊΠ° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎ-ΡΠΈΠ³ΡΡΠ½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
