Как безопасно добавить запись в /etc/passwd контейнера docker для набора uid с параметром docker —user

#docker #dockerfile #fuse

#докер #dockerfile #предохранитель

Вопрос:

Проблема

Для образа docker (на основе alpine), который должен запускаться как некорневой, у меня есть два требования:

  1. Мне нужно смонтировать файловую систему FUSE внутри контейнера docker
  2. Пользователи образа docker могут установить UID / GID пользователя docker с помощью docker run --user {uid}:{gid}

fusermount Команда FUSE требует действительной записи для пользователя, в /etc/passwd противном случае она не будет монтировать файловую систему. Учитывая, что я не знаю UID / GID пользователя во время сборки, я не могу позвонить adduser во время сборки. И я также не могу сделать это во время выполнения, так как тогда у пользователя нет соответствующих привилегий.

Найденные решения

До сих пор я нашел два решения, которые оба кажутся неуместными / безопасными

1. Сделайте /etc/passwd доступным для записи

При добавлении chmod 555 /etc/passwd в Dockerfile я могу затем выполнить это во время выполнения

 echo "someuser:x:${my_uid}:$(id -g)::/tmp:/sbin/nologin" >> /etc/passwd
 

Это выполняет работу для fusermount. К сожалению, я не нашел способа вернуть файл passwd обратно в режим только для чтения во время выполнения, и без этого у меня есть опасения по поводу безопасности, что кто-то может злоупотребить этим, чтобы вернуть права root. Хотя я не мог найти простой способ использовать открытый файл passwd для какого-либо эксплойта (хотя я мог добавлять / изменять пароль и конфигурации непосредственно в / etc / passwd для всех пользователей, а затем изменять пользователей через login , alpine не разрешал это для пользователя root (ни через login , ни через su ). Но я думаю, что есть люди более умные, чем я, и каким-то образом все решение похоже на довольно грязный взлом. Есть ли у кого-нибудь конкретные идеи о том, как можно использовать записываемый файл passwd внутри контейнера для получения неправомерных прав внутри контейнера?

2. Замените требование #2 двумя дополнительными переменными среды

Введя DUID и DGID в качестве переменных среды и установив для ПОЛЬЗОВАТЕЛЯ значение какого-либо недавно добавленного пользователя, не являющегося пользователем root, внутри файла Dockerfile, я нашел решение с помощью sudo amp; /etc/sudoers: в сценарии запуска, который я использую в качестве точки входа, я могу вызвать sudo adduser / addgroup для данного DUID / DGID и затем запустите саму программу с пользователем , указанным через sudo -u someuser someprog .

За исключением того факта, что вся настройка стала довольно уродливой, мне не понравился тот факт, что пользователь моего образа docker больше не мог использовать обычную docker run --user опцию, так как это нарушило бы конфигурацию sudo.