備註
自 2022 年 12 月 31 日起,Microsoft安全性程式代碼分析 (MSCA) 延伸模組已淘汰。 MSCA 會取代為 Microsoft Security DevOps Azure DevOps 擴充功能。 請遵循 設定 中的指示來安裝和設定擴充功能。
一般常見問題集
我可以在 Azure DevOps Server (先前稱為 Visual Studio Team Foundation Server) 實例上安裝擴充功能,而不是在 Azure DevOps 實例上安裝擴充功能嗎?
否。 此延伸模組無法下載及安裝 Azure DevOps Server(先前稱為 Visual Studio Team Foundation Server)。
我是否必須搭配組建執行Microsoft安全性程序代碼分析?
可能。 這取決於分析工具的類型。 原始碼可能是唯一的必要專案,或可能需要建置輸出。
例如,認證掃描器 (CredScan) 會分析程式代碼存放庫資料夾結構內的檔案。 由於這項分析,您可以在獨立組建中執行 CredScan 和發佈安全性分析記錄建置工作,以取得結果。
對於其他工具,例如分析建置後成品的 BinSkim,首先需要建置。
當找到結果時,我可以中斷組建嗎?
是的。 當任何工具在其記錄檔中回報問題或問題時,您可以引入建置中斷。 新增 [分析后建置] 工作,然後選取您要中斷建置之任何工具的複選框。
在 「分析後」工作的 UI 中,您可以選擇在任何工具只報告錯誤或同時回報錯誤和警告時中斷組建。
Azure DevOps 中的命令行自變數與獨立桌面工具中的這些自變數有何不同?
通常,Azure DevOps 建置工作是安全性工具命令行自變數的直接包裝函式。 您可以將自變數傳遞至建置工作,而您通常傳遞至命令行工具的任何專案。
明顯的差異:
- 工具會從代理程式 $(Build.SourcesDirectory) 的源資料夾或從 %BUILD_SOURCESDIRECTORY%執行。 例如 C:\agent_work\1\s。
- 自變數中的路徑可以相對於先前列出的來源目錄根目錄。 路徑也可以是絕對路徑。 您可以使用 Azure DevOps 建置變數,或使用本機資源的已知部署位置執行內部部署代理程式,以取得絕對路徑。
- 工具會自動提供輸出檔案路徑或資料夾。 如果您提供建置工作的輸出位置,該位置會取代為建置代理程式上已知記錄位置的路徑
- 某些工具會變更一些其他命令行自變數。 其中一個範例是新增或移除可確保未啟動 GUI 的選項。
我可以在 Azure DevOps 組建中跨多個存放庫執行認證掃描器之類的建置工作嗎?
否。 不支援在單一管線中跨多個存放庫執行安全開發工具。
我指定的輸出檔案未建立,或找不到我指定的輸出檔案
建置工作會篩選一些用戶輸入。 針對這個問題,他們會將產生的輸出檔位置更新為組建代理程式上的通用位置。 如需此位置的詳細資訊,請參閱下列問題。
工具所產生的輸出檔案會儲存在哪裡?
建置工作會自動將輸出路徑新增至組建代理程式上的這個已知位置:$(Agent.BuildDirectory)_sdt\logs。 因為我們將此位置標準化,因此產生或取用程式代碼分析記錄的所有小組都可以存取輸出。
我可以將組建排入佇列,以在託管的組建代理程式上執行這些工作嗎?
是的。 延伸模組中的所有工作和工具都可以在裝載的組建代理程式上執行。
備註
反惡意代碼掃描器建置工作需要啟用 Windows Defender 的組建代理程式。 裝載的Visual Studio 2017和更新版本會提供這類代理程式。 建置工作不會在Visual Studio 2015裝載的代理程式上執行。
雖然無法在這些代理程式上更新簽章,但簽章應該一律少於三個小時。
我可以執行這些組建工作做為發行管線的一部分,而不是組建管線嗎?
在大部分情況下,是的。
不過,當這些工作發佈成品時,Azure DevOps 不支援在發行管線內執行工作。 這種缺乏支援可防止發行安全性分析記錄工作在發行管線中順利執行。 工作會改為失敗,並出現描述性錯誤訊息。
建置工作會從何處下載工具?
建置工作可以從 Azure DevOps 套件管理摘要下載工具的 NuGet 套件。 建置工作也可以使用必須預安裝於建置代理程序的節點套件管理員。 這類安裝的範例是命令 npm install tslint。
在 Azure DevOps 組織中安裝擴充功能有何影響?
安裝之後,擴充功能所提供的安全性建置工作就可供組織中的所有使用者使用。 當您建立或編輯 Azure Pipeline 時,這些工作可從建置工作集合清單中取得。 否則,在 Azure DevOps 組織中安裝擴充功能沒有任何作用。 安裝不會修改任何帳戶設定、項目設定或管線。
安裝延伸模組是否修改了現有的 Azure Pipelines?
否。 安裝延伸模組可讓安全性建置工作可供新增至管線。 您仍然需要新增或更新組建定義,讓工具可以使用您的建置程式。
工作特定常見問題
本節列出建置工作的特定問題。
認證掃描器
常見的歸併案例和範例為何?
以下是其中兩個最常見歸併案例的詳細數據。
隱藏指定路徑內指定秘密的所有出現次數
需要 CredScan 輸出檔案中秘密的哈希密鑰,如下列範例所示。
{
"tool": "Credential Scanner",
"suppressions": [
{
"hash": "CLgYxl2FcQE8XZgha9/UbKLTkJkUh3Vakkxh2CAdhtY=",
"_justification": "Secret used by MSDN sample, it is fake."
}
]
}
警告
哈希機碼是由相符值或檔案內容的一部分所產生。 任何原始程式碼修訂都可以變更哈希機碼,並停用隱藏規則。
隱藏指定檔案中的所有秘密,或隱藏秘密檔案本身
檔案表達式可以是檔名。 它也可以是完整檔案路徑或檔名的基底名稱部分。 不支援通配符。
下列範例示範如何隱藏 InputPath <檔案>\src\JS\lib\angular.js
有效歸並規則的範例:
- <InputPath>\src\JS\lib\angular.js - 隱藏指定路徑中的檔案
- \src\JS\lib\angular.js
- \JS\lib\angular.js
- \lib\angular.js
- angular.js - 隱藏任何具有相同名稱的檔案
{
"tool": "Credential Scanner",
"suppressions": [
{
"file": "\\files\\AdditonalSearcher.xml",
"_justification": "Additional CredScan searcher specific to my team"
},
{
"file": "\\files\\unittest.pfx",
"_justification": "Legitimate UT certificate file with private key"
}
]
}
警告
新增至檔案的所有未來秘密也會自動隱藏。
管理秘密的建議指導方針為何?
下列資源可協助您從應用程式內安全地管理秘密和存取敏感性資訊:
- Azure Key Vault
- Azure Active Directory (Azure AD)
- Azure AD 受控服務識別 (MSI)
- Azure 資源的受控識別
- 在 Azure App Service 和 Azure Functions 中 受控識別
- AppAuthentication 連結庫
如需詳細資訊,請參閱部落格文章 在雲端安全地管理秘密。
我可以撰寫自己的自定義搜尋程式嗎?
認證掃描器依賴一組通常定義於 buildsearchers.xml 檔案中的內容搜尋工具。 檔案包含 XML 串行化物件的數位,代表 ContentSearcher 物件。 程式會與一組經過良好測試的搜尋程式一起散發。 但您也可以實作自己的自定義搜尋程式。
內容搜尋工具的定義如下:
Name:要用於認證掃描器輸出檔案的描述性搜尋程式名稱。 建議您針對搜尋程式名稱使用駱駝式命名慣例。
RuleId:搜尋者的穩定不透明識別碼:
- 認證掃描器預設搜尋程式會指派 RuleId 值,例如CSCAN0010、CSCAN0020或CSCAN0030。 最後一個數位會保留給可能透過正則表達式合併或分割搜尋程式群組(regex)。
- 自定義搜尋工具的 RuleId 值應該有自己的命名空間。 範例包括 CSCAN-<Namespace>0010、CSCAN-<Namespace>0020,以及 CSCAN-<Namespace>0030。
- 完整搜尋程式名稱是 RuleId 值和搜尋程式名稱的組合。 範例包括CSCAN0010。KeyStoreFiles 和 CSCAN0020。Base64EncodedCertificate。
ResourceMatchPattern:要檢查搜尋者的擴展名 Regex。
ContentSearchPatterns:字串陣列,包含要比對的 regex 語句。 如果未定義搜尋模式,則會傳回符合 ResourceMatchPattern 值的所有檔案。
ContentSearchFilters:包含 regex 語句的字串陣列,可篩選搜尋程式特定的誤判。
MatchDetails:要針對搜尋者的每個相符專案新增描述性訊息、風險降低指示或兩者。
建議:使用PREfast報表格式比對的建議字段內容。
嚴重性:反映問題的嚴重性層級的整數。 最高嚴重性層級具有值 1。
顯示認證掃描器設定XML
Roslyn 分析器
使用 Roslyn Analyzers 工作時常見的錯誤為何?
使用錯誤的 Microsoft.NETCore.App 版本還原專案
完整錯誤訊息:
「錯誤:已使用 Microsoft.NETCore.App 版本 x.x.x還原專案,但使用目前的設定時,會改用版本 y.y.y.y。 若要解決此問題,請確定用於還原和後續作業(例如建置或發佈)的相同設定。 如果 RuntimeIdentifier 屬性是在建置或發布期間設定,但在還原期間未設定,通常就會發生此問題。
由於 Roslyn Analyzers 工作會在編譯時執行,因此建置機器上的來源樹狀結構必須處於可建置狀態。
主要組建與 Roslyn Analyzers 步驟之間的步驟,可能會使來源樹狀結構進入防止建置的狀態。 這個額外步驟可能會 dotnet.exe 發佈。 請嘗試複製在 Roslyn Analyzers 步驟之前執行 NuGet 還原的步驟。 這個重複的步驟可能會讓來源樹狀結構回到可建置狀態。
csc.exe 無法建立分析器實例
完整錯誤訊息:
“'csc.exe' 結束,錯誤碼為 1 -- 無法從 C:\BBBB.dll 建立分析器 AAAA 實例:無法載入檔案或元件 'Microsoft.CodeAnalysis, Version=X.X.X.X、Culture=neutral、PublicKeyToken=31bf3856ad364e35' 或其其中一個相依性。 系統找不到指定的檔案。」
請確定您的編譯程序支援 Roslyn 分析器。 執行命令 csc.exe /version 應該報告版本值 2.6 或更新版本。
有時.csproj 檔案可以藉由參考來自 Microsoft.Net.Compilers 的套件來覆寫組建計算機的 Visual Studio 安裝。 如果您不想使用特定版本的編譯程式,請移除Microsoft.Net.Compilers 的參考。 否則,請確定參考套件的版本也是 2.6 或更新版本。
嘗試取得錯誤記錄檔路徑,其指定於 csc.exe /errorlog 選項中。 選項和路徑會出現在 Roslyn Analyzers 建置工作的記錄中。 它們看起來可能會像 /errorlog:F:\ts-services-123_work\456\s\Some\Project\Code.csproj.sarif
C# 編譯程式版本不夠最近
若要取得最新版的 C# 編譯程式,請移至 Microsoft.Net.Compilers。 若要取得已安裝的版本,請在命令提示字元中執行 csc.exe /version。 請確定您參考的是 2.6 版或更新版本的 Microsoft.Net.Compilers NuGet 套件。
找不到 MSBuild 和 VSBuild 記錄
Roslyn Analyzers 建置工作必須從 MSBuild 建置工作查詢 Azure DevOps 以取得 MSBuild 記錄。 如果分析器工作緊接在 MSBuild 工作之後執行,則記錄尚無法使用。 將其他工作放在 MSBuild 工作與 Roslyn Analyzers 工作之間。 其他工作的範例包括 BinSkim 和反惡意代碼掃描器。
後續步驟
如果您需要其他協助,Microsoft安全性程式代碼分析支援將於星期一至星期五上午 9:00 至下午 5:00 太平洋標準時間提供。
上架:請參閱我們的 上線檔
支援:Microsoft安全性程式代碼分析支援 傳送電子郵件給小組