Безопасное создание многоэтапных образов Docker: лучшие практики и примеры кода

Чтобы безопасно создать многоэтапный образ Docker, вы можете следовать нескольким рекомендациям. Вот несколько методов и примеры кода:

  1. Используйте официальные базовые образы. Начните свой Dockerfile с официального и надежного базового образа из Docker Hub или других авторитетных источников. Официальные изображения регулярно обновляются и исправляются на предмет уязвимостей безопасности.
# Use an official base image
FROM node:14 AS builder
  1. Минимизация слоев изображения. Уменьшите поверхность атаки, минимизировав количество слоев в образе Docker. Каждый уровень представляет потенциальную угрозу безопасности, поэтому объединение команд в один уровень повышает безопасность.
# Combine commands into a single layer
RUN apt-get update && apt-get install -y curl
  1. Отдельные среды сборки и выполнения. Используйте многоэтапные сборки, чтобы отделить среду сборки от окончательной среды выполнения. Это гарантирует, что в окончательный образ будут включены только необходимые зависимости, уменьшая общую поверхность атаки.
# Build stage
FROM node:14 AS builder
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build
# Runtime stage
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
  1. Удалить неиспользуемые зависимости: очистите ненужные зависимости и файлы после этапа сборки, чтобы минимизировать размер конечного образа и потенциальные риски безопасности.
# Build stage
FROM node:14 AS builder
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build
# Runtime stage
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

# Remove unused dependencies
RUN rm -rf /usr/share/nginx/html/node_modules
  1. Реализуйте привилегии пользователя: запустите контейнер от имени пользователя без полномочий root, чтобы уменьшить потенциальное влияние нарушений безопасности. Это ограничивает разрешения, доступные злоумышленнику, если ему удастся использовать контейнер.
# Runtime stage
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
# Run the container as a non-root user
RUN chown -R nginx:nginx /usr/share/nginx/html
USER nginx