Chapter 1 Securing Your Server and Network(9):使用Kerberos用於身分識別驗證,securingkerberos
原文出處:http://blog.csdn.net/dba_huangzj/article/details/38332605,專題目錄:http://blog.csdn.net/dba_huangzj/article/details/37906349
未經作者同意,任何人不得以“原創”形式發布,也不得已用於商業用途,本人不負責任何法律責任。
前一篇:http://blog.csdn.net/dba_huangzj/article/details/38263043
前言:
在活動目錄(Active Directory)中,有兩種身分識別驗證機制:NTLM和Kerberos。其中NTLM(NT LAN Manager)是基於舊版加密方式的授權協議,微軟不建議再使用。詳情可見:http://msdn.microsoft.com/en-us/library/cc236715.aspx
Kerberos是一個免費的軟體協議,有MIT(麻省理工)首先開發出來,並從Windows 2000開始引入。通過secured tickets(暫時未發現專業術語)的轉換對用戶端和伺服器進行安全識別。相對於使用雜湊密碼,Kerberos通過共用安全加密金鑰來管理身分識別驗證。用戶端和驗證伺服器共用一個對稱金鑰,。其中驗證伺服器成為KDC(Key Distributor Center,密鑰分發中心),並且作為網域控制站的服務運行。
在登入時,用戶端會從KDC中請求一個Ticket Grant Ticket (TGT) ,然後KDC建立一個包含用戶端標識的TGT,並連同把帶有密鑰的會話返回給用戶端。TGT的壽命不長,通常只有8~10小時。過時之後,用戶端不能在訪問資源。
服務標籤(Service ticket)必須包含目標資源(如SQL Server執行個體)的Service Principal Name(SPN,服務主體名稱)。當KDC接收到請求,會回送服務標籤。這個標籤會在後續用於用戶端請求訪問伺服器之用。更多資訊可以訪問:http://technet.microsoft.com/en-us/library/cc772815.aspx
實現:
使用Kerberos,需要在域環境中,並且伺服器的SPN必須已經註冊到Active Directory。如果滿足這些條件,那麼Kerberos應該預設已經使用,可以在SQL Server中檢查:
SELECT auth_scheme, net_transport, client_net_address FROM sys.dm_exec_connections;
如果串連是來自同一個域或者使用NTLM授權的可信任域,需要研究為什麼沒有使用Kerberos。當SQL Server啟動時,會嘗試自動註冊自己的SPN到Active Directory中,如果SQL Server服務帳號沒有許可權,那麼SPN就不能建立,並且Kerberos授權也將不能使用。
檢查SPN是否已經註冊,可以在cmd或者PowerShell中輸入下面的命令:
setspn.exe -L DOMAIN\<SQL service Account>
本人環境下
應該要看到其中一個資訊:
MSSQLSvc/SQL-A.Contoso.com:1433 --格式為:MSSQLSvc/<SQL Server機器名>.<網域名稱>.com:<連接埠號碼>
檢查可見沒有這個資訊,證明沒有成功,所以再上一個圖的結果周鞥只有NTLM授權。通常是因為這個帳號沒有"write public information" 許可權。預設情況下,SQL Server服務帳號如果是一個域使用者安裝的,將沒有這個許可權。
現在把SQL Server服務帳號換成網域系統管理員,再次檢查可見已經得到期待結果了:
如果發現沒有註冊SPN,可以使用下面步驟實現:
1. 在網域控制站的【管理工具】中,選擇【ADSI 編輯器】:
2.串連到【預設命名內容】,尋找服務帳號並且右鍵【屬性】,然後選擇【安全】頁:
3. 對SELF授予【寫入 公用 資訊】,並重啟SQL Server服務:
注意,本機是用contoso\mirroradmin安裝和啟動並執行,所以這裡選擇這個帳號授權。授權完畢之後,重新查詢,可以見到已經有Kerberos連進了了。
原理:
SPN是執行個體的唯一標識,沒有合適的SPN,Kerberos不能驗證一個服務並提供服務標籤來允許用戶端訪問。所以如果沒有SPN,用戶端唯一能用的驗證方式是NTLM,而SPN必須安裝在活動目錄,並且有KDC角色。
SPN的固定格式:<service>/<host>:<port/name>。其中host是完全合格網域名稱(Fully Qualified Domain Name ,FQDN)。
更多資訊:
如果不想授予【寫入公用資訊】到AD上,或者某些原因SPN不能註冊,可以手動執行下面語句建立:
setspn.exe -A MSSQLSvc/SQL-A.Contoso.com:<port> Contoso\SQL-A --其中SQL-A是機器名,contoso是網域名稱
對於Kerberos問題偵測可以閱讀下面文章:
http://blogs.technet.com/b/askds/archive/2008/05/14/troubleshooting-kerberos-authentication-problems-name-resolution-issues.aspx