ο»Ώ
ο»Ώ
ο»Ώ

🧠 Π—Π°Π΄Π°Ρ‡Π°: БСзопасный CI/CD для Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π² GitLab

УсловиС:
Π£ вас Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½:

build_and_push:
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
    - docker build -t "$CI_REGISTRY_IMAGE:latest" .
    - docker push "$CI_REGISTRY_IMAGE:latest"

Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ содСрТит ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ бСзопасности ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ ошибки.

🚨 ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

1. `docker:dind` ΠΈ `tcp://docker:2375` β€” критичСски уязвимы.
Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ любой процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ root-доступ ΠΊ Docker-Π΄Π΅ΠΌΠΎΠ½Ρƒ, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΈ ΠΊ хосту Ρ€Π°Π½Π½Π΅Ρ€Π°.

2. НСт Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈΠ»ΠΈ сканирования.
Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ уязвимый ΠΎΠ±Ρ€Π°Π·.

3. ИспользованиС Ρ‚Π΅Π³Π° `latest`.
Π’Π΅Π³ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€” Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ Π°ΡƒΠ΄ΠΈΡ‚.

4. ΠŸΠ°Ρ€ΠΎΠ»ΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды.
Π›ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ бСзопасныС Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, OIDC).

5. НСт изоляции сборки.
ΠžΠ±Ρ€Π°Π· ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ --privileged, --network=host, ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ sandboxed.

βœ… ЦСль: ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ DIND β†’ kaniko, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ бСзопасности ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ.

πŸ›‘οΈ ΠžΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½Ρ‹ΠΉ .gitlab-ci.yml

variables:
  IMAGE_TAG: "${CI_COMMIT_SHORT_SHA}"

build_and_push:
  image:
    name: gcr.io/kaniko-project/executor:latest
    entrypoint: [""]
  script:
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor \
        --context $CI_PROJECT_DIR \
        --dockerfile $CI_PROJECT_DIR/Dockerfile \
        --destination $CI_REGISTRY_IMAGE:$IMAGE_TAG \
        --destination $CI_REGISTRY_IMAGE:stable \
        --snapshotMode=redo \
        --single-snapshot

scan_image:
  image: aquasec/trivy:latest
  stage: test
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$IMAGE_TAG



πŸ” Π Π°Π·Π±ΠΎΡ€ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ:

β€’ Kaniko β€” Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ docker.sock
β€’ `IMAGE_TAG` = SHA β€” вСрсии ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹, audit-friendly
β€’ Trivy β€” автоматичСскоС сканированиС уязвимостСй
β€’ Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ `latest` β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ stable ΠΈ SHA
β€’ НСт `docker:dind` β€” бСзопаснСС, ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ быстрСС
β€’ БСзопасная аутСнтификация β€” ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ username/password Π½Π° OIDC Π² GitLab

πŸ“Œ Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ:

1. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ rules: Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сборку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ main ΠΈΠ»ΠΈ тэгам.
2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ readonly ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΈ fsGroup Ссли ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ.
3. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΡŒΡ‚Π΅ доступ ΠΊ runner Ρ‡Π΅Ρ€Π΅Π· protected: true.

πŸ’£ Бонус: ΠΏΠΎΡ‡Π΅ΠΌΡƒ docker:dind = ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ?

Если runner запускаСтся Π² privileged Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚ΠΎ docker:dind Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚ root Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈ Π²Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° β€” Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ хостовых Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΠΎΠ±Π΅Π³ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

πŸ’‘ Π’Π°ΠΊΠΎΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ бСзопаснСС, Π½ΠΎ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π΅Π½, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ прСдсказуСм.




CI/CD
Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ: Π’Ρ‡Π΅Ρ€Π°, 21:02
0
0

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

ο»Ώο»Ώο»Ώο»Ώο»Ώ
ο»Ώ
НавСрΡ