Linux User Authentication Against Active Directory Using Winbind

This tutorial walks you through configuring CentOS (tested on v7) to allow Active Directory users to authenticate using their AD credentials. This tutorial assumes you already have a functioning AD forest with users & groups.

Install dependencies

sudo yum -y install authconfig krb5-workstation pam_krb5 samba-common \
samba-winbind oddjob-mkhomedir ntp

Run authconfig to build initial authentication configuration

sudo authconfig --disablecache --enablewinbind --enablewinbindauth \
--smbsecurity=ads --smbworkgroup=UNT --smbrealm=UNT.AD.UNT.EDU \
--enablewinbindusedefaultdomain \
--winbindtemplatehomedir=/home/UNT.AD.UNT.EDU/%U \
--winbindtemplateshell=/bin/bash --enablekrb5 \
--krb5realm=UNT.AD.UNT.EDU --enablekrb5kdcdns \
--enablekrb5realmdns --enablelocauthorize --enablemkhomedir \
--enablepamaccess --updateall

Modify /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 = UNT.AD.UNT.EDU
default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24h
forwardable = yes

[appdefaults]
pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
}

Modify /etc/samba/smb.conf

[global]
        client ntlmv2 auth = yes
        kerberos method = secrets and keytab
        encrypt passwords = true
        workgroup = UNT
        security = ads        
        realm = UNT.AD.UNT.EDU
        template homedir = /home/UNT.AD.UNT.EDU/%U
        template shell = /bin/bash
        obey pam restrictions = yes
        unix password sync = yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        pam password change = yes
        map to guest = bad user
        server string = Samba Server Version %v
        # log files split per-machine:
        log file = /var/log/samba/log.%m
        # maximum size of 50KB per log file, then rotate:
        max log size = 50
        passdb backend = tdbsam
        # the following login script name is determined by the machine name
        # (%m):
        # the following login script name is determined by the UNIX user used:
        # use an empty path to disable profile support:
        # various scripts can be used on a domain controller or a stand-alone
        # machine to add or delete corresponding UNIX accounts:
        dns proxy = no
        load printers = yes
        cups options = raw
        allow trusted domains = no
        # obtain a list of printers automatically on UNIX System V systems:
        # Some defaults for winbind (make sure you're not using the ranges
        # for something else.)
        #idmap uid = 10000-900000
        #idmap gid = 10000-900000
        #idmap backend = rid:UNT=10000-900000

        idmap backend = tdb
        idmap uid = 1000000-1999999
        idmap gid = 1000000-1999999
        idmap config UNT : backend  = ad
        idmap config UNT : range = 1000000 - 99999999
        idmap config UNT : schema_mode = rfc2307
        
        winbind enum groups = no
        winbind enum users = no
        winbind use default domain = yes
        winbind refresh tickets = yes
        winbind nested groups = yes
        winbind offline logon = false
        

[homes]
        comment = Home Directories
        browseable = no
        writable = yes

[printers]
        comment = All Printers
        path = /var/spool/samba
        browseable = no
        guest ok = no
        writable = no
        printable = yes

Modify /etc/nsswitch.conf

passwd:         compat winbind
group:          compat winbind
shadow:         compat winbind
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Test that domain authentication via kerberos is working

kinit joe9876

Sync time with the ad domain

sudo ntpdate unt.ad.unt.edu

Join the linux system to the domain

sudo net ads join unt.ad.unt.edu -U adminUser
sudo net ads testjoin

Create home directory structure

sudo mkdir /home/UNT.AD.UNT.EDU
sudo chmod 777 /home/UNT.AD.UNT.EDU

Add members of the itsm-team AD group to sudoers

sudo sh -ec 'echo %itsm-team ALL=\(ALL\) ALL > /etc/sudoers.d/itsm-team'

Maybe a duplicate of other services; however, needed to prevent any AD account from authenticating over SSH

sudo sh -ec 'echo auth include system-auth > /etc/pam.d/unt-ad-auth'
sudo sh -ec 'echo account include system-auth >> /etc/pam.d/unt-ad-auth'
sudo sh -ec 'echo password include system-auth >> /etc/pam.d/unt-ad-auth'
sudo sh -ec 'echo session include system-auth >> /etc/pam.d/unt-ad-auth'
sudo sh -ec 'echo account [default=bad success=ignore] pam_succeed_if.so user ingroup itsm-team quiet >> /etc/pam.d/unt-ad-auth'

Make sure all required services are set to start on boot

sudo chkconfig oddjobd on
sudo chkconfig winbind on 
sudo chkconfig messagebus on
sudo reboot

Try logging in with your AD credentials to see if it works.

Resources