共用方式為


常見問題集 | Azure

注意

自 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),您必須先進行建置。

是否可以在找到結果時中斷我的建置?

可以。 您可以在任何工具於其記錄檔中報告問題 (Issue) 或問題 (Problem) 時引進建置中斷。 新增分析後建置工作,然後選取您想要中斷建置之任何工具的核取方塊。

在分析後工作的 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 管線時,這些工作會在建置工作集合清單中提供。 否則,在您的 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"
    }
  ]
}

警告

系統也會自動隱藏未來新增至檔案的所有祕密。

管理祕密的建議指導方針為何?

下列資源可協助您從應用程式內安全地管理祕密並存取敏感性資訊:

如需詳細資訊,請參閱在雲端中安全地管理祕密 \(英文\) 部落格文章。

我是否可以撰寫自己的自訂搜尋程式?

認證掃描器需仰賴一組內容搜尋程式,這些搜尋程式通常會在 buildsearchers.xml 檔案中定義。 該檔案包含 XML 序列化物件的陣列,其代表 ContentSearcher 物件。 該程式會隨著一組經妥善測試的搜尋程式一起發佈。 但是您也可以實作屬於自己的自訂搜尋程式。

內容搜尋程式的定義如下:

  • Name:要在認證掃描器輸出檔案中使用的描述性搜尋程式名稱。 建議您針對搜尋程式名稱使用駝峰式命名慣例。

  • RuleId:搜尋程式的穩定不透明識別碼:

    • 系統會為認證掃描器預設搜尋程式指派 RuleId 值,例如 CSCAN0010、CSCAN0020 或 CSCAN0030。 系統會保留最後一個數字,以便在必要的情況下透過規則運算式 (RegEx) 合併或分割搜尋程式群組。
    • 自訂搜尋程式的 RuleId 值應該要具有自己的命名空間。 範例包括 CSCAN-<命名空間>0010, CSCAN-<Namespace>0020,和 CSCAN-<命名空間>0030。
    • 完整搜尋程式名稱是由 RuleId 值和搜尋程式名稱所組成。 範例包括 CSCAN0010.KeyStoreFiles 和 CSCAN0020.Base64EncodedCertificate。
  • ResourceMatchPattern:檔案副檔名的 Regex,以用來針對搜尋程式進行檢查。

  • ContentSearchPatterns:包含要比對之 RegEx 陳述式的字串陣列。 如果未定義任何搜尋模式,系統會傳回所有符合 ResourceMatchPattern 值的檔案。

  • ContentSearchFilters:字串陣列,其中包含 RegEx 陳述式,以篩選搜尋程式特有的誤判為真結果。

  • MatchDetails:要針對搜尋程式的每個相符項目新增的描述性訊息、風險降低指示或兩者。

  • Recommendation:使用 PREfast 報表格式之相符項目的建議欄位內容。

  • Severity:反映問題嚴重性層級的整數。 最高的嚴重性層級具有 1 的值。

    顯示認證掃描器設定的 XML

Roslyn 分析器

使用 Roslyn 分析器工作時的常見錯誤為何?

專案是使用錯誤的 Microsoft.NETCore.App 版本來還原的

完整的錯誤訊息:

「錯誤: 專案是使用 Microsoft.NETCore.App x.x.x 版來還原的,但由於目前所使用的設定,將會改為使用 y.y.y 版。 若要解決此問題,請確定會針對還原和後續作業 (例如建置或發佈) 使用相同的設定。 一般來說,如果在建置或發佈期間 (而不是在還原期間) 設定了 RuntimeIdentifier 屬性,就會發生此問題。」

由於 Roslyn 分析器工作會隨著編譯工作執行,因此組建電腦上的來源樹狀結構必須處於可建置的狀態。

介於您的主要建置和 Roslyn 分析器步驟之間的步驟可能已將來源樹狀結構置於防止建置的狀態。 這個額外的步驟很可能是 dotnet.exe publish。 請嘗試複製會在 Roslyn 分析器步驟之前進行 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 分析器建置工作的記錄檔中。 其看起來可能會類似 /errorlog:F:\ts-services-123_work\456\s\Some\Project\Code\Code.csproj.sarif

C# 編譯器版本不夠新

若要取得 C# 編譯器的最新版本,請移至 Microsoft.Net.Compilers \(英文\)。 若要了解您已安裝的版本,請在命令提示字元中執行 csc.exe /version。 請確定您參考的是 2.6 版或更新版本的 Microsoft.Net.Compilers NuGet 套件。

找不到 MSBuild 與 VSBuild 記錄檔

Roslyn 分析器建置工作必須查詢 Azure DevOps 以取得 MSBuild 建置工作的 MSBuild 記錄檔。 如果分析器立即在某個 MSBuild 工作之後執行,其記錄檔會尚不可用。 請在 MSBuild 工作和 Roslyn 分析器工作之間放置其他工作。 其他工作的範例包括 BinSkim 和反惡意程式碼掃描器。

後續步驟

如果您需要其他協助,我們提供 Microsoft 安全性程式碼分析支援的時間為太平洋標準時間的星期一到星期五上午 9:00 到下午 5:00。