kerberos credential cache filename with sshd causing problems for long running jobs

Jason Keltz jas at eecs.yorku.ca
Wed Jul 7 20:16:53 EDT 2021


Hi.

I have a question about Kerberos credential caches with sshd and long 
running compute jobs.

If a user logs into our central SSH server, a kerberos credential cache 
is created in /tmp/krb5cc_<uid> as would be expected.

A user can run kinit -R before their 10 hour ticket expiry, up until the 
7 day hard expiry.  It all works the way I would expect.

However, users don't run their compute jobs on the central ssh server.  
They ssh from there to a variety of compute servers. This is where the 
problem occurs.

When the user SSHes to the compute server, the SSHd stores the 
credential cache at /tmp/krb5cc_<uid>_<randomchars> instead of just 
/tmp/krb5cc_<uid>.

As far as I can tell, there's no option to tell SSHd to just use 
/tmp/krb5cc_<uid>.

This creates various problems:

If, after sshing to the compute server, the user starts their compute 
job in the background, then logs out, even if their ticket would still 
have been valid for 10 hours, they soon thereafter lose access to their 
Kerberos NFS home directory because sshd deletes the credential cache 
when they log out.

I could potentially resolve this problem by configuring SSHD to *not* 
clean the credential cache on logout.  However, that creates a new 
problem because now the credential cache files will stay around forever 
(unless I clean them up manually).

If the user wants to say, run a cron/at job that will just run "kinit 
-R" periodically on the compute server to extend their ticket up to 7 
days, this won't work because kinit -R is going to renew the cache in 
/tmp/krb5cc_<uid>, and not /tmp/krb5cc_<uid>_<randomchars> unless the 
user explicitly specifies the cache file location (which will be 
different for each ssh session they start).

In addition, if the user wants to run a really long job, and that job 
will run for longer than 7 days, I can instruct the user to create a 
keytab file, then pass that to kinit periodically via cron, but I'll 
have the same problem -- they would have to specify the full path to 
their credential cache because kinit would otherwise assume the default 
location of /tmp/krb5cc_<uid>.

It all seems very complicated.

I assume that the reason that SSHd creates the sshd credential cache in 
/tmp/krb5cc_<uid>_<randomchars> is so that an ssh session will not share 
the same credential cache with say, a local workstation login.  I could 
imagine a case where you log out of the local workstation, thereby 
destroying your credential cache, but this stops a job running on the 
same workstation via ssh session which is using the same credential cache.

Let's assume that the user won't be logging into the local workstation 
and will only connect via SSH.  Would it be reasonable for me to 
manually copy /tmp/krb5cc_<uid>_<randomchars> to /tmp/krb5cc_<uid> when 
required, then change KRB5CCNAME to point to /tmp/krb5cc_<uid> instead 
of /tmp/krb5cc_<uid>_<randomchars> so that things just work? This way, 
sshd can delete it's cache as required on logout, and the user can 
continue to easily run their compute job (albeit being careful about 
local workstation login versus remote ssh login to the same machine).  
I'm surprised such an option doesn't exist in SSH to tell the daemon not 
to insert the randomchars, but I may be missing the point which is why 
I'm asking for clarification.

I know there are other mechanisms for credential cache.  In my case, 
those won't work on my current installation.

Any thoughts? Thanks for any information you can provide...

Jason.



More information about the Kerberos mailing list