InfoGrab Docs

OSS 라이선스 확인

요약

이 가이드는 Blue Oak Council 라이선스 등급을 기반으로 프로젝트에 대한 라이선스 컴플라이언스 정책을 구현하는 데 도움을 줍니다. 또한 최신 승인 라이선스를 가져오는 Python 스크립트 update_licenses.py를 사용하여 라이선스 목록을 최신 상태로 유지할 수 있습니다.

시작하기#

솔루션 컴포넌트 다운로드#

  1. 계정 팀에서 초대 코드를 받으세요.
  2. 초대 코드를 사용하여 솔루션 컴포넌트 웹스토어에서 솔루션 컴포넌트를 다운로드하세요.

OSS 라이브러리 라이선스 확인 - GitLab 정책#

이 가이드는 Blue Oak Council 라이선스 등급을 기반으로 프로젝트에 대한 라이선스 컴플라이언스 정책을 구현하는 데 도움을 줍니다. 이 정책은 Blue Oak Council의 Gold, Silver, Bronze 티어에 포함되지 않은 라이선스를 사용하는 모든 의존성에 대해 자동으로 승인을 요구합니다.

또한 최신 승인 라이선스를 가져오는 Python 스크립트 update_licenses.py를 사용하여 라이선스 목록을 최신 상태로 유지할 수 있습니다.

개요#

OSS 라이브러리 라이선스 확인은 다음을 제공합니다:

  • 프로젝트의 모든 의존성에 대한 자동 라이선스 스캐닝
  • Blue Oak Council에서 Gold, Silver, Bronze 등급을 받은 라이선스를 허용하는 사전 구성된 정책
  • 이러한 티어에 없는 라이선스에 대한 승인 워크플로

사전 요구 사항#

  • GitLab Ultimate 티어
  • GitLab 인스턴스 또는 그룹에 대한 관리자 액세스
  • 프로젝트에 의존성 스캐닝이 활성화되어 있어야 합니다 (의존성 스캐닝 설정 지침을 따라 지정된 범위의 모든 프로젝트에 선택적으로 활성화 및 적용할 수 있습니다)

구현 가이드#

이 가이드에서는 두 가지 주요 시나리오를 다룹니다:

  1. 처음부터 설정 (기존 보안 정책 프로젝트 없음)
  2. 기존 정책에 추가 (기존 보안 정책 프로젝트 있음)

UI를 사용하여 처음부터 설정#

보안 정책 프로젝트가 아직 없는 경우 새 프로젝트를 만들고 의존성 스캐닝 및 라이선스 컴플라이언스 정책을 모두 설정해야 합니다.

의존성 스캐닝 처음부터 설정#

  1. 먼저 이 정책을 적용할 그룹을 결정하세요. 이 그룹은 정책이 적용될 수 있는 최상위 그룹 수준이 됩니다 (이 그룹 내의 프로젝트를 포함하거나 제외할 수 있습니다).
  2. 해당 그룹의 Secure > Policies 페이지로 이동하세요.
  3. New policy를 클릭하세요.
  4. Scan execution policy를 선택하세요.
  5. 정책 이름을 입력하세요 (예: "Dependency scanning policy").
  6. 설명을 입력하세요 (예: "사용된 OSS 라이선스 목록을 얻기 위해 의존성 스캐닝을 적용합니다").
  7. "이 그룹의 모든 프로젝트" (선택적으로 예외 설정 가능)나 "특정 프로젝트" (드롭다운에서 프로젝트 선택)를 선택하여 Policy scope를 설정하세요.
  8. Actions 섹션에서 기본값인 Secret Detection 대신 Dependency scanning을 선택하세요.
  9. Conditions 섹션에서 매 커밋이 아닌 일정에 따라 스캔을 실행하려면 "Triggers:"를 "Schedules:"로 선택적으로 변경할 수 있습니다.
  10. Create policy를 클릭하세요.

라이선스 컴플라이언스 처음부터 설정#

