Pemetaan Pengguna NFSv4

12

Pertanyaan ini sepertinya sudah ditanyakan berkali-kali, tetapi jawaban yang lain entah bagaimana tidak berlaku untuk saya.

Pada dasarnya saya hanya menyiapkan server NFSv4 baru dan saya menghadapi masalah klasik di mana UID dan GID tidak cocok antara server dan klien. Namun, sinkronisasi / etc / passwd dan / etc / group tidak layak dalam skenario saya. Perhatikan bahwa saya memiliki pengguna yang sama di kedua mesin (yang bertentangan dengan pertanyaan ini ).

Karena itu saya mencari idmap: menurut beberapa sumber, sepertinya NFSv4 mengirimkan nama pengguna (berbeda dengan perilaku NFSv3 untuk mengirim UID / GID) dan peran idmap adalah menerjemahkan nama pengguna ini ke server UID / GID.

Namun, ini tampaknya tidak berfungsi dalam kasus saya (detail pengaturan di bawah), yang saya anggap sangat standar (cukup banyak hanya menginstal NFS dari repo).

Apakah saya melewatkan sesuatu? Apakah ada cara untuk membuat ini berfungsi tanpa mengatur LDAP atau Kerberos?


Pengaturan server

Server telah Ubuntu 16.04diinstal dan dua pengguna.

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 diinstal dari repo dan dikonfigurasikan untuk mengekspor folder uji.

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)

Karena server dan klien memiliki nama host yang berbeda, saya mengubah nilai "Domain" di file konfigurasi idmapd. Kalau tidak, file tersebut identik dengan yang diinstal oleh manajer paket. Harap perhatikan bahwa konten file ini identik pada server dan klien.

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

Pengaturan klien

Klien juga memiliki Ubuntu 16.04dan dua pengguna, yang bagaimanapun memiliki nama pengguna yang sama tetapi UID / GID yang berbeda .

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 diinstal dari repo dan bagian uji dipasang.

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

Pengujian

Pertama-tama saya membuat file pada klien, dan ini tampaknya baik-baik saja:

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

Tetapi ketika saya melihat file dari server, saya perhatikan bahwa pemiliknya salah, sedangkan grup tidak ada.

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

Eksperimen

Menurut jawaban untuk pertanyaan serupa, pemetaan id harus diaktifkan sebagai berikut, di server (perhatikan kesalahannya):

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

Saat berada di klien (perhatikan tidak adanya kesalahan):

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

Tetapi hasilnya aneh:

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

Jawaban lain menyarankan untuk mengubah konfigurasi idmapd sebagai berikut (kontennya sama di kedua mesin):

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

Tapi itu tampaknya tidak membuat perbedaan.

matpen
sumber

Jawaban:

6

NFSv4 tidak akan menerjemahkan UID dan GID seperti yang mungkin Anda pikirkan ketika tidak menggunakan Kerberos dan rasa keamanan. Tapi itu persis bertindak seperti yang Anda gambarkan. Alasannya adalah bahwa NFSv4 akan menggunakan AUTH_SYSkeamanan. Deskripsi yang lebih terperinci dapat ditemukan di sini .

Thomas
sumber
2
Terima kasih atas jawaban dan tautannya, sangat informatif. Tetapi masih tidak bisa masuk ke dalam konteks ... jadi apa tujuan dari idmapping? Mengapa ini disebut "rpcidmapd" jika tidak bekerja dengan rpc? Dan apa efek dari perintah - perintah ini ?
matpen
FWIW, tampaknya memungkinkan untuk mengaktifkan pemetaan id NFSv4 bahkan ketika menggunakan AUTH_SYSper pertanyaan ini: unix.stackexchange.com/q/438939/111905
sxc731
@ sxc731: dari pengalaman saya, dan saya melakukan tes hari ini, menggunakan idmapwith AUTH_SYSapakah menerjemahkan UID dan GID dengan benar. Tetapi hak yang efektif tidak diterjemahkan dan bahkan jika lsmemang menunjukkan Anda memiliki direktori atau file Anda tidak akan dapat membuat perubahan karena ID numerik tidak cocok dan dengan AUTH_SYSID numerik digunakan untuk hak akses.
Thomas
1
@ Thomas benar. Ketika pemetaan sec=sysID dipangkas dengan ON , file muncul sesuai ID mappig tetapi tulisan berfungsi seolah-olah tidak ada pemetaan ID yang terjadi sama sekali. Referensi lain : "Meskipun nomor uid / gid tidak lagi digunakan dalam protokol NFSv4 kecuali secara opsional di string di atas, mereka masih akan berada di bidang otentikasi RPC saat menggunakan AUTH_SYS (sec = sys), yang merupakan default. Dengan demikian, dalam hal ini baik nama pengguna / grup dan ruang angka harus konsisten antara klien dan server. "
Irfan Latif