Вступ
Сканування контейнерів є важливою частиною забезпечення безпеки вашого 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)