의존성 스캐닝을 설정한 후 다음 단계에 따라 라이선스 컴플라이언스 정책을 설정합니다:

  1. 동일한 그룹의 Secure > Policies 페이지로 다시 이동하세요.
  2. New policy를 클릭하세요.
  3. Merge request approval policy를 선택하세요.
  4. 정책 이름을 입력하세요 (예: "OSS Compliance Policy").
  5. 설명을 입력하세요 (예: "Blue Oak Council의 Gold, Silver, Bronze 티어에 포함되지 않은 라이선스를 차단합니다").
  6. "이 그룹의 모든 프로젝트" (선택적으로 예외 설정 가능)나 "특정 프로젝트" (드롭다운에서 프로젝트 선택)를 선택하여 Policy scope를 설정하세요.
  7. Rules 섹션에서 "Select scan type" 드롭다운을 클릭하고 License Scan을 선택하세요.
  8. 대상 브랜치를 설정하세요 (기본값은 모든 보호된 브랜치).
  9. "Status is:" 드롭다운을 Newly detected 또는 Pre-existing으로 변경하세요 (새 의존성에만 정책을 적용할지 기존 의존성에도 적용할지에 따라 다름).
  10. 중요: "License is:" 드롭다운을 기본값인 "Matching"에서 Except으로 변경하세요 (이렇게 하면 정책이 비승인 라이선스를 올바르게 차단합니다).
  11. Actions 섹션으로 스크롤하여 필요한 승인 수를 설정하세요.
  12. "Choose approver type" 드롭다운에서 승인을 제공해야 하는 사용자, 그룹 또는 역할을 선택하세요 (동일한 규칙에 여러 승인자 유형을 추가하려면 "Add new approver"를 클릭하세요).
  13. "Override project approval settings" 섹션을 구성하고 필요에 따라 기본 설정을 변경하세요.
  14. 페이지 상단으로 스크롤하여 .yaml mode를 클릭하세요.
  15. YAML 편집기에서 license_types 섹션을 찾아 전체 정책 구성 섹션의 승인된 라이선스 전체 목록으로 교체하세요. 해당 섹션은 다음과 같습니다:
rules:
  - type: license_finding
    match_on_inclusion_license: false
    license_types:
    # 이 섹션을 전체 정책 구성 섹션의 라이선스 전체 목록으로 교체하세요
    - MIT License
    - Apache License 2.0
    # etc...
  1. Create policy를 클릭하세요.

기존 정책에 추가#

이미 보안 정책 프로젝트가 있지만 의존성 및/또는 라이선스 컴플라이언스 정책이 없는 경우:

  1. 그룹의 보안 정책 프로젝트로 이동하세요.
  2. .gitlab/security-policies/policy.yml 파일로 이동하세요.
  3. Edit > Edit single file을 클릭하세요.
  4. 전체 정책 구성에서 scan_execution_policyapproval_policy 섹션을 추가하세요.
  5. 다음 사항을 확인하세요:
    • 기존 YAML 구조 유지
    • 이 섹션들을 다른 최상위 섹션과 동일한 수준에 배치
    • user_approvers_ids 및/또는 group_approvers_ids 및/또는 role_approvers 설정 (하나만 필요)
      • YOUR_USER_ID_HERE 또는 YOUR_GROUP_ID_HERE를 적절한 사용자/그룹 ID로 교체 (사용자 이름이 아닌 사용자/그룹 ID를 붙여넣으세요, 예: 1234567)
    • 정책에서 제외할 프로젝트가 있는 경우 YOUR_PROJECT_ID_HERE 교체 (프로젝트 이름/경로가 아닌 프로젝트 ID를 붙여넣으세요, 예: 1234)
    • approvals_required: 1을 필요한 승인 수로 설정
    • 필요에 따라 approval_settings 섹션 수정 (true로 설정된 항목은 프로젝트 승인 설정을 재정의합니다)
  6. Commit changes를 클릭하고 새 브랜치에 커밋하세요. 정책 변경을 병합할 수 있도록 Create a merge request for this change를 선택하세요.

