Зачем создавать Docker-контейнер с пользовательским пользователем, повторно публикует производные изображения? - PullRequest
0 голосов
/ 09 июля 2019

Я читаю статью о безопасности докера о запуске процессов докера от имени пользователя без полномочий root. В нем говорится:

FROM openjdk:8-jdk
RUN useradd --create-home -s /bin/bash user
WORKDIR /home/user
USER user

Это просто, но заставляет нас переиздавать все эти полученные изображения, создание кошмара обслуживания.

1) что означает повторная публикация производных изображений?
2) Как это обслуживание кошмар?
3) Разве это не распространенная практика, так как в большинстве примеров для интернет-пользователей подобный метод запуска docker выполняется без полномочий root

1 Ответ

1 голос
/ 09 июля 2019

Скажем, у меня есть приложение

FROM openjdk:8-jre
COPY myapp.jar /
CMD ["java", "-jar", "/myapp.jar"]

Теперь я хочу использовать вашу технику, чтобы иметь обычного пользователя без полномочий root.Поэтому мне нужно изменить этот Dockerfile на

FROM my/openjdk:8-jre # <-- change the base image name
USER root             # <-- change back to root for file installation
COPY myapp.jar ./
USER user             # <-- use non-root user at runtime
CMD ["java", "-jar", "./myapp.jar"]

Далее, предположим, что есть проблема безопасности Java, и мне нужно обновить все до более новой JRE.Если я использую стандартный образ OpenJDK, мне просто нужно убедиться, что я docker pull отредактировал более новый образ, а затем пересобрать образ своего приложения.Но если я использую ваше пользовательское промежуточное изображение, мне нужно сначала перестроить этот образ, а затем пересобрать приложение.Вот тут-то и возникает бремя обслуживания.

В моих изображениях Docker я склонен просто RUN adduser и указать USER в самом изображении.(Им не нужен домашний каталог или какая-либо конкретная оболочка, и у них определенно не должно быть зависимого от хоста идентификатора пользователя.) Если вы широко рассматриваете Dockerfile как имеющий три «части» - настройку зависимостей на уровне ОС, установкуприложение и определение параметров времени выполнения - я обычно помещаю это в первую часть.

FROM openjdk:8-jre  # <-- standard Docker Hub image
RUN adduser user    # <-- add the user as a setup step
WORKDIR /app
COPY myapp.jar .    # <-- install files at root
USER user           # <-- set the default runtime user
CMD ["java", "-jar", "/app/myapp.jar"]

(Скажем, ваше приложение имеет проблему безопасности. Если вы установили файлы как root и запускаете приложение как не-root, тогда злоумышленник не сможет перезаписать установленное приложение внутри контейнера.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...