Help us learn about your current experience with the documentation. Take the survey.

开源软件许可证检查

  • Tier: Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

入门指南

下载解决方案组件

  1. 从您的客户团队获取邀请码。
  2. 使用邀请码从 解决方案组件商店 下载解决方案组件。

开源库许可证检查 - GitLab 策略

本指南帮助您基于 Blue Oak Council 许可证评级为您的项目实施许可证合规策略。该策略将自动要求对使用未包含在 Blue Oak Council 金级、银级和铜级许可证中的任何依赖项进行批准。

您还可以使用提供的 Python 脚本 update_licenses.py保持许可证列表最新,该脚本会获取最新的已批准许可证。

概述

开源库许可证检查提供:

  • 对项目中所有依赖项的自动化许可证扫描
  • 预配置的策略,允许使用 Blue Oak Council 评级的 金级银级铜级 许可证
  • 对这些级别之外任何许可证的审批工作流

前置条件

  • GitLab Ultimate 版本
  • 对您的 GitLab 实例或组的管理员权限
  • 为您的项目启用了 依赖项扫描(可以通过遵循 依赖项扫描设置 说明,为指定范围内的所有项目可选地启用并强制执行)

实施指南

本指南涵盖两个主要场景:

  1. 从头开始设置(没有现有的安全策略项目)
  2. 添加到现有策略(现有的安全策略项目)

从头开始设置(使用 UI)

如果您还没有安全策略项目,需要先创建一个,然后设置依赖项扫描和许可证合规策略。

从头开始设置依赖项扫描

  1. 首先,确定您要将此策略应用于哪个组。这将是策略可以应用的最高组级别(您可以包含或排除此组内的项目)。
  2. 导航到该组的 安全 > 策略 页面。
  3. 点击 新建策略
  4. 选择 扫描执行策略
  5. 为您的策略输入名称(例如,“依赖项扫描策略”)。
  6. 输入描述(例如,“强制执行依赖项扫描以获取使用的开源软件许可证列表”)。
  7. 通过选择"此组中的所有项目"(并可选地设置例外)或"特定项目"(并从下拉列表中选择项目)来设置 策略范围
  8. 操作 部分,选择"依赖项扫描"而不是"秘密检测"(默认)。
  9. 条件 部分,如果您希望按计划运行扫描而不是在每次提交时运行,可以将"触发器:“更改为"计划:"。
  10. 点击 创建策略

从头开始设置许可证合规

设置依赖项扫描后,按照以下步骤设置许可证合规策略:

  1. 导航回同一组的 安全 > 策略 页面。
  2. 点击 新建策略
  3. 选择 合并请求审批策略
  4. 为您的策略输入名称(例如,“开源合规策略”)。
  5. 输入描述(例如,“阻止任何未包含在 Blue Oak Council 金级、银级或铜级中的许可证”)。
  6. 通过选择"此组中的所有项目”(并可选地设置例外)或"特定项目"(并从下拉列表中选择项目)来设置 策略范围
  7. 规则 部分,点击"选择扫描类型"下拉菜单并选择 许可证扫描
  8. 设置目标分支(默认为所有受保护分支)。
  9. 将"状态是:“下拉菜单更改为 新检测到已存在(取决于您是否只想对新的依赖项强制执行策略,还是也对现有依赖项强制执行)。
  10. 重要:将"许可证是:“下拉菜单从默认的"匹配"更改为 排除(这确保策略能正确阻止未批准的许可证)。
  11. 向下滚动到 操作 部分并设置所需的批准数量。
  12. 在"选择审批者类型"下拉菜单中,选择应提供批准的用户、组或角色(您可以通过点击"添加新审批者"在同一规则中添加多个审批者类型)。
  13. 配置"覆盖项目审批设置"部分,并根据需要更改默认设置。
  14. 滚动回页面顶部并点击 .yaml 模式
  15. 在 YAML 编辑器中,找到 license_types 部分并用 完整策略配置 部分中的完整批准许可证列表替换它。该部分看起来像这样:
rules:
  - type: license_finding
    match_on_inclusion_license: false
    license_types:
    # 用完整策略配置部分的完整许可证列表替换此部分
    - MIT License
    - Apache License 2.0
    # 等等...
  1. 点击 创建策略

添加到现有策略

如果您已经有安全策略项目但没有依赖项和/或许可证合规策略:

  1. 导航到您的组的策略安全项目。
  2. 导航到 .gitlab/security-policies/ 中的 policy.yml 文件。
  3. 点击 编辑 > 编辑单个文件
  4. 完整策略配置 添加 scan_execution_policyapproval_policy 部分。
  5. 确保:
    • 保持现有的 YAML 结构
    • 将这些部分与其他顶级部分放在同一级别
    • 设置 user_approvers_ids 和/或 group_approvers_ids 和/或 role_approvers(只需要一个)
      • YOUR_USER_ID_HEREYOUR_GROUP_ID_HERE 替换为适当的用户/组 ID(确保粘贴用户/组 ID,例如 1234567,而不是用户名)
    • 如果您想从策略中排除任何项目,请替换 YOUR_PROJECT_ID_HERE(确保粘贴项目 ID,例如 1234,而不是项目名称/路径)
    • approvals_required: 1 设置为您要要求的批准数量
    • 根据需要修改 approval_settings 部分(设置为 true 的任何内容将覆盖项目审批设置)
  6. 点击 提交更改,并提交到新分支。选择 为此更改创建合并请求,以便策略更改可以被合并。