전체 정책 구성#

참조용으로 전체 정책 구성은 다음과 같습니다:

scan_execution_policy:
- name: License scan policy
  description: Enforces dependency scanning to get a list of OSS licenses used, in
    order to remain compliant with OSS usage guidance.
  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: OSS Compliance Policy
  description: |-
    Block any licenses that are not included in the Blue Oak Council's Gold, Silver, or Bronze tiers.
    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의 Gold, Silver, Bronze 티어)
    • 이 목록에 없는 라이선스에 대해 승인 요구
    • 비승인 라이선스가 감지되면 봇 메시지 전송
    • 승인이 완료될 때까지 병합 차단

사용자 정의 옵션#

  • 승인자: 세 가지 방법으로 승인자를 지정할 수 있습니다:
    • user_approvers_ids: 라이선스를 승인해야 하는 개인의 사용자 ID로 교체 (예: 1234567)
    • group_approvers_ids: 승인자가 포함된 그룹의 그룹 ID로 교체 (예: 9876543)
    • role_approvers: 승인할 수 있는 역할 지정, 옵션은 developer, maintainer, owner
  • 프로젝트 제외: policy_scope.projects.excluding 섹션에 프로젝트 ID를 추가하여 정책에서 제외
  • 필요한 승인 수: 더 많은 승인을 요구하려면 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()  # Raise an exception for bad status codes
        return response.json()
    except requests.RequestException as e:
        print(f"Error fetching data: {e}")
        return None

# Fetch and print the data to verify it worked
data = fetch_license_data()
if data:
    # Look through each rating section
    target_tiers = ['Gold', 'Silver', 'Bronze']

    for rating in data['ratings']:
        if rating['name'] in target_tiers:
            # Print each license name in this tier
            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 구성에서 의존성 스캐닝이 활성화되어 있는지, 의존성 파일이 있는지 확인하세요. 자세한 내용은 의존성 스캐닝 문제 해결을 참조하세요.

추가 리소스#

OSS 라이선스 확인

Tier: Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

이 가이드는 Blue Oak Council 라이선스 등급을 기반으로 프로젝트에 대한 라이선스 컴플라이언스 정책을 구현하는 데 도움을 줍니다. 또한 최신 승인 라이선스를 가져오는 Python 스크립트 update_licenses.py를 사용하여 라이선스 목록을 최신 상태로 유지할 수 있습니다.

시작하기#

솔루션 컴포넌트 다운로드#

  1. 계정 팀에서 초대 코드를 받으세요.
  2. 초대 코드를 사용하여 솔루션 컴포넌트 웹스토어에서 솔루션 컴포넌트를 다운로드하세요.

OSS 라이브러리 라이선스 확인 - GitLab 정책#

이 가이드는 Blue Oak Council 라이선스 등급을 기반으로 프로젝트에 대한 라이선스 컴플라이언스 정책을 구현하는 데 도움을 줍니다. 이 정책은 Blue Oak Council의 Gold, Silver, Bronze 티어에 포함되지 않은 라이선스를 사용하는 모든 의존성에 대해 자동으로 승인을 요구합니다.

또한 최신 승인 라이선스를 가져오는 Python 스크립트 update_licenses.py를 사용하여 라이선스 목록을 최신 상태로 유지할 수 있습니다.

개요#

OSS 라이브러리 라이선스 확인은 다음을 제공합니다:

  • 프로젝트의 모든 의존성에 대한 자동 라이선스 스캐닝
  • Blue Oak Council에서 Gold, Silver, Bronze 등급을 받은 라이선스를 허용하는 사전 구성된 정책
  • 이러한 티어에 없는 라이선스에 대한 승인 워크플로

사전 요구 사항#

  • GitLab Ultimate 티어
  • GitLab 인스턴스 또는 그룹에 대한 관리자 액세스
  • 프로젝트에 의존성 스캐닝이 활성화되어 있어야 합니다 (의존성 스캐닝 설정 지침을 따라 지정된 범위의 모든 프로젝트에 선택적으로 활성화 및 적용할 수 있습니다)

