nfsv4 Usermapping

schorsch_76

FreeBSD Fanboy
Hallo,
ich versuch seit einigen Stunden Usermapping zum laufen zu bekommen aber die Ids werden einfach nicht gemappt. Brauch ich einen NIS Server dazu?

Ich hab 2 User angelegt.
Server:
U1:id=1001
U2:id=1010

Client:
U1:id=1002
U2:id=1011

Leider werde immer nur die UIDs und nicht die Namen angezeigt.

Client:
Code:
nfs_client_enable="YES"
nfsuserd_enable="YES"
nfsuserd_flags="-domain me.local -verbose"
nfscbd_enable="YES"
nfscbd_flags="-p 7654 -P root"

rpc_lockd_enable="YES"
rpc_statd_enable="YES"
mountd_flags="-r"

hostid_enable="YES"
vfs.nfs.enable_uidtostring=1


Server:
Code:
nfs_server_enable="YES"
nfsv4_server_enable="YES"
nfs_client_enable="YES"
nfsuserd_enable="YES"
nfsuserd_flags="-domain me.local -verbose"
nfscbd_enable="YES"
mountd_enable="YES"
mountd_flags="-r"

hostid_enable="YES"
vfs.nfs.enable_uidtostring=1
vfs.nfsd.enable_stringtouid=1


exports:
Code:
/zroot/nfsv4/test                -maproot=root -network 192.168.160.0/24
V4: /zroot/nfsv4                 -network 192.168.160.0/24
 

CommanderZed

OpenBSD User
Teammitglied
Man mag mich hier korrigieren, aber soweit ich weiß müssen bei NFS die user-ids auf beiden maschinen "die gleichen sein" - das kann man auch durch NIS etc sicher stellen
 

Vincent

Well-Known Member
Man mag mich hier korrigieren, aber soweit ich weiß müssen bei NFS die user-ids auf beiden maschinen "die gleichen sein" - das kann man auch durch NIS etc sicher stellen
Muss man nicht das deckt sich mit meiner Erfahrung.
Es ist am besten wenn man auf allen Clients die gleichen UID und GID hat. Dann hat man auch keine Probleme mit den Berechtigungen und Zugriffen.

Solange der Server jetzt aber nichts mit den Dateien macht sind dort die UID und GID egal. Sieht halt nur schöner aus wenn man dort auch den User- und Gruppennamen sieht. Funktionieren tut es auch ohne.
 

schorsch_76

FreeBSD Fanboy
Muss man nicht das deckt sich mit meiner Erfahrung.
Es ist am besten wenn man auf allen Clients die gleichen UID und GID hat. Dann hat man auch keine Probleme mit den Berechtigungen und Zugriffen.

Solange der Server jetzt aber nichts mit den Dateien macht sind dort die UID und GID egal. Sieht halt nur schöner aus wenn man dort auch den User- und Gruppennamen sieht. Funktionieren tut es auch ohne.
Naja, meine Idee war es eben die unzulängliche SMB2+ Client Unterstützung durch FreeBSD zu umgehen indem ich parallel NFSv4 implementiere.

Ich denke ich werde einen NIS Server aufsetzen. Das sollte (tm) nicht so dramatisch seine, da ich nur eine handvoll Benutzer habe und sich nur ein paar bei den uid/gid's sich auf den Systemen unterscheiden.

Ich wollte meine System mit ansible administrierbar machen. Ich denke das wird dann noch eine jail die "unter" dhcp/dns liegt. Mal sehen: Evtl ist es sogar sinnvoll auf jedem System einen NIS Slave Server zu betreiben. Insbesondere wenn es sich um einen Laptop handelt.

Kleine offtopic Frage: Denkt ihr, dass es einen Sicherheitsvorteil bringt wenn man die Jails auf eine eigene Bridge legt und sie nicht mit dem Ethernet Adapter in eine gemeinsame bridge? Oder ist das eigentlich egal außer man bekommt nur eine IP vom äußeren Netz?
 

turrican

Well-Known Member
werden bei einen 'ls' auf dem client die user:group als ne korrekte uid:gid oder als root:root angezeigt?
 

