/etc/auto.smb is a script used by autofs to make Windows file servers 
accessible to the automounter. The script basically works by by parsing the 
output of 'smbclient -L SERVER'. My workplace has a fairly vanilla FreeIPA 
setup with a one-way trust to an Active Directory domain, and in order for 
smbclient to be able to list a file server's shares, it has to be able to 
access the Kerberos ticket cache of the user who requested the mount in order 
to authenticate to the file servers.

This isn't easy, because the script is launched by autofs, so it doesn't really 
know anything about the user other than its UID and name. The standard script 
just checks in some standard hardcoded locations: 
DIR:/run/user/$AUTOFS_UID/krb5_cc_* and /tmp/krb5cc_$AUTOFS_UID; there's no 
support for other locations, or any of the more interesting credential cache 
types.

I discovered that SSSD has a 'ccacheFile' attribute that points to the location 
of the user's Kerberos ticket cache. After adding '+ccacheFile' to 
[ifp]user_attributes in sssd.conf and restarting sssd, the following patch to 
/etc/auto.smb  got things working.

The patch is pretty straightforward, it just retrieves the ccacheFile attribute 
via the sssd infopipe API:

--- /usr/share/autofs/conffiles/auto.smb        2020-01-15 22:04:23.000000000 
+0000
+++ /etc/auto.smb       2020-06-28 19:07:01.941702373 +0100
@@ -24,7 +24,19 @@
 
 get_krb5_cache() {
     cache=
-    uid=${UID}
+    uid=${AUTOFS_UID}
+    # This requires busctl, jq, sssd's infopipe responder, and for sssd.conf 
to contain [ifp]user_attributes = +ccacheFile
+    # ... maybe we should just su to the user to run smbclient?
+    if [[ -x /usr/bin/busctl ]] && [[ -x /usr/bin/jq ]]; then
+        _user_obj=$(busctl -j call org.freedesktop.sssd.infopipe 
/org/freedesktop/sssd/infopipe/Users org.freedesktop.sssd.infopipe.Users 
FindByID u "$uid" | jq -r '.data[0]')
+        if [[ -n $_user_obj ]]; then
+            cache=$(busctl -j get-property org.freedesktop.sssd.infopipe 
"$_user_obj" org.freedesktop.sssd.infopipe.Users.User extraAttributes | jq -r 
'.data.ccacheFile[0]')
+            if [[ -n $cache ]]; then
+                return
+            fi
+        fi
+    fi
     for x in $(ls -d /run/user/$uid/krb5cc_* 2>/dev/null); do
         if [ -d "$x" ] && klist -s DIR:"$x"; then
            cache=DIR:$x

So, I come to this list to find out whether this is a good idea or not: is this 
attribute an implementation detail, or something that a client of sssd can rely 
upon? If not, would you consider making it stable, or provide another mechanism 
to retrieve a user's Kerberos credential cache location--or else propose 
another mechanism (e.g., I suppose the script _could_ use runuser, su or sudo, 
etc., to run smbclient as the requesting user, which would automatically pick 
up KRB5CCNAME via pam_sssd.so)... would that be a better way to do this?

(It appears that the cifs code within the kernel itself has a similar problem; 
it is able to find a user's Kerberos credentials by use of cifs.upcall(8), 
which peeks into the environment of the process that caused a key to be 
requested, and uses the value of KRB5CCNAME that it finds there. autofs can't 
do something similar because the kernels doesn't make the PID of the requesting 
process available to it.)

BTW, I might have run into a bug while figuring out the above. I noticed that 
changes to [libdefaults]default_ccache_name in krb5.conf weren't taking effect 
even after a reboot! It turns out that pam_sss.so sets KRB5CCNAME during login 
to the value from its cache, rather than from krb5.conf. I ended up using 
ldbedit to remove the ccacheFile  attribute from my user record and logging in 
again, whereupon the attribute was added again with the new expected value.

-- 
Sam Morris <https://robots.org.uk>
_______________________________________________
sssd-users mailing list -- [email protected]
To unsubscribe send an email to [email protected]
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/[email protected]

Reply via email to