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

NFSv4 сопоставление UID и GID в Debian Stretch

Я использую следующую настройку:

Сервер NFS (Ubuntu 16.04 LTS)

Клиент NFS

На стороне клиента пользователь test существует с тем же UID, что и на стороне сервера. Но мне нужно использовать пользователя testmf а не test один.

Я прочитал много документации и ответов от StackOverflow / StackExchange, и по некоторым причинам у меня ничего не работает.

Один из многих ответов - изменить файл /etc/idmapd.conf.

Итак, вот оно с обеих сторон:

Сервер

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

[Mapping]    
Nobody-User = nobody
Nobody-Group = nogroup

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

[General]
Verbosity = 9
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if it differs from FQDN minus hostname
# Domain = localdomain
Domain = example.com

[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup

[Translation]
Method = static

[Static]
test@nfsserver.example.com = testmf
test@192.168.0.1 = testmf
test@nfsserver = testmf

И я использую такую ​​команду для монтирования каталога на клиенте:

mount 192.168.0.1:/home/test/my_exp_dir /home/testmf/my_imp_dir

И когда я делаю ls -l /home/testmf/my_imp_dir Получаю что-то вроде этого:

-rw-r--r-- 1 test test  326025780 May  9  2017 allCountries.zip

и нет

-rw-r--r-- 1 testmf testmf  326025780 May  9  2017 allCountries.zip

Если я сделаю это touch testfile Я понимаю:

-rw-r--r-- 1 test test  326025780 May  9  2017 allCountries.zip
-rw-r--r-- 1 testmf testmf      0 Jun  9  18:57 testfile

Или ls -ln

-rw-r--r-- 1 1300 1300  326025780 May  9  2017 allCountries.zip
-rw-r--r-- 1 1350 1350          0 Jun  9  18:57 testfile

Я попытался повысить уровень детализации, и нигде в моих журналах я не вижу сопоставления пользователей от одного UID к другому, как я мог видеть в некоторых ответах. Я заметил две вещи: настройки ядра /sys/module/nfs/parameters/nfs4_disable_idmapping был установлен на Y и даже после перехода на N, похоже, ничего не работает.

Второе, что я обнаружил, это двух записей, которых нет на моем клиентском сервере:

И я не знаю, как его добавить, особенно если nfsidmap недоступен.

Я прочитал, что мне также нужно перезапустить idmapd обслуживание после этого изменения. Но в Debian 9 это невозможно ... Или, по крайней мере, я не нашел, как это сделать ...

Я также изменил файл /etc/default/nfs-common установить переменную NEED_IDMAPD=yes и ничего не делает даже после перезагрузки ...

Так что мой вопрос может быть довольно глупым, но как я могу активировать nfsidmapd в Debian Stretch? У меня действительно нет возможности, ключевые слова для поиска и официальная документация Debian здесь не очень полезны, за исключением случаев, когда я полностью слеп!

Спасибо заранее за вашу помощь.

Существует большая путаница с отображением идентификаторов nfs. Отображение используется, когда субъект строковой формы, например test@example.com, необходимо преобразовать в числовой идентификатор и наоборот. Однако, когда вы монтируете с помощью sec = sys, что вы, очевидно, делаете, тогда все запросы аутентифицируются с использованием локального UID и GID клиента. IOW, на прикоснуться UID клиентского процесса будет владельцем файла на сервере.

Вторая путаница заключается в том, что Статический может использоваться для определения статического сопоставления. Согласно странице руководства:

«Статический» метод перевода использует статический список имен, прошедших проверку подлинности GSS, в имена локальных пользователей.

Который буквально ожидает участников, прошедших проверку подлинности GSS:

 if (strcmp(secname, "krb5") != 0 && strcmp(secname, "spkm3") != 0)
     return -EINVAL;

http://git.linux-nfs.org/?p=trondmy/libnfsidmap.git;a=blob;f=static.c;h=fffd4580847d2577d3fb9638a246069bdb8f12b5;hb=HEAD#l118

Поскольку слишком многим людям требуется статическое сопоставление, это, вероятно, придется исправить, однако вы не можете исправить использование UID процесса.

Чтобы решить эту проблему дружественным к NFS способом, лучшим вариантом будет использование kerberos и монтирование с sec = krb5. В этом случае вы можете запускать процесс с билетом kerberos для одного пользователя, но локально иметь другой UID. В таком сценарии можно использовать статическое сопоставление, чтобы избежать использования LDAP.

Ну, это мой ответ, возможно, не совсем то, что я хотел, но, по крайней мере, он решил мою проблему, и я продолжаю.

По сути, я обеспечил, чтобы все пользователи входили в одну группу с одним и тем же GID на всех задействованных серверах. Затем я установил идентификатор группы для всех каталогов в общем каталоге с помощью:

find /share-dir -type d -exec chmod g+s {} \;

Я также проверил, что umask был установлен на 007 вместо 022, 027.