Authenticating Windows domain users on Linux Notebooks

If you're working on a Linux notebook in an Active Directory environment and frequently accessing file shares, you'll soon find yourself annoyed by typing your password all the time. At least, I did. I thought it would be cool to use Kerberos (it is designed for just that use case), but completely rewiring my laptop's auth system to auth using Kerberos wouldn't work because when I'm on the move, there won't be no Domain Controller available, so I wouldn't be able to log in. This is obviously not acceptable.

I came up with a solution that works for me pretty well: My domain user and my local user have the same username and password. I chose to keep it that way, and just instruct PAM to try to reach the DC, and if successful, acquire a Kerberos ticket using the password I just entered. In case this worked, I'd have a Kerberos ticket for my session that I could then use to access file shares or kerberized web servers.

The setup is actually pretty simple. Join the domain, apt-get install libpam-krb5, and put the following lines at the very end of /etc/pam.d/common-auth:

# http://ubuntuforums.org/showthread.php?t=1205604
# skip the next 2 modules, UNLESS we have uid = 1000
auth   [default=2 success=ignore]      pam_succeed_if.so quiet uid eq 1000
# skip the next module, UNLESS we can ping the domain controller
auth    [default=1 success=ignore]     pam_exec.so quiet /bin/ping -c1 -w1 10.5.0.1
# login using kerberos and ignore failures
auth   [authinfo_unavail=ignore success=ok new_authtok_reqd=ok default=ignore] pam_krb5.so use_first_pass minimum_uid=999

This code will get you a Kerberos ticket whenever you're logging in as user id 1000 (to prevent breaking the login for root) and the DC is within reach (to prevent breaking login when you're on the move).

You can easily test this setup by running (as your user):

svedrin@damien:~$ su svedrin
Password:
svedrin@damien:~$ klist
Ticket cache: FILE:/tmp/krb5cc_1000_sBIZIb
Default principal: svedrin@LOCAL.LAN

Valid starting       Expires              Service principal
24.09.2015 21:08:16  25.09.2015 07:08:16  krbtgt/LOCAL.LAN@LOCAL.LAN
        renew until 25.09.2015 21:08:16

Note that I'd always recommend using the DC's IP address in the ping command because a DNS name won't resolve when your DNS server is out of reach.