NFSv4 — это единый порт, псевдофайловая система и поддержка Kerberos. Для организации это способ дать общий каталог Linux-клиентам без паролей в открытом виде. Настройка сложнее, чем у шары с sec=sys: нужны KDC, keytab, idmapping и согласованные права. Ниже — рабочий порядок для сервера и клиента.

Что даёт NFSv4 и какие бывают режимы безопасности

NFSv4 работает через 2049/TCP, использует корень fsid=0 и умеет NFSv4 ACL. Отдельные mountd и statd для базовой работы не нужны, хотя rpcbind может понадобиться для совместимости. Режим sec= задаёт уровень защиты:

  • sec=sys — традиционные UID/GID без Kerberos. Только для доверенной сети.
  • sec=krb5 — аутентификация без защиты целостности и шифрования.
  • sec=krb5i — аутентификация и проверка целостности, без шифрования.
  • sec=krb5p — аутентификация, целостность и шифрование. Самый безопасный и медленный режим.

Kerberos подтверждает личность, но доступ проверяют Unix-права и ACL. Если прав на каталог нет, билет не поможет. И krb5p не отменяет root_squash. Для новых установок выбирайте NFSv4.2: опция vers=4.2 включает актуальные исправления протокола.

Подготовка KDC и keytab

Для небольшой инфраструктуры достаточно MIT Kerberos. Установите krb5-kdc и krb5-admin-server на KDC, krb5-user — на сервере и клиентах. Время должно совпадать, иначе получите «Clock skew too great».

sudo apt install krb5-kdc krb5-admin-server krb5-user
sudo kdb5_util create -s
sudo kadmin.local -q "addprinc -randkey nfs/fileserver.example.ru@EXAMPLE.RU"
sudo kadmin.local -q "ktadd -k /etc/krb5.keytab nfs/fileserver.example.ru@EXAMPLE.RU"

В /etc/krb5.conf укажите realm и KDC; имя в principal должно совпадать с DNS-именем сервера. Файл /etc/krb5.keytab доступен только root. Клиенту нужен host/client.example.ru для монтирования до входа пользователя. Проверить билеты можно через kinit и klist. Если KDC и сервер NFS — разные машины, переносите keytab только по защищённому каналу и сразу проверяйте владельца и права файла.

Экспорт на сервере

Установите nfs-kernel-server и gssproxy. В современных nfs-utils серверную часть GSS обслуживает gssproxy; старый rpc-svcgssd не запускайте одновременно с ним.

sudo apt install nfs-kernel-server gssproxy
sudo systemctl enable --now nfs-server gssproxy
sudo systemctl status nfs-server gssproxy --no-pager

Домен в /etc/idmapd.conf должен совпадать на сервере и клиентах, иначе владельцы превратятся в nobody. Экспорт с fsid=0 и sec=krb5p выглядит так:

/srv/nfs4        *(rw,sync,no_subtree_check,fsid=0,sec=krb5p)
/srv/nfs4/media  *(rw,sync,no_subtree_check,sec=krb5p)

Примените exportfs -rav, проверьте exportfs -s, откройте 2049/TCP и 88/TCP+UDP. Для NFSv3-совместимости нужен и 111.

Клиент: билеты и монтирование

На клиенте установите nfs-common, krb5-user и, если дистрибутив использует его, gssproxy. Создайте principal host/client.example.ru и добавьте его в keytab, включите rpc-gssd и получите билет. Монтируйте с явным sec=krb5p. Обычным пользователям нужен собственный билет: kinit alice или выдача через PAM; машинный keytab их не заменяет.

sudo apt install nfs-common krb5-user gssproxy
sudo systemctl enable --now rpc-gssd
sudo kadmin -p admin/admin@EXAMPLE.RU -q "addprinc -randkey host/client.example.ru"
sudo kadmin -p admin/admin@EXAMPLE.RU -q "ktadd -k /etc/krb5.keytab host/client.example.ru"
kinit -k host/client.example.ru
sudo mount -t nfs4 -o vers=4.2,sec=krb5p fileserver.example.ru:/media /mnt/media
nfsstat -m

