OSS 라이선스 확인
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
이 가이드는 Blue Oak Council 라이선스 등급을 기반으로 프로젝트에 대한 라이선스 컴플라이언스 정책을 구현하는 데 도움을 줍니다. 또한 최신 승인 라이선스를 가져오는 Python 스크립트 update_licenses.py를 사용하여 라이선스 목록을 최신 상태로 유지할 수 있습니다.
시작하기#
솔루션 컴포넌트 다운로드#
- 계정 팀에서 초대 코드를 받으세요.
- 초대 코드를 사용하여 솔루션 컴포넌트 웹스토어에서 솔루션 컴포넌트를 다운로드하세요.
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 인스턴스 또는 그룹에 대한 관리자 액세스
- 프로젝트에 의존성 스캐닝이 활성화되어 있어야 합니다 (의존성 스캐닝 설정 지침을 따라 지정된 범위의 모든 프로젝트에 선택적으로 활성화 및 적용할 수 있습니다)
구현 가이드#
이 가이드에서는 두 가지 주요 시나리오를 다룹니다:
UI를 사용하여 처음부터 설정#
보안 정책 프로젝트가 아직 없는 경우 새 프로젝트를 만들고 의존성 스캐닝 및 라이선스 컴플라이언스 정책을 모두 설정해야 합니다.
의존성 스캐닝 처음부터 설정#
- 먼저 이 정책을 적용할 그룹을 결정하세요. 이 그룹은 정책이 적용될 수 있는 최상위 그룹 수준이 됩니다 (이 그룹 내의 프로젝트를 포함하거나 제외할 수 있습니다).
- 해당 그룹의 Secure > Policies 페이지로 이동하세요.
- New policy를 클릭하세요.
- Scan execution policy를 선택하세요.
- 정책 이름을 입력하세요 (예: "Dependency scanning policy").
- 설명을 입력하세요 (예: "사용된 OSS 라이선스 목록을 얻기 위해 의존성 스캐닝을 적용합니다").
- "이 그룹의 모든 프로젝트" (선택적으로 예외 설정 가능)나 "특정 프로젝트" (드롭다운에서 프로젝트 선택)를 선택하여 Policy scope를 설정하세요.
- Actions 섹션에서 기본값인 Secret Detection 대신 Dependency scanning을 선택하세요.
- Conditions 섹션에서 매 커밋이 아닌 일정에 따라 스캔을 실행하려면 "Triggers:"를 "Schedules:"로 선택적으로 변경할 수 있습니다.
- Create policy를 클릭하세요.
라이선스 컴플라이언스 처음부터 설정#
의존성 스캐닝을 설정한 후 다음 단계에 따라 라이선스 컴플라이언스 정책을 설정합니다:
- 동일한 그룹의 Secure > Policies 페이지로 다시 이동하세요.
- New policy를 클릭하세요.
- Merge request approval policy를 선택하세요.
- 정책 이름을 입력하세요 (예: "OSS Compliance Policy").
- 설명을 입력하세요 (예: "Blue Oak Council의 Gold, Silver, Bronze 티어에 포함되지 않은 라이선스를 차단합니다").
- "이 그룹의 모든 프로젝트" (선택적으로 예외 설정 가능)나 "특정 프로젝트" (드롭다운에서 프로젝트 선택)를 선택하여 Policy scope를 설정하세요.
- Rules 섹션에서 "Select scan type" 드롭다운을 클릭하고 License Scan을 선택하세요.
- 대상 브랜치를 설정하세요 (기본값은 모든 보호된 브랜치).
- "Status is:" 드롭다운을 Newly detected 또는 Pre-existing으로 변경하세요 (새 의존성에만 정책을 적용할지 기존 의존성에도 적용할지에 따라 다름).
- 중요: "License is:" 드롭다운을 기본값인 "Matching"에서 Except으로 변경하세요 (이렇게 하면 정책이 비승인 라이선스를 올바르게 차단합니다).
- Actions 섹션으로 스크롤하여 필요한 승인 수를 설정하세요.
- "Choose approver type" 드롭다운에서 승인을 제공해야 하는 사용자, 그룹 또는 역할을 선택하세요 (동일한 규칙에 여러 승인자 유형을 추가하려면 "Add new approver"를 클릭하세요).
- "Override project approval settings" 섹션을 구성하고 필요에 따라 기본 설정을 변경하세요.
- 페이지 상단으로 스크롤하여
.yaml mode를 클릭하세요. - YAML 편집기에서
license_types섹션을 찾아 전체 정책 구성 섹션의 승인된 라이선스 전체 목록으로 교체하세요. 해당 섹션은 다음과 같습니다:
rules:
- type: license_finding
match_on_inclusion_license: false
license_types:
# 이 섹션을 전체 정책 구성 섹션의 라이선스 전체 목록으로 교체하세요
- MIT License
- Apache License 2.0
# etc...
- Create policy를 클릭하세요.
기존 정책에 추가#
이미 보안 정책 프로젝트가 있지만 의존성 및/또는 라이선스 컴플라이언스 정책이 없는 경우:
- 그룹의 보안 정책 프로젝트로 이동하세요.
.gitlab/security-policies/의policy.yml파일로 이동하세요.- Edit > Edit single file을 클릭하세요.
- 전체 정책 구성에서
scan_execution_policy와approval_policy섹션을 추가하세요. - 다음 사항을 확인하세요:
- 기존 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로 설정된 항목은 프로젝트 승인 설정을 재정의합니다)
- 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
작동 방식#
scan_execution_policy섹션은 모든 브랜치에서 의존성 스캐닝을 실행하도록 GitLab을 구성하며, 이는 라이선스 승인 정책에서 사용되는 CycloneDX 형식의 SBOM 파일을 생성합니다.approval_policy섹션은 다음과 같은 규칙을 만듭니다:
사용자 정의 옵션#
- 승인자: 세 가지 방법으로 승인자를 지정할 수 있습니다:
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']}")
이 스크립트를 사용하려면:
update_licenses.py로 저장하세요.- 아직 설치하지 않았다면 requests 라이브러리를 설치하세요:
pip install requests. - 스크립트를 실행하세요:
python update_licenses.py. - 출력(라이선스 목록)을 복사하여
policy.yml파일의 기존license_types목록을 교체하세요.
이렇게 하면 정책이 항상 최신 Blue Oak Council 라이선스 등급을 반영하게 됩니다.
문제 해결#
정책이 적용되지 않는 경우#
수정한 보안 정책 프로젝트가 그룹에 올바르게 연결되어 있는지 확인하세요. 자세한 내용은 보안 정책 프로젝트에 연결을 참조하세요.
의존성 스캔이 실행되지 않는 경우#
CI/CD 구성에서 의존성 스캐닝이 활성화되어 있는지, 의존성 파일이 있는지 확인하세요. 자세한 내용은 의존성 스캐닝 문제 해결을 참조하세요.
