To get the APM Cookbook series moving along, I’ve decided to help out by documenting the common APM solutions I help customers and partners with on a regular basis.

Kerberos SSO is nothing new, but seems to stump people who have never used Kerberos before. Getting Kerberos SSO to work with APM is straight forward once you have the Active Directory components configured.

Overview

I have a pre-configured web service (IIS 7.5/Sharepoint 2010) that is configured for Windows Authentication, which will send a “Negotiate” in the header of the “401 Request for Authorization”. Make sure the web service is configured to send the correct header before starting the APM configuration by accessing the website directly and viewing the headers using browser tools.

In my example, I used the Sharepoint 2010/2013 iApp to build the LTM configuration. I’m using a single pool member, sp1.f5.demo (10.10.30.2) listening on HTTP and the Virtual Server listening on HTTPS performing SSL offload.

Step 1 - Create a delegation account on your domain

1.1 Open Active Directory Users and Computers administrative tool and create a new user account.

  • User logon name: host/apm-kcd.f5.demo
  • User logon name (pre-Windows 2000): apm-kcd
  • Set the password and not expire

Screen Shot 2014-04-14 at 9.07.48 am

1.2 Alter the account and set the servicePrincipcalName. Run setspn from the command line:

  • setspn –A host/apm-kcd.f5.demo apm-kcd

Screen Shot 2014-04-14 at 9.12.21 am

A delegation tab will now be available for this user.

Step 2 - Configure the SPN

2.1 Open Active Directory Users and Computers administrative tool and select the user account created in the previous step.

  • Edit the Properties for this user
  • Select the Delegation tab
  • Select: Trust this user for delegation to specified services only
  • Select: Use any authentication protocol
  • Select Add, to add services.
  • Select Users or Computers…
  • Enter the host name, in my example I will be adding HTTP service for sp1.f5.demo (SP1).

Screen Shot 2014-04-28 at 9.36.45 pm

  • Select Check Names and OK

Screen Shot 2014-04-28 at 9.39.41 pm

  • Select the http Service Type and OK

Screen Shot 2014-04-14 at 9.28.59 am

2.2 Make sure there are no duplicate SPNs and run setspn –x from the command line.

Screen Shot 2014-04-14 at 9.36.54 am

Step 3 - Check Forward and Reverse DNS

DNS is critical and a missing PTR is common error I find when troubleshooting Kerberos SSO problems.

From the BIG-IP command line test forward and reverse records exist for the web service using dig:

# dig sp1.f5.demo

;; QUESTION SECTION:

;sp1.f5.demo. IN A

;; ANSWER SECTION:

sp1.f5.demo. 1200 IN A 10.10.30.2

# dig -x 10.10.30.2

;; QUESTION SECTION:

;2.30.10.10.in-addr.arpa. IN PTR

;; ANSWER SECTION:

2.30.10.10.in-addr.arpa. 1200 IN PTR sp1.f5.demo.

Step 4 - Create the APM Configuration

In this example I will use a Logon Page to capture the user credentials that will be authenticated against Active Directory and mapped to the SSO variables for the Kerberos SSO.

4.1 Configure AAA Server for Authentication

Access Policy >> AAA Servers >> Active Directory >> “Create”

Supply the following:

  • Name: f5.demo_ad_aaa
  • Domain Name: f5.demo
  • Domain Controller: (Optional – BIG-IP will use DNS to discover if left blank)
  • Admin Name and Password

Select “Finished" to save.

Screen Shot 2014-04-14 at 9.59.57 am

 

4.2 Configure Kerberos SSO

Access Policy >> SSO Configurations >> Kerberos >> “Create”

Supply the following:

  • Name: f5.demo_kerberos_sso
  • Username Source: session.sso.token.last.username
  • User Realm Source: session.ad.last.actualdomain
  • Kerberos Realm: F5.DEMO
  • Account Name: apm-kcd (from Step 1)
  • Account Password & Confirm Account Password (from Step1)

Select “Finished” to save.

Screen Shot 2014-04-14 at 10.28.42 am

4.3 Create an Access Profile and Policy

We can now bring it all together using the Visual Policy Editor (VPE).

Access Policy >> Access Profiles >> Access Profile List >> “Create”

Supply the following:

  • Name: intranet.f5.demo_sso_ap
  • SSO Configuration: f5.demo_kerberos_sso
  • Languages: English (en)
  • Use the default settings for all other settings.

