Рейтинг:0

gcsfuse не удалось открыть /dev/fuse: разрешение отклонено

флаг de

Я запускаю следующую команду внутри контейнера как обычный пользователь без полномочий root

gcsfuse --foreground --debug_fuse --debug_fs --debug_gcs --debug_http my-bucket/data

и это работает локально когда я запускаю контейнер с -- привилегированный и это нормально.

Но то же самое не работает в Cloud Run (при использовании среды выполнения предварительного просмотра 2-го поколения). Я получаю следующую ошибку:

2022-05-13 12:08:41.547 CEST gcs: 2022/05/13 10:08:41.546642 Req 0x1: -> ListObjects("") (46,897367 мс): ОК
2022-05-13 12:08:41.551 CEST /usr/bin/fusermount: не удалось открыть /dev/fuse: разрешение отклонено
2022-05-13 12:08:41.551 CEST mountWithArgs: mountWithConn: Mount: mount: работает /usr/bin/fusermount: статус выхода 1

Все остальные строки журнала отладки, HTTP, GCS и т. д. показывают, что все работает.

Я создаю своего пользователя таким образом в моем Докерфайл

ВЫПОЛНИТЬ useradd -lmU joe\
  && mkdir -p /данные \
  && chown -R джо:джо /данные
ПОЛЬЗОВАТЕЛЬ Джо

документы говорят что я следует запускать gcsfuse от имени пользователя, который будет использовать файловую систему, а не от имени пользователя root, но это не работает. Любая идея, что я делаю неправильно?

Priyashree Bhadra avatar
флаг in
Взгляните на этот [ответ] (https://stackoverflow.com/a/70430026/15803365).Автор вопроса (https://stackoverflow.com/questions/70407189/unable-to-mount-bucket-with-gcsfuse-on-cloud-run) столкнулся с аналогичным сообщением об ошибке и не смог смонтировать ведро с gcsfuse в Cloud Run.
флаг de
@PriyashreeBhadra Спасибо! Я видел этот вопрос/ответ, но я думаю, что использование «777» не соответствует цели. С `root` у меня все работает, но в документации указано, что `root` использовать не следует, так что... ИМХО это неоптимально. (Цель состоит в том, чтобы следовать подходу *безопасность превыше всего* при работе с контейнерами.) Может быть, это вообще невозможно, но тогда это ответ! :)
Priyashree Bhadra avatar
флаг in
По умолчанию все иноды в файловой системе gcsfuse отображаются как принадлежащие UID и GID самого процесса gcsfuse, то есть пользователю, смонтировавшему файловую систему. 644 и 755 — это разрешения по умолчанию для всех инодов файлов и каталогов в файловой системе gcsfuse. Изменение режима индексного дескриптора (используя chmod(2) или подобное) не поддерживается, и изменения молча игнорируются.
Priyashree Bhadra avatar
флаг in
Когда вы монтируете сегмент хранилища с помощью gcsfuse, уровень ядра fuse ограничивает доступ к файловой системе для пользователя, смонтировавшего файловую систему. Если вы хотите предоставить доступ другим пользователям, вы можете переопределить это поведение с помощью параметра монтирования allow_other вместе с флагами --uid и --gid. Однако имейте в виду, что это может иметь последствия для безопасности. См. [здесь](https://github.com/googlecloudplatform/gcsfuse/blob/master/docs/semantics.md#inodes) документацию.
флаг de
`файловая система gcsfuse отображается как принадлежащая UID и GID самого процесса gcsfuse` Это именно то, что я хочу. Запустите `gcsfuse` как `joe`, что в настоящее время не работает. `Если вы хотите предоставить доступ другим пользователям, вы можете переопределить это поведение с помощью монтирования allow_other ` Но я не хочу этого делать именно по той причине, по которой вы упомянули, что это имеет последствия для безопасности. Я начинаю понимать, что эта проблема скорее связана с проблемой среды Cloud Run, чем с gcsfuse, однако, поскольку пользователи Cloud Run потенциально могут использовать это больше всего, я оставлю этот вопрос открытым.
Priyashree Bhadra avatar
флаг in
Я думаю, что я видел много людей, использующих сервисы, отличные от Cloud Run, с gcsfuse (например, как экземпляр виртуальной машины). Насколько я понимаю, этот вопрос кажется мне вопросом разрешения gcsfuse, а не Cloud Run, но да, он действителен, если человек не хочет выполнять chmod с разрешениями 777/666 или использовать allow_other. Я наткнулся на этот GitHub [комментарий к проблеме] (https://github.com/GoogleCloudPlatform/gcsfuse/issues/236#issuecomment-361956965), который кажется справедливым. Можете ли вы попробовать добавить себя в группу предохранителей и изменить группу для предохранителей в устройстве /dev/fuse. Дайте мне знать, возможно ли это для вас
флаг de
`/dev/fuse` доступен только тогда, когда контейнер действительно запускается, поэтому мой пользователь joe без `root` не может сменить владельца, а поскольку устройство принадлежит `root:root`, я ничего не могу с этим поделать. Я пытался создать группу `fuse` и добавить в нее своего пользователя, но... похоже, это не сработало. Я попробую, когда у меня будет время, ... но! Все работает локально с флагом `--priviliged`, переданным `docker run`, даже если устройство принадлежит `root:root`. В комментарии к проблеме на GitHub сказано, что они меняют *группу для объединения в устройстве `/dev/fuse`*. Тогда они должны выполняться под `root`.
флаг de
*Тогда они должны выполняться под root.* Что тогда является решением *вроде*, хотя и немного хакерским. Спасибо за упоминание этой проблемы GitHub, я подписался!
Рейтинг:1
флаг in

Для сообщества, ищущего ответ на этот вопрос:

Согласно этому отвечать, добавление -file-mode=777 -dir-mode=777 вместе с командой gcsfuse в gcsfuse.sh для включения чтения/записи внутри смонтированного каталога корзины GCS должно быть одним из вариантов, но поскольку Коханьи Роберт подтвердил, что это не служит цели по соображениям безопасности. Я копаю дальше, и я нашел эту действительно полезную информацию:

  • По умолчанию все индексные дескрипторы в файловой системе gcsfuse отображаются как принадлежит UID и GID самого процесса gcsfuse, т.е. пользователю кто монтировал файловую систему. 644 и 755 — разрешения по умолчанию. для всех инодов файлов и каталогов в файловой системе gcsfuse. Изменение режим inode (с использованием chmod(2) или аналогичного) не поддерживается и изменяется молча игнорируются.

  • Когда вы монтируете корзину хранилища с помощью gcsfuse, ядро ​​fuse слой ограничивает доступ к файловой системе пользователю, смонтировавшему файл система. Если вы хотите предоставить доступ другим пользователям, вы можете переопределите это поведение с помощью параметра монтирования allow_other вместе с флаги --uid и --gid. Однако имейте в виду, что это может иметь последствия для безопасности. Видеть здесь для документации

  • Если человек не хочет делать chmod с правами 777/666 или использовать allow_other он может попробовать добавить себя в группу предохранителей и изменить group для слияния в устройстве /dev/fuse. Я наткнулся на этот GitHub опубликовать комментарий что кажется справедливым. Вещи работают локально с --привилегированный флаг, переданный для запуска докера, даже если устройство принадлежит корень: корень. В комментарии к выпуску GitHub сказано, что они измените группу на fuse в устройстве /dev/fuse. Они должны выполнить под root, и это может быть решением для всех пользователей, которые не хочу проходить 777/allow_other/ --uid,--gid, 666 взломов.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.