你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

常见问题 | Azure

注意

Microsoft 安全代码分析 (MSCA) 扩展将在 2022 年 12 月 31 日正式停用。 现有 MSCA 客户对 MSCA 的访问权限将截止到 2022 年 12 月 31 日。 请参阅 OWASP 源代码分析工具,以获取 Azure DevOps 的其他选项。 对于计划迁移到 GitHub 的客户,可以查看 Github 高级安全

遇到问题? 请查看以下常见问题解答来了解详细信息。

常见问题解答

是否可以在 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 包。 生成任务还可以使用 Node 包管理器(必须在生成代理上预先安装)。 例如,使用命令 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"
    }
  ]
}

警告

将来添加到此文件中的任何机密也将被自动抑制。

用于管理机密的建议准则有哪些?

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

有关详细信息,请参阅博客文章:Managing Secrets Securely in the Cloud(在云中安全地管理机密)。

我是否可以编写自己的自定义搜索器?

凭据扫描程序依赖于通常在 buildsearchers.xml 文件中定义的一组内容搜索器。 该文件包含一个 XML 序列化对象数组,代表 ContentSearcher 对象。 该程序在分发时附带了一组经过充分测试的搜索器。 但你也可以实现自己的自定义搜索器。

内容搜索器定义如下:

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

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

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

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

  • ContentSearchFilters:一个包含 regex 语句的字符串数组,用于筛选特定于搜索器的误报。

  • MatchDetails:要为搜索器的每个匹配项添加的描述性消息和/或缓解说明。

  • 建议:针对匹配项的建议字段内容,使用 PREfast 报告格式。

  • 严重性:一个整数,反映问题的严重性级别。 最高严重性级别的值为 1。

    显示了凭据扫描程序设置的 XML

Roslyn 分析器

使用 Roslyn 分析器任务时的常见错误有哪些?

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

完整错误消息:

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

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

介于主生成与 Roslyn 分析器步骤之间的一个步骤可能会将源树置于会阻止生成的状态。 这一额外步骤可能是 dotnet.exe 发布。 在即将执行 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 和反恶意软件扫描程序。

后续步骤

如果你需要更多帮助,可以在周一到周五的太平洋标准时间上午 9:00 到下午 5:00 联系 Microsoft 安全代码分析支持人员。