구현 가이드#

이 가이드에서는 두 가지 주요 시나리오를 다룹니다:

  1. 처음부터 설정 (기존 보안 정책 프로젝트 없음)
  2. 기존 정책에 추가 (기존 보안 정책 프로젝트 있음)

UI를 사용하여 처음부터 설정#

보안 정책 프로젝트가 아직 없는 경우 새 프로젝트를 만들고 의존성 스캐닝 및 라이선스 컴플라이언스 정책을 모두 설정해야 합니다.

의존성 스캐닝 처음부터 설정#

  1. 먼저 이 정책을 적용할 그룹을 결정하세요. 이 그룹은 정책이 적용될 수 있는 최상위 그룹 수준이 됩니다 (이 그룹 내의 프로젝트를 포함하거나 제외할 수 있습니다).
  2. 해당 그룹의 Secure > Policies 페이지로 이동하세요.
  3. New policy를 클릭하세요.
  4. Scan execution policy를 선택하세요.
  5. 정책 이름을 입력하세요 (예: "Dependency scanning policy").
  6. 설명을 입력하세요 (예: "사용된 OSS 라이선스 목록을 얻기 위해 의존성 스캐닝을 적용합니다").
  7. "이 그룹의 모든 프로젝트" (선택적으로 예외 설정 가능)나 "특정 프로젝트" (드롭다운에서 프로젝트 선택)를 선택하여 Policy scope를 설정하세요.
  8. Actions 섹션에서 기본값인 Secret Detection 대신 Dependency scanning을 선택하세요.
  9. Conditions 섹션에서 매 커밋이 아닌 일정에 따라 스캔을 실행하려면 "Triggers:"를 "Schedules:"로 선택적으로 변경할 수 있습니다.
  10. Create policy를 클릭하세요.

라이선스 컴플라이언스 처음부터 설정#

의존성 스캐닝을 설정한 후 다음 단계에 따라 라이선스 컴플라이언스 정책을 설정합니다:

  1. 동일한 그룹의 Secure > Policies 페이지로 다시 이동하세요.
  2. New policy를 클릭하세요.
  3. Merge request approval policy를 선택하세요.
  4. 정책 이름을 입력하세요 (예: "OSS Compliance Policy").
  5. 설명을 입력하세요 (예: "Blue Oak Council의 Gold, Silver, Bronze 티어에 포함되지 않은 라이선스를 차단합니다").
  6. "이 그룹의 모든 프로젝트" (선택적으로 예외 설정 가능)나 "특정 프로젝트" (드롭다운에서 프로젝트 선택)를 선택하여 Policy scope를 설정하세요.
  7. Rules 섹션에서 "Select scan type" 드롭다운을 클릭하고 License Scan을 선택하세요.
  8. 대상 브랜치를 설정하세요 (기본값은 모든 보호된 브랜치).
  9. "Status is:" 드롭다운을 Newly detected 또는 Pre-existing으로 변경하세요 (새 의존성에만 정책을 적용할지 기존 의존성에도 적용할지에 따라 다름).
  10. 중요: "License is:" 드롭다운을 기본값인 "Matching"에서 Except으로 변경하세요 (이렇게 하면 정책이 비승인 라이선스를 올바르게 차단합니다).
  11. Actions 섹션으로 스크롤하여 필요한 승인 수를 설정하세요.
  12. "Choose approver type" 드롭다운에서 승인을 제공해야 하는 사용자, 그룹 또는 역할을 선택하세요 (동일한 규칙에 여러 승인자 유형을 추가하려면 "Add new approver"를 클릭하세요).
  13. "Override project approval settings" 섹션을 구성하고 필요에 따라 기본 설정을 변경하세요.
  14. 페이지 상단으로 스크롤하여 .yaml mode를 클릭하세요.
  15. YAML 편집기에서 license_types 섹션을 찾아 전체 정책 구성 섹션의 승인된 라이선스 전체 목록으로 교체하세요. 해당 섹션은 다음과 같습니다:
