Изграждане на аргументи: Удобство, което може да компрометира сигурността
Аргументите за изграждане на Docker улесняват предаването на конфигурационни стойности по време на изграждане, но те идват с често пренебрегвана цена: тези аргументи се запазват в метаданните и слоевете на изображението. Разработчиците често приемат, че тези стойности изчезват след изграждането, но в действителност инструкциите за изграждане на Docker аргументи ги вграждат в историята на изображенията на Docker.
⚠️Несигурен пример, само за образователни цели. Не използвайте в продукция.
FROM node:18 ARG API_KEY=my-secret-key RUN echo "API_KEY=$API_KEY" > /app/config.txt Всеки, който тича история на докера or докер инспектира ще намери API_KEY стойност, вградена в метаданните на изображението. Това се случва, защото инструкцията Docker build build arg commitвсяка стъпка от изграждането като постоянен слой.
Защитена версия:
# Use Docker BuildKit secrets instead of ARG # docker build --secret id=api_key,src=./api.key . FROM node:18 RUN --mount=type=secret,id=api_key cat /run/secrets/api_key > /app/config.txt Образователна бележка: Избягвайте инжектирането на секрети чрез аргументи за изграждане на Docker. Използвайте –тайна монтирания, предоставени от BuildKit за чувствителни данни; те никога не се запазват в слоеве или метаданни.
Как тайните се съхраняват в слоеве и метаданни
Всяка инструкция в Dockerfile създава нов слой с изображение. Дори когато презаписвате или изтривате файлове, по-ранните слоеве остават в кеша. Ето защо тайните, инжектирани с Docker build args или build args Docker, се запазват за неопределено време.
⚠️Несигурен пример, само за образователни цели. Не използвайте в продукция.
FROM python:3.10 ARG GITHUB_TOKEN=ghp_ABC123TOKEN RUN pip install private-package --extra-index-url https://user:$GITHUB_TOKEN@pypi.example.com Използването на ARG По този начин токенът се вгражда в слоя с изображението, видим през проверка на изображението на Docker или извлечени от кеша. Защитена версия:
# Secure alternative using BuildKit secrets # docker build --secret id=gh_token,src=.secrets/token.txt . FROM python:3.10 RUN --mount=type=secret,id=gh_token pip install private-package --extra-index-url https://pypi.example.com Образователна бележка: При употребата му, чувствителните стойности остават в историята. Използвайте ефимерни секретни монтирания вместо това, за да защитите токени и идентификационни данни.
Често срещани неправилни конфигурации в CI/CD Pipelines
In модерен pipelines, разработчиците често предават тайни чрез CI/CD среди, използващи аргументи на Docker или споделени кешове. Този навик изтича тайни в лог файлове, runners и кешове на системния регистър. С общи бегачи вътре Действия на GitHub, GitLab CI или Дженкинс, тези тайни могат лесно да се разпространят към несвързани работни места.
⚠️Несигурен пример, само за образователни цели. Не използвайте в продукция.
# Never expose real tokens, credentials, or internal URLs in pipelines - name: Build image run: docker build -t app --build-arg TOKEN=${{ secrets.API_TOKEN }} . Тайната се озовава в лог файловете за изграждане и метаданните на изображенията, нарушавайки принципите за най-малки привилегии. Защитена версия:
# Secure build command using BuildKit secret mount - name: Secure Docker build run: docker buildx build --secret id=api_token,src=.secrets/api_token.txt . Образователна бележка: Избягвайте –build-arg за тайни. В CI/CD, тайните никога не трябва да преминават през променливи на средата или лог файлове. Винаги предпочитайте ефимерни тайни монтирания.
Най-добри практики за предотвратяване на тайно разкриване
Предотвратяването на разкриването на тайни данни започва с признаването, че аргументите за изграждане на Docker са публични по дизайн. Те са чудесни за конфигуриране (като тагове за версии или флагове на функции), но не и за идентификационни данни.
Най-добри практики
- Използвайте BuildKit — тайна за чувствителни данни.
- Никога не дефинирайте тайни чрез ARG или ENV.
- Добави .env, тайни/, и конфигурация/ директории към .dockerignore.
- Прилагане на многоетапни компилации да изолира частни етапи.
- Изчистване на кешовете след чувствителни етапи на изграждане.
- Валидиране на метаданните на изображението с историята на Docker преди публикуване.
Мини превантивен контролен списък
- Одитирайте всички Docker файлове за изграждане на аргументи в Docker използване.
- Заменете идентификационните данни с BuildKit –тайна.
- Уверете се, .dockerignore изключва чувствителни файлове.
- дезинфенкцирам CI/CD променливи на средата.
- Автоматизирайте тайното сканиране преди изпращане на изображения.
Образователна бележка: Ако дадена стойност премине през аргумент за изграждане на Docker, тя става постоянна. Използвайте секретни монтирания и изолирани етапи на изграждане, за да защитите чувствителните данни.
Откриване на опасно използване на аргументи за изграждане преди внедряване
Автоматизираното сканиране е от съществено значение за идентифициране на рискови модели на аргументи за изграждане на Docker, преди изображението да бъде пуснато в производство. Инструменти като Дребнав, Хадолинт, и Ксигени може да открива идентификационни данни, вградени в Docker файлове или слоеве с изображения.
Функционален фрагмент, с контекст и контролен парапет
# CI/CD guardrail: pre-deployment Dockerfile security scan - name: Dockerfile security scan run: trivy config --severity HIGH, CRITICAL --ignore-unfixed. Тази стъпка действа като превантивен контрол, блокирайки несигурните Docker инструкции за аргументи за изграждане преди внедряването им.
Образователна бележка: Интегрирайте сканирането на Dockerfile като задължително CI/CD етап. Автоматизираните инструменти помагат за прилагането на последователна и сигурна хигиена на изграждането.
Как Xygeni предпазва от секретни течове по време на изграждане
Ксигени Тайни за сигурност осигурява специализирано откриване на злоупотреба с аргументи на Docker. Той идентифицира опасни ARG дефиниции, проследява секретни стойности в етапите на изграждане и маркира остатъчни идентификационни данни в метаданните на изображението или кешираните слоеве. Чрез интегриране с вашия CI/CD pipeline, той прилага политиките за сигурност на Docker build build arg преди сливания или пускания.
Функционален фрагмент, пример за контекстуално прилагане
# Secure enforcement of Docker build arg usage - name: Xygeni Docker ARG enforcement run: dotnet xygeni enforce --rules dockerfile,secrets,build --fail-on-risk Добавете тази работа към вашата pipelineетапът на валидиране за непрекъсната защита.
Образователна бележка: Xygeni автоматично налага безопасни практики на Docker, предотвратявайки изтичането на секрети в различни среди от рискови конфигурации по време на изграждане.
В крайна сметка: Докерът за изграждане на аргументи никога не трябва да обработва секрети
Аргументите за изграждане на Docker са нож с две остриета - удобни за конфигуриране, но рискови за секрети. Всяка инжектирана от вас стойност в Docker за изграждане може да се запази в метаданни, история на изображенията или кешове.
Защитете вашите конструкции чрез:
- Използване на BuildKit –тайна за пълномощия.
- Изолиране на чувствителни данни в многоетапни компилации.
- Сканиране за изтекли стойности преди внедряване.
- Прилагане на политики за сигурност чрез Xygeni Code Security.
Вашата компилация pipeline е толкова сигурно, колкото са тайните, които не разкривате. Отнасяйте се към всеки Docker build arg като към потенциален вектор за разкриване и го заключете, преди атакуващите да го открият.






