策略

  • Tier: 旗舰版
  • Offering: JihuLab.com, 私有化部署

极狐GitLab 提供了策略功能,帮助安全和合规团队在组织中全局实施控制。

安全团队可以确保:

  1. 在开发团队的流水线中强制执行安全扫描器,并进行适当的配置。
  2. 所有扫描作业都可以在没有任何更改或改动的情况下执行。
  3. 根据发现的结果,合并请求获得适当的批准。
  4. 不再检测到的漏洞会自动解决,从而减少漏洞分类的工作量。

合规团队可以:

  1. 在所有合并请求上集中实施多个审批者。
  2. 在符合组织要求的项目范围内实施各种设置,例如启用或锁定合并请求和存储库设置。

以下是可用的策略类型:

安全策略项目#

安全策略项目是一种特殊类型的项目,仅用于包含策略。策略存储在 .gitlab/security-policies/policy.yml YAML 文件中。

要在安全策略项目中实施策略,请将安全策略项目链接到您要实施策略的项目、子群组或群组。一个安全策略项目可以包含多个策略,但它们是一起实施的。一个安全策略项目在群组或子群组上实施时,适用于层级中的所有内容,包括所有子群组及其项目。

在合并请求中进行的策略更改在合并请求合并后立即生效。那些不通过合并请求进行的更改,而是直接提交到默认分支的,可能需要最多 10 分钟才能生效。

删除安全策略项目#

History
    • 极狐GitLab 17.8 中引入了名为 reject_security_policy_project_deletion 的删除保护功能,并默认启用。
    • 极狐GitLab 17.9 中引入了名为 reject_security_policy_project_deletion_groups 的删除保护功能,并默认启用。
    • 极狐GitLab 17.10 中删除了名为 reject_security_policy_project_deletion 的功能标志,并普遍可用。
    • 极狐GitLab 17.10 中删除了名为 reject_security_policy_project_deletion_groups 的功能标志,并普遍可用。
此功能的可用性由功能标志控制。有关更多信息,请参阅历史记录。

要删除安全策略项目或其父群组,必须从所有其他项目或群组中删除链接,否则在尝试删除链接的安全策略项目或父群组时会显示错误消息。

策略设计指南#

在设计您的策略时,您的目标应该是:

  1. 设计策略实施,以实现最小的开销但最大的覆盖范围。
  2. 确保职责分离。

实施#

要实施满足您要求的策略,请考虑以下因素:

  1. 继承: 默认情况下,策略是在其链接的组织单位以及所有后代子群组及其项目上实施的。
  2. 范围: 要自定义策略实施,您可以定义策略的范围以满足您的需求。

继承#

要最大化策略覆盖范围,请将安全策略项目链接到实现您目标的最高组织单位:群组、子群组或项目。策略是在其链接的组织单位以及所有后代子群组及其项目上实施的。在最高点实施可以最大限度地减少所需的安全策略数量,从而最小化管理开销。

您可以使用策略继承逐步推出策略。例如,在推出新策略时,您可以在一个项目上实施,然后进行测试。如果测试通过,您可以将其从项目中移除,并在群组上实施,逐步向上移动层级,直到策略在所有适用项目上实施。

在现有群组或子群组上实施的策略会自动在任何在其下创建的新子群组和项目中实施,前提是以下所有条件均为真:

  1. 新的子群组和项目包含在策略的范围定义中(例如,范围包括此群组中的所有项目)。
  2. 现有群组或子群组已经链接到安全策略项目。
JihuLab.com 用户可以在其顶级群组或跨子群组实施策略,但不能跨 JihuLab.com 顶级群组实施策略。极狐GitLab 私有化部署管理员可以在其实例中跨多个顶级群组实施策略。

以下示例说明了两个群组及其结构:

  • Alpha 群组包含两个子群组,每个子群组包含多个项目。
  • 安全与合规群组包含两个策略。

Alpha 群组(包含代码项目)

  • 财务 (子群组)
    • 项目 A
    • 应收帐款(子群组)
      • 项目 B
      • 项目 C
  • 工程 (子群组)
    • 项目 K
    • 项目 L
    • 项目 M

安全与合规 群组(包含安全策略项目)

  • 安全策略管理
  • 安全策略管理 - 安全策略项目
    • SAST 策略
    • 密钥检测策略

假设没有策略实施,请考虑以下示例:

  • 如果在 Alpha 群组实施 "SAST" 策略,它适用于其子群组财务和工程,以及它们的所有项目和子群组。如果在子群组 "应收帐款" 上也实施 "密钥检测" 策略,则两个策略均适用于项目 B 和 C。然而,仅 "SAST" 策略适用于项目 A。
  • 如果在子群组 "应收帐款" 上实施 "SAST" 策略,它仅适用于项目 B 和 C。没有策略适用于项目 A。
  • 如果在项目 K 上实施 "密钥检测" 策略,它仅适用于项目 K。没有其他子群组或项目有策略适用于它们。

