#docker #dockerfile #fuse
#докер #dockerfile #предохранитель
Вопрос:
Проблема
Для образа docker (на основе alpine), который должен запускаться как некорневой, у меня есть два требования:
- Мне нужно смонтировать файловую систему FUSE внутри контейнера docker
- Пользователи образа 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.