完整策略配置

供参考,以下是完整的策略配置:

scan_execution_policy:
- name: 许可证扫描策略
  description: 强制执行依赖项扫描以获取使用的开源软件许可证列表,
    以符合开源软件使用指南。
  enabled: true
  policy_scope:
    projects:
      excluding:
      - id: YOUR_PROJECT_ID_HERE
      - id: YOUR_PROJECT_ID_HERE
  rules:
  - type: pipeline
    branch_type: all
  actions:
  - scan: dependency_scanning
  skip_ci:
    allowed: true
    allowlist:
      users: []
approval_policy:
- name: 开源合规策略
  description: |-
    阻止任何未包含在 Blue Oak Council 金级、银级或铜级中的许可证。
    https://blueoakcouncil.org/list
  enabled: true
  policy_scope:
    projects:
      excluding:
      - id: YOUR_PROJECT_ID_HERE
      - id: YOUR_PROJECT_ID_HERE
  rules:
  - type: license_finding
    match_on_inclusion_license: false
    license_types:
    - BSD-2-Clause Plus Patent License
    - Amazon Digital Services License
    - Apache License 2.0
    - Adobe Postscript AFM License
    - BSD 1-Clause License
    - BSD 2-Clause "Simplified" License
    - BSD 2-Clause FreeBSD License
    - BSD 2-Clause NetBSD License
    - BSD 2-Clause with Views Sentence
    - Boost Software License 1.0
    - DSDP License
    - Educational Community License v1.0
    - Educational Community License v2.0
    - hdparm License
    - ImageMagick License
    - Intel ACPI Software License Agreement
    - ISC License
    - Linux Kernel Variant of OpenIB.org license
    - MIT License
    - MIT License Modern Variant
    - MIT testregex Variant
    - MIT Tom Wu Variant
    - Microsoft Public License
    - Mulan Permissive Software License, Version 1
    - Mup License
    - PostgreSQL License
    - Solderpad Hardware License v0.5
    - Spencer License 99
    - Universal Permissive License v1.0
    - Xerox License
    - Xfig License
    - BSD Zero Clause License
    - Academic Free License v1.1
    - Academic Free License v1.2
    - Academic Free License v2.0
    - Academic Free License v2.1
    - Academic Free License v3.0
    - AMD's plpa_map.c License
    - Apple MIT License
    - Academy of Motion Picture Arts and Sciences BSD
    - ANTLR Software Rights Notice
    - ANTLR Software Rights Notice with license fallback
    - Apache License 1.0
    - Apache License 1.1
    - Artistic License 2.0
    - Bahyph License
    - Barr License
    - bcrypt Solar Designer License
    - BSD 3-Clause "New" or "Revised" License
    - BSD with attribution
    - BSD 3-Clause Clear License
    - Hewlett-Packard BSD variant license
    - Lawrence Berkeley National Labs BSD variant license
    - BSD 3-Clause Modification
    - BSD 3-Clause No Nuclear License 2014
    - BSD 3-Clause No Nuclear Warranty
    - BSD 3-Clause Open MPI Variant
    - BSD 3-Clause Sun Microsystems
    - BSD 4-Clause "Original" or "Old" License
    - BSD 4-Clause Shortened
    - BSD-4-Clause (University of California-Specific)
    - BSD Source Code Attribution
    - bzip2 and libbzip2 License v1.0.5
    - bzip2 and libbzip2 License v1.0.6
    - Creative Commons Zero v1.0 Universal
    - CFITSIO License
    - Clips License
    - CNRI Jython License
    - CNRI Python License
    - CNRI Python Open Source GPL Compatible License Agreement
    - Cube License
    - curl License
    - eGenix.com Public License 1.1.0
    - Entessa Public License v1.0
    - Freetype Project License
    - fwlw License
    - Historical Permission Notice and Disclaimer - Fenneberg-Livingston variant
    - Historical Permission Notice and Disclaimer - sell regexpr variant
    - HTML Tidy License
    - IBM PowerPC Initialization and Boot Software
    - ICU License
    - Info-ZIP License
    - Intel Open Source License
    - JasPer License
    - libpng License
    - PNG Reference Library version 2
    - libtiff License
    - LaTeX Project Public License v1.3c
    - LZMA SDK License (versions 9.22 and beyond)
    - MIT No Attribution
    - Enlightenment License (e16)
    - CMU License
    - enna License
    - feh License
    - MIT Open Group Variant
    - MIT +no-false-attribs license
    - Matrix Template Library License
    - Mulan Permissive Software License, Version 2
    - Multics License
    - Naumen Public License
    - University of Illinois/NCSA Open Source License
    - Net-SNMP License
    - NetCDF license
    - NICTA Public Software License, Version 1.0
    - NIST Software License
    - NTP License
    - Open Government Licence - Canada
    - Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)
    - Open LDAP Public License v2.0.1
    - Open LDAP Public License v2.1
    - Open LDAP Public License v2.2
    - Open LDAP Public License v2.2.1
    - Open LDAP Public License 2.2.2
    - Open LDAP Public License v2.3
    - Open LDAP Public License v2.4
    - Open LDAP Public License v2.5
    - Open LDAP Public License v2.6
    - Open LDAP Public License v2.7
    - Open LDAP Public License v2.8
    - Open Market License
    - OpenSSL License
    - PHP License v3.0
    - PHP License v3.01
    - Plexus Classworlds License
    - Python Software Foundation License 2.0
    - Python License 2.0
    - Ruby License
    - Saxpath License
    - SGI Free Software License B v2.0
    - Standard ML of New Jersey License
    - SunPro License
    - Scheme Widget Library (SWL) Software License Agreement
    - Symlinks License
    - TCL/TK License
    - TCP Wrappers License
    - UCAR License
    - Unicode License Agreement - Data Files and Software (2015)
    - Unicode License Agreement - Data Files and Software (2016)
    - UnixCrypt License
    - The Unlicense
    - Vovida Software License v1.0
    - W3C Software Notice and License (2002-12-31)
    - X11 License
    - XFree86 License 1.1
    - xlock License
    - X.Net License
    - XPP License
    - zlib License
    - zlib/libpng License with Acknowledgment
    - Zope Public License 2.0
    - Zope Public License 2.1
    license_states:
    - newly_detected
    branch_type: default
  actions:
  - type: require_approval
    approvals_required: 1
    user_approvers_ids:
    # 替换为您的合规审批者的用户 ID
    - YOUR_USER_ID_HERE
    - YOUR_USER_ID_HERE
    group_approvers_ids:
    # 替换为包含审批者的组 ID
    - YOUR_GROUP_ID_HERE
    - YOUR_GROUP_ID_HERE
    role_approvers:
    # 替换为您的合规审批者的角色
    - owner
    - maintainer
  - type: send_bot_message
    enabled: true
  approval_settings:
    block_branch_modification: true
    block_group_branch_modification: true
    prevent_pushing_and_force_pushing: true
    prevent_approval_by_author: true
    prevent_approval_by_commit_author: true
    remove_approvals_with_new_commit: true
    require_password_to_approve: false
  fallback_behavior:
    fail: closed

