SCANOSS

SCANOSS는 오픈소스 컴포넌트를 파일 단위뿐 아니라 스니펫(코드 조각) 단위까지 식별할 수 있는 소프트웨어 구성 분석(SCA) 도구입니다. 1억 개 이상의 파일을 인덱싱한 지식베이스(OSSKB, Open Source Knowledge Base)와 대조하여 라이선스·저작권 정보를 검출하고, CycloneDX·SPDX 형식의 SBOM을 자동으로 생성합니다.

1. 주요 특징

  • 스니펫 수준 매칭: 파일 전체가 아닌 코드 일부를 복사·수정한 경우도 출처 추적 가능
  • 대규모 지식베이스: OSSKB에 1억 개 이상의 오픈소스 파일 인덱싱 — 주요 패키지 저장소와 GitHub 커버
  • SBOM 자동 생성: CycloneDX(JSON/XML) 및 SPDX 형식 출력 지원
  • CLI & REST API 이중 제공: scanoss-py(Python) CLI와 REST API를 모두 지원하여 자동화 통합이 용이
  • CI/CD 파이프라인 통합: GitHub Actions 등 CI 환경에서 커맨드 한 줄로 스캔 가능

2. 설치 방법

Python 3.8 이상 환경에서 pip로 설치합니다.

pip install scanoss

설치 확인:

scanoss-py --version

3. 기본 사용법

(1) 디렉토리 스캔

# 현재 디렉토리 스캔 후 결과를 JSON으로 저장
scanoss-py scan . --output results.json

(2) SBOM 생성 (CycloneDX)

# 스캔 결과를 CycloneDX JSON 형식의 SBOM으로 변환
scanoss-py component crypto --input results.json --format cyclonedx --output sbom.json

(3) 결과 확인

# 검출된 컴포넌트 목록 조회
cat results.json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for f, matches in data.items():
    for m in matches:
        if m.get('id') != 'none':
            print(f\"{f}: {m.get('component','?')} ({m.get('licenses','?')})\")"

4. CI/CD 연동

GitHub Actions에서 스캔을 자동화하는 예시입니다.

# .github/workflows/scanoss.yml
name: SCANOSS License Scan

on: [push, pull_request]

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install SCANOSS
        run: pip install scanoss
      - name: Run scan
        run: scanoss-py scan . --output results.json
      - name: Generate SBOM
        run: scanoss-py component crypto --input results.json --format cyclonedx --output sbom.json
      - name: Upload SBOM
        uses: actions/upload-artifact@v4
        with:
          name: sbom
          path: sbom.json

5. 참고 자료