Select “Finished” to save.

Screen Shot 2014-04-14 at 4.22.36 pm

Screen Shot 2014-04-14 at 4.23.54 pm

4.4 Edit the Access Policy in the VPE

Access Policy >> Access Profiles >> Access Profile List >> “Edit” (intranet.f5.demo_sso_ap)

On the fallback branch after the Start object, add a Logon Page object.

  • Leave the defaults and “Save”.

Screen Shot 2014-04-17 at 4.04.28 pm

On the fallback branch after the Logon Page object, add an AD Auth object.

  • Select the Server

Screen Shot 2014-04-17 at 4.07.19 pm

  • Select “Save” when your done.

Screen Shot 2014-04-17 at 4.12.44 pm

On the Successful branch after the AD Auth object, add a SSO Credential Mapping object.

Screen Shot 2014-04-17 at 4.24.10 pm

  • Leave the defaults and “Save”.

 

On the fallback branch after the SSO Credential Mapping, change Deny ending to Allow. The finished policy should look similar to this:

Screen Shot 2014-04-17 at 4.34.10 pm

Don't forget to “Apply Access Policy”.

 

Step 5 – Attach the APM Policy to the Virtual Server and Test

5.1 Edit the Virtual Server

Local Traffic >> Virtual Servers >> Virtual Server List >> intranet.f5.demo_vs

Scroll down to the Access Policy section and select the Access Profile.

Screen Shot 2014-04-23 at 9.49.53 pm

Select “Update” to save.

5.2 Test

Open a browser, access the Virtual Server URL (https://intranet.f5.demo in my example), authenticate and verify the client is automatically logged on (SSO) to the web service. To verify Kerberos SSO has worked correctly, check /var/log/apm on APM by turning on debug. You should see log events similar to the ones below when the BIG-IP has fetched a Kerberos Ticket.

info websso.1[9041]: 014d0011:6: 33186a8c: Websso Kerberos authentication for user 'test.user' using config '/Common/f5.demo_kerberos_sso'
debug websso.1[9041]: 014d0018:7: sid:33186a8c ctx:0x917e4a0 server address = ::ffff:10.10.30.2
debug websso.1[9041]: 014d0021:7: sid:33186a8c ctx:0x917e4a0 SPN = HTTP/sp1.f5.demo@F5.DEMO
debug websso.1[9041]: 014d0023:7: S4U ======> ctx: 33186a8c, sid: 0x917e4a0, user: test.user@F5.DEMO, SPN: HTTP/sp1.f5.demo@F5.DEMO
debug websso.1[9041]: 014d0001:7: Getting UCC:test.user@F5.DEMO@F5.DEMO, lifetime:36000
debug websso.1[9041]: 014d0001:7: fetched new TGT, total active TGTs:1
debug websso.1[9041]: 014d0001:7: TGT: client=apm-kcd@F5.DEMO server=krbtgt/F5.DEMO@F5.DEMO expiration=Tue Apr 29 08:33:42 2014  flags=40600000
debug websso.1[9041]: 014d0001:7: TGT expires:1398724422 CC count:0
debug websso.1[9041]: 014d0001:7: Initialized UCC:test.user@F5.DEMO@F5.DEMO, lifetime:36000 kcc:0x92601e8
debug websso.1[9041]: 014d0001:7: UCCmap.size = 1, UCClist.size = 1
debug websso.1[9041]: 014d0001:7: S4U ======> - NO cached S4U2Proxy ticket for user: test.user@F5.DEMO server: HTTP/sp1.f5.demo@F5.DEMO - trying to fetch
debug websso.1[9041]: 014d0001:7: S4U ======> - NO cached S4U2Self ticket for user: test.user@F5.DEMO - trying to fetch
debug websso.1[9041]: 014d0001:7: S4U ======> - fetched S4U2Self ticket for user: test.user@F5.DEMO
debug websso.1[9041]: 014d0001:7: S4U ======> trying to fetch S4U2Proxy ticket for user: test.user@F5.DEMO server: HTTP/sp1.f5.demo@F5.DEMO
debug websso.1[9041]: 014d0001:7: S4U ======> fetched S4U2Proxy ticket for user: test.user@F5.DEMO server: HTTP/sp1.f5.demo@F5.DEMO
debug websso.1[9041]: 014d0001:7: S4U ======> OK!

Conclusion

Like I said in the beginning, once you know how Kerberos SSO works with APM, it’s a piece of cake!