Tools

여기에서는 오픈소스 관리를 위해 필요한 오픈소스 도구를 소개하고 사용법을 안내합니다.

Author : 장학성 (Haksung Jang) / CC BY 4.0

1 - FOSSology

오픈소스 컴플라이언스를 위해 소프트웨어 내에 포함된 오픈소스와 라이선스 정보를 검출하기 위해 소스코드 스캔 도구를 사용할 수 있다.

https://www.fossology.org/

< https://www.fossology.org/ >

Linux Foundation의 FOSSology 프로젝트는 이러한 스캔 도구를 개발하고 오픈소스로 공개해 누구나 자유롭게 사용할 수 있게 한 도구이다.

주요 특징

FOSSology는 웹기반의 프로그램으로 사용자는 웹사이트에 로그인하여 개별 파일 혹은 소프트웨어 패키지를 업로드할 수 있다. FOSSology는 업로드된 파일 내에 라이선스 텍스트와 Copyright 정보를 검출한다. 개발자는 사용하고자 하는 오픈소스의 라이선스가 무엇인지, Copyright은 어떻게 되는지에 대한 정보를 확인하고자 할때 FOSSology를 이용하는 것이 좋다. FOSSology는 개발자가 업로드한 오픈소스 패키지 내의 모든 파일을 스캔하여 각 파일 내 라이선스 관련 텍스트와 Copyright 정보를 자동으로 검출하고, 이를 리포트로 생성한다. FOSSology 주요 특징에 대한 자세한 내용은 다음 페이지를 참고할 수 있다. : https://www.fossology.org/features/

설치

기업 내에서 FOSSology를 사용하기 위해서는 사내에 FOSSology 서버를 구축해야 한다. 이를 위해 리눅스 기반의 서버 시스템에 FOSSology를 설치해야 한다. FOSSology는 다음 세 가지 방법으로 설치할 수 있다.

  1. Docker 사용
  2. Vagrant와 VirtualBox 사용
  3. Source build하여 설치

여기서는 가장 간편한 방법인 Docker를 사용하는 방법에 대해 설명한다.