范围#

History
    • 在极狐GitLab 16.7 中引入了名为 security_policies_policy_scope 的功能标志,并默认启用。
    • 在极狐GitLab 16.11 中 GA。功能标志 security_policies_policy_scope 已移除。
    • 在极狐GitLab 17.4 中引入了按群组范围的功能。

您可以通过以下方式细化策略的范围:

  1. 合规框架:对选定合规框架的项目实施策略。
  2. 群组:
    • 群组中的所有项目,包括所有后代子群组及其项目。可选择排除特定项目。
    • 多个群组中的所有项目,包括其后代子群组及其项目。只有链接到同一安全策略项目的群组才能在策略中列出。可选择排除特定项目。
  3. 项目:包含或排除特定项目。只有链接到同一安全策略项目的项目才能在策略中列出。

这些选项可以在同一策略中一起使用。然而,排除优先于包含。

policy_scope 关键词#

使用 policy_scope 关键词仅对您指定的群组、项目、合规框架或组合实施策略。

字段类型可能值描述
compliance_frameworksarray不适用列出在范围内的合规框架的 ID,作为对象数组,其中的键为 id
projectsobjectincluding, excluding使用 excluding:including: 然后列出您希望包含或排除的项目 ID,作为对象数组,其中的键为 id
groupsobjectincluding使用 including: 然后列出您希望包含的群组 ID,作为对象数组,其中的键为 id。只有链接到同一安全策略项目的群组才能在策略中列出。
范围示例#

在此示例中,扫描执行策略在每个发布流水线中对应用了 ID 为 211 的合规框架的所有项目实施 SAST 扫描。