Yamagi

Possessed With Psi Powers
Teammitglied
Bei mir funktioniert es mit FreeBSD 13.1 als Server und FreeBSD sowie Linux als Clients. Unter FreeBSD starte ich den nfsused mit der Domäne, genauso wie du es machst:

Code:
nfsuserd_enable="YES"
nfsuserd_flags="-domain home.yamagi.org"

Unter Linux bekommt der idmapd in seiner Config ebenfalls die Domäne:

Code:
Domain = home.yamagi.org

So gesehen weiß ich auf den ersten Blick nicht, was bei dir schief läuft. Mir fällt nur noch die Suggestivfrage "Und du mountest wirklich NFS4, nicht 3 oder 2? :)" ein. Aber den Fehler wirst du nicht machen, also leider keine Ahnung.
 

Yamagi

Possessed With Psi Powers
Teammitglied
Die ist auch recht einfach:

Code:
# Festplatte
/mnt/data    -alldirs -network=192.168.142.0/24
/mnt/data    -alldirs -network=[ip6_zensiert]::/64

# NFS4 Root
V4:    / -sec=sys -network=192.168.142.0/24
V4:    / -sec=sys -network=[ip4_zensiert]::/64
 

schorsch_76

FreeBSD Fanboy
Ich setze heute Abend nochmal 2 frische Bhyve VMs auf. Server+Client und probier das nochmal "auf der grünen Wiese" aus. Wenn ich manuell die User Ids gleich gemacht habe, dann funktioniert das auch bisher. Ich habe mit
Code:
mount -t nfs -o nfsv4 [serverip]:/test /mnt
gemountet. Mit "nfsstat -m" hab ich auf dem Client auch alle Nfs Optionen gesehen. Da war NFSv4 im Einsatz. Nur NFS4.1 oder NFS4.2 hab ich nicht zum laufen bekommen. Geschweige denn im Linux/FreeBSD Mix.

Da sind mir doch gleich drei Unterschiede aufgefallen: -maproot=root bei mir und -alldirs und ein explizietes -sec=sys bei dir.

Aber: Da wird der Test hoffentlich aufschlussreich sein.

Danke für die Hinweise! :)
 

schorsch_76

FreeBSD Fanboy
Ich hab das Setup jetz mal mit 2 VMs nachgestellt und die IDs werden nicht angepasst.

VM fs: (server)
1001 = admin
1002 = u1
1003 = u2

VM fc: (client)
1001 = admin
1002 = u2
1003 = u1

u1 und u2 explizit gedreht um zu sehen ob das Usermapping funktioniert!

fs zeigt:
Code:
admin@fs:~ # id u1
uid=1002(u1) gid=1002(u1) groups=1002(u1)
admin@fs:~ # id u2
uid=1003(u2) gid=1003(u2) groups=1003(u2)
admin@fs:~ $ hostname -f
fs.me.local
admin@fs:~ $ ls -la /zroot/nfsv4/test/
total 3
drwxr-xr-x  2 root   wheel  5 Jun  7 17:46 .
drwxr-xr-x  3 root   wheel  3 Jun  7 17:46 ..
-rw-r--r--  1 admin  wheel  0 Jun  7 17:46 hallo_admin
-rw-r--r--  1 u1     u1     0 Jun  7 17:46 hallo_u1
-rw-r--r--  1 u2     u2     0 Jun  7 17:46 hallo_u2
rc.conf (komplett)
Code:
admin@fs:~ $ cat /etc/rc.conf
hostname="fs.me.local"
keymap="de.kbd"
ifconfig_vtnet0="DHCP"
ifconfig_vtnet0_ipv6="inet6 accept_rtadv"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="NO"
zfs_enable="YES"

nfs_server_enable="YES"
nfsv4_server_enable="YES"
nfs_client_enable="YES"
nfsuserd_enable="YES"
nfsuserd_flags="-domain me.local -verbose"
nfscbd_enable="YES"
mountd_enable="YES"
mountd_flags="-r"

hostid_enable="YES"

Code:
admin@fs:~ $ cat /etc/exports
/zroot/nfsv4/test                -alldirs -network 192.168.160.0/24
V4: /zroot/nfsv4                 -sec=sys -network 192.168.160.0/24

sysctl.conf
vfs.nfs.enable_uidtostring=1
vfs.nfsd.enable_stringtouid=1

fc zeigt:
Code:
root@fc:~ # id u1
uid=1003(u1) gid=1003(u1) groups=1003(u1)
root@fc:~ # id u2
uid=1002(u2) gid=1002(u2) groups=1002(u2)
root@fc:~ # hostname -f
fc.me.local
root@fc:~ # mount -t nfs -o nfsv4 192.168.160.66:/test /mnt
root@fc:~ # nfsstat -m
192.168.160.66:/test on /mnt
nfsv4,minorversion=2,tcp,resvport,nconnect=1,hard,cto,sec=sys,acdirmin=3,acdirmax=60,acregmin=5,acregmax=60,nametimeo=60,negnametimeo=60,rsize=65536,wsize=65536,readdirsize=65536,readahead=1,wcommitsize=8388608,timeout=120,retrans=2147483647
root@fc:~ # ls -la /mnt/
total 11
drwxr-xr-x   2 root   wheel   5 Jun  7 17:46 .
drwxr-xr-x  19 root   wheel  25 Jun  7 17:44 ..
-rw-r--r--   1 admin  wheel   0 Jun  7 17:46 hallo_admin
-rw-r--r--   1 u2     u2      0 Jun  7 17:46 hallo_u1
-rw-r--r--   1 u1     u1      0 Jun  7 17:46 hallo_u2
root@fc:~ #

rc.conf (komplett)
Code:
hostname="fc.me.local"
keymap="de.kbd"
ifconfig_vtnet0="DHCP"
ifconfig_vtnet0_ipv6="inet6 accept_rtadv"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="NO"
zfs_enable="YES"

nfs_client_enable="YES"
nfsuserd_enable="YES"
nfsuserd_flags="-domain me.local -verbose"
nfscbd_enable="YES"
nfscbd_flags="-p 7654 -P root"

rpc_lockd_enable="YES"
rpc_statd_enable="YES"
mountd_flags="-r"

hostid_enable="YES"

sysctl.conf
vfs.nfs.enable_uidtostring=1

Da die Maschinen die IDs definiert haben zeigen sie ihre entsprechenden Namen. ABER: Das ist NFS4.2! Auch mit den Optionen von @Yamagi in der exports ist das so. ;'(

Domainname gesetzt ... hostids aktiviert ... nfsv4.2 .... Namen sind gleich geschrieben.

In der man Page zur rc.conf steht noch nisdomainname (aber nur wenn NIS genutzt wird).

Grübel grübel und Studier .... was kann das nur sein? :confused:
 

schorsch_76

FreeBSD Fanboy
Ich hab jetzt mal mit Wireshark bzw tcpdump gegraben. Laut Doku müsste (tm) im Paket der Owner im Stringformat übertragen werden aber er wird als uid übertragen.


man nfsv4 schrieb:
NFSv4 uses strings for users and groups instead of numbers. On the wire,
these strings can either have the numbers in the string or take the form:

<user>@<dns.domain>

where ``<dns.domain>'' is not the same as the DNS domain used for host
name lookups, but is usually set to the same string. Most systems set
this ``<dns.domain>'' to the domain name part of the machine's
hostname(1) by default. However, this can normally be overridden by a
command line option or configuration file for the daemon used to do the
name<->number mapping. Under FreeBSD, the mapping daemon is called
nfsuserd(8) and has a command line option that overrides the domain com-
ponent of the machine's hostname. For use of this form of string on
NFSv4, either client or server, this daemon must be running.

The form where the numbers are in the strings can only be used for
AUTH_SYS. To configure your systems this way, the nfsuserd(8) daemon
does not need to be running on the server, but the following sysctls need
to be set to 1 on the server.

vfs.nfs.enable_uidtostring
vfs.nfsd.enable_stringtouid

On the client, the sysctl

vfs.nfs.enable_uidtostring
 

Anhänge

  • Screenshot_20220607_190348.png
    Screenshot_20220607_190348.png
    147,4 KB · Aufrufe: 26

schorsch_76

FreeBSD Fanboy
Beim stöbern im Bett (weil es mit einfach keine Ruhe gelassen hat) bin ich auf die Lösung gekommen:


rick schrieb:
Oh, and I forgot to mention name<->id# mapping.
If using AUTH_SYS (not kerberos), then you have the
choice of running "nfsuserd" or setting these two sysctls to 1.
vfs.nfs.enable_uidtostring=1
vfs.nfsd.enable_stringtouid=1
--> This makes the server just handle id#s (uid, gid) as numbers in
a string. (This is the default for Linux these days although it was
' frowned upon in the early days.)

Running nfsuserd maps uid, gid numbers to/from names using the
password and group databases. This must be used for Kerberos mounts.

Without the above properly configured, you'll see lots of files owned
by "nobody" on the client mounts.

rick

Daraus hab ich dann auf Client + Server. So wird auch der nfsuserd genutzt!
vfs.nfs.enable_uidtostring=1
vfs.nfsd.enable_stringtouid=0

"ermögliche uid nach string" ... klar=1 :ugly:
"ermögliche string nach uid" ... klar=0 :ugly:

Jetzt gibt zeigt der Client:
Code:
root@fc:/mnt # ls -la
total 11
drwxr-xr-x   2 root   wheel   5 Jun  7 17:46 .
drwxr-xr-x  19 root   wheel  25 Jun  8 05:50 ..
-rw-r--r--   1 admin  wheel   0 Jun  7 17:46 hallo_admin
-rw-r--r--   1 u1     u1      0 Jun  7 17:46 hallo_u1
-rw-r--r--   1 u2     u2      0 Jun  7 17:46 hallo_u2

Und auf dem Server:
/var/log/mesages schrieb:
Jun 8 05:54:57 fs nfsuserd:[551]: Added uid=0 name=root
Jun 8 05:54:57 fs nfsuserd:[552]: Added gid=0 name=wheel
Jun 8 05:55:30 fs nfsuserd:[553]: Added uid=1003 name=u2
Jun 8 05:55:30 fs nfsuserd:[551]: Added gid=1003 name=u2
Jun 8 05:55:30 fs nfsuserd:[551]: Added uid=1002 name=u1
Jun 8 05:55:30 fs nfsuserd:[551]: Added gid=1002 name=u1
Jun 8 05:55:30 fs nfsuserd:[550]: Added uid=1001 name=admin
 

schorsch_76

FreeBSD Fanboy
Jetzt hab ich mal zu schreiben versucht. Es gab erstmal "permission denied". Dann hab ich ein Subfolder auf dem Server angelegt mit o+w,g+w,o+w. Vom Client aus ein "su - u1" und ein "touch /mnt/test/sub/hello_feom_client_u1" und es geht.

Info vom Server:
Code:
admin@fs:~ $ sudo ls -la /zroot/nfsv4/test/sub/
total 3
drwxr-xrwx  2 u1  u1  3 Jun  8 18:04 .
drwxrwxr-x  3 u1  u1  6 Jun  8 06:07 ..
-rw-r--r--  1 u2  u1  0 Jun  8 18:04 hello_feom_client_u1
admin@fs:~ $ sudo ls -ln /zroot/nfsv4/test/sub/
total 1
-rw-r--r--  1 1003  1002  0 Jun  8 18:04 hello_feom_client_u1

Info von Client:
Code:
u1@fc:~ $ touch /mnt/sub/hello_feom_client_u1
u1@fc:~ $ ls -la /mnt/sub/
total 2
drwxr-xrwx  2 u2  u2  3 Jun  8 18:04 .
drwxrwxr-x  3 u2  u2  6 Jun  8 06:07 ..
-rw-r--r--  1 u1  u2  0 Jun  8 18:04 hello_feom_client_u1
u1@fc:~ $ ls -ln /mnt/sub/
total 1
-rw-r--r--  1 1003  1002  0 Jun  8 18:04 hello_feom_client_u1

Ich mache ein touch als u1 und es zeigt dann den Owner u2 an. Trotz nfsuserd? Beim "ls -la" auf dem Client wird es ja wie gewünscht angezeigt? Im tcpdump sehe ich das die Username wie u1@me.local etc übertragen werden.

Ist das ein Bug?
 

schorsch_76

FreeBSD Fanboy
Der BR wurde heute von Rick freebsd-fs zugewiesen und nicht geschlossen. Dann wird das vermutlich als Bug angesehen.
 

schorsch_76

FreeBSD Fanboy
Okay... Ohne nis, LDAP oder kerberos oder gleiche ids funktioniert nfsuserd nicht wie ich es gerne hätte. Siehe br und die Antwort von Rick.
 

Athaba

Libellenliebhaber
Also je nach Anwendungsfall (wenn du unterschiedliche Pfade für User verwendest), könntest du in /etc/exports eventuell mit -mapall arbeiten. Zumindest bei mir klappt das, auch mit unterschiedlichen IDs. Setup ist zwar 12.3, aber eben NFSv4 und kein Kerberos, NIS, etc. Wenn du möchtest kann ich auch mein Setup im Detail schildern. Klappt auch mit vfs.nfs.enable_uidtostring und vfs.nfsd.enable_stringtouid auf 0.
 

schorsch_76

FreeBSD Fanboy
@Athaba das wäre sehr nett von dir!

Mein Fall ist wie folgt: Ich habe momentan eine Linux NAS (wegen dem rtc Problem) welche ein paar shares anbietet. Das sind 2 von einigen Shares. Wenn NFS sauber läuft möchte ich das NAS wieder auf FreeBSD umziehen.

Code:
[mefs]
guest ok = no
comment = foldersync for me
browseable = yes
create mode = 0660
directory mode = 0770
path = /srv/samba/foldersync/me
writeable = Yes
valid users = me
force user = me

[wifefs]
guest ok = no
comment = foldersync for wife
browseable = yes
create mode = 0660
directory mode = 0770
path = /srv/samba/foldersync/wife
writeable = Yes
valid users = wife,me
force user = wife

Jetzt haben diese Verzeichnisse entsprechende uids/gids.

Code:
drwxr-xr-x 1 root  root 18 16. Dez 2020  .
drwxr-xr-x 1 root  root 86 16. Dez 2020  ..
drwxr-xr-x 1 me    root 70  8. Mai 11:59 me
drwxr-xr-x 1 wife  root  0 16. Dez 2020  wife

In den Ordnern sind die uids me:me bzw. wife:wife und 755. Wir haben mehrere Rechner welche unterschiedliche uids haben. Mit Samba kann ich das mit force user handhaben und auf der Client (Linux) Seite mit Mountoptionen um die Userrechte und die uids/gids "schön sauber" zu haben. Da ich meine Linuxkiste immer weniger nutze wollte ich diese abschaffen und nur noch FreeBSD nutzen. Natürlich könnte ich CIFS aka SMB1 nutzen. Das ist aber wie jeder weis nicht gut. Mit Samba dachte ich, das dies praktisch alle OSes können..... smbnetfs funktioniert zwar aber mehr schlecht als recht mit dem unmounten und beschädigten Dateien beim herunterfahren weil der fuse Prozess abgeschossen wird.

Um NFS wie Samba sauber und mit keinen beschädigten Dateien nutzen zu können braucht man dann wohl NIS+Kerberos5+NFSv4. Das frustriert mich.....

Leider hat "mount -t nfs -o nfsv4" keine optionen um die uids,gids auf Clientseite zu setzen. Das der nfsuserd so nutzlos ist hätte ich nicht gedacht. Wenn ich bei ext4 ein toch auf eine neue Datei mache und die Datei hätte ein Ownership eines anderen Nutzers wäre der Aufschrei gewaltig und jeder würde auf Linux schimpfen aber bei nfs ..... works as intended.

Sorry für den Rant....
 
Oben