Код-ревью Middle Безопасность цепочки поставки обновлено

Код-ревью: Dockerfile с точки зрения поставки

Вопрос

Найдите проблемы безопасности цепочки поставки и сборки в Dockerfile.

FROM node:latest
ARG NPM_TOKEN
RUN echo "//npm.example.ru/:_authToken=${NPM_TOKEN}" > ~/.npmrc
WORKDIR /app
COPY . .
RUN curl -s https://get.example.com/tool.sh | bash
RUN npm install
RUN npm run build
USER root
CMD ["node", "dist/server.js"]

Коротко

Хороший Dockerfile для поставки: базовый образ по digest, секреты сборки только через --mount=type=secret, .dockerignore, воспроизводимая установка, multi-stage с минимальным финальным образом и запуск не от root. Дальше CI генерирует SBOM, сканирует и подписывает образ.

Что должен найти ревьюер

  1. Безопасностьстрока 1
    node:latest: плавающий тег, непредсказуемая версия и полный образ с лишними пакетами. Фиксировать версию и digest, брать slim или distroless.
  2. Безопасностьстрока 3
    Токен реестра записан в .npmrc в слое образа: его достанет любой, у кого есть образ. Использовать RUN --mount=type=secret или multi-stage без копирования .npmrc.
  3. Безопасностьстрока 5
    COPY . . без .dockerignore: в образ попадут .git, .env и локальные секреты.
  4. Безопасностьстрока 6
    Скрипт из интернета выполняется без проверки хеша или подписи.
  5. Ошибкастрока 7
    npm install вместо npm ci: lock-файл может не соблюдаться, сборка не воспроизводима.
  6. Безопасностьстрока 9
    Контейнер работает от root. Использовать непривилегированного пользователя (у образов node есть node).
  7. Производительностьстрока 8
    Нет multi-stage: в итоговом образе исходники, devDependencies и инструменты сборки, больше размер и поверхность атаки.

Разбор

Хороший Dockerfile для поставки: базовый образ по digest, секреты сборки только через --mount=type=secret, .dockerignore, воспроизводимая установка, multi-stage с минимальным финальным образом и запуск не от root. Дальше CI генерирует SBOM, сканирует и подписывает образ.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.