Firstly a note of warning. I’ve done this mostly using CentOS but there’s no reason it shouldn’t work just as well on other distributions. I’ve gleaned a lot of this information by scouring a lot of other resources around the internet, FAQs, newsgroups etc. but as far as I can remember I wasn’t able to find a coherent article which described all of the required pieces of the puzzle.
Secondly the objective of this article is to have unified accounting across Windows & Linux, or at least as close as possible. We’re going to use Microsoft Active Directory, Kerberos, Samba, Winbind, pam and nsswitch. We’re also going to end up with consistent uids and gids across multiple linux clients.
/etc/samba/smb.conf
[global]
workgroup = PSYPHI
realm = PSYPHI.LOCAL
security = ADS
allow trusted domains = No
use kerberos keytab = Yes
log level = 3
log file = /var/log/samba/%m
max log size = 50
printcap name = cups
idmap backend = idmap_rid:PSYPHI=600-20000
idmap uid = 600-20000
idmap gid = 600-20000
template shell = /bin/bash
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
/etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = PSYPHI.LOCAL
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24h
forwardable = yes
[realms]
EXAMPLE.COM = {
kdc = kerberos.example.com:88
admin_server = kerberos.example.com:749
default_domain = example.com
}
PSYPHI.LOCAL = {
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
psyphi.local = PSYPHI.LOCAL
.psyphi.local = PSYPHI.LOCAL
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
Next we join the machine to the AD domain – it’s necessary to specify a user with the right privileges. It also prompts for a password.
net ads join -U administrator
We can check things are working so far by trying to create a kerberos ticket using an existing username. Again it prompts us for a password.
kinit (username)
Then klist
gives us output something like this:
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: username@PSYPHI.LOCAL
Valid starting Expires Service principal
04/28/10 10:57:32 04/28/10 20:57:34 krbtgt/PSYPHI.LOCAL@PSYPHI.LOCAL
renew until 04/29/10 10:57:32
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
Cool, so we have a machine joined to the domain and able to use kerberos tickets. Now we can tell our system to use winbind for fetching account information:
/etc/pam.d/system-auth-ac
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth sufficient pam_krb5.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account [default=bad success=ok user_unknown=ignore] pam_krb5.so
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password sufficient pam_krb5.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required /lib/security/pam_mkhomedir.so
session required pam_unix.so
session optional pam_krb5.so
If we’re on a 64-bit distribution we’ll find that references to /lib need to be switched for /lib64, e.g. /lib64/security/pam_mkhomedir.so . This file will also create new home directories for users if they’re not present during first log-in.
/etc/nsswitch.conf
passwd: files winbind
shadow: files winbind
group: files winbind
hosts: files dns
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
netgroup: nisplus
publickey: nisplus
automount: files nisplus
aliases: files nisplus
Now we need to tell a few services to start on boot
chkconfig smb on
chkconfig winbind on
and start a few services now
service smb start
service winbind start
The Winbind+pam configuration can sometimes take a few minutes to settle down – I occasionally find it’s necessary to wait 5 or 10 minutes before accounts are available. YMMV.
getent passwd
Should now list local accounts (which take precedence) followed by domain accounts. Using ssh to the box as a domain user should make new home directories in /home/PSYPHI/username. If you decide to migrate home directories from /home make sure you change uid and gid to the new domain values for that user, then remove the old local account.
There are a handful of limitations of this approach –
- Though usernames and groupnames map ok, linux uids still don’t map to the windows uids so permissions don’t quite work across smb/cifs mounts
- The standard linux tools for user & group modification don’t work for domain accounts (adduser/usermod/groupadd/… etc.)
- Winbind seems unstable. On a lot of systems I’ve resorted to cronning a
service winbind restart
every 15 minutes, which seriously sucks - … and probably others too
For debugging /var/log/secure
is very useful, as are the samba logs in /var/log/samba/
.