Вопрос или проблема
Мне интересно, возможно ли иметь клиента, где root может получить доступ только для чтения к целому экспорту NFS3 на сервере, а другие пользователи могут получать доступ на чтение и запись к файлам, к которым они уполномочены получить доступ?
Я думаю, это сводится к вопросу, обрабатываются ли записи в /etc/exports
на сервере по принципу первого совпадения или первого успеха.
Рассмотрим сервер /etc/exports
/home/foo 192.168.0.100(ro,no_root_squash) 192.168.0.0/24(rw)
А на 192.168.0.100 автоматическое монтирование для пользователя foo пытается смонтировать его домашний каталог. “Случается” ли это, но позволяет только чтение, или же происходит сбой, потому что запрос монтирования не является только для чтения (оба по принципу первого совпадения), или же происходит переход ко второй записи в /etc/exports и все проходит корректно? Описано ли поведение в какой-либо документации?
Также будет ли работать создание привязочного монтирования той же папки на сервере и экспортирование этого для root, чтобы получить доступ только для чтения через другую запись в /etc/exports, в то время как для любого другого пользователя автоматическое монтирование работает в обычном режиме?
(Да, я знаю, что NFS3 в любом случае крайне небезопасен!)
Ответ или решение
Вопрос о монтировании NFS3 с разными уровнями доступа для пользователя root и других пользователей
Ваша проблема действительно интересна и охватывает важные аспекты конфигурации NFS (Network File System) и управления доступом в UNIX-подобных системах. Рассмотрим ее более детально.
Обзор конфигурации NFS
На сервере в файле /etc/exports
вы указали следующую настройку:
/home/foo 192.168.0.100(ro,no_root_squash) 192.168.0.0/24(rw)
Это означает следующее:
- 192.168.0.100(ro,no_root_squash): Клиент с IP-адресом 192.168.0.100 может монтировать папку
/home/foo
с правами только для чтения (ro), но без снижения привилегий для пользователя root (no_root_squash). - 192.168.0.0/24(rw): Все клиенты из подсети 192.168.0.0/24 имеют права на чтение и запись (rw).
Логика обработки настроек в /etc/exports
Важно понимать, что NFS обрабатывает записи в /etc/exports
первым подходящим вариантом (first-match). Это означает, что как только NFS находит запись, соответствующую IP-адресу клиента, она применяет заданные в этой записи параметры и не переходит к следующей записи.
В вашей ситуации, если клиент 192.168.0.100 пытается смонтировать /home/foo
, он получит права только для чтения из первой записи. Второй вариант с rw
для подсети не будет проверен для этого клиента, так как первая запись уже «соответствует».
Если клиентоя попытка монтирования произойдет в контексте пользователя root, то, благодаря параметру no_root_squash
, он сможет получить доступ к папке, но только в режиме чтения. Таким образом, для root доступ будет read-only, а для других пользователей, принадлежащих к подсети, доступ будет read-write.
Альтернативное решение с использованием bind mount
Также вы упомянули возможность использования bind mount
. Это действительно может быть жизнеспособным решением. Создав bind mount для каталога /home/foo
и экспортировав его как читаемый для группы клиентов root с правами ro
, вы могли бы исключить конфликтovaoй доступов:
-
Создайте bind mount на сервере:
mount --bind /home/foo /mnt/foo_bind
-
Добавьте новую запись в
/etc/exports
:/mnt/foo_bind 192.168.0.100(ro,no_root_squash)
Таким образом, для root на клиенте с IP 192.168.0.100 будет доступен /mnt/foo_bind
с правами только на чтение, а для других пользователей доступ по-прежнему будет через /home/foo
с правами на запись.
Документация и безопасность
Спецификация NFS не всегда полностью ясна в отношении обработки множества записей в /etc/exports
, но поведение, описанное выше, соответствует стандартной практике. Существует множество сторонних источников и мануалов, описывающих такие аспекты настройки.
Вы правы, что NFSv3 имеет известные уязвимости, особенно в отношении безопасности. Рассмотрите возможность использования более новых версий (например, NFSv4), которые предлагают улучшенные механизмы аутентификации и безопасности.
Заключение
Ваша конфигурация NFS действительно имеет свои нюансы. Вы можете ограничить доступ для root до режима чтения, а для других пользователей предоставить права на запись, не изменяя изначальный контроль доступа. Также использование bind mount — хороший способ обойти ограничения конфигурации NFS.