MSSQLSvc 服務主體名稱、Kerberos 和 NTLM
最近正在幫助 DBA 解決似乎與無效 SPN 相關的問題。發現大量 SQL 服務帳戶根本沒有設置 SPN,從而導致 NTLM 身份驗證。
我已將 SPN 配置添加到我們的建構過程中,但我不確定使用 NTLM 回到現有系統並配置 SPN 以允許 Kerberos 身份驗證是否會破壞任何東西。
是否存在配置 MSSQLSvc SPN 以允許 Kerberos 身份驗證的任何常見情況,這會破壞通過 NTLM 正常執行的現有系統?
這是我正在使用的程式碼:
#Query to identify authentication type for various connections on a SQL server $query = "SELECT s.session_id, c.connect_time, s.login_time, s.login_name, c.protocol_type, c.auth_scheme, s.HOST_NAME, s.program_name FROM sys.dm_exec_sessions s JOIN sys.dm_exec_connections c ON s.session_id = c.session_id" #Everything comes back NTLM #Source: https://raw.githubusercontent.com/RamblingCookieMonster/PowerShell/master/Invoke-Sqlcmd2.ps1 Invoke-Sqlcmd2 -ServerInstance ServerInQuestion -query $query #Get a list of SPNs associated with ServerInQuestion #Results indicate no SPNs exist #Source: http://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a Get-SPN -ServiceType MSSQLSvc -ComputerName ServerInQuestion #Configuring SPNs for test systems results in Kerberos working without issue setspn -A "MSSQLSvc/ServerInQuestion.DOMAIN.XXX:1433" DOMAIN\SVCACCOUNT setspn -A "MSSQLSvc/ServerInQuestion.DOMAIN.XXX" DOMAIN\SVCACCOUNT
我擔心的是,如果我回到現有系統並配置 SPN,我可能會破壞使用 NTLM 但不使用 Kerberos 的現有應用程序或程序。我認為如果需要他們會退回到 NTLM,但這不是我的專業領域,我不願意做出這樣的假設。
謝謝!
你至少有點擔心可能是對的。不幸的是,特定應用程序是否會中斷完全取決於應用程序。但總的來說,只要您正確設置了 SPN,就不太可能出現任何問題。
我的主要建議是: 不正確的 SPN 比根本沒有 SPN 更糟糕。
我認為對您來說唯一可能存在的問題是是否設置了 SPN,但設置不正確。
舉個例子:
- 如果遠端客戶端嘗試對 SQL 進行身份驗證並找到有效的 SPN,它將使用 Kerberos。
- 如果遠端客戶端嘗試連接但沒有找到 SPN,它將使用 NTLM。
- 如果遠端客戶端嘗試連接並找到一個 SPN,然後嘗試使用該 SPN 通過 Kerberos 進行身份驗證,但由於 SPN 無效而失敗……它是否仍會故障返回到 NTLM?
最後一個問題是非常具體的行為,因應用程序和 Windows 版本而異。
這是一篇很好的後續文章,儘管它很舊,但仍然主要相關:
更新:
如果有什麼安慰的話,我只是使用 SQL Server 2012 和一個執行 Server 2012 R2 和 SQL Management Studio 的遠端客戶端進行了測試。正確註冊 SPN 後,使用了 Kerberos。當 SPN 不存在時,SQL Management Studio 故障轉移到 NTLM。當我故意在服務帳戶的 SPN 中引入錯字時,連接仍然建立,並故障轉移到 NTLM。所以這是個好消息,但事實仍然是其他未指定的應用程序可能無法正確實現 Windows 身份驗證以利用該協商協議……所以如果您有奇怪的應用程序,您仍然需要測試它們。在您的測試中,不要忘記 NTLM 將始終用於本地連接,無論 SPN 是什麼……取決於作業系統版本。:D