Файловая система FUSE с опцией “умолчательные разрешения”

Вопрос или проблема

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

/home/bin/fusexmp /mnt/fuse -o default_permissions -o allow_other -o nonempty -o hard_remove -d

Теперь, если я войду как пользователь “test” и попытаюсь создать файл под названием “testfile”.

test@11540302:/registration> touch testfile
touch: установка времени `testfile': Доступ запрещен

Вывод Strace:

uname({sys="Linux", node="11540302", ...}) = 0
brk(0)                                  = 0x8055000
brk(0x8076000)                          = 0x8076000
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) =    3
dup2(3, 0)                              = 0
close(3)                                = 0
utimensat(0, NULL, NULL, 0)             = -1 EACCES (Доступ запрещен)
close(0)                                = 0

Но создание “testfile” успешно завершается с владельцем как root,

-rw-r--r--  1 root trusted     0 Янв 19 13:51 testfile

Я понимаю, что приложение Fuse работает на уровне root, создание файла происходит с владельцем root. Из-за этого пользователь test не может выполнять никакие операции с “testfile”.

Мой вопрос:

1. Поскольку я указал “allow_other” при монтировании, почему пользователь test не имеет прав доступа к “testfile”?

2. После входа в систему как пользователь “test” и попытки создать “testfile”, почему файл назначается владельцем “root”, а не “test”? Это наблюдается даже после указания “default_permission” во время монтирования.

Пожалуйста, поправьте меня, если я не прав в своих пониманиях.

Хорошо, позвольте мне прояснить: Вы не “смонтировали fuse”, вы использовали пример программы fusexmp, который является очень простой программой на основе Fuse, которая просто передает все операции на стандартные библиотеки Linux. Это всего лишь пример программы и весьма скучная.

Вы не указали, от имени какого пользователя вы выполнили эту операцию монтирования, но я предполагаю, что вы сделали это от имени root (потому что в противном случае allow_other не сработал бы, и не было бы создано testfile с владельцем root). Обратите внимание, что вы в принципе можете монтировать файловые системы FUSE от любого пользователя.

Когда пользователь test выполнил touch, сначала он открыл файл в смонтированной файловой системе fuse. Поскольку вы использовали default_permissions, система проверила, позволяет ли пользователю test создавать файлы в этом конкретном каталоге (что, очевидно, успешно), и затем разрешила fusexmp создать файл. Поскольку fusexmp работает от имени root, этот файл был создан с владельцем root.

Далее, touch захотел установить дату. Поскольку вы использовали default_permissions, система проверила, может ли пользователь test установить дату для этого конкретного файла. Это не так, поэтому система прервала операцию с ошибкой разрешения, вне зависимости от того, может ли программа fusexmp на самом деле установить дату (что она и могла бы, работая как root).

Я все еще не понимаю суть этого упражнения: вы использовали пример программы необычным образом и затем удивлялись результатам. Если вы задали default_permissions, вам также следует убедиться, что ваша программа в пространстве пользователей создает файлы с правильным владельцем и т. д. (что fusexmp не делает).

Если вы хотите понять файловые системы fuse с точки зрения пользователя, я предлагаю вам поэкспериментировать с реальными примерами, такими как sshfs. Или написать свою собственную программу на Fuse и самостоятельно управлять разрешениями и т. д.

Я нашел решение для этой проблемы.

Подробное объяснение этой проблемы.

Решение:

Как сказал @dirkt, нам нужно самостоятельно управлять разрешениями.

Код для получения uid и gid вызывающего:

fuse_get_context()->uid;

fuse_get_context()->gid;

Получите идентификатор пользователя и группы вызывающего, и установите владельца файла/каталога при создании через API Fuse.

Всегда есть место для улучшения. Пожалуйста, поправьте меня, если я не прав.

Спасибо, dirkt, за ваше объяснение.

Ответ или решение

Конечно, давайте разберёмся с вашим вопросом о файловой системе FUSE и опции "default_permissions".

Понимание проблемы

Вы правильно отметили, что при создании файлов с использованием программы примера fusexmp файл создаётся с владельцем root, даже когда вы запускаете команду от имени пользователя test. Это связано с тем, что fusexmp — это простой пример реализации FUSE, который не учитывает контекст пользователя, выполняющего операции.

Ответы на ваши вопросы

  1. Почему тестовый пользователь не имеет прав доступа к созданному файлу, даже с параметром allow_other?

    Параметр allow_other позволяет другим пользователям (кроме пользователя, выполнившего монтирование) видеть и взаимодействовать с файлами в файловой системе FUSE. Однако это не влияет на способ, которым программа создаёт файлы. В вашем случае, когда test пользователь создал файл, он был создан в контексте fusexmp, работающего от имени root. Учитывая, что в FUSE используется опция default_permissions, система проверяет права доступа пользователя test к создаваемому файлу. Это приводит к ошибке при попытке установить метку времени на файл, поскольку у пользователя test нет прав на эту операцию.

  2. Почему при создании файла пользователем test он получает владельца root, несмотря на использование default_permissions?

    Опция default_permissions просто указывает операционной системе проверять права доступа на уровне файловой системы перед выполнением операций. Однако, поскольку fusexmp не устанавливает владельца создаваемого файла на основе контекста вызывающего пользователя, файл всегда создаётся с владельцем root. Чтобы изменить это поведение, необходимо модифицировать код FUSE для установления принадлежности создаваемого файла к пользователю, вызывшему операцию. Как вы уже упомянули в своём решении, вы можете использовать функции fuse_get_context() для получения идентификаторов пользователя и группы вызывающего процесса и соответствующим образом устанавливать владельца.

Рекомендации

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

Вы также можете рассмотреть использование более сложных FUSE-примеров или библиотек, таких как sshfs, которые обеспечивают более продвинутую обработку файловых операций и управления доступом.

Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать.

Оцените материал
Добавить комментарий

Капча загружается...