Для /etc/fstab используйте те же опции плюс hard и noatime; timeo=600 заставляет клиент ждать, а не терять данные. После монтирования nfsstat -m должен показать sec=krb5p. Если там sec=sys, клиент не получил билет или сервер не предложил нужный flavor.

Права: POSIX ACL, NFSv4 ACL и root_squash

На сервере создайте группу и каталог с setgid, чтобы новые файлы наследовали группу. Default ACL задаёт права для будущих файлов.

sudo groupadd --system media
sudo usermod -aG media alice
sudo install -d -m 2770 -o root -g media /srv/nfs4/media
sudo setfacl -m g:media:rwx,d:g:media:rwx /srv/nfs4/media

Проверьте getfacl. Пользователь должен перелогиниться, иначе id не покажет новую группу и доступ будет запрещён. Дополнительно выставьте umask 002 в сценариях, которые создают файлы в этом каталоге.

NFSv4 ACL богаче POSIX: именованные пользователи, наследование и флаги. На Linux-сервере они обычно транслируются в POSIX ACL, поэтому не все комбинации сохранятся. На клиенте работают nfs4_getfacl и nfs4_setfacl из пакета nfs4-acl-tools; для POSIX ACL нужен пакет acl. На локальном ext4 команды NFSv4 ACL не работают.

nfs4_getfacl /mnt/media/report.txt
nfs4_setfacl -a A::alice@example.ru:rwatTnNcCy /mnt/media/report.txt
getfacl /srv/nfs4/media
id alice

root_squash включён по умолчанию и сопоставляет root клиента с анонимом. Это защищает экспорт от администратора клиента. no_root_squash опасен, а all_squash с anonuid/anongid подходит для публичного каталога только на запись.

Диагностика

Начинайте с билетов и keytab, затем проверяйте экспорт и права. Большинство ошибок связаны с principal, временем или idmapping. Команда rpcinfo -p показывает зарегистрированные службы и порты: для NFSv4 в списке должен быть nfs с 2049, а ошибки GSS ищите в журналах gssproxy и rpc-gssd.

klist -k /etc/krb5.keytab
sudo kinit -k host/client.example.ru
kvno nfs/fileserver.example.ru
sudo exportfs -s
sudo rpcinfo -p fileserver.example.ru
sudo journalctl -u rpc-gssd -u gssproxy -b --no-pager
sudo nfsstat -m

Типичные ошибки: Server not found in Kerberos database — нет principal или неверный realm; Clock skew too great — время; Permission denied — права, ACL или idmapping; access denied by server — exports или sec=. Для отладки включите rpcdebug -m nfs -s all и rpcdebug -m rpc -s all, после — отключите.

Если владельцы видны как nobody, проверьте /etc/idmapd.conf, перезапустите idmapping и очистите кеш через nfsidmap -c. Домен должен совпадать, а DNS — разрешать имена в обе стороны.

Чек-лист

  • Время синхронизировано на KDC, сервере и клиентах.
  • Principal nfs/сервер и host/клиент созданы, keytab с правами 600.
  • Домен idmapping совпадает, служба idmapping работает.
  • В exports указан sec=krb5p, корень имеет fsid=0.
  • Порт 2049 и Kerberos открыты в firewall.
  • Клиент монтирует с явным sec=krb5p, а nfsstat -m это подтверждает.
  • Права проверены через getfacl, пользователь перелогинился после добавления в группу.

Итог

NFSv4 с Kerberos — это KDC, keytab, idmapping и права. Зато вы получаете централизованную аутентификацию, шифрование krb5p и общий каталог для Linux-клиентов. Начните с sec=krb5 на стенде, затем перейдите на krb5p и измерьте пропускную способность. krb5i с защищённым каналом — разумный компромисс, если шифрование слишком медленное.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте