Увімкнення сканування контейнерів з GitLab Ultimate та Google Artifact Registry (GAR)

Вступ

Сканування контейнерів є важливою частиною забезпечення безпеки вашого DevOps конвеєра. Оцінюючи GitLab Ultimate, я зіткнувся з проблемами при налаштуванні сканування контейнерів за допомогою шаблону для сканування контейнерів GitLab. Оскільки всі наші образи зберігаються в Google Artifact Registry (GAR), автентифікація до GAR стала ключовою вимогою для виконання сканування.

У цьому матеріалі я поділюся проблемою, яку я зустрів, як я її вирішив, а також деякими корисними порадами щодо того, як зробити сканування контейнерів з GitLab Ultimate і GAR максимально зручним.

Проблема

Ми використовуємо наступний шаблон GitLab для сканування контейнерів:

- template: Jobs/Container-Scanning.gitlab-ci.yml

Коли був запущений завдання конвеєра, воно виконувалося до кінця, але призводило до наступної помилки:

[FATAL] Фатальна помилка: кількість імен користувачів і паролів повинна збігатися:

Після ознайомлення з документацією GitLab стало зрозуміло, що змінні CS_REGISTRY_USER та CS_REGISTRY_PASSWORD повинні бути встановлені для автентифікації в зовнішньому реєстрі, як-от GAR. Наша дефініція етапу виглядала так:

container_scanning:  
 variables:  
 CS_REGISTRY_USER: _json_key  
 CS_REGISTRY_PASSWORD: $GAR_SCANNER  
 SECURE_LOG_LEVEL: debug  
 stage: scan_images  
 parallel:  
 matrix:  
 - CS_IMAGE: ["us-central1-docker.pkg.dev/test/image1:v1",  
 "us-central1-docker.pkg.dev/test/image2:v1",  
 "us-central1-docker.pkg.dev/test/image3:v1"]  
 allow_failure: true

Змінна $GAR_SCANNER містила JSON-ключ для облікового запису служби Google в GitLab CI. Обліковий запис мав всі необхідні ролі (pull, push) для виконання операцій на GAR. Однак завдання все одно завершувалося з помилкою Fatal error.

Причина проблеми

Після дослідження я з'ясував, що ця помилка часто виникає, коли певні символи в облікових даних призводять до неправильного тлумачення введених даних сканером (у цьому випадку Trivy). Зокрема, CS_REGISTRY_PASSWORD (наш JSON-ключ облікового запису служби) містив кілька символів ,, що ймовірно змусило Trivy сприйняти це як кілька імен користувачів, але лише один пароль, або навпаки.

Виправлення

Щоб вирішити проблему, я закодував JSON-ключ у base64 і оновив CS_REGISTRY_USER до _json_key_base64. Це кодування забезпечило те, що жодні проблемні символи в JSON-ключі не завадять обробці Trivy.

Ось як я закодував JSON-ключ:

base64 -i sa-key.json -o encoded-key.txt

Закодований у base64 JSON-ключ потім був переданий у змінну $GAR_SCANNER, оновивши її значення в GitLab CI.

Далі я оновив дефініцію етапу наступним чином:

container_scanning:  
 variables:  
 CS_REGISTRY_USER: _json_key_base64  
 CS_REGISTRY_PASSWORD: $GAR_SCANNER  
 SECURE_LOG_LEVEL: debug  
 stage: scan_images  
 parallel:  
 matrix:  
 - CS_IMAGE: ["us-central1-docker.pkg.dev/test/image1:v1",  
 "us-central1-docker.pkg.dev/test/image2:v1",  
 "us-central1-docker.pkg.dev/test/image3:v1"]  
 allow_failure: true

Як це працює

Для Google Artifact Registry ім'я користувача зазвичай є _json_key, а пароль — це декодований JSON-ключ облікового запису служби. Однак у цьому випадку я закодував JSON-ключ у base64 і оновив ім'я користувача на _json_key_base64. Ось чому:

  • _json_key — це спеціальне заповнювальне значення, яке використовують сервіси Google Cloud для позначення автентифікації облікового запису служби.
  • Змінна $GAR_SCANNER в GitLab містить base64-кодований ключ облікового запису служби. Коли його передають як пароль, кодування дозволяє уникнути проблем, викликаних спеціальними символами в JSON-ключі.

Такий підхід гарантує безперебійну автентифікацію без того, щоб сканер неправильно інтерпретував облікові дані.

Висновок

Закодувавши JSON-ключ облікового запису служби в base64 і встановивши CS_REGISTRY_USER на _json_key_base64, я зміг вирішити проблему і успішно налаштувати сканування контейнерів у GitLab Ultimate з Google Artifact Registry.
Якщо ви стикаєтеся з подібними проблемами, це рішення повинно допомогти вам без зусиль інтегрувати сканування контейнерів у ваші CI/CD конвеєри.

Чи стикалися ви з подібними проблемами? Поділіться своїм досвідом або поставте питання в коментарях нижче!

Перекладено з: Enabling Container Scanning with GitLab Ultimate and Google Artifact Registry (GAR)

Leave a Reply

Your email address will not be published. Required fields are marked *