Audit на текущите Docker образи и внедряване на vulnerability scanning

Docker контейнерите революционизираха разработката на софтуер. Но сигурността им често остава на заден план. В тази статия ще разгледаме как да направим аудит на съществуващите Docker образи. Ще внедрим и система за сканиране на уязвимости.
Защо Docker security e критично важен?
Docker образът е основата на контейнерите. Всеки образ съдържа приложението и всичките му зависимости. Също така съдържа и потенциални уязвимости.
Според проучване на Anchore, над 50% от Docker образите в Docker Hub съдържат критични уязвимости. Това е сериозен риск за сигурността.
Редовният аудит на образите не е опция. Това е задължителна практика за всеки DevOps екип. Особено когато работим в production среда.
Стъпки за аудит на текущи Docker образи
Преди да внедрим сканиране, трябва да направим аудит. Трябва да разберем какви образи имаме в системата.
1. Инвентаризация на текущите образи
Първо, изведете всички Docker образи в системата:
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"Тази команда ще покаже всички инсталирани образи. Ще видите техния repository, tag и размер.
2. Проверка на историята на образите
За всеки образ проверете историята на слоевете му:
docker history my-image:tag
Историята показва как е бил създаден образът. Това помага да идентифицирате потенциални проблеми.
3. Анализ на Dockerfile-овете
Прегледайте Dockerfile-овете на вашите образи. Търсете следните проблеми:
- Използване на остарели базови образи
- Инсталиране на ненужни пакети
- Липса на обновяване на пакетите преди build
- Използване на root потребител
- Експозиране на ненужни портове
Внедряване на vulnerability scanning
След като направихме инвентаризация, time for действие. Ще внедрим автоматично сканиране.
Избор на инструмент за сканиране
Има няколко популярни инструмента:
- Trivy (рекомендирам)
- Clair
- Anchore Engine
- Docker Scout (нова функция)
Trivy е моят личен избор. Лесен е за употреба и има отлични резултати.
Инсталиране на Trivy
За Ubuntu/Debian системи:
sudo apt-get install wget apt-transport-https gnupg lsb-release wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list sudo apt-get update sudo apt-get install trivy
За други дистрибуции, проверете официалната документация.
Сканиране на Docker образ с Trivy
Основна команда за сканиране:
trivy image my-image:tag
За по-подробен отчет:
trivy image --severity CRITICAL,HIGH my-image:tag
Така ще видите само критичните и високите рискове.
Интеграция в CI/CD pipeline
Истинската сила на Trivy идва при интеграция в CI/CD. Ето пример за GitLab CI:
stages:
- test
container_scanning:
stage: test
image:
name: aquasec/trivy:0.45.1
entrypoint: [""]
variables:
TRIVY_USERNAME: "$CI_REGISTRY_USER"
TRIVY_PASSWORD: "$CI_REGISTRY_PASSWORD"
script:
- trivy image --exit-code 1 --severity CRITICAL,HIGH $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
only:
- master
- developТози job ще сканира образа и ще върне грешка ако има критични уязвимости.
Автоматично сканиране в регистри
Ако използвате Docker Hub или частен registry, може да настроите автоматично сканиране.
В Docker Hub:
- Отидете на вашия repository
- Изберете таб "Vulnerability Scanning"
- Активирате сканирането
За AWS ECR, сканирането за уязвимости е вградена функционалност. Може да я активирате при създаване на repository.
Обработка на резултатите от сканирането
Сканирането само по себе си не е достатъчно. Важно е как обработваме резултатите.
Приоритизиране на проблемите
Не всички уязвимости са еднакво опасни. Фокусирайте се върху:
- Критични и високо рискови уязвимости
- Уязвимости с публичен exploit
- Пакети, които са директно достъпни от интернет
Процес на оправяне
Създайте ясен процес за оправяне на намерените проблеми:
- Идентифициране на уязвимостта
- Оценка на риска и въздействието
- Актуализиране на базовия образ или пакетите
- Ребилдване на образа
- Ретестиране след оправяне
Най-добри практики за безопасни Docker образи
Сканирането е важен следствен инструмент. Но по-добре е да предотвратяваме проблемите.
1. Използвайте минимални базови образи
Избягвайте ubuntu:latest или centos:latest. Вместо това използвайте алпински или distroless образи.
FROM alpine:3.18
Тези образи са по-малки и имат по-малка повърхност за атака.
2. Регулярно обновявайте базовите образи
Не разчитайте на кеширани стари версии. Уверете се, че обновявате базовите образи редовно.
3. Мулти-етапни builds
Използвайте multi-stage builds за да намалите крайния размер на образа.
# Build етап FROM golang:1.21 as builder WORKDIR /app COPY . . RUN go build -o myapp # Final етап FROM alpine:3.18 COPY --from=builder /app/myapp /usr/local/bin/myapp CMD ["myapp"]
4. Не изпълнявайте приложения като root
Създайте и използвайте не-привилегирован потребител:
RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser
5. Поддържайте Dockerfile-овете чисти
Комбинирайте команди за по-малко слоеве и по-малък образ:
# Лошо
RUN apt-get update
RUN apt-get install -y package1
RUN apt-get install -y package2
# Добре
RUN apt-get update && \
apt-get install -y package1 package2 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*Инструменти за мониторинг и наблюдение
Сканирането не трябва да е еднократно действие. Необходимо е постоянно наблюдение.
1. Docker Bench for Security
Инструмент, който проверява вашата Docker инсталация спрямо best practices:
docker run -it --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib/systemd:/usr/lib/systemd \
-v /etc:/etc --label docker_bench_security \
docker/docker-bench-security2. Интеграция с мониторинг системи
Интегрирайте резултатите от сканирането с вашите мониторинг системи. Например Prometheus + Grafana:
trivy image --format template --template "@contrib/github.tpl" -o report.html my-image:tag
Може да използвате Trivy с други формати (JSON, SARIF) за интеграция.
Заключение
Сигурността на Docker образите не е еднократна задача. Това е постоянен процес. Започнете с аудит на текущите ви образи. Внедрете vulnerability scanning в CI/CD пайплайнa ви. Следвайте best practices при изграждане на нови образи.
С тези стъпки значително ще подобрите сигурността на вашите приложения. Ще намалите риска от security incidents. И ще създадете по-стабилна и надеждна инфраструктура.