yaml
1--- 2scan_execution_policy: 3- name: 在每个发布流水线中实施指定扫描 4 description: 此策略在发布分支上实施 SAST 扫描 5 enabled: true 6 rules: 7 - type: pipeline 8 branches: 9 - release/* 10 actions: 11 - scan: sast 12 policy_scope: 13 compliance_frameworks: 14 - id: 2 15 - id: 11

在此示例中,扫描执行策略在所有 ID 为 203 的群组中的项目(包括所有后代子群组及其项目)上的默认分支的流水线中实施密钥检测和 SAST 扫描,但排除 ID 为 64 的项目。

yaml
1- name: 在每个默认分支流水线中实施指定扫描 2 description: 此策略在默认分支上实施密钥检测和 SAST 扫描 3 enabled: true 4 rules: 5 - type: pipeline 6 branches: 7 - main 8 actions: 9 - scan: secret_detection 10 - scan: sast 11 policy_scope: 12 groups: 13 including: 14 - id: 203 15 projects: 16 excluding: 17 - id: 64

职责分离#

职责分离对于成功实施策略至关重要。实施策略以实现必要的合规和安全要求,同时允许开发团队实现其目标。

安全和合规团队:

  1. 应负责定义策略,并与开发团队合作,以确保策略满足其需求。

开发团队:

  1. 不应能够以任何方式禁用、修改或规避策略。

要在群组、子群组或项目上实施安全策略项目,您必须拥有以下之一:

  1. 在该群组、子群组或项目中的拥有者角色。
  2. 在该群组、子群组或项目中的自定义角色,具有 manage_security_policy_link 权限。

拥有者角色和具有 manage_security_policy_link 权限的自定义角色遵循跨群组、子群组和项目的标准层级规则:

组织单位群组拥有者或群组 manage_security_policy_link 权限子群组拥有者或子群组 manage_security_policy_link 权限项目拥有者或项目 manage_security_policy_link 权限
群组
子群组
项目

所需权限#

要创建和管理安全策略:

  1. 对群组实施的策略:您必须至少拥有该群组的维护者角色。
  2. 对项目实施的策略:
    • 您必须是项目拥有者。
    • 您必须是具有创建项目权限的群组成员。
如果您不是群组成员,您可能会在为您的项目添加或编辑策略时遇到限制。创建和管理策略的能力需要在群组中创建项目的权限。确保您在群组中拥有所需的权限,即使在处理项目级策略时也是如此。

策略实施#

安全策略项目的实施选项在 JihuLab.com、极狐GitLab Dedicated 和极狐GitLab 私有化部署之间略有不同。主要区别在于,在 JihuLab.com 上只能创建子群组。确保职责分离需要更细化的权限配置。

在 JihuLab.com 命名空间中全局实施策略#

  • 层级:旗舰版
  • 提供:JihuLab.com

前提条件:

  • 您必须拥有拥有者角色或自定义角色,具有 manage_security_policy_link 权限,以链接到安全策略项目。有关更多信息,请参阅职责分离

在 JihuLab.com 命名空间中跨所有子群组和项目全局实施策略的高级工作流程:

  1. 从您的顶级群组访问 策略 标签。

  2. 在子群组中,转到 策略 标签并创建一个测试策略。

    (提示:您可以创建一个禁用的策略进行测试。)创建策略会自动在您的顶级群组下创建一个新的安全策略项目。此项目用于存储您的 policy.yml 或策略代码。

  3. 检查并设置新创建项目中的权限,如所需。

    默认情况下,拥有者和维护者能够创建、编辑和删除策略。开发者可以提出策略更改,但不能合并。

  4. 在您创建的子群组中的安全策略项目中,创建所需的策略。

    您可以在您创建的 安全策略管理 项目中使用策略编辑器,在 策略 标签下。或者您可以直接在新创建的安全策略项目 安全策略管理 - 安全策略项目 中存储的 policy.yml 文件中更新策略。

  5. 将群组、子群组或项目链接到安全策略项目。

    作为子群组拥有者或具有适当权限的项目拥有者,您可以访问 策略 页面并创建到安全策略项目的链接。包括完整路径,并且项目名称应以 "- 安全策略项目" 结尾。所有链接的群组、子群组和项目都可以通过安全策略项目中创建的任何策略进行 "实施"。有关详细信息,请参阅链接到安全策略项目

  6. 默认情况下,当策略启用时,它在链接的群组、子群组和项目中的所有项目上实施。

    为了更细化的实施,添加 "策略范围"。策略范围允许您对特定项目集或包含给定合规框架标签的项目实施策略。

  7. 如果您需要额外的限制,例如阻止继承的权限或要求额外的审查或批准策略更改,您可以创建一个仅限于您的安全策略项目的额外策略,并实施额外的批准。

在极狐GitLab Dedicated 或极狐GitLab 私有化部署中全局实施策略#

  • 层级:旗舰版
  • 提供:极狐GitLab 私有化部署, 极狐GitLab Dedicated

前提条件:

  • 您必须拥有拥有者角色或自定义角色,具有 manage_security_policy_link 权限,以链接到安全策略项目。有关更多信息,请参阅职责分离
  • 为了在实例中全局支持审批群组,请在您的极狐GitLab 实例应用设置中启用 security_policy_global_group_approvers_enabled

跨多个群组实施策略的高级工作流程:

  1. 创建一个独立的群组以包含您的策略并确保职责分离。

    通过创建一个独立的群组,您可以最小化继承权限的用户数量。

  2. 在新群组中访问 策略 标签。

    这作为策略编辑器的主要位置,允许您在 UI 中创建和管理策略。

  3. 创建一个测试策略(您可以创建一个禁用的策略进行测试)。

    创建策略会自动在您的群组下创建一个新的安全策略项目。此项目用于存储您的 policy.yml 或策略代码。

  4. 检查并设置新创建项目中的权限,如所需。

    默认情况下,拥有者和维护者能够创建、编辑和删除策略。开发者可以提出策略更改,但不能合并。

  5. 在您创建的子群组中的安全策略项目中,创建所需的策略。

    您可以在您创建的 安全策略管理 项目中使用策略编辑器,在 策略 标签下。或者您可以直接在新创建的安全策略项目 安全策略管理 - 安全策略项目 中存储的 policy.yml 文件中更新策略。

  6. 将群组、子群组或项目链接到安全策略项目。

    作为子群组拥有者或具有适当权限的项目拥有者,您可以访问 策略 页面并创建到安全策略项目的链接。包括完整路径,并且项目名称应以 "- 安全策略项目" 结尾。所有链接的群组、子群组和项目都可以通过安全策略项目中创建的任何策略进行 "实施"。有关更多信息,请参阅链接到安全策略项目

  7. 默认情况下,当策略启用时,它在链接的群组、子群组和项目中的所有项目上实施。为了更细化的实施,添加策略范围。策略范围允许您对特定项目集或包含给定合规框架标签的项目实施策略。

  8. 如果您需要额外的限制,例如阻止继承的权限或要求额外的审查或批准策略更改,您可以创建一个仅限于您的安全策略项目的额外策略,并实施额外的批准。

要对群组、子群组或项目实施安全策略项目中的策略,您需要链接它们。默认情况下,所有链接的实体都被实施。要在每个策略上细化实施,可以在每个策略中设置 "策略范围"。

前提条件:

  • 您必须拥有拥有者角色或自定义角色,具有 manage_security_policy_link 权限,以链接到安全策略项目。有关更多信息,请参阅职责分离
  • 您必须至少拥有报告者角色或自定义角色,具有 manage_security_policy_link 权限,以将项目分配为安全策略项目。有关更多信息,请参阅职责分离

要将群组、子群组或项目链接到安全策略项目:

  1. 在左侧边栏,选择 搜索或转到 并找到您的项目、子群组或群组。
  2. 选择 安全 > 策略
  3. 选择 编辑策略项目,然后从下拉列表中搜索并选择您要链接的项目。
  4. 选择 保存

要取消链接安全策略项目,请按照相同的步骤操作,但在对话框中选择垃圾桶图标。 您可以从同一顶级群组的不同子群组或完全不同的顶级群组链接到安全策略项目。然而,当您实施流水线执行策略时,用户必须至少对引用策略中 CI/CD 配置的项目具有只读访问权限,以触发流水线。

查看链接的安全策略项目#

所有有权访问项目策略页面但不是项目拥有者的用户会看到一个按钮,链接到关联的安全策略项目。

策略建议#

在实施策略时,请考虑以下建议。

分支名称#

在策略中指定分支名称时,使用受保护分支的通用类别,例如 默认分支所有受保护分支,而不是单个分支名称。

仅当指定的分支存在于项目中时,策略才会在项目上实施。例如,如果您的策略在分支 main 上实施规则,但范围内的一些项目使用 production 作为其默认分支,则策略不适用于后者。

推送规则#

在极狐GitLab 17.3 及更早版本中,如果您使用推送规则验证分支名称,请确保它们允许创建前缀为 update-policy- 的分支。此分支命名前缀用于创建或修改安全策略时。例如,update-policy-1659094451,其中 1659094451 是时间戳。如果推送规则阻止创建分支,则会发生以下错误:

分支名称 update-policy-<timestamp> 不符合模式 <branch_name_regex>

在极狐GitLab 17.4 及更高版本中,安全策略项目被排除在实施分支名称验证的推送规则之外。

策略管理#

策略页面显示所有可用环境的已部署策略。您可以检查策略的信息(例如,描述或实施状态),并创建和编辑已部署的策略:

  1. 在左侧边栏,选择 搜索或转到 并找到您的项目。
  2. 选择 安全 > 策略

策略列表页面

第一列中的绿色勾号表示该策略已启用并在其范围内的所有群组和项目上实施。灰色勾号表示该策略当前未启用。

策略编辑器#

使用策略编辑器创建、编辑和删除策略:

  1. 在左侧边栏,选择 搜索或转到 并找到您的项目。

  2. 选择 安全 > 策略

    • 要创建新策略,请选择位于 策略 页面标题中的 新策略。然后您可以选择要创建的策略类型。
    • 要编辑现有策略,请选择所选策略抽屉中的 编辑策略

    策略编辑器有两种模式:

    • 视觉 规则 模式允许您使用规则块和相关控件构建和预览策略规则。

      策略编辑器规则模式

    • YAML 模式允许您以 .yaml 格式输入策略定义,旨在支持专家用户和规则模式不支持的情况。

      策略编辑器 YAML 模式

      您可以随时交替使用两种模式并在它们之间切换。如果 YAML 资源不正确或包含规则模式不支持的数据,规则模式会自动禁用。如果 YAML 不正确,您必须使用 YAML 模式修复您的策略,然后规则模式才会再次可用。

  3. 选择 通过合并请求进行配置 以保存并应用更改。

    策略的 YAML 会进行验证,并显示任何结果错误。

  4. 审查并合并生成的合并请求。

    如果您是项目拥有者,并且此项目没有关联的安全策略项目,则在创建合并请求时会创建并链接一个安全策略项目。

故障排除#

在处理安全策略时,请考虑以下故障排除提示:

  1. 您不应同时将安全策略项目链接到开发项目和开发项目所属的群组或子群组。这样链接会导致合并请求审批策略中的审批规则不适用于开发项目中的合并请求。
  2. 创建合并请求审批策略时,scan_finding 规则中的数组 severity_levels 和数组 vulnerability_states 均不能留空。要创建有效的规则,每个数组必须至少有一个条目。
  3. 项目的拥有者可以为该项目实施策略,前提是他们还有权限在群组中创建项目。不是群组成员的项目拥有者可能会在添加或编辑策略时面临限制。如果您无法为您的项目管理策略,请联系您的群组管理员以确保您在群组中拥有必要的权限。