常见问题 |天蓝色

注释

自 2022 年 12 月 31 日起,Microsoft安全代码分析(MSCA)扩展已停用。 MSCA 替换为Microsoft安全 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 Build 中的多个存储库中运行生成任务,例如凭据扫描程序?

不是。 不支持在单个管道中跨多个存储库运行安全开发工具。

我指定的输出文件未创建,或者找不到我指定的输出文件

生成任务会筛选一些用户输入。 具体而言,对于此问题,他们将生成的输出文件的位置更新为生成代理上的公用位置。 有关此位置的详细信息,请参阅以下问题。

工具生成的输出文件保存在何处?

生成任务会自动将输出路径添加到生成代理上的此已知位置:$(Agent.BuildDirectory)_sdt\logs。 由于我们对此位置进行了标准化,因此生成或使用代码分析日志的所有团队都可以访问输出。

是否可以将生成排队以在托管生成代理上运行这些任务?

是的。 扩展中的所有任务和工具都可以在托管生成代理上执行。

注释

反恶意软件扫描程序生成任务需要启用 Windows Defender 的生成代理。 托管的 Visual Studio 2017 及更高版本提供此类代理。 生成任务不会在 Visual Studio 2015 托管代理上运行。

尽管无法在这些代理上更新签名,但签名应始终少于 3 小时。

是否可以将这些生成任务作为发布管道的一部分运行,而不是生成管道?

在大多数情况下,是的。

但是,当这些任务发布项目时,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"
    }
  ]
}

警告

添加到文件的所有将来的机密也将自动取消。

管理机密的建议准则是什么?

以下资源可帮助你安全地管理机密并从应用程序中访问敏感信息:

有关详细信息,请参阅博客文章 在云中安全地管理机密

是否可以编写自己的自定义搜索程序?

凭据扫描程序依赖于一组通常在 buildsearchers.xml 文件中定义的内容搜索程序。 该文件包含一个由 XML 序列化对象构成的数组,这些对象表示 ContentSearcher 对象。 该程序随一组经过良好测试的搜索器分发。 但你也可以实现自己的自定义搜索程序。

内容搜索器的定义如下:

  • 名称:凭据扫描程序输出文件中要使用的描述性搜索程序名称。 建议对搜索程序名称使用 camel 大小写命名约定。

  • RuleId:搜索者的稳定不透明 ID:

    • 为凭据扫描程序默认搜索程序分配一个 RuleId 值,例如CSCAN0010、CSCAN0020或CSCAN0030。 最后一位数字用于通过正则表达式(正则表达式)进行可能合并或划分搜索程序组。
    • 自定义搜索程序 RuleId 值应具有自己的命名空间。 示例包括 CSCAN-<命名空间>0010、CSCAN-<命名空间>0020 和 CSCAN-<命名空间>0030。
    • 完全限定的搜索程序名称是 RuleId 值和搜索程序名称的组合。 示例包括CSCAN0010。KeyStoreFiles 和 CSCAN0020。Base64EncodedCertificate。
  • ResourceMatchPattern:要检查搜索者的文件扩展名的正则表达式。

  • ContentSearchPatterns:包含要匹配的正则表达式语句的字符串数组。 如果未定义搜索模式,则返回与 resourceMatchPattern 值匹配 的所有文件。

  • ContentSearchFilters:包含正则表达式语句的字符串数组,用于筛选特定于搜索器的误报。

  • MatchDetails:要为搜索程序的每个匹配添加的描述性消息、缓解说明或两者。

  • 建议:使用 PREfast 报表格式匹配的建议字段内容。

  • 严重性:反映问题的严重性级别的整数。 最高严重性级别具有值 1。

    显示凭据扫描程序设置XML showing Credential Scanner setupXML showing Credential Scanner setupXML

Roslyn 分析器

使用 Roslyn 分析器任务时常见的错误是什么?

项目已使用错误的 Microsoft.NETCore.App 版本还原

完整的错误消息:

“错误:使用 Microsoft.NETCore.App 版本 x.x.x还原项目,但使用当前设置时,将使用版本 y.y.y.y。 若要解决此问题,请确保使用相同的设置用于还原和后续作,例如生成或发布。 如果 RuntimeIdentifier 属性是在生成或发布期间设置的,但在还原期间未设置,则通常会发生此问题。

由于 Roslyn 分析器任务作为编译的一部分运行,因此生成计算机上的源树必须处于可生成状态。

主生成和 Roslyn 分析器步骤之间的步骤可能已将源树置于阻止生成的状态。 此额外步骤可能是 dotnet.exe 发布。 请尝试复制在 Roslyn 分析器步骤之前执行 NuGet 还原的步骤。 此重复步骤可能会使源树重新处于可生成状态。

csc.exe 无法创建分析器实例

完整的错误消息:

“'csc.exe' 退出并出现错误代码 1 - 无法从 C:\BB.dll 创建分析器 AAAA 实例:无法加载文件或程序集'Microsoft.CodeAnalysis, Version=X.X.X.X、Culture=neutral、PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。 系统找不到指定的文件。

确保编译器支持 Roslyn 分析器。 运行命令 csc.exe /version 应报告版本值 2.6 或更高版本。

有时,.csproj 文件可以通过从 Microsoft.Net.Compiler 引用包来替代生成计算机的 Visual Studio 安装。 如果不打算使用特定版本的编译器,请删除对 Microsoft.Net.Compilers 的引用。 否则,请确保引用包的版本也是 2.6 或更高版本。

尝试获取错误日志路径,该路径是在 csc.exe /errorlog 选项中指定的。 选项和路径显示在 Roslyn 分析器生成任务的日志中。 它们可能类似于 /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 分析器生成任务必须从 MSBuild 生成任务查询 Azure DevOps 以获取 MSBuild 日志。 如果分析器任务在 MSBuild 任务后立即运行,则日志尚不可用。 将其他任务放在 MSBuild 任务和 Roslyn 分析器任务之间。 其他任务的示例包括 BinSkim 和反恶意软件扫描程序。

后续步骤

如果需要其他帮助,Microsoft安全代码分析支持将于周一到星期五上午 9:00 至下午 5:00(太平洋标准时间)提供。