Using Kerberos with SQL Server

Using Kerberos with SQL Server

Rate This
  • Comments 47

Kerberos is a widely accepted network authentication protocol that is used to provide a highly secure method to authenticate users.  Reliance is placed upon a trusted third party called the Key Distribution Center (KDC) to facilitate the generation and secure distribution of authentication tokens and symmetric session keys.  In a Windows environment, the operation of the KDC is assumed by the Domain Controller (DC) using the Active Directory (AD).  Furthermore, all Windows domain users are effectively Kerberos principals and are capable of engaging in Kerberos authentication.

Among the key benefits of Kerberos authentication that make it popular are:

  • Mutual authentication (the client can validate the identity of the server principal)
  • Secure authentication tickets (only encrypted tickets are used and passwords are never included in the ticket)
  • Integrated authentication (single sign-on, i.e., once the user is logged on, s/he does not need to log on again to access any service that supports Kerberos authentication)

Kerberos with SQL Server

SQL Server 2005 (and 2000) supports Kerberos indirectly through the Windows SSPI interface when using Windows integrated authentication (as opposed to SQL authentication).  However, Kerberos will only be used under certain circumstances as SQL Server allows SSPI to negotiate the authentication protocol to use; if Kerberos cannot be used, then Windows will fall back NTLM authentication.  Kerberos authentication is far more desirable than NTLM from a security (and, to a lesser degree, performance) point of view and I think it’s important to understand how to ensure Kerberos is used for remote connections when possible.  If you're using integrated auth, you need to make sure that the follow are done:

  1. Both the client and server machines must be part of the same Windows domain, or else trusted domains.
  2. The server's Service Principal Name (SPN) must be registered with the Active Directory (I'll explain this in more detail below)
  3. The client must connect to the server using TCP/IP.  Assuming that the server has TCP/IP enabled, this can be accomplished by either placing TCP/IP at the top of the client's protocol order or else prefixing the connection string with "tcp:"

Registering an SPN

 

The SPN is essentially a mapping between a principal name and the Windows account that started the server instance service.  This is needed because the client will use the server’s hostname and the TCP/IP port to which it connects to compose an SPN.  If the SPN mapping has not been performed, then the Windows security layer will be unable to determine the account associated with the SPN and Kerberos authentication will not be used.  In an attempt to facilitate this, the SQL Server 2005 instance will automatically try to register the SPN with the AD at startup if TCP/IP is enabled.  The problem is, however, that only a domain administrator or a Local System account has the authority to register an SPN.  Therefore, in the majority of cases where the service is started under a normal account, SQL Server will be unable to register the SPN for the instance.  This will not prevent the instance from starting but you will see the following entry in the error log:

 

The SQL Network Interface library could not register the Service Principal Name (SPN) for the SQL Server service. Error: 0x2098. Failure to register an SPN may cause integrated authentication to fall back to NTLM instead of Kerberos. This is an informational message. Further action is only required if Kerberos authentication is required by authentication policies.

 

