การแม็พผู้ใช้ NFSv4


12

ดูเหมือนว่าคำถามนี้จะถูกถามหลายครั้งแล้ว แต่คำตอบอื่น ๆ ไม่ได้ใช้กับฉัน

โดยทั่วไปฉันเพิ่งตั้งค่าเซิร์ฟเวอร์ NFSv4 ใหม่และฉันกำลังเผชิญกับปัญหาแบบคลาสสิกที่ UID และ GID ไม่ตรงกันระหว่างเซิร์ฟเวอร์และไคลเอนต์ อย่างไรก็ตาม syncronizing / etc / passwd และ / etc / group ไม่สามารถทำได้ในสถานการณ์ของฉัน โปรดทราบว่าฉันมีผู้ใช้งานเหมือนกันทั้งสองเครื่อง (ตรงข้ามกับคำถามนี้ )

ดังนั้นฉันจึงค้นหา idmap: ตามแหล่งข้อมูลบางแหล่งดูเหมือนว่า NFSv4 จะส่งชื่อผู้ใช้ (ตรงข้ามกับพฤติกรรมของ NFSv3 เพื่อส่ง UID / GID) และบทบาทของ idmap จะแปลชื่อผู้ใช้เหล่านี้เป็นเซิร์ฟเวอร์ UID / GID

อย่างไรก็ตามดูเหมือนว่าจะไม่ทำงานในกรณีของฉัน (รายละเอียดการตั้งค่าด้านล่าง) ซึ่งฉันพิจารณาว่าเป็นมาตรฐานมาก

ฉันพลาดอะไรไปรึเปล่า? มีวิธีทำให้งานนี้โดยไม่ตั้งค่า 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 ถูกติดตั้งจาก repo และกำหนดค่าให้ส่งออกโฟลเดอร์ทดสอบ

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)

เนื่องจากเซิร์ฟเวอร์และไคลเอนต์มีชื่อโฮสต์ที่แตกต่างกันฉันจึงเปลี่ยนค่า "โดเมน" ในไฟล์ config ของ 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และผู้ใช้สองคนซึ่ง แต่มีชื่อผู้ใช้เดียวกันแต่โพสต์ที่แตกต่างกัน / GIDs

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 ถูกติดตั้งจาก repo และส่วนแบ่งการทดสอบถูกเมาท์

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

แต่นั่นไม่ได้สร้างความแตกต่างใด ๆ

คำตอบ:


6

NFSv4 จะไม่แปล UID และ GID ตามที่คุณคิดเมื่อไม่ใช้ Kerberos และความปลอดภัย แต่มันจะทำหน้าที่ตรงตามที่คุณอธิบาย เหตุผลก็คือ NFSv4 จะใช้AUTH_SYSความปลอดภัย รายละเอียดเพิ่มเติมสามารถพบได้ที่นี่


2
ขอบคุณสำหรับคำตอบและลิงค์ที่ให้ข้อมูล แต่ยังไม่สามารถปรับให้เข้ากับบริบท ... ดังนั้นวัตถุประสงค์ของการทำแผนที่คืออะไร เหตุใดจึงเรียกว่า "rpcidmapd" หากไม่สามารถใช้งานกับ rpc ได้ และผลกระทบของคำสั่งเหล่านี้คืออะไร?
matpen

FWIW ดูเหมือนเป็นไปได้ที่จะเปิดใช้งานการแมป NFSv4 แม้ว่าจะใช้AUTH_SYSต่อคำถามนี้: unix.stackexchange.com/q/438939/111905
sxc731

@ sxc731: จากประสบการณ์ของฉันและฉันได้ทำการทดสอบในวันนี้โดยใช้idmapกับAUTH_SYSแปล UID และ GID อย่างถูกต้อง แต่สิทธิ์ที่มีประสิทธิภาพจะไม่ถูกแปลและแม้ว่าlsจะแสดงให้คุณเห็นว่าคุณเป็นเจ้าของไดเรกทอรีหรือไฟล์คุณจะไม่สามารถทำการเปลี่ยนแปลงได้เพราะรหัสตัวเลขไม่ตรงกับAUTH_SYSรหัสตัวเลขที่ใช้สำหรับสิทธิ์การเข้าถึง
โธมัส

1
@ โทมัสถูกต้อง เมื่อการจับคู่ ID ถูกเปิดใช้งานด้วยsec=sysไฟล์จะปรากฏตามการแม็พ ID แต่การเขียนจะทำงานราวกับว่าไม่มีการแมป ID เกิดขึ้นเลย การอ้างอิงอื่น: "ถึงแม้ว่าหมายเลข uid / gid จะไม่ถูกใช้ในโปรโตคอล NFSv4 อีกต่อไปเว้นแต่จะเป็นตัวเลือกในสตริงด้านบน แต่จะยังคงอยู่ในฟิลด์การตรวจสอบสิทธิ์ RPC เมื่อใช้ AUTH_SYS (sec = sys) ซึ่งเป็นค่าเริ่มต้น ในกรณีนี้ทั้งชื่อผู้ใช้ / กลุ่มและหมายเลขช่องว่างจะต้องสอดคล้องกันระหว่างไคลเอนต์และเซิร์ฟเวอร์ "
Irfan Latif
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.