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

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

Audit на Docker образи и vulnerability scanning | UrociBG

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:

  1. Отидете на вашия repository
  2. Изберете таб "Vulnerability Scanning"
  3. Активирате сканирането

За AWS ECR, сканирането за уязвимости е вградена функционалност. Може да я активирате при създаване на repository.

Обработка на резултатите от сканирането

Сканирането само по себе си не е достатъчно. Важно е как обработваме резултатите.

Приоритизиране на проблемите

Не всички уязвимости са еднакво опасни. Фокусирайте се върху:

  • Критични и високо рискови уязвимости
  • Уязвимости с публичен exploit
  • Пакети, които са директно достъпни от интернет

Процес на оправяне

Създайте ясен процес за оправяне на намерените проблеми:

  1. Идентифициране на уязвимостта
  2. Оценка на риска и въздействието
  3. Актуализиране на базовия образ или пакетите
  4. Ребилдване на образа
  5. Ретестиране след оправяне

Най-добри практики за безопасни 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. И ще създадете по-стабилна и надеждна инфраструктура.

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: