Sorry for the delay in reply. Had a few busy days.

On Tue, Jul 15, 2014 at 7:15 PM, Jakub Hrozek <jhro...@redhat.com> wrote:

> On Mon, Jul 14, 2014 at 09:58:11PM +0300, Noam Meltzer wrote:
> > On Mon, Jul 14, 2014 at 7:21 PM, Jakub Hrozek <jhro...@redhat.com>
> wrote:
> >
> > > On Fri, Jun 27, 2014 at 09:44:34AM +0300, Noam Meltzer wrote:
> > > > Follow patches are the code implementing design document:
> > > > https://fedorahosted.org/sssd/wiki/DesignDocs/rpc.idmapd%20plugin
> > > >
> > > > Changes compared to v2 of this patch:
> > > >  * rebase over rev. 8ca18752 (current master)
> > > >  * remove man pages from the patch (will be sent separately)
> > > >  * add new contact details for plugin author
> > > >  * code style
> > > >  * remove sss_nfs_make_request() wrapper
> > > >  * fix typo in reply_to_name(): REPLY_ID_OFFSET -> REPLY_NAME_OFFSET
> > >
> > > Thanks for these changes! The patches look good with one nitpick, which
> > > I can fix locally before pushing and one packaging question. I'll ask
> > > those inline when replying to the patches themselves.
> > >
> > > But more importantly, I have a question on testing the patches. I admit
> > > my NFS internals knowledge is quite lacking, so maybe these are basic
> > > questions..how exactly do I make sure the plugin mapping functions are
> > > called? I tried attaching gdb to rpc.idmapd and doing various
> operations
> > > to the file (ls, echo "foo" >> file) etc but still no luck. Disabling
> > > the sss nsswitch plugin just yields UIDs and GIDs on the client (which
> > > is
> > >
> > > For my test, I configured a server and a client. I can mount the shares
> > > just fine, I see I'm using NFSv4 in the mount(8) output. I can see the
> > > sss plugin was loaded, because journalctl -u nfs-idmap.service says:
> > > Jul 14 12:01:21 master.ipa.example.com rpc.idmapd[24320]: rpc.idmapd:
> > > sss_nfs_init: use memcache: 1
> > > Jul 14 12:01:21 master.ipa.example.com rpc.idmapd[24320]: rpc.idmapd:
> > > libnfsidmap: loaded plugin /lib64/libnfsidmap/sss_nfs.so for method
> > > sss_nfs
> > >
> > > My idmapd.conf file looks quite simple:
> > > --------------------
> > > [General]
> > > Verbosity = 2
> > > Domain = ipa.example.com
> > >
> > > [Mapping]
> > > Nobody-User = nfsnobody
> > > Nobody-Group = nfsnobody
> > >
> > > [Translation]
> > > Method = sss_nfs
> > >
> > > [Static]
> > >
> > > [UMICH_SCHEMA]
> > > nk --------------------
> > )>
> > > I guess I could also ask -- where does the rpc.idmapd daemon hook into
> > > the system? When exactly are the translation functions called?
> > >
> >
> > The idmapd.conf looks good (assuming that your LDAP domain really is
> > ipa.example.com).
> >
> > Regarding how rpc.idmapd operation:
> > 1. There's the feature wiki:
> > https://fedorahosted.org/sssd/wiki/DesignDocs/rpc.idmapd%20plugin
> > I'm not sure that it answers your question though. (so I'll make sure to
> > update it following this email thread)
>
> I'm aware of the design document, but I was more interested in some
> user-facing documentation. Something we could give to the admins to tell
> them what are the benefits and how to leverage them.
>
> Oh, sorry. Gotcha now. Here goes: (I think it should also go to the
manpage & wiki page, what do you think?)

  The sss_nfs plugin is useful on systems designated as dedicated NFS
servers.
Background: With NFSv4 it is required to be able to translate between
usernames/groupnames sent on the wire to uid/gids and vice versa. The
traditional way of achieving this is by having the OS aware of the various
NFS users/groups and then retrieve the user<->uid / group<->gid information
from the OS.
However, that methodology poses a security concern which requires special
attention. The sss_nfs plugin overcomes this issue by providing direct
communication path between rpc.idmapd (+ libnfsidmap) and sssd.



> >
> > 2. rpc.idmapd listens for events (queries) from the kernel over a named
> > pipe. once such an event arrives, rpc.idmapd will start the mapping
> process
> > using libnfsidmap.
>
> OK, thanks, that's very helpful, but how/when does the kernel receive
> the event ? How can I trigger that even as admin or a user using NFS
> client+server ? For instance, if you run "ls -l", is there anything more
> than the id->name conversion using getpwuid() ? I realize these might be
> basic questions, so feel free to point me to docs..
>
These are good questions. Unfortunately (for me) the answer is not well (or
maybe not at all) documented. I'll try to provide a good explanation
without going too much into details.

Assume a NFSv4 setup:
Server = Fedora20, kernel NFS server.
Client(s) = Various linuxes, other UNIXes.

On the very basic level:
When a client send a GETATTR request on the wire (in a sense, similar to
stat(2)), the server will perform the following operations to retrieve the
info:
* Read the uid/gid from the file on disk
* Send a request on a well defined named-pipe requesting uid/gid to
username/groupname mapping.
* rpc.idmapd will receive the request and perform the mapping using
libnfsidmap (and here comes the sss_nfs plugin...)
* respond will be sent on a well defined named-pipe to the kernel.
* kernel nfs server will send the information (the username/groupname) over
the wire as strings.

Once the client receives the information over the wire it will need to
translate the username/groupname back to uid/gid. The actual mechanism is
out of scope for this email, but if the client is Fedora20, the NFS client
will run an upcall to "/usr/sbin/request-key" to perform the translation.

Sounds simple? Now lets make it complicated:
* Caching might be available both on client side and server side.
* On recent linux kernels (not sure which versions), if sec=sys is used on
the NFS export, there will be a short-circuit sending the uid/gid as a
string over the wire (check manpage exports(5), section about sec= for more
info) thus translation is not performed.
* There are different NFS clients & servers: linux vs. UNIX vs. commercial
NFS products (NetApp, for example). Each one implementing the NFS protocol
a bit differently.

So... How to test a full system with Fedora20 client & server?
Having a kerberised NFS setup is one option. However, this might be a pain
in the neck to setup (if you don't have one already).
A more simpler solution is to use the "sec=sys" and disable the
short-circuit described above:
echo N > /sys/module/nfsd/parameters/nfs4_disable_idmapping
echo N > /sys/module/nfs/parameters/nfs4_disable_idmapping

If when doing "ls -l" on a directory with files, you see the permissions
you expected to see, then test was successful.


> > libnfsidmap on its turn will dlopen(3) the relevant plugin (sss_nfs in
> our
> > case) and call the relevant functions from 'struct trans_func'.
> >
> >
> > How to test:
> > libnfsidmap.git comes with a small C code named "libtest.c" which allows
> > you to directly test the various function from 'struct trans_func'.
> > I modified this code a bit to match our needs (and attached to this
> email).
> > compile/link with:
> > gcc -o libtest libtest.c  -lnfsidmap
> >
> > run like this:
> > $ ./libtest noam@localdomain 0 users@localdomain 101
> >
> > expected output:
> > input: user=noam@localdomain uid=0 group=users@localdomain gid=101
> > nfs4_name_to_uid: username noam@localdomain has uid 1000
> > nfs4_name_to_gid: username users@localdomain has gid 100
> > nfs4_uid_to_name: uid 0 has name root@localdomain
> > nfs4_gid_to_name: gid 101 has name libuuid@localdomain
>
> Thank you, I will test using the program so far.
>
> >
> >
> > Unfortunately, I don't have an LDAP environment at the moment to test it
> > myself. So what you see here is the result of the default idmapd.conf
> > running with the "nss" plugin (going to /etc/passwd ...)
>
> np, I can test with your program. Thanks again.
>
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to