FOSSology는 컨테이너화 된 Docker 이미지를 Docker Hub (https://hub.docker.com/)를 통해 공개하고 있다. : https://hub.docker.com/r/fossology/fossology

Pre-built 된 Docker 이미지는 다음 명령어를 사용하여 실행할 수 있다.

$ docker run -p 8081:80 fossology/fossology

Docker 이미지는 다음 URL과 계정 정보로 사용할 수 있다. : http://[IP_OF_DOCKER_HOST]:8081/repo

  • Username : fossy
  • Passwd : fossy

설치와 관련한 자세한 내용은 다음 페이지를 참고할 수 있다. : https://github.com/fossology/fossology/blob/master/README.md

테스트 서버

FOSSology를 설치할 수 있는 시스템 구축이 곤란한 상황이라면, FOSSology Project에서 제공하는 테스트 서버를 이용할 수 있다. FOSSology 프로젝트에서는 테스트를 위한 환경을 제공한다. (테스트 서버는 예고없이 중단될 수 있다.)

사용자는 다음 계정으로 FOSSology 테스트 서버에 접속하여 FOSSology 기능을 시험해볼 수 있다.

Basic Workflow

FOSSology의 기본 사용 절차는 다음과 같다.

  • 사용하고자 하는 오픈소스의 라이선스와 Copyright 정보를 확인하기 위해 오픈소스의 소스 코드를 하나의 파일로 압축하여 FOSSology에 업로드한다.
  • 이를 위해 메뉴 > Upload > From File을 선택합니다.

  • 업로드할 파일을 선택하고 Upload 버튼을 클릭한다.
  • 업로드가 완료되면 Job Agent에 의해 자동으로 분석을 수행한다.
  • 메뉴 > Jobs > My Recent Jobs에서 분석 중인 Status를 확인할 수 있다.

  • 분석이 완료되면 메뉴 > Browse에서 분석 결과를 확인할 수 있다.

  • 개별 파일을 선택하면 FOSSology가 검출한 라이선스 관련 텍스트가 무엇인지 확인할 수 있다.

  • 메뉴 > Browser > 파일 혹은 디렉터리를 선택 > Copyright/Email/Url/Author에서는 FOSSology가 검출한 Copyright/Email/Url/Author 정보를 보여다.

사용자는 FOSSology는 이렇게 분석한 결과가 유효한지 여부에 대해 확인 후 잘못 검출된 항목에 대해서는 분석 결과에서 제외시키는 작업을 할 수 있다. FOSSology는 이를 Clearing 과정이라고 설명하며, 자세한 사항은 다음 페이지를 참고할 수 있다. : https://www.fossology.org/get-started/basic-workflow/

위와 같은 방법으로 사용하고자 하는 오픈소스의 라이선스는 무엇인지, Copyright 정보는 어떻게 되는지를 간단히 확인할 수 있다.

2 - SW360

(Updated on August 29, 2023.)

오픈소스를 포함하는 제품을 개발하고 배포하는 기업이라면 각 제품과 릴리스 버전마다 사용한 오픈소스의 버전, 라이선스 등의 정보를 수집하고 추적해야 한다. 이를 통해 기업은 올바른 오픈소스 컴플라이언스 활동을 수행할 수 있다.

특히, NVD (https://nvd.nist.gov/vuln)에서 특정 오픈소스 버전에 보안 취약점이 보고 되었을때, 해당 버전을 사용하고 있는 제품이 무엇인지 추적을 할 수 없다면, 그 기업은 어느 제품에 보안 패치를 적용해야 할 지 알 수 없는 상황에 처하게 되고, 그 기업의 제품들은 보안취약점에 그대로 노출이 될 수 밖에 없다.

이렇듯, 오픈소스 정보를 추적하는 활동은 꼭 필요하다. 기업들은 이를 위해 자체 시스템을 구축하거나, 상용 서비스를 구매하여 사용하기도 한다. SW360은 Eclipse 재단에서 후원하는 오픈소스로서 소프트웨어 BOM에 대한 정보를 수집 및 추적하기 위한 웹 애플리케이션 및 저장소를 제공한다.

https://www.eclipse.org/sw360/

< https://www.eclipse.org/sw360/ >

주요 특징

SW360은 웹 기반의 UI를 제공하며 주요 기능은 다음과 같다.

  • 제품에 사용된 컴포넌트 추적
  • 보안 취약점 평가
  • 라이선스 의무 관리
  • 고지문 등 법적 문서 생성

https://www.eclipse.org/sw360/

설치

SW360은 다음과 같이 구성된다.

  • Frontend : Liferay-(Tomcat-)based portal application
  • Backend : Tomcat-based thrift service
  • Database : CouchDB

Project 구조와 설치를 위해 요구되는 소프트웨어 등 자세한 내용은 README의 Required software 부분에서 확인할 수 있다. : https://github.com/eclipse-sw360/sw360

SW360은 다음 두 가지의 설치 방법을 제공한다. 사용자는 이 중 하나를 선택하여 설치할 수 있다.

  1. Docker를 통해 Deploy 할 수 있다. : https://github.com/eclipse-sw360/sw360/blob/main/README_DOCKER.md
  2. SW360의 구성요소를 개별적으로 설치할 수 있다. : https://github.com/eclipse/sw360
  3. Vagrant (https://www.vagrantup.com/) 기반 설치 : Vagrant는 가상화 인스턴스를 관리하는 도구로서 sw360vagrant에서는 SW360을 한 번에 Deploy 하기 위한 환경을 제공한다. : https://github.com/sw360/sw360vagrant
    • Vagrant 기반 설치 가이드는 여기에서 확인할 수 있다. (단, 가이드 작성 시점과 현재 코드가 상이하여 정상동작하지 않을 가능성이 있습니다.)

이 가이드에서는 Docker로 Deploy하는 방법을 소개한다. 자세한 사항은 README를 참고한다. : https://github.com/eclipse-sw360/sw360/blob/main/README_DOCKER.md

1. 코드 다운로드

Docker Image 빌드를 위해 코드를 다운로드 한다. 테스트가 완료된 코드는 여기서 받을 수 있다. : https://github.com/haksungjang/sw360/tree/docker_build

git clone -b docker_build https://github.com/haksungjang/sw360.git

2. 빌드

먼저 Docker를 설치한다. (기업 개발자가 사용하려면 유료 구매가 필요할 수 있음에 주의하세요.)

아래와 같이 docker_build.sh를 실행하여 빌드한다.

cd sw360
./docker_build.sh

정상적으로 빌드가 완료되면 아래와 같이 생성된 이미지를 확인할 수 있다.

docker image ls

REPOSITORY                       TAG              IMAGE ID       CREATED          SIZE
eclipse-sw360/sw360              18-development   ab0fd848bf80   8 minutes ago    2.95GB
eclipse-sw360/sw360              latest           ab0fd848bf80   8 minutes ago    2.95GB
ghcr.io/eclipse-sw360/sw360      18-development   ab0fd848bf80   8 minutes ago    2.95GB
ghcr.io/eclipse-sw360/sw360      latest           ab0fd848bf80   8 minutes ago    2.95GB
eclipse-sw360/binaries           18-development   aa7debf0a1fc   8 minutes ago    347MB
eclipse-sw360/binaries           latest           aa7debf0a1fc   8 minutes ago    347MB
ghcr.io/eclipse-sw360/binaries   18-development   aa7debf0a1fc   8 minutes ago    347MB
ghcr.io/eclipse-sw360/binaries   latest           aa7debf0a1fc   8 minutes ago    347MB
eclipse-sw360/base               18-development   e5147733fc88   37 minutes ago   1.52GB
eclipse-sw360/base               latest           e5147733fc88   37 minutes ago   1.52GB
ghcr.io/eclipse-sw360/base       18-development   e5147733fc88   37 minutes ago   1.52GB
ghcr.io/eclipse-sw360/base       latest           e5147733fc88   37 minutes ago   1.52GB
ghcr.io/eclipse-sw360/thrift     0.18.1           0012d7998058   4 weeks ago      152MB
ghcr.io/eclipse-sw360/thrift     latest           0012d7998058   4 weeks ago      152MB
eclipse-sw360/thrift             0.18.1           0012d7998058   4 weeks ago      152MB
eclipse-sw360/thrift             latest           0012d7998058   4 weeks ago      152MB

3. 실행

docker-compose up 명령으로 생성된 이미지를 실행한다.

docker-compose up

정상적으로 실행이 완료되면 아래와 같이 세개의 container가 실행된 것을 볼 수 있다.

docker ps 

CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS                   PORTS                                              NAMES
4299fd39010c   eclipse-sw360/sw360   "/app/entry_point.sh"    3 minutes ago   Up 3 minutes             0.0.0.0:8080->8080/tcp, 0.0.0.0:11311->11311/tcp   sw360
13fd5696b140   postgres:14           "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes (healthy)   0.0.0.0:5438->5432/tcp                             sw360-postgresdb-1
7bb70f2daaf4   couchdb               "tini -- /docker-ent…"   3 minutes ago   Up 3 minutes (healthy)   4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp         sw360-couchdb-1

이 상태에서 http://localhost:8080/로 접근하면 다음과 같은 화면에 진입한다.

설정

SW360을 정상적으로 설치한 후에는 아래의 절차대로 초기 설정이 필요하다. 자세한 내용은 여기에서 확인할 수 있다. : SW360 Initial Setup Configuration

1. User, Login 설정

설정을 위해 다음 계정으로 로그인한다.

로그인을 하면 아래와 같이 Not Found라는 표시가 나타나게 된다.

화면 우상단의 아이템 아이콘(큐브 모양)을 클릭하고 Control Panel 탭을 선택한다.

SECURITY > Password Policies > Default Password Policy > PASSWORD CHANGES > Change Requried를 활성화한다.

그리고, 다시 Control Panel탭에서 CONFIGURATION > Instance Settings을 선택한다. 그러면, PLATFORM메뉴를 볼 수 있다.

거기서 Users를 선택한다. 그리고, Default User Associations 메뉴로 진입하고, Apply to Existing Users를 체크한다. 그리고 Save한다.

이번에는 Instance Settings > PLATFORM에서 User Authentication를 선택한다. General로 진입하여 모든 항목을 Uncheck한다. (관리 목적상 필요한 항목은 Check하여 활성화할 수 있다.) 그리고 Save한다.

끝으로, jquery와 font awesome을 활성화시켜야 한다. 이를 위해 Control Panel 탭에서 CONFIGURATION > System Settings으로 진입하면 PLATFORM 하위에 Third Party를 볼 수 있다.

Third Party에 진입하여 JQueryFont Awesome을 각각 Enable시킨다.

브라우저를 새로 실행하면 변경 사항이 적용된다.

2. LAR 파일 import

SW360 설정을 위해서는 *.lar 파일들을 import해야 한다. 이를 설정하기 위해서는 메뉴로 진입해야 하는데, 메뉴 버튼은 화면 좌측 상단에 있다.

메뉴에서 Publishing > Import에 진입한다.

우측의 + 버튼을 눌러 LAR 파일을 업로드 할 수 있는데, LAR 파일은 SW360 소스 파일 내 frontend/configuration 폴더 하위에 있다. (예: https://github.com/haksungjang/sw360/tree/docker_build/frontend/configuration)

먼저, Public_Pages_7_4_3_18_GA18.lar 파일을 업로드하고 Continue 버튼을 누른다.

File Summary 화면에서 업로드된 LAR 파일 세부 내용을 볼 수 있다.

제일 아래의 AUTHORSHIP OF THE CONTENTUse the Current User as Author로 변경하고 Import 버튼을 누른다.

그러면 Import가 성공적으로 완료된 걸 볼 수 있다.

이와 유사하게 Private_Pages_7_4_3_18_GA18.lar 파일을 Import한다. File Summary 화면에서 아래와 같이 PAGES > Private Pages로 변경한다.

그리고, PERMISSIONS, UPDATE DATA, AUTHORSHIP OF THE CONTENT 항목을 각각 아래 이미지와 같이 선택하고, Import버튼을 눌러 Import를 수행한다.

여기까지 수행을 마친 후 메뉴 상단의 Home 버튼을 누른다.

그럼 아래와 같이 Welcome to SW360! 화면에 진입한다.

Start 버튼을 눌러 SW360 첫 화면에 진입할 수 있다. (모든 항목이 비어있다.)

3. User Account 설정 (테스트용)

SW360 메뉴에서 Admin > User를 선택한다.

화면 하단의 UPLOAD USERS 메뉴에서 테스트를 위한 User 리스트를 업로드 한다. (테스트를 위한 User 리스트는 여기에서 다운 받을 수 있다. : test_users_with_passwords_12345.csv )

그러면 다음과 같이 9개의 User 리스트가 업로드 된 것을 볼 수 있다.

여기서 보이는 User 리스트 중 하나인 user@@sw360.org 계정으로 다시 로그인을 시도한다. Password는 12345이다.

Basic Workflow

1. License 등록

SW360을 처음 설치하면 먼저 자주 사용하는 오픈소스 라이선스 들을 등록해야 한다. 라이선스 다음과 같은 정보를 포함한다.

  • Full Name
  • Short Name
  • License Type
  • GPL-2.0 Compatibility (예: yes, no)
  • License Text

메뉴 > Licenses > Add License를 선택하면 다음과 같이 Create License 화면으로 진입한다.

이와 같이 라이선스를 하나씩 수동으로 등록하는 일은 상당히 수고스러울 수 있는데, 다행히 SW360은 SPDX License List를 한 번에 Import 하는 기능을 제공한다. 메뉴 > Admin < Import SPDX Information을 클릭한다.

그러면, 곧 SPDX License List가 자동으로 등록됩니다. 메뉴 > Licenses에서 338개의 License가 등록된 것을 확인할 수 있다.

2. Component 및 Release 등록

SW360에서 Component는 하나의 소프트웨어 단위이다. 여기에는 다양한 형태의 소프트웨어가 해당할 수 있으며, 그 예는 다음과 같다.

  • 오픈소스 소프트웨어
  • 라이브러리
  • 3rd party 소프트웨어

Component는 다음과 같은 정보를 포함한다.

  • Component Name
  • Main Licenses
  • Categories (예: Library, Cloud, Mobile, …)
  • Component Type (예: OSS, Internal, InnerSource, Service, Freeware)
  • Default Vendor
  • Homepage URL

Release는 Component에서 하나의 Version을 가리키는 단위이다. 따라서 하나의 Component는 여러 개의 Release를 가질 수 있다. Release는 하나의 Component 하위에 생성되어 관리된다.

Release는 다음과 같은 정보들을 포함한다.

  • Component Name
  • Version
  • License
  • Download URL
  • CPE ID (예: cpe:2.3:a:apache:maven:3.0.4)

예를 들어, zlib-1.2.8을 등록해야 한다면, 먼저 Component에 zlib을 먼저 등록한 후, Release에 zlib 1.2.8을 등록한다. Menu > Components > Add Component를 선택하면 Create Component 화면으로 진입하여 zlib에 대한 정보를 등록할 수 있다.

Component를 생성하면, Components > Releases > Add Release에서 zlib-1.2.8 version에 대한 정보를 등록할 수 있다.

하나의 zlib이라는 Component에 1.2.8과 1.2.11 version을 각각의 Release로 등록하였을 때, Release Overview 화면에서 다음과 같이 2개의 Release가 존재하는 것을 볼 수 있다.

SW360은 다수의 Component 정보를 Import 시키기 위한 기능을 제공한다. 메뉴 > Admin > Import / Export에 CSV template에 등록을 원하는 Component 정보를 입력 후 Import 할 수 있다.

단, 이 기능은 2020년 2월 기준 아직 안정적으로 동작하지 않을 수 있다.

3. Project 생성

Project는 하나의 제품을 가리킨다. 사업 유형에 따라 제품일수도 있고, 서비스 혹은 소프트웨어 일수도 있다. Project에는 제품에 사용된 Component/Release를 등록하여 관리한다.

Project 생성 시에는 다음과 같은 정보를 등록한다.

  • Project Name
  • Version
  • Project type (예: Product, Customer Project, Service, Internal Project, InnerSource)

메뉴 > Projects > Add Project를 통해 Project를 생성할 수 있다.

Project를 생성하고 나면, 포함하는 Release나 하위 Project를 등록한다. 메뉴 > Projects에서 해당 Project를 선택하면 “Linked Releases and Projects”에서 Linked Projects와 Linked Releases를 등록할 수 있다.

다음은 SuperCalc라는 Project에 OpenSSL 1.0.1과 zlib 1.2.8을 Linked Releases로 등록한 이후의 화면이다.

4. 보안 취약점 관리

SW360은 등록된 Release에 대해 보안 취약점이 있는지 자동으로 확인할 수 있다. 이를 위해 SW360은 CVE 정보를 주기적으로 수집하도록 스케쥴링하는 기능을 제공한다. 메뉴 > Admin > Schedule 에서 CVE SEARCH 정보를 24시간마다 수집하도록 스케쥴링을 설정할 수 있다.

이렇게 스케쥴링을 설정하면 SW360은 정해진 시간에 CVE Search 사이트(https://cve.circl.lu/)에서 CVE 정보를 수집한다. 수집한 CVE 정보는 메뉴 > Vulnerabilities에서 확인할 수 있다.

이렇게 Vulnerabilities 정보가 수집된 이후에는 생성한 Project에 보안 취약점이 있는지 조회할 수 있다. 위에서 생성한 SuperCalc Project에서는 85개의 보안 취약점이 보고된 것을 확인할 수 있다.

이와 같은 방법으로 기업에서 개발/배포하는 소프트웨어를 SW360에 등록하여 관리한다면, 오픈소스 컴플라이언스뿐만 아니라 보안 취약점에 대해서도 리스크를 최소화할 수 있는 형태로 관리가 가능하다.

또한 SW360은 위와 같은 Web Interface 뿐만 아니라 대부분의 기능을 REST API로 제공하여서 FOSSology 등의 다른 도구와의 연동이 가능하다. : https://github.com/eclipse/sw360/wiki/Dev-REST-API

즉, 소스 코드 스캐닝 도구의 분석 결과를 SW360에 Import 시키는 등의 방법으로 DevOps에 Integration 시켜서 Project, Release 등록을 자동화시켜서 관리한다면 효율성이 크게 증가될 것이다.

3 - FOSSLight

FOSSLight는 LG Electronics에서 주도하는 오픈소스 프로젝트로, 다양한 스캐너를 활용하여 소스 코드, 바이너리, 의존성을 분석하고 SBOM(Software Bill of Materials, 소프트웨어 자재 명세서)을 생성하는 도구입니다. 특히 FOSSLight Hub는 오픈소스 관리, 라이선스 관리, 취약점 관리 기능을 제공하여 컴플라이언스 프로세스를 지원합니다.

1 FOSSLight 소개

  • 주요 기능:
    • 다양한 스캐너 연동: ScanCode Toolkit, SPDX Tools, CycloneDX, 그리고 Fossology 등 다양한 오픈소스 스캐너를 통합하여 사용
    • 다양한 분석 대상 지원: 소스 코드, 바이너리, 컨테이너 이미지, Linux 패키지 등 다양한 분석 대상 지원
    • SBOM 생성 및 관리: 다양한 형식(SPDX, CycloneDX, Excel, Text)으로 SBOM 생성 및 관리
    • 라이선스 정보 탐지 및 관리: 오픈소스 라이선스 정보를 정확하게 탐지하고 관리
    • 취약점 정보 연동: NVD, CVE 등 외부 취약점 데이터베이스와 연동하여 취약점 정보 제공
    • FOSSLight Hub: 웹 기반 UI를 통해 오픈소스 관리, 라이선스 관리, 취약점 관리 기능 제공
  • 장점:
    • 높은 확장성: 다양한 스캐너를 플러그인 형태로 통합하여 사용할 수 있음
    • 웹 기반 UI 제공: FOSSLight Hub를 통해 사용자 친화적인 인터페이스 제공
    • 다양한 보고서 형식 지원: SPDX, CycloneDX, Excel, Text 등 다양한 형식으로 보고서 생성 가능
    • 오픈소스 라이선스
  • 단점:
    • 초기 설정 복잡: 다양한 스캐너를 연동해야 하므로 초기 설정이 다소 복잡할 수 있음
    • FOSSLight Hub 설치 필요: 웹 기반 UI를 사용하려면 FOSSLight Hub를 별도로 설치해야 함

2 FOSSLight 설치

FOSSLight는 FOSSLight Scanner와 FOSSLight Hub로 구성됩니다. FOSSLight Scanner는 다양한 스캐너를 실행하여 분석 결과를 생성하는 역할을 하며, FOSSLight Hub는 스캐너 결과를 통합 관리하고 시각화하는 웹 기반 UI를 제공합니다.

여기서는 Docker Compose를 사용하여 FOSSLight Scanner와 FOSSLight Hub를 동시에 설치하는 방법을 설명합니다.

  1. Docker 및 Docker Compose 설치:

    • FOSSLight를 설치하기 전에 Docker와 Docker Compose가 시스템에 설치되어 있는지 확인합니다.
    • Docker 설치 방법은 운영체제에 따라 다르므로, Docker 공식 문서를 참고하십시오(https://docs.docker.com/get-docker/).
    • Docker Compose는 Docker를 사용하여 여러 컨테이너를 동시에 실행하고 관리하는 도구입니다. Docker Compose 설치 방법은 Docker 공식 문서를 참고하십시오(https://docs.docker.com/compose/install/).
  2. FOSSLight 저장소 복제:

    • 다음 명령어를 실행하여 FOSSLight GitHub 저장소를 복제합니다.
    git clone <https://github.com/fosslight/fosslight_hub.git>
    cd fosslight_hub
    
  3. Docker Compose 파일 설정:

    • fosslight_hub 디렉토리에는 docker-compose.yml 파일이 포함되어 있습니다. 이 파일을 텍스트 편집기로 열고, FOSSLight Hub의 설정을 변경할 수 있습니다.
    version: "3.7"
    services:
      fosslight_db:
        image: mariadb:10.6.4
        container_name: fosslight_db
        volumes:
          - fosslight_db:/var/lib/mysql
        restart: always
        environment:
          - MYSQL_ROOT_PASSWORD=fosslight
          - MYSQL_DATABASE=fosslight_db
          - MYSQL_USER=fosslight
          - MYSQL_PASSWORD=fosslight
    
      fosslight_web:
        image: fosslight/fosslight_hub:latest
        container_name: fosslight_web
        ports:
          - "8080:8080"
        restart: always
        environment:
          - FOSSLightDB_HOST=fosslight_db
          - FOSSLightDB_PORT=3306
          - FOSSLightDB_USER=fosslight
          - FOSSLightDB_PASSWORD=fosslight
          - FOSSLightDB_NAME=fosslight_db
        depends_on:
          - fosslight_db
    
      fosslight_scanner:
        image: fosslight/fosslight_scanner:latest
        container_name: fosslight_scanner
        restart: always
        volumes:
          - ./upload:/home/fosslight_scanner/upload
          - ./result:/home/fosslight_scanner/result
    volumes:
      fosslight_db:
    
    • 필요에 따라 포트 번호, 데이터베이스 설정 등을 변경할 수 있습니다.
  4. FOSSLight 실행:

    • 다음 명령어를 실행하여 FOSSLight를 실행합니다.
    docker-compose up -d
    
    • 이 명령어는 FOSSLight Hub, FOSSLight Scanner, 그리고 MariaDB 데이터베이스를 Docker 컨테이너로 실행합니다.
  5. FOSSLight 설치 확인:

    • 웹 브라우저에서 http://localhost:8080에 접속하여 FOSSLight Hub에 접속할 수 있는지 확인합니다.
    • FOSSLight Hub 웹 UI가 표시되면 설치가 성공적으로 완료된 것입니다.

    그림 2.1: FOSSLight Hub 웹 UI

    (FOSSLight Hub 웹 UI 화면 캡쳐 이미지 삽입)

3 FOSSLight 사용 가이드

FOSSLight는 웹 UI(FOSSLight Hub)와 CLI(FOSSLight Scanner)를 통해 사용할 수 있습니다.

3.1 FOSSLight Hub 사용

FOSSLight Hub는 웹 UI를 통해 오픈소스 프로젝트를 관리하고, 스캔 결과를 확인하며, 다양한 보고서를 생성할 수 있는 기능을 제공합니다.

  1. 프로젝트 등록:

    • FOSSLight Hub에 접속하여 새로운 프로젝트를 등록합니다.
    • 프로젝트 이름, 설명, 담당자 등의 정보를 입력합니다.

    그림 2.2: FOSSLight Hub 프로젝트 등록 화면

    (FOSSLight Hub 프로젝트 등록 화면 캡쳐 이미지 삽입)

  2. 스캔 결과 업로드:

    • FOSSLight Scanner를 사용하여 생성한 스캔 결과를 FOSSLight Hub에 업로드합니다.
    • 스캔 결과 파일은 SPDX, CycloneDX, 또는 FOSSLight JSON 형식이어야 합니다.

    그림 2.3: FOSSLight Hub 스캔 결과 업로드 화면

    (FOSSLight Hub 스캔 결과 업로드 화면 캡쳐 이미지 삽입)

  3. 스캔 결과 확인:

    • 업로드된 스캔 결과를 확인합니다.
    • FOSSLight Hub는 SBOM 정보, 라이선스 정보, 그리고 취약점 정보를 시각적으로 제공합니다.

    그림 2.4: FOSSLight Hub 스캔 결과 확인 화면

    (FOSSLight Hub 스캔 결과 확인 화면 캡쳐 이미지 삽입)

  4. 보고서 생성:

    • 스캔 결과를 바탕으로 다양한 보고서를 생성합니다.
    • 보고서 형식은 SPDX, CycloneDX, Excel, 또는 Text 형식을 선택할 수 있습니다.

    그림 2.5: FOSSLight Hub 보고서 생성 화면

    (FOSSLight Hub 보고서 생성 화면 캡쳐 이미지 삽입)

3.2 FOSSLight Scanner 사용

FOSSLight Scanner는 CLI를 통해 소스 코드, 바이너리, 컨테이너 이미지를 스캔하고 SBOM을 생성하는 기능을 제공합니다.

  1. 스캔 실행:

    • 다음 명령어를 실행하여 스캔을 실행합니다.
    docker run --rm -v $(pwd)/upload:/home/fosslight_scanner/upload -v $(pwd)/result:/home/fosslight_scanner/result fosslight/fosslight_scanner -p /home/fosslight_scanner/upload/<스캔 대상> -o /home/fosslight_scanner/result/<결과 파일명> -f <결과 형식>
    
    • 각 옵션에 대한 설명은 다음과 같습니다.
      • -rm: 컨테이너 실행 후 자동으로 제거합니다.
      • v $(pwd)/upload:/home/fosslight_scanner/upload: 현재 디렉토리의 upload 디렉토리를 컨테이너 내부의 /home/fosslight_scanner/upload 디렉토리와 공유합니다. 스캔 대상 파일 또는 디렉토리를 이 디렉토리에 복사해야 합니다.
      • v $(pwd)/result:/home/fosslight_scanner/result: 현재 디렉토리의 result 디렉토리를 컨테이너 내부의 /home/fosslight_scanner/result 디렉토리와 공유합니다. 스캔 결과 파일이 이 디렉토리에 저장됩니다.
      • p /home/fosslight_scanner/upload/<스캔 대상>: 스캔 대상 파일 또는 디렉토리 경로를 지정합니다.
      • o /home/fosslight_scanner/result/<결과 파일명>: 스캔 결과 파일 이름을 지정합니다.
      • f <결과 형식>: 스캔 결과 형식을 지정합니다 (spdx, cyclonedx, fosslight_json).
    • 예시:
    docker run --rm -v $(pwd)/upload:/home/fosslight_scanner/upload -v $(pwd)/result:/home/fosslight_scanner/result fosslight/fosslight_scanner -p /home/fosslight_scanner/upload/my_project -o /home/fosslight_scanner/result/my_project_sbom.json -f fosslight_json
    
  2. 스캔 결과 확인:

    • 스캔이 완료되면 result 디렉토리에 스캔 결과 파일이 생성됩니다.
    • 스캔 결과 파일을 텍스트 편집기 또는 FOSSLight Hub를 사용하여 확인할 수 있습니다.

4 FOSSLight 사용 시 주의사항

  • FOSSLight는 다양한 스캐너를 연동하여 사용하므로, 각 스캐너의 특징과 사용법을 이해해야 합니다.
  • FOSSLight Hub는 웹 서버와 데이터베이스를 필요로 하므로, 시스템 자원 요구사항을 고려하여 설치해야 합니다.
  • FOSSLight Scanner는 스캔 대상 파일 또는 디렉토리에 접근할 수 있는 권한이 필요합니다.

5 문제 해결

  • Docker 실행 오류: Docker가 제대로 설치되었는지 확인하고, 권한 문제가 없는지 확인합니다.
    • sudo docker run ... 명령어를 사용하여 관리자 권한으로 실행해봅니다.
  • 스캔 오류: 스캔 대상 파일 또는 디렉토리 경로가 정확한지 확인하고, 해당 파일 또는 디렉토리에 접근 권한이 있는지 확인합니다.
  • FOSSLight Hub 접속 오류: Docker 컨테이너가 정상적으로 실행 중인지 확인하고, 포트 포워딩 설정이 제대로 되었는지 확인합니다.

6 추가 정보

4 - OSV-SCALIBR

OSV-SCALIBR (Software Composition Analysis LIBRary)은 Google에서 개발한 오픈소스 소프트웨어 구성 분석 라이브러리입니다. 다양한 프로그래밍 언어를 지원하며, 빠르고 정확한 분석 결과를 제공하는 것을 목표로 합니다. SBOM(Software Bill of Materials, 소프트웨어 자재 명세서) 생성을 위한 핵심 기능들을 제공하지만, 독립적인 실행 파일 형태가 아닌 라이브러리 형태로 제공되므로, 사용자는 직접 코드를 작성하여 통합해야 합니다.

1 OSV-SCALIBR 소개

  • 주요 기능:
    • 다양한 프로그래밍 언어 지원 (Python, Go, Java 등)
    • 패키지 매니페스트 파일 분석 (requirements.txt, pom.xml, go.mod 등)
    • 종속성 정보 추출
    • 취약점 정보 연동 (OSV 데이터베이스 활용)
    • 빠른 분석 속도
  • 장점:
    • 다양한 프로그래밍 언어 지원
    • 빠른 분석 속도
    • OSV 데이터베이스 연동을 통한 최신 취약점 정보 제공
    • 유연한 통합 가능성
    • 오픈소스 라이선스
  • 단점:
    • 독립적인 실행 파일 형태가 아닌 라이브러리 형태로 제공
    • 사용자가 직접 코드를 작성하여 통합해야 함
    • SBOM 생성 기능을 직접 구현해야 함
    • 문서화 및 커뮤니티 지원 부족

2 OSV-SCALIBR 설치

OSV-SCALIBR은 라이브러리 형태로 제공되므로, 사용하려는 프로그래밍 언어에 맞는 패키지 관리자를 통해 설치해야 합니다. 이 가이드에서는 Python 환경에서의 설치 방법을 설명합니다.

  1. Python 및 pip 설치 확인:

    • OSV-SCALIBR을 설치하기 전에 Python과 pip가 시스템에 설치되어 있는지 확인합니다.
    • 명령 프롬프트 또는 터미널에서 다음 명령어를 실행하여 Python 버전을 확인합니다.
    python --version
    
    • Python 3.7 이상이 설치되어 있어야 합니다.
    • pip 버전을 확인하려면 다음 명령어를 실행합니다.
    pip --version
    
  2. OSV-SCALIBR 설치:

    • 다음 명령어를 실행하여 OSV-SCALIBR 라이브러리를 설치합니다.
    pip install osv-db
    
  3. 설치 확인:

    • Python 인터프리터를 실행하고, 다음 코드를 입력하여 OSV-SCALIBR이 제대로 설치되었는지 확인합니다.
    import osv
    print(osv.__version__)
    
    • OSV-SCALIBR 버전 정보가 출력되면 설치가 성공적으로 완료된 것입니다.

3 OSV-SCALIBR 사용 가이드

OSV-SCALIBR은 라이브러리 형태로 제공되므로, SBOM 생성을 위해서는 직접 코드를 작성해야 합니다. 다음은 Python 환경에서 OSV-SCALIBR을 사용하여 SBOM을 생성하는 기본적인 예시입니다.

  1. 필수 라이브러리 설치:

    • osv-db 외에도 SBOM 생성을 위해 필요한 라이브러리 (예: spdx-tools) 를 설치합니다.
    pip install spdx-tools
    
  2. 코드 작성:

    • 다음은 requirements.txt 파일에서 종속성 정보를 추출하고, OSV-SCALIBR을 사용하여 취약점 정보를 확인한 후, SPDX 형식의 SBOM을 생성하는 예시 코드입니다.
    import osv
    from spdx_tools.spdx.model import Document, Package
    from spdx_tools.spdx.builder import Builder
    from spdx_tools.spdx.validation.document_validator import validate_full
    import os
    
    def create_sbom_from_requirements(requirements_file):
        """
        requirements.txt 파일에서 종속성 정보를 추출하고,
        OSV-SCALIBR을 사용하여 취약점 정보를 확인한 후,
        SPDX 형식의 SBOM을 생성합니다.
        """
    
        # 1. requirements.txt 파일 읽기
        dependencies = []
        with open(requirements_file, "r") as f:
            for line in f:
                line = line.strip()
                if line and not line.startswith("#"):
                    package_name, package_version = line.split("==")
                    dependencies.append((package_name, package_version))
    
        # 2. OSV API 클라이언트 생성
        client = osv.Client()
    
        # 3. SPDX 문서 생성
        document = Document(
            spdx_version="SPDX-2.2",
            data_license="CC0-1.0",
            spdx_id="SPDXRef-DOCUMENT",
            name="SBOM for " + requirements_file,
        )
        document.creators = ["Tool: OSV-SCALIBR Example Script", "Organization: Your Organization"]
    
        # 4. 패키지 정보 추가 및 취약점 정보 확인
        for package_name, package_version in dependencies:
            # OSV API를 사용하여 취약점 정보 조회
            vulnerabilities = client.get_vulnerabilities(package_name, package_version)
    
            # 패키지 생성
            package = Package(
                name=package_name,
                spdx_id=f"SPDXRef-Package-{package_name}",
                version=package_version,
                # TODO: 라이선스 정보를 추가해야 합니다.
            )
    
            # 취약점 정보가 있는 경우, 주석 추가
            if vulnerabilities:
                comment = f"취약점 발견: {len(vulnerabilities)}건"
                package.comment = comment
    
            document.packages.append(package)
    
        # 5. 유효성 검사 및 출력
        validation_messages = validate_full(document)
        if validation_messages:
            print("유효성 검사 오류:")
            for message in validation_messages:
                print(message)
        else:
            # SPDX 문서를 문자열로 변환 (spdx-tools 사용)
            from spdx_tools.spdx.writer.write_anything import write_anything
            output_file = "sbom.spdx"
            write_anything(document, output_file, "tag", check_licenses=False)
            print(f"SPDX 문서 생성 성공! 파일: {output_file}")
    
    # 실행 예시
    # requirements.txt 파일이 현재 디렉토리에 있어야 합니다.
    if os.path.exists("requirements.txt"):
        create_sbom_from_requirements("requirements.txt")
    else:
        print("오류: requirements.txt 파일을 찾을 수 없습니다.")
    
  3. 코드 실행:

    • 위 코드를 Python 파일로 저장하고 (예: sbom_generator.py), 다음 명령어를 실행합니다.
    python sbom_generator.py
    
  4. 결과 확인:

    • 코드가 성공적으로 실행되면, sbom.spdx 파일이 생성됩니다. 이 파일은 SPDX 형식으로 작성된 SBOM을 포함하고 있습니다.

4 OSV-SCALIBR 사용 시 주의사항

  • OSV-SCALIBR은 라이브러리 형태로 제공되므로, SBOM 생성을 위해서는 직접 코드를 작성해야 합니다.
  • OSV-SCALIBR은 SBOM 생성을 위한 모든 기능을 제공하지 않으므로, 필요한 기능을 직접 구현하거나, 다른 라이브러리와 함께 사용해야 합니다.
  • OSV-SCALIBR 문서는 다소 부족할 수 있으며, 커뮤니티 지원이 활발하지 않을 수 있습니다.
  • 코드 예시에서는 requirements.txt 파일을 기준으로 SBOM을 생성하지만, 실제 환경에서는 다양한 패키지 관리자에 대한 지원이 필요할 수 있습니다.
  • 코드 예시에서는 라이선스 정보를 직접 추가하지 않고 있습니다. 실제 SBOM에서는 각 패키지의 라이선스 정보를 정확하게 파악하여 추가해야 합니다.

5 생성된 SBOM 예시 (추론)

OSV-SCALIBR을 사용하여 생성된 SBOM (SPDX 형식) 은 다음과 같은 구조를 가질 것입니다. (실제 내용은 requirements.txt 파일의 내용에 따라 달라집니다.)

SPDXVersion: SPDX-2.2
DataLicense: CC0-1.0
SPDXID: SPDXRef-DOCUMENT
Name: SBOM for requirements.txt
Creator: Tool: OSV-SCALIBR Example Script
Created: 2025-02-11T00:00:00Z

# Package Information
PackageName: requests
SPDXID: SPDXRef-Package-requests
PackageVersion: 2.28.1
# Comment: 취약점 발견: 1건 (OSV 데이터베이스에 따라 다를 수 있음)

PackageName: urllib3
SPDXID: SPDXRef-Package-urllib3
PackageVersion: 1.24.13

# Relationships
# (각 패키지 간의 의존 관계 정보)

참고: 위 예시는 OSV-SCALIBR을 사용하여 생성될 수 있는 SBOM의 형식을 보여주는 예시일 뿐이며, 실제 SBOM 내용은 코드 및 종속성 분석 결과에 따라 달라집니다. 라이선스 정보, 출처 정보 등 추가적인 정보는 직접 코드를 수정하여 추가해야 합니다.

6 문제 해결

  • 설치 오류: pip가 최신 버전인지 확인하고, 필요한 종속성 패키지가 설치되어 있는지 확인합니다.
    • pip install --upgrade pip
    • pip install -r requirements.txt (requirements.txt 파일이 있는 경우)
  • 코드 실행 오류: 코드에 오타가 없는지 확인하고, 필요한 라이브러리가 설치되어 있는지 확인합니다.
  • OSV 데이터베이스 연결 오류: 인터넷 연결 상태를 확인하고, OSV 데이터베이스 URL이 올바른지 확인합니다.

7 추가 정보

주의: OSV-SCALIBR은 라이브러리 형태이므로, 이 가이드만으로는 SBOM 생성을 완료하기 어려울 수 있습니다. Python 프로그래밍 및 SBOM 생성에 대한 이해가 필요하며, 추가적인 코드 작성이 필요합니다.