Для быстрой и простой проверки Docker образов на уязвимости существует популярный Open Source инструмент — Trivy. Я покажу на примере, как им пользоваться. Получится готовая мини инструкция по установке и использованию.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Установить Trivy можно разными способами: из репозитория с пакетами, собрать с помощью Nix, воспользоваться bash скриптом, запустить в Docker. Все способы описаны в документации. Я установлю в Debian из репозитория.
Установка Trivy
Устанавливаем некоторые пакеты и подключаем репозиторий:
# apt install wget apt-transport-https gnupg lsb-release # wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | tee /usr/share/keyrings/trivy.gpg > /dev/null # echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | tee -a /etc/apt/sources.list.d/trivy.list # apt update # apt install trivy
Проверка на уязвимости Docker образа
Теперь скачиваем любой образ и проверяем его на уязвимости. Покажу на примере заведомо уязвимого образа.
# docker pull mcr.microsoft.com/oss/nginx/nginx:1.21.6 # trivy image --vuln-type os --ignore-unfixed -f json -o nginx.1.21.6.json mcr.microsoft.com/oss/nginx/nginx:1.21.6
Результат проверки будет в файле nginx.1.21.6.json, что удобно для последующего автоматического анализа. Можно наглядно посмотреть результат в консоли:
# trivy image --vuln-type os --ignore-unfixed mcr.microsoft.com/oss/nginx/nginx:1.21.6
Trivy отлично подходит для автоматической проверки образов перед их отправкой в registry. Да и просто для быстрого анализа созданного или скачанного образа. Помимо проверки образов, он умеет сканировать git репозитории, файлы с зависимостями (Gemfile.lock, Pipfile.lock, composer.lock, package-lock.json, yarn.lock, Cargo.lock).
Исправление уязвимостей в Docker образе
Теперь расскажу, как их автоматически исправить. Для этого нам понадобится Copacetic. Он будет брать информацию из отчётов Trivy. Для запуска copa cli нам нужно:
- Установить Go v1.19 или новее.
- Собрать и установить runc.
- Установить buildkit v0.10.5 или новее.
- Собрать и установить copa.
Я кратко без пояснений покажу как это сделать на примере Debian. Все подробности есть в самих репозиториях программ.
✅ Устанавливаем GO.
# wget https://go.dev/dl/go1.19.5.linux-amd64.tar.gz # tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz # ln -s /usr/local/go/bin/go /usr/bin/go # go version
✅ Устанавливаем runc.
# apt install make git gcc build-essential pkgconf libtool libsystemd-dev libprotobuf-c-dev libcap-dev libseccomp-dev libyajl-dev libgcrypt20-dev go-md2man autoconf python3 automake # git clone https://github.com/opencontainers/runc # cd runc # make # make install
✅ Устанавливаем buildkit.
# wget https://github.com/moby/buildkit/releases/download/v0.11.0/buildkit-v0.11.0.linux-amd64.tar.gz # tar -C /usr -xzf buildkit-v0.11.0.linux-amd64.tar.gz
✅ Устанавливаем copacetic.
# git clone https://github.com/project-copacetic/copacetic # cd copacetic # make # mv dist/linux_amd64/release/copa /usr/local/bin/
Все необходимые компоненты установили. Теперь патчим уязвимый контейнер. Для этого предварительно в фоне запускаем buildkitd:
# buildkitd & # copa patch -i mcr.microsoft.com/oss/nginx/nginx:1.21.6 -r nginx.1.21.6.json -t 1.21.6-patched
Copa не перезаписывает старый образ, а создаёт новый с тэгом patched. Можете сразу его посмотреть и проверить:
# docker images # docker history mcr.microsoft.com/oss/nginx/nginx:1.21.6-patched
Ну и убедиться, что он нормально запускается:
# docker run -it --rm --name nginx-test mcr.microsoft.com/oss/nginx/nginx:1.21.6-patched
Copa, используя информацию о версиях пакетов из отчёта Trivy, обновила все уязвимые системные пакеты в образе. Можете проверить уже пропатченный образ:
# trivy image --vuln-type os --ignore-unfixed mcr.microsoft.com/oss/nginx/nginx:1.21.6-patched
Я показал набор софта и пример обновления контейнера. Получилась готовая инструкция, которую я лично проверил. Используя эту информацию и информацию из репозиториев, можно настроить подобные обновления для своей среды.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Владимир, есть еще вариант сделать stage или multistage build c alpine.
Уязвимостей не будет вообще.
Вариант с ubuntu
root@dev5:/# trivy image --vuln-type os --ignore-unfixed docker.repo.ru/myapp:2.0.5
2023-08-21T22:36:44.168+0300 INFO Vulnerability scanning is enabled
2023-08-21T22:36:44.169+0300 INFO Secret scanning is enabled
2023-08-21T22:36:44.169+0300 INFO If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-08-21T22:36:44.169+0300 INFO Please see also https://aquasecurity.github.io/trivy/v0.44/docs/scanner/secret/#recommendation for faster secret detection
2023-08-21T22:36:44.193+0300 INFO Detected OS: ubuntu
2023-08-21T22:36:44.199+0300 INFO Detecting Ubuntu vulnerabilities...
docker.repo.ru/myapp:2.0.5 (ubuntu 22.04)
===========================================================================
Total: 77 (UNKNOWN: 0, LOW: 34, MEDIUM: 43, HIGH: 0, CRITICAL: 0)
Вариант с alpine
root@dev5:/# trivy image --vuln-type os --ignore-unfixed docker.repo.ru/myapp:multiarch-0821
2023-08-21T22:38:09.787+0300 INFO Vulnerability scanning is enabled
2023-08-21T22:38:09.787+0300 INFO Secret scanning is enabled
2023-08-21T22:38:09.787+0300 INFO If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-08-21T22:38:09.787+0300 INFO Please see also https://aquasecurity.github.io/trivy/v0.44/docs/scanner/secret/#recommendation for faster secret detection
2023-08-21T22:38:09.792+0300 INFO Detected OS: alpine
2023-08-21T22:38:09.792+0300 INFO Detecting Alpine vulnerabilities...
docker.repo.ru/myapp:multiarch-0821 (alpine 3.18.3)
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
Что называется, почувствуйте разницу!