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