rules:
  - type: license_finding
    match_on_inclusion_license: false
    license_types:
    # 이 섹션을 전체 정책 구성 섹션의 라이선스 전체 목록으로 교체하세요
    - MIT License
    - Apache License 2.0
    # etc...
  1. Create policy를 클릭하세요.

기존 정책에 추가#

이미 보안 정책 프로젝트가 있지만 의존성 및/또는 라이선스 컴플라이언스 정책이 없는 경우:

  1. 그룹의 보안 정책 프로젝트로 이동하세요.
  2. .gitlab/security-policies/policy.yml 파일로 이동하세요.
  3. Edit > Edit single file을 클릭하세요.
  4. 전체 정책 구성에서 scan_execution_policyapproval_policy 섹션을 추가하세요.
  5. 다음 사항을 확인하세요:
    • 기존 YAML 구조 유지
    • 이 섹션들을 다른 최상위 섹션과 동일한 수준에 배치
    • user_approvers_ids 및/또는 group_approvers_ids 및/또는 role_approvers 설정 (하나만 필요)
      • YOUR_USER_ID_HERE 또는 YOUR_GROUP_ID_HERE를 적절한 사용자/그룹 ID로 교체 (사용자 이름이 아닌 사용자/그룹 ID를 붙여넣으세요, 예: 1234567)
    • 정책에서 제외할 프로젝트가 있는 경우 YOUR_PROJECT_ID_HERE 교체 (프로젝트 이름/경로가 아닌 프로젝트 ID를 붙여넣으세요, 예: 1234)
    • approvals_required: 1을 필요한 승인 수로 설정
    • 필요에 따라 approval_settings 섹션 수정 (true로 설정된 항목은 프로젝트 승인 설정을 재정의합니다)
  6. Commit changes를 클릭하고 새 브랜치에 커밋하세요. 정책 변경을 병합할 수 있도록 Create a merge request for this change를 선택하세요.

전체 정책 구성#

참조용으로 전체 정책 구성은 다음과 같습니다:

scan_execution_policy:
- name: License scan policy
  description: Enforces dependency scanning to get a list of OSS licenses used, in
    order to remain compliant with OSS usage guidance.
  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: OSS Compliance Policy
  description: |-
    Block any licenses that are not included in the Blue Oak Council's Gold, Silver, or Bronze tiers.
    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의 Gold, Silver, Bronze 티어)
    • 이 목록에 없는 라이선스에 대해 승인 요구
    • 비승인 라이선스가 감지되면 봇 메시지 전송
    • 승인이 완료될 때까지 병합 차단

사용자 정의 옵션#

  • 승인자: 세 가지 방법으로 승인자를 지정할 수 있습니다:
    • user_approvers_ids: 라이선스를 승인해야 하는 개인의 사용자 ID로 교체 (예: 1234567)
    • group_approvers_ids: 승인자가 포함된 그룹의 그룹 ID로 교체 (예: 9876543)
    • role_approvers: 승인할 수 있는 역할 지정, 옵션은 developer, maintainer, owner
  • 프로젝트 제외: policy_scope.projects.excluding 섹션에 프로젝트 ID를 추가하여 정책에서 제외
  • 필요한 승인 수: 더 많은 승인을 요구하려면 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()  # Raise an exception for bad status codes
        return response.json()
    except requests.RequestException as e:
        print(f"Error fetching data: {e}")
        return None

# Fetch and print the data to verify it worked
data = fetch_license_data()
if data:
    # Look through each rating section
    target_tiers = ['Gold', 'Silver', 'Bronze']

    for rating in data['ratings']:
        if rating['name'] in target_tiers:
            # Print each license name in this tier
            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 구성에서 의존성 스캐닝이 활성화되어 있는지, 의존성 파일이 있는지 확인하세요. 자세한 내용은 의존성 스캐닝 문제 해결을 참조하세요.

추가 리소스#