Назад | Перейти на главную страницу

Сопоставление пользователей NFSv4

Этот вопрос, кажется, уже задавали много раз, но другие ответы почему-то не относились ко мне.

По сути, я только что установил новый сервер NFSv4 и столкнулся с классической проблемой, когда UID и GID не совпадают между сервером и клиентом. Однако синхронизация / etc / passwd и / etc / group в моем сценарии невозможна. Обратите внимание, что у меня одни и те же пользователи на обеих машинах (в отличие от этот вопрос).

Поэтому я изучал idmap: согласно некоторым источникам, кажется, что NFSv4 отправляет имена пользователей (в отличие от поведения NFSv3 для отправки UID / GID), и роль idmap будет заключаться в переводе этих имен пользователей в UID / GID сервера.

Однако в моем случае это, похоже, не работает (подробности настройки приведены ниже), что я считаю очень стандартным (в значительной степени установленным только NFS из репо).

Я что-то упускаю? Есть ли способ заставить это работать без настройки LDAP или Kerberos?


Настройка сервера

На сервере есть Ubuntu 16.04 установил и два пользователя.

user1@server:~$ id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1),27(sudo)
user1@server:~$ id user2
uid=1001(user2) gid=1001(user2) groups=1001(user2)

NFS был установлен из репозитория и настроен для экспорта тестовой папки.

user1@server:~$ sudo apt-get install nfs-kernel-server

user1@server:~$ sudo cat /proc/fs/nfsd/versions 
+2 +3 +4 +4.1 +4.2

user1@server:~$ ls -ld /srv/nfs/test/
drwxrwxrwx 2 nobody nogroup 4096 nov  2 17:34 /srv/nfs/test/

user1@server:~$ cat /etc/exports 
"/srv/nfs/test" 192.168.x.x(rw,sync,no_subtree_check)

Поскольку у сервера и клиента разные имена хостов, я изменил значение «Домен» в конфигурационном файле idmapd. В остальном файл идентичен тому, который установлен менеджером пакетов. Обратите внимание, что содержимое этого файла идентично как на сервере, так и на клиенте.

user1@server:~$ cat /etc/idmapd.conf
[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
Domain = mydomain

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

Настройка клиента

У клиента также есть Ubuntu 16.04 и два пользователя с одинаковыми именами но разные UID / GID.

user1@client:~$ id user1
uid=1001(user1) gid=1002(user1) groups=1002(user1),27(sudo)
user1@client:~$ id user2
uid=1000(user2) gid=1000(user2) groups=1000(user2),27(sudo)

NFS был установлен из репо, и тестовый ресурс был смонтирован.

user1@client:~$ sudo apt-get install nfs-common

user1@client:~$ mkdir ./test
user1@client:~$ sudo mount -t nfs4 192.168.x.x:/srv/nfs/test ./test

Тестирование

Сначала я создаю файл на клиенте, и это нормально:

user1@client:~$ touch test/testfile
user1@client:~$ ls -l ./test
total 0
-rw-rw-r-- 1 user1 user1 0 nov  2 17:24 testfile

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

user1@server:~$ ls -l /srv/nfs/test
total 0
-rw-rw-r-- 1 user2 1002 0 nov  2 17:24 testfile

Эксперименты

В соответствии с этот ответ Чтобы ответить на аналогичный вопрос, необходимо активировать отображение идентификаторов на сервере следующим образом (обратите внимание на ошибки):

user1@server:~$ sudo tee /sys/module/nfsd/parameters/nfs4_disable_idmapping <<< "N"
user1@server:~$ sudo nfsidmap -c
nfsidmap: 'id_resolver' keyring was not found.
user1@server:~$ sudo service rpcidmapd restart
Failed to restart rpcidmapd.service: Unit rpcidmapd.service not found.
user1@server:~$ sudo service nfs-kernel-server restart

На клиенте (обратите внимание на отсутствие ошибок):

user1@client:~$ sudo tee /sys/module/nfs/parameters/nfs4_disable_idmapping <<< "N"
user1@client:~$ sudo nfsidmap -c

Но результаты странные:

user1@client:~$ touch test/testfile
user1@client:~$ ls -l test
total 0
-rw-rw-r-- 1 user2 4294967294 0 nov  2 19:16 testfile
user1@server:~$ ls -l /srv/nfs/project/
total 0
-rw-rw-r-- 1 user2 1002 0 nov  2 19:16 prova

Другой ответ предлагает изменить конфигурацию idmapd следующим образом (содержимое одинаково на обеих машинах):

user1@server:~$ cat /etc/idmapd.conf 
[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
Domain = mydomain

[Translation]
   Method=static
[Static]
   user1@mydomain = user1

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

Но это, похоже, не имеет никакого значения.

NFSv4 не будет преобразовывать идентификаторы UID и GID, как вы могли подумать, если не используете Kerberos и систему безопасности. Но он действует именно так, как вы описали. Причина в том, что NFSv4 будет использовать AUTH_SYS безопасность. Более подробное описание можно найти Вот.