Блог "Дети ОИТа"
/поиск

Права доступа NFSv4

> [!INFO] Применимость > **ALT Linux 10.4–11.x** · только NFSv4.0/4.1/4.2 · `sec=sys` и Kerberos · сервер и клиент Linux · CLI/TTY · доступ `root` > > Цель: определить, почему пользователь видит катал

Модель прав NFSv4

Эффективный доступ определяется уровнями:

1. Клиент допущен в /etc/exports
2. Выбран security flavor: sec=sys или Kerberos
3. Сервер определил UID/GID или Kerberos principal
4. Применён root_squash/all_squash
5. Проверены Unix mode bits
6. Проверены POSIX ACL или NFSv4 ACL
7. Проверены дополнительные ограничения приложения и локальной ФС

Параметр:

rw

разрешает операции записи через export, но не выдаёт право записи в каталог.

Например:

/srv/nfs4/projects 10.20.30.0/24(rw,...)

и:

drwxr-xr-x root root /srv/nfs4/projects

означают, что обычный пользователь всё равно не может создавать файлы.

Исходная проверка

Перейти в root:

su -

На клиенте

Показать mount:

findmnt -no SOURCE,TARGET,FSTYPE,OPTIONS /mnt/projects
nfsstat -m

Проверить пользователя:

id administrator

Проверить каталог:

stat /mnt/projects

Проверить путь:

namei -l /mnt/projects

Проверить доступ от имени пользователя:

su - administrator -c 'touch /mnt/projects/.nfs-rights-test'

На сервере

Показать export:

exportfs -v

Проверить физический каталог:

namei -l /srv/nfs4/projects
stat /srv/nfs4/projects
getfacl -p /srv/nfs4/projects

Проверить пользователя:

getent passwd administrator
getent group <ГРУППА>

Определение активной защиты

На клиенте:

nfsstat -m

Искать:

sec=sys

или:

sec=krb5
sec=krb5i
sec=krb5p

На сервере:

exportfs -v

Искать:

sec=sys

или Kerberos flavors.

Не смешивать объяснения:

sec=sys → права в основном зависят от UID/GID
Kerberos → личность подтверждается principal, но сервер всё равно сопоставляет её с локальным пользователем

Права при sec=sys

sec=sys передаёт серверу identity клиента через Unix UID/GID.

Практический вывод:

Пользователь с UID 1000 на клиенте должен соответствовать нужному пользователю с UID 1000 на сервере.

Проверить клиент:

id administrator

Проверить сервер:

id administrator

Сравнить:

uid
primary gid
supplementary groups

Пример корректного результата:

Клиент: uid=1000(administrator) gid=1000(administrator)
Сервер: uid=1000(administrator) gid=1000(administrator)

Если на сервере UID 1000 принадлежит другому пользователю, NFS видит числовой идентификатор, а не человеческую драму вокруг совпавших имён.

Ограничение sec=sys

Клиент с административным контролем может подставлять UID/GID. Поэтому sec=sys применять только:

  • в доверенной сети;
  • на управляемых клиентах;
  • с root_squash;
  • с ограничением exports по адресам;
  • для данных, где такая модель риска допустима.

Согласование UID и GID

Вариант 1. Централизованный каталог

Предпочтительный вариант:

FreeIPA
LDAP
SSSD
Active Directory через SSSD

Проверить на клиенте и сервере:

getent passwd administrator
getent group project_users

Результаты UID/GID должны совпадать.

Вариант 2. Локальные учётные записи

Если централизованного каталога нет, создать одинаковые UID/GID вручную.

Сначала проверить свободные идентификаторы:

getent passwd 1500
getent group 1500

Создать группу:

groupadd -g 1500 project_users

Создать пользователя:

useradd -u 1500 -g 1500 -m projectuser

Повторить с теми же ID на клиенте и сервере.

Не изменять UID существующего пользователя без проверки владельцев всех его файлов.

Поиск файлов старого UID

Перед изменением:

find / -xdev -uid <СТАРЫЙ_UID> -ls 2>/dev/null

Для группы:

find / -xdev -gid <СТАРЫЙ_GID> -ls 2>/dev/null

root_squash

root_squash является стандартной защитой export.

Клиентский UID 0 отображается на anonymous identity сервера.

Пример:

/srv/nfs4/projects 10.20.30.0/24(rw,sync,no_subtree_check,root_squash,sec=sys)

Проверить с клиента:

touch /mnt/projects/.root-test

На сервере:

ls -ln /srv/nfs4/projects/.root-test

В зависимости от прав каталога операция:

  • будет запрещена;
  • либо файл будет принадлежать anonymous UID/GID.

Удалить тест:

rm -f /srv/nfs4/projects/.root-test

no_root_squash

Не использовать для обычных файловых ресурсов:

no_root_squash

Это даёт root управляемого клиента возможность действовать как root на экспортируемой ФС.

Допустимые исключения требуют отдельного обоснования, например специализированные backup/workload-сценарии с изолированным клиентом.

all_squash и анонимная учётная запись

all_squash отображает всех пользователей в одну anonymous identity.

Пример общего drop-каталога:

/srv/nfs4/drop 10.20.30.0/24(rw,sync,no_subtree_check,all_squash,anonuid=1600,anongid=1600,sec=sys)

Создать серверную identity:

groupadd -g 1600 nfsdrop
useradd -u 1600 -g 1600 -M -s /sbin/nologin nfsdrop

Назначить каталог:

chown nfsdrop:nfsdrop /srv/nfs4/drop
chmod 0770 /srv/nfs4/drop

Проверить export:

exportfs -rav

Когда применять

  • общий технический каталог;
  • все файлы должны принадлежать одной service account;
  • персональная идентификация пользователей не требуется;
  • права контролируются на уровне export и приложения.

Когда не применять

  • персональные домашние каталоги;
  • аудит действий пользователей;
  • shared development;
  • данные, где нужен реальный владелец.

Права Unix-каталога на сервере

Доступ одной группы

Создать группу:

groupadd project_users

Добавить пользователя:

usermod -aG project_users administrator

Назначить каталог:

chown root:project_users /srv/nfs4/projects
chmod 2770 /srv/nfs4/projects

Setgid-бит:

2

обеспечивает наследование группы новыми объектами.

Проверить:

stat -c '%A %U:%G %n' /srv/nfs4/projects

Ожидается:

drwxrws--- root:project_users

Пользователь должен заново войти в сессию для получения новой supplementary group.

Проверить:

id administrator

Read-only на уровне каталога

chmod 0750 /srv/nfs4/projects

При владельце root:project_users группа получает только чтение и переход.

Но правильнее также установить ro в export, если запись не нужна:

/srv/nfs4/projects 10.20.30.0/24(ro,sync,no_subtree_check,root_squash,sec=sys)

POSIX ACL на сервере

Проверить поддержку:

getfacl -p /srv/nfs4/projects

Выдать пользователю права:

setfacl -m u:administrator:rwx /srv/nfs4/projects

Выдать группе:

setfacl -m g:project_editors:rwx /srv/nfs4/projects

Default ACL для новых объектов:

setfacl -d -m g:project_editors:rwx /srv/nfs4/projects
setfacl -d -m o::--- /srv/nfs4/projects

Проверить:

getfacl -p /srv/nfs4/projects

Маска ACL

Если ACL содержит:

mask::r-x

то запись группы будет запрещена даже при:

group:project_editors:rwx

Исправить маску:

setfacl -m m::rwx /srv/nfs4/projects

NFSv4 ID mapping

NFSv4 может представлять владельца как:

user@domain

Проверить эффективный NFSv4 domain:

nfsidmap -d

На клиенте и сервере значение должно совпадать.

Проверить конфигурацию:

grep -vE '^[[:space:]]*(#|$)' /etc/idmapd.conf

Типовой фрагмент:

[General]
Domain = example.local

Сохранить:

cp -a /etc/idmapd.conf /etc/idmapd.conf.before-rights

После изменения очистить кеш:

nfsidmap -c

Переподключить ресурс:

umount /mnt/projects
mount /mnt/projects

На новых Linux-клиентах при sec=sys часто используются числовые UID/GID, а idmapper включается при необходимости. Поэтому совпадение UID/GID всё равно остаётся обязательной практической проверкой.

Появление nobody или nogroup

Признак:

ls -ln /mnt/projects

показывает известный UID, но:

ls -l /mnt/projects

показывает:

nobody
nogroup

Проверить:

nfsidmap -d
nfsidmap -l
getent passwd <UID>
getent group <GID>
grep -vE '^[[:space:]]*(#|$)' /etc/idmapd.conf

Очистить кеш после исправления:

nfsidmap -c

Проверить журнал:

journalctl -k -b --no-pager | grep -Ei 'nfs|idmap'

Основные причины:

  • пользователь отсутствует локально/в каталоге;
  • разные NFSv4 domains;
  • не работает SSSD/LDAP;
  • закеширован отрицательный результат;
  • сервер возвращает identity, которую клиент не умеет разрешить.

NFSv4 ACL

Некоторые серверные файловые системы и NFS-реализации предоставляют NFSv4 ACL.

Проверить инструменты:

command -v nfs4_getfacl
command -v nfs4_setfacl

Показать ACL:

nfs4_getfacl /mnt/projects/<FILE>

Сохранить перед изменением:

nfs4_getfacl /mnt/projects/<FILE> \
  > /root/nfs4-acl-before.txt

Редактировать интерактивно:

nfs4_editfacl /mnt/projects/<FILE>

Не смешивать бездумно:

POSIX ACL
NFSv4 ACL
Windows-style allow/deny ACE

Поддержка и отображение зависят от серверной ФС и NFS-сервера. Если nfs4_getfacl не поддерживается, управлять правами через Unix mode/POSIX ACL на сервере.

Права при Kerberos

Kerberos flavors:

sec=krb5   — аутентификация
sec=krb5i  — аутентификация и целостность
sec=krb5p  — аутентификация, целостность и шифрование

Проверить mount:

nfsstat -m

Проверить ticket пользователя:

su - administrator -c 'klist -ef'

Проверить identity на сервере:

getent passwd administrator

Даже при Kerberos серверу нужен способ сопоставить principal с локальной учётной записью и её группами.

Пример export:

/srv/nfs4/projects 10.20.30.0/24(rw,sync,no_subtree_check,root_squash,sec=krb5p)

Пример mount:

mount -t nfs \
  -o nfsvers=4.2,hard,sec=krb5p \
  nfs01.example.local:/projects \
  /mnt/projects

Проверить доступ именно от имени пользователя с ticket:

su - administrator -c \
  'touch /mnt/projects/.krb5-rights-test'

Несколько пользователей и служб

Пользовательский доступ

Для sec=sys:

  • UID/GID одинаковы на клиенте и сервере;
  • группы одинаковы;
  • серверный каталог имеет подходящие mode/ACL.

Служба

Определить service account:

id <SERVICE_USER>

Проверить от её имени:

su -s /bin/sh -c \
  'touch /mnt/projects/.service-test' \
  <SERVICE_USER>

Удалить:

rm -f /mnt/projects/.service-test

Не запускать приложение от root ради обхода прав

Если root клиента не может писать из-за root_squash, это штатное поведение.

Правильное решение:

  • service account;
  • подходящий UID/GID;
  • группа;
  • ACL;
  • Kerberos principal.

Неправильное:

no_root_squash

только потому, что приложение лениво настроено.

Самодостаточные сценарии

Сценарий 1. Пользователь видит файлы, но не пишет

На клиенте:

id administrator
nfsstat -m
su - administrator -c \
  'touch /mnt/projects/.write-test'

На сервере:

id administrator
exportfs -v
namei -l /srv/nfs4/projects
getfacl -p /srv/nfs4/projects

Исправить группу:

usermod -aG project_users administrator
chown root:project_users /srv/nfs4/projects
chmod 2770 /srv/nfs4/projects

Пользователю заново войти в систему.

Повторить тест.

Сценарий 2. Root клиента получает Permission denied

Проверить export:

exportfs -v

Если включён:

root_squash

это ожидаемо.

Создать service account и запускать операцию от неё:

su -s /bin/sh -c \
  'touch /mnt/projects/.service-test' \
  <SERVICE_USER>

Не отключать root_squash без отдельного решения.

Сценарий 3. Файлы отображаются как nobody

Клиент:

nfsidmap -d
getent passwd <UID>

Сервер:

nfsidmap -d
getent passwd <UID>

Исправить /etc/idmapd.conf или источник identities.

Очистить кеш на клиенте и сервере:

nfsidmap -c

Переподключить mount.

Сценарий 4. Все файлы должны принадлежать одной службе

Сервер:

groupadd -g 1600 nfsapp
useradd -u 1600 -g 1600 -M -s /sbin/nologin nfsapp
chown nfsapp:nfsapp /srv/nfs4/app
chmod 0770 /srv/nfs4/app

Export:

/srv/nfs4/app 10.20.30.0/24(rw,sync,no_subtree_check,all_squash,anonuid=1600,anongid=1600,sec=sys)

Применить:

exportfs -rav

Клиент:

touch /mnt/app/.ownership-test

Сервер:

stat /srv/nfs4/app/.ownership-test

Ожидаемый владелец:

nfsapp:nfsapp

Проверка результата

Клиент

nfsstat -m
id administrator
su - administrator -c \
  'touch /mnt/projects/.rights-final-test'
su - administrator -c \
  'stat /mnt/projects/.rights-final-test'
su - administrator -c \
  'rm /mnt/projects/.rights-final-test'

Сервер

exportfs -v
getfacl -p /srv/nfs4/projects
journalctl -k -b --no-pager | grep -Ei 'nfs|idmap|permission'

Типовые ошибки

Симптом Проверить
Permission denied Export rw/ro, mode, ACL, UID/GID, Kerberos ticket
Root не пишет root_squash, это штатно
Имена одинаковые, права разные Числовые UID/GID
Владелец nobody ID mapping, каталог пользователей, cache
Группа добавлена, но не действует Новая login session, supplementary groups
ACL выдаёт rwx, но запись запрещена ACL mask, export ro, parent directory
chmod на клиенте не помогает Серверная ФС/ACL или отсутствие права владельца
Все пользователи выглядят одним владельцем all_squash
При Kerberos root работает иначе Principal и server-side mapping
Один клиент пишет, другой нет Разные UID/GID, groups, tickets или IP rules

Откат

Сохранить до изменений:

getfacl -Rp /srv/nfs4/projects \
  > /root/projects-acl-before.txt

Сохранить ownership/mode:

stat -c '%u %g %a %n' /srv/nfs4/projects \
  > /root/projects-mode-before.txt

Сохранить exports:

cp -a /etc/exports /etc/exports.before-rights

Вернуть ACL:

setfacl --restore=/root/projects-acl-before.txt

Вернуть exports:

cp -a /etc/exports.before-rights /etc/exports
exportfs -ra

Вернуть idmap config:

cp -a /etc/idmapd.conf.before-rights /etc/idmapd.conf
nfsidmap -c

Удалять созданных пользователей и группы только после проверки, что им не принадлежат другие файлы:

find / -xdev -uid <UID> -ls 2>/dev/null
find / -xdev -gid <GID> -ls 2>/dev/null

Источники