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-security
2. Интеграция с мониторинг системи
Интегрирайте резултатите от сканирането с вашите мониторинг системи. Например 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. И ще създадете по-стабилна и надеждна инфраструктура.