The alternative is to have a domain admin manually register the SPN for the instance.   The format for an SPN is MSSQLSvc/FQDN:tcpport, where FQDN is the fully qualified domain name of the server and tcpport is the TCP/IP port number.  To register the SPN, the administrator will need to use the SetSPN.exe tool which is available from the Windows server resource kit (for Windows 2K3, you can find it here, http://support.microsoft.com/default.aspx?scid=kb;en-us;892777).  An example of the command is:

 

           setspn -A MSSQLSvc/myhost.redmond.microsoft.com:1433 accountname

 

If an SPN already exists, then it must be deleted before it can be re-registered.  This is accomplished by a domain admin using the setspn -D command.

 

To verify that Kerberos authentication is being used, you may query the sys.dm_exec_connections DMV and look under the auth_scheme column, e.g.

 

select auth_scheme from sys.dm_exec_connections where session_id=@@spid

 

If Kerberos is being used, then it will display “KERBEROS”.

 

I should also mention that if the instance automatically registered an SPN at startup, then it will unregister it when the instance is stopped.

 

Potential Problems

 

If instance is configured to listen to a different port, then the SPN will need to be deleted and recreated using the new port number.  The problem is worse if the server is configured to use dynamic IP addresses as, potentially, a new SPN must be configured every time the server is started.  I recommend that a static IP address be used so that the SPN need only be registered once.  In addition, using a static IP address provides the additional benefit that the client can specify the TCP/IP directly in the connection string.  Doing this will prevent the need to rely upon SQL Browser to determine the port number (SQL Browser communication uses an unauthenticated UDP channel).

 

A couple of other considerations that are documented in the BOL are (i) the Dedicated Admin Connection (DAC) only uses NTLM so no SPN is registered for the DAC connection, and (ii) if the instance is configured to listen to multiple IP addresses, then the server will only attempt to automatically register the SPN using the first port that it identifies.

Il-Sung Lee
Program Manager, SQL Server Protocols

Disclaimer: This posting is provided "AS IS" with no warranties, and confers no rights

Leave a Comment
  • Please add 1 and 8 and type the answer here:
  • Post
  • Is the select statement "to verify that Kerberos authentication is being used" for SQL 2005? If so, is there an equivilant for SQL 2000?
    Thanks,
    Al.
  • Unfortunately, querying resulting SSPI auth package of SPNEGO, whether it is NLTM or Kerberos, is not available in SQL 2000. This is new feature added in SQL 2005.
  • Will this also work when using the NT Authority\Network Service account to control the SQL Server instances?  
  • The “Cannot generate SSPI context” issue is described by http://support.microsoft.com/?id=811889 in general....
  • After manually registering the spn for the sql server service account we still are receiving this error. The results of the above query are still displaying NTLM. Is there a work around to this problem?
  • Hi, Bill

       1)Did you successfully register the SPN through Setspn.exe?
       2)you still receive which error?0x2098? If so, that means you are using invalid account to register SPN, check your DC to verify this account.
       3)Did you enable TCP/IP protocol and restart server?
       4)which service account your sql server is running under? It should be admin account such as domain admin account or localsystem account.
       5)Which OS you came across this problem, XP?

    In a word, try setspn.exe( here is a useful link about setspn, http://technet2.microsoft.com/WindowsServer/en/Library/b3a029a1-7ff0-4f6f-87d2-f2e70294a5761033.mspx?mfr=true), see if you can register SPN? if it report error 0x2098, it means the account is invalid, contact your domain administrator to check the account in DC.

    Thanks!
    Ming.
  • I think I may have a firewall issue, but if someone could look at the following and shed some light or toss a tip I would be highly appreciative.

    I have a server ServerA which resolves internally to ServerA.windomain.co and externally to Somename.Outside.Com
    I am using a Domain Account and verified the SPN's are correct via setspn -L and can log in using a trusted connection via any of the following internally:
    tcp:ServerA.windomain.co,1433
    ServerA.windomain.co
    Somename.Outside.Com
    tcp:Somename.Outside.Com,1433
    tcp:ComputerName,1433
    Each of the above returns 'Kerberos' when checking the sys.dm_exec_connections system view.

    However, from outside, Somename.Outside.Com (and all variations) returns 'Cannot Generate SSPI Context'.  ping -a resolves correctly and connecting to Somename.Outside.com / direct IP via SQL authentication works fine. Also connects fine (as assumed) when using a VPN.

    I've done Matt's (http://blogs.msdn.com/sql_protocols/archive/2005/10/15/481297.aspx) delete SPN trick successfully, checked every setting under the KB articles and 'Cannot Generate SPPI Context' blog and the outside clients are members of the same domain.
    Is there an additional port (besides 1433) that is required when using SSPI?

    Server: SQL 2005 Server Standard Edition SP1
    Windows 2003 SP1
    Clients: Windows XP SP2 w/ SQL 2005 Express SP1
  • Hi,Adarro

      First, double check "ping -a" returns the correct fully qualified domain name like somename.Outside.Com? Can you connect by using "sqlcmd /S somename /E" ? Are the client and server in the same domain, right? what is the client FQDN?

      Secondly, please download setspn.exe and klist.exe from SQL Server 2003 Resource Kit. And do "setspn -L <servermachinename>" whether you saw something like "MSSQLSvc/<server FQDN>:1433" ? If there is, could you contact you domain administrator to delete this SPN or use "setspn -D <SPN> machinename ", then try:
      (1) change your sql server service to run under localsystem account.
      (2) restart the service.
      (3) test the connection and let me know what you get.

      If there is no SPN, then go to your client box, do "klist -purge" and retry connection, let me know what you get.

    Good Luck!
    Ming.

  • We're having an issue with linked servers/Kerberos and SPN's.

    SPN is registered. Everything works ok.
    However it seems like every day or every other day the linked server breaks reverting back to NTLM. What gives? Checked SPN -l...service is there.
    Kerberos debugging on....no noticeable errors.
    Able to receive tgt and service tickets.
    Checked everything under the sun. Any suggestions as to why it works one day and then breaks?
  • I'd suggest taking a network trace from the middle tier server for request from both client and the backend server.

    Also, check the settings according to the article "Troubleshooting Kerberos Delegation" http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/tkerbdel.mspx
  • SQL Server 2005: “Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'”.
    SQL Server 2000: “Login failed...
  • We just had a similar issue to hte one described above. In the end we resolved it by drop/creating the linked servers on both sides.
  • Take a look at Nan's recent blog about the "Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'” error message with DQ.

    Thanks,
    Il-Sung.
  • In my implementation, even after registering the SPN connections from SQL Server management Studio on the local box using TCP/IP always used NTLM.  Any connections from other boxes in the domain used Kerberos.

  • In my company we use 2 SQL servers 2000 and the link works fine...

    Both servers are mixed mode. Everyone but my NT Login...

    When I'm executing something that has to read data from the other server : I get the Error Login Failed for user null.

    My Nt login has rights on both servers. I've tried  in Server Client Network Util to use names pipes / tcp/ip nothing worked.

    We checked with Network Admin settings of my account to another that works and we have no differences!!!

    I'm Lost !!!

    Thx

Page 1 of 4 (47 items) 1234