SSH with Duo MFA and Active Directory

Duo has thorough documentation for adding MFA to your SSH sessions, but there are a couple additional steps needed to also integrate with Active Directory. This post will go through the installation for both Duo and Active Directory for Ubuntu 16.04. For other Linux distros, the Duo documentation linked above has you covered.

System components:

  • Ubuntu 16.04 server
  • Duo MFA account
  • Duo Unix package
  • Centify Express for Active Directory integration

Duo Installation:

Install OpenSSL development headers and libraries:

apt-get install libssl-dev libpam-dev -y

Add Duo repository and install duo-unix package:

echo 'deb http://pkg.duosecurity.com/Ubuntu xenial main' | tee /etc/apt/sources.list.d/duosecurity.list
curl -s https://duo.com/APT-GPG-KEY-DUO | apt-key add -
apt-get update
apt-get install duo-unix

Edit /etc/duo/pam_duo.conf with your integration key, secret key, and API host. You can find these values in the Duo Administration page for your "UNIX Application".

[duo]
; Duo integration key
ikey = XXXXXXXXXXXXXXXXXXXXXXX
; Duo secret key
skey = XXXXXXXXXXXXXXXXXXXXXXX
; Duo API host
host = XXXXXXXXXXXXXXXXXXXXXXX
; Send command for Duo Push authentication
;pushinfo = yes

Centrify Installation:

First, edit /etc/ssh/sshd_config so that ChallengeResponseAuthentication is set to "yes"

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes

Download, unzip, and install Centrify Express:

wget https://downloads.centrify.com/products/centrify-suite/2017-update-1/centrify-suite-2017.1-deb7-x86_64.tgz
tar -xvzf centrify-suite-2017.1-deb7-x86_64.tgz
./install-express.sh

Go through the installation script to connect to your Active Directory environment:

You can type Q at any prompt to quit the installation and exit
the script without making any changes to your environment.

How do you want to proceed? (E|S|X|C|Q) [X]: X
Do you want to continue to install in Express mode? (C|Y|Q|N) [Y]:Y

Do you want to run adcheck to verify your AD environment? (Q|Y|N) [Y]:Y

Please enter the Active Directory domain to check [company.com]: your-domain.com
Join an Active Directory domain? (Q|Y|N) [Y]:Y
    Enter the Active Directory domain to join [your-domain.com]:
    Enter the Active Directory authorized user [administrator]: your-admin
    Enter the password for the Active Directory user:
    Enter the computer name [server-name]:
    Enter the container DN [Computers]:
    Enter the name of the domain controller [auto detect]:
Reboot the computer after installation? (Q|Y|N) [Y]: Y

After the server restarts, you should be able to login with your Active Directory credentials via SSH, but you are not prompted for Duo MFA. To support this, we need to edit /etc/pam.d/common-auth as follows:

# lines inserted by Centrify Direct Control { CentrifyDC 5.4.1-455 }
#auth   sufficient      pam_centrifydc.so
#auth   requisite       pam_centrifydc.so deny
auth    requisite       pam_centrifydc.so

# here are the per-package modules (the "Primary" block)
#auth   [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite       pam_unix.so nullok_secure
auth  [success=1 default=ignore] /lib64/security/pam_duo.so

In both sections, I commented out the existing config and added the necessary lines so that pam_duo is used after a successful pam_centrifydc authentication.

Next, we need to edit /etc/pam.d/sshd and comment out "@include common-auth" so we can add the Centrify and Duo PAM modules (but we don't need pam_unix):

# Standard Un*x authentication.
#@include common-auth
auth    requisite       pam_centrifydc.so
auth    [success=1 default=ignore]      /lib64/security/pam_duo.so
auth    requisite       pam_deny.so
auth    required        pam_permit.so

You should be able to SSH to the server with your Active Directory credentials, and then be prompted for Duo MFA (assuming you have a Duo account that matches your AD username)

Active Directory Group Restriction:

You may also want to restrict SSH access to users in a certain Active Directory group. This can be done with two lines in /etc/ssh/sshd_config at the end of the config, after "UsePAM yes":

UsePAM yes
#########
UseDNS no
AllowGroups root your-group-name

Be sure to add the 'root' group so that you can still manage your server with the root account if needed. Restart SSH and your group restriction will be in effect:

service ssh restart