接到報案,Azure DevOps Server 2022 因啟用基本驗證 (Basic Authentication) 但未搭配 TLS/SSL 加密傳輸,被判定不安全需列入改善。
註:HTTP 基本驗證主要用在 Personal Access Token (PAT),方便批次作業或背景服務以 PAT 取代帳號密碼存取 Azure DevOps Server,現階段沒用到,故關閉也是個選項。若會用到 PAT,則啟用 TLS 加密是正解。

但查了一下,IIS 主機根本沒安裝基本驗證模組:

觀察到 Response 包含 X-Tfs-ProcessId 等自訂 Header,加上認證失敗畫面為客製版本(如下圖),推測 Azure DevOps Server 應該有加掛 HTTP Module 處理身分認證。

用 IIS 管理介面查到有個 Microsoft.TeamFoundation.Framework.Server.TeamFoundationModule,應該就是可跳過 IIS 發送 Www-Authenticate Header 的來源:

原始想法是成熟的軟體或產品應該有開關或設定決定啟用哪些驗證方式,如果是勇者欣梅爾的話,一定會這麼做的,更何況是 Azure DevOps Server 這類架構嚴謹的系統 (光看其 DLL 數量即可見一斑)。但這問題屬小眾產品的少見需求,試遍各種關鍵字也苦尋不到相關討論。摸摸鼻子,那就發揮駭客精神,設法追 Code 找答案吧。

動用反組譯工具追到一段依據 IsFeatureEnabled("VisualStudio.BasicAuth.Disable") 決定是否加上 Www-Authenticate: Basic Header 的邏輯,BINGO! 進一步查到 Feature Flag 是由 FeatureAvailability\Entries\<Feature_Name>\AvailabilityState 格式的字串決定,懷疑是用 XML 或 JSON 檔控制,但遍尋不著設定相關說明。最後靠關鍵字查到一篇 Azure DevOps Server 2020 RC1 問題討論,提到有個名為 prc_SetRegistryValue 的 Stored Procedure,指引了一條明路。

在 AzureDevOps_Configuration 資料庫果真有個 Procedure,用以下指令設定及查詢:

exec prc_SetRegistryValue 1,'#\FeatureAvailability\Entries\VisualStudio.BasicAuth.Disable\AvailabilityState\', 1
exec prc_QueryRegistry 1, '#\FeatureAvailability\Entries\VisualStudio.BasicAuth.Disable\AvailabilityState\', 1

設定完成,IISRESET 重啟後,我成功停用了基本驗證,哈里路亞~~

【題外話】

要找出這個解決方案很吃經驗跟背景知識,還需要一點運氣。

你必須了解 HTTP 驗證原理,知道 IIS Module 與 ASP.NET 程式架構,並具備從 DLL 追 Code 的技巧,並幸運地在耐心磨完前找到線索,當然選對關鍵字爬文的技巧也不可少。在成天有人高喊「AI 來了,老鳥優勢不再」的年代,這類破案經驗多少能帶來一點信心,相信自己不會那麼快被淘汰...

thumbnail

This article shares how I analyzed and investigated to find a way to disable the Basic Authentication feature in Azure DevOps Server.


Comments

Be the first to post a comment

Post a comment