工作原理

  1. scan_execution_policy 部分配置 GitLab 在所有分支上运行依赖项扫描,生成 CycloneDX 格式的 SBOM 文件,供许可证审批策略使用。
  2. approval_policy 部分创建一个规则,该规则:
    • 包含预批准许可证列表(来自 Blue Oak Council 的 金级银级铜级
    • 要求对列表中的任何许可证进行批准
    • 在检测到未批准的许可证时发送机器人消息
    • 在获得批准之前阻止合并

自定义选项

  • 审批者:您可以通过三种方式指定审批者:
    • user_approvers_ids:替换为应批准许可证的用户 ID(例如,1234567
    • group_approvers_ids:替换为包含审批者的组 ID(例如,9876543
    • role_approvers:指定可以批准的角色,选项为 developermaintainerowner
  • 项目排除:将项目 ID 添加到 policy_scope.projects.excluding 部分以将其从策略中豁免
  • 所需批准:将 approvals_required: 1 更改为要求更多批准
  • 机器人消息:在 send_bot_message 下设置 enabled: false 以禁用机器人通知
  • 覆盖项目审批设置:根据需要修改 approval_settings 部分(设置为 true 的任何内容将覆盖项目设置)

保持许可证列表最新

为确保您的批准许可证列表与 Blue Oak Council 评级保持最新,您可以使用以下 Python 脚本获取最新的许可证数据:

import requests

def fetch_license_data():
    url = "https://blueoakcouncil.org/list.json"
    try:
        response = requests.get(url)
        response.raise_for_status()  # 对错误状态码引发异常
        return response.json()
    except requests.RequestException as e:
        print(f"获取数据时出错: {e}")
        return None

# 获取并打印数据以验证是否工作
data = fetch_license_data()
if data:
    # 查看每个评级部分
    target_tiers = ['Gold', 'Silver', 'Bronze']

    for rating in data['ratings']:
        if rating['name'] in target_tiers:
            # 打印此级别中的每个许可证名称
            for license in rating['licenses']:
                print(f"- {license['name']}")

使用此脚本:

  1. 将其保存为 update_licenses.py
  2. 如果尚未安装,请安装 requests 库:pip install requests
  3. 运行脚本:python update_licenses.py
  4. 复制输出(许可证列表)并替换您 policy.yml 文件中的现有 license_types 列表。

这确保您的策略始终反映最新的 Blue Oak Council 许可证评级。

故障排除

策略未应用

确保您修改的安全策略项目正确链接到您的组。有关更多信息,请参阅 链接到安全策略项目

依赖项扫描未运行

检查依赖项扫描是否在您的 CI/CD 配置中启用,并且存在依赖项文件。有关更多信息,请参阅 故障排除依赖项扫描

其他资源