CLI 레퍼런스¶
BomLens의 전체 옵션과 분석 모드, CI/CD 통합 방법, 트러블슈팅을 설명합니다.
옵션 레퍼런스¶
Windows 사용자: 위 명령은 macOS/Linux 기준입니다. 다음 중 하나를 고르세요. 설치는 시작하기를 참고하세요.
./scripts/scan-sbom.sh를scripts\scan-sbom.bat로 바꿔 실행합니다 (Git Bash 필요).- WSL2에서는 명령을 그대로 실행합니다.
- CLI 없이 쓰려면
scripts\sbom-ui.bat을 더블클릭하거나 데스크톱 앱을 내려받으세요.
| 옵션 | 기본값 | 설명 |
|---|---|---|
--project <이름> |
— | (필수) 프로젝트 이름 |
--version <버전> |
— | (필수) 프로젝트 버전 |
--target <대상> |
현재 디렉터리 | 분석 대상: 디렉터리(소스 트리, 또는 OS rootfs·빌드 산출물 staging), Docker 이미지, 바이너리 파일, .zip/.tar.gz 아카이브. Yocto 빌드 디렉터리는 그렇게 인식해서, 빌드 트리를 훑는 대신 tmp/deploy/images/ 아래에 빌드가 만든 이미지 SBOM을 분석합니다(공급사 SBOM 가이드 참고) |
--git <url> |
— | git/GitHub URL을 얕은 클론(shallow) 후 소스로 분석 (비공개 저장소: GIT_TOKEN 환경변수) |
--branch <ref> |
기본 브랜치 | --git 대상의 브랜치, 태그, 커밋 (별칭 --ref) |
--firmware |
false | --target 파일을 펌웨어 모드로 강제 (opt-in 펌웨어 이미지) |
--analyze <sbom> |
— | 공급사 SBOM 검증·분석 (별칭 --sbom). CycloneDX/SPDX. --target와 배타 |
--model <owner/name> |
— | HuggingFace 모델의 AI SBOM(CycloneDX 1.7 ML-BOM)을 OWASP AIBOM Generator로 생성(opt-in bomlens-aibom 이미지; 모델 카드 메타데이터를 네트워크로 가져옴). --target/--analyze/--git/--merge와 배타 |
--license <spdx-id> |
— | 프로젝트를 배포하는 배포 라이선스(예: Apache-2.0). SBOM 루트 컴포넌트에 기록하고, 조건이 충돌하는 의존성을 표시하는 데 쓴다. 소스 스캔으로는 알아낼 수 없어(cdxgen이 maven과 gradle에서 루트 라이선스를 비워 둔다) 지정하지 않으면 충돌 판정을 내리지 않는다. SBOM에 이미 있는 루트 라이선스(공급사가 선언한 값)는 덮어쓰지 않는다 |
--usage <scenario> |
— | AI 모델 위험 판정을 사용 형태에 맞춘다(--model 전용): internal, product, redistribute, outputs-only. 그 사용 형태에 적용되는 라이선스 조건만으로 판정하고, 보고서에 어떤 형태 기준인지 명시한다. 지정하지 않으면 전체 조건 기준으로 판정한다 |
--merge <a.json> <b.json> … |
— | CycloneDX SBOM 두 개 이상을 하나로 병합하고 purl 기준으로 중복을 제거한 뒤, 최상위 컴포넌트를 --project/--version으로 기재. 선택 기능으로, 외부 시스템이 제품당 단일 BOM을 요구할 때 씁니다. 그 외에는 층별로 따로 둡니다(서버 SBOM 작성 가이드 참고). --target/--analyze/--git와 배타 |
--merge-root <file> |
— | --merge와 함께: 새 1.6 루트를 만드는 대신 이 입력 파일의 specVersion과 최상위 컴포넌트를 유지합니다(예: ML-BOM의 CycloneDX 1.7 루트와 모델 카드). --merge 입력 중 하나여야 하며, 유지된 루트의 이름과 버전은 --project/--version으로 바뀝니다 |
--generate-only |
false | 업로드 없이 로컬에만 저장 |
--upload-target <대상> |
dependency-track |
업로드 대상: dependency-track(DT 호환) 또는 trusca(네이티브 ingest) |
--trusca <project_id> |
— | TRUSCA에 업로드(= --upload-target trusca + project id). API_URL과 Bearer API_KEY 필요 |
--notice |
(기본 on) | 오픈소스 고지문(NOTICE, txt+html) 생성 |
--security |
(기본 on) | Trivy 보안 보고서(json+md+html) 생성. CVSS, EPSS, CISA KEV 우선순위 신호 포함 |
--spdx |
false | 최종 CycloneDX 결과를 변환한 SPDX 2.3 JSON(_bom.spdx.json)을 함께 생성 |
--all |
— | --notice --security --spdx |
--no-report |
false | 오픈소스위험분석보고서(risk-report) 생략 (아래 참고) |
--lang <en\|ko> |
en |
사람이 읽는 적합성·AI 준수 개요 보고서(.md/.html)의 언어. SBOM과 JSON 보고서는 언어와 무관하게 영어로 유지 |
--deep-license |
false | scancode 정밀 라이선스 탐지 (opt-in 이미지) |
--deep-cve |
false | grype로 Maven 컴포넌트를 CPE 기준으로 NVD와 추가 대조한다 (opt-in bomlens-deep-cve 이미지, 자동으로 내려받음). 오래된 Java 라이브러리에서 Trivy가 놓치는 NVD 전용 CVE를 찾아내며, --security를 자동으로 켠다. NVD 실시간 버전 범위로 확인하지 못한 결과는 보고서에 버전 미검증으로 표시된다 — 정밀 CVE 대조 가이드 참고 |
--identify-vendored |
false | 패키지 매니저가 없는 C/C++ 소스에 복사돼 들어간(vendored) 오픈소스를 식별. 파일 지문을 OSSKB 서비스와 대조 (발행 이미지에 포함; 소스가 아니라 해시 전송). 내장 오픈소스 식별 가이드 참고 |
--byte-stable |
false | 결정론적(재현 가능) SBOM 출력 |
--sign |
false | cosign 서명 (COSIGN_KEY 필요) |
--output-dir <dir> |
현재 디렉터리 | 산출물 베이스 디렉터리 (별칭 -o). 스캔마다 그 아래 {Project}_{Version}/ 하위 폴더에 묶여 저장되어 소스 트리를 오염시키지 않음 |
--timestamp |
false | 실행 하위 폴더 이름에 _YYYYMMDD-HHMMSS를 덧붙여, 같은 프로젝트와 버전을 다시 스캔해도 덮어쓰지 않고 나란히 보관. 폴더 이름만 바뀌고 SBOM 내용은 그대로 |
--ui |
— | 로컬 웹 UI 실행 |
--mount <dir> |
— | --ui와 함께: 호스트 디렉터리를 웹 UI의 디렉터리 경로 입력에서 고를 수 있는 읽기 전용 스캔 대상으로 추가(여러 번 지정 가능). 실행 폴더 밖의 OS 트리를 스캔할 수 있고, --mount /로 실행 중인 호스트 OS도 스캔합니다. 결과는 그대로 실행 폴더에 저장됩니다 |
--help |
— | 도움말 출력 |
환경변수로 동작을 조정할 수 있습니다.
| 환경변수 | 기본값 | 설명 |
|---|---|---|
SBOM_SCANNER_IMAGE |
ghcr.io/sktelecom/bomlens:latest |
스캐너 이미지를 다른 태그로 재정의 |
SBOM_FIRMWARE_IMAGE |
ghcr.io/sktelecom/bomlens-firmware:latest |
펌웨어 분석용 이미지 지정 |
SBOM_AIBOM_IMAGE |
ghcr.io/sktelecom/bomlens-aibom:latest |
AI 모델(ML-BOM) 생성용 이미지 지정 |
SBOM_DEEP_CVE_IMAGE |
ghcr.io/sktelecom/bomlens-deep-cve:latest |
--deep-cve(grype maven CPE 매칭)용 이미지 지정 |
SBOM_OUTPUT_FLAT |
— | 1로 두면 실행별 하위 폴더 없이 산출물을 베이스에 평면으로 저장(격리 이전 배치, 옛 경로를 기대하는 CI용) |
SBOM_OUTPUT_DIR |
~/sbom-output |
데스크톱 앱과 웹 UI의 산출물 베이스(CLI는 대신 --output-dir 사용). 스캔마다 그 아래 {Project}_{Version}/ 하위 폴더에 저장 |
SBOM_UI_MOUNT_DIR |
— | CLI 인자를 받지 않는 Windows 실행 파일 sbom-ui.bat용: 웹 UI의 디렉터리 경로 입력에 읽기 전용 대상으로 추가할 폴더 하나(--ui --mount의 더블클릭 대응). & ^ | < > 가 없는 경로를 쓸 것 — 런처는 이런 문자가 있으면 잘못된 마운트를 Docker에 넘기는 대신 거부한다 |
SBOM_LANG |
시스템 로캘 | Windows 런처와 데스크톱 앱의 언어. en 또는 ko. 한국어가 아니면 영어로 표시된다 |
SBOM_PULL |
missing |
Windows 런처의 다운로드 동작. missing은 이미지가 없을 때만, always는 매번 레지스트리를 다시 확인(새 :latest 반영), never는 네트워크를 전혀 쓰지 않음 |
SBOM_IMAGE_TAR |
— | docker save로 만든 이미지 tar 경로. Windows 런처가 pull 대신 이 파일을 불러온다. 스크립트 옆에 bomlens-image.tar가 있으면 자동으로 사용한다. SBOM_PULL=never와 함께 쓰면 완전 오프라인 설치가 된다 |
CVE_BIN_TOOL_MODE |
auto |
펌웨어 CVE 매칭 방식. auto는 번들 CVE 데이터베이스가 있으면 그걸 쓰고, 없으면 네트워크에 닿을 때 NVD에서 내려받음. offline은 번들 데이터베이스로만 매칭. online은 항상 네트워크에서 갱신. components-only는 CVE 매칭을 건너뛰고 구성요소만 담은 SBOM을 생성 |
CVE_BIN_TOOL_HOME |
/opt/cve-bin-tool-home |
번들 cve-bin-tool CVE 데이터베이스 위치. cve-bin-tool은 캐시를 HOME 기준으로 잡으므로 $CVE_BIN_TOOL_HOME/.cache/cve-bin-tool/cve.db를 읽음 |
CVE_BIN_TOOL_DISABLE_SOURCES |
GAD |
펌웨어 스캔에서 비활성화할 cve-bin-tool 데이터 출처. GAD(GitLab Advisory)는 번들된 cve-bin-tool에서 fetch 시 크래시를 일으켜 기본 비활성화 |
SCANOSS_API_URL |
OSSKB 무료 API | --identify-vendored의 엔드포인트. 에어갭·대량 사용 시 SCANOSS 상용·자체 호스팅 엔드포인트로 지정 |
SCANOSS_API_KEY |
— | SCANOSS_API_URL이 요구하는 경우의 자격 증명 |
SCANOSS_MIN_FILES |
2 |
라이브러리를 보고하기 위해 매치돼야 하는 최소 파일 수. 단발성 다운스트림 포크 노이즈를 거른다. 1로 두면 단일 파일 매치도 모두 유지 |
GIT_TOKEN |
— | 비공개 git 저장소 클론에 쓰는 토큰 |
HF_TOKEN |
— | --model과 AI SBOM 분석의 데이터셋 메타데이터 조회에 쓰는 HuggingFace read 토큰. 비공개·게이트 저장소에 필요하며, 모델을 공개하기 전 검토할 때 쓴다. HUGGING_FACE_HUB_TOKEN도 별칭으로 받는다 |
ENRICH_HF_SECURITY |
true |
--model 스캔에서 HuggingFace가 자체 실행한 파일 보안 스캔 결과(파일별 ClamAV·picklescan)를 읽어 ML-BOM에 기록한다. 메타데이터만 읽고 파일은 내려받지 않는다. false면 조회를 건너뛴다 |
COSIGN_KEY |
— | --sign에 쓰는 서명 키 경로 |
FETCH_LICENSE |
true |
소스 스캔 시 의존성 라이선스를 자동 조회. false면 조회를 생략해 속도를 높임 |
PROJECT_LICENSE |
— | --license와 같다. 프로젝트의 배포 라이선스를 SPDX 식별자로 지정한다. bomlens:licenseConflict 판정과 위험 보고서의 충돌 절을 만든다 |
SECURITY_ENRICH |
true |
보안 보고서에 EPSS와 CISA KEV 신호를 보강. 폐쇄망에서는 false로 외부 조회 생략 |
SECURITY_NVD_VERIFY |
false |
--deep-cve와 함께: grype의 nvd:cpe 결과를 NVD 실시간 버전 범위와 대조해 범위 밖 오탐을 걸러낸다 (NVD_API_KEY와 네트워크 필요, 수 분 추가). 기본은 꺼짐 — 결과를 버리지 않고 버전 미검증으로 표시한다 |
NVD_API_KEY |
— | SECURITY_NVD_VERIFY에 쓰는 NVD API 키. 컨테이너에 이름으로만 전달하며 명령줄에 노출하지 않는다 |
API_URL |
— | 업로드 서버 주소(DT 서버 또는 TRUSCA base) |
API_KEY |
— | 업로드 자격. DT는 X-Api-Key, TRUSCA는 Bearer 토큰으로 쓰임 |
UPLOAD_TARGET |
dependency-track |
업로드 대상: dependency-track 또는 trusca |
TRUSCA_PROJECT_ID |
— | TRUSCA 프로젝트 id(UUID). trusca일 때 필수 |
TRUSCA_REF |
main |
ingest ref 라벨 |
TRUSCA_RELEASE |
--version 값 |
ingest release 라벨 |
Windows에서는 명령 프롬프트에서 설정한 환경변수가 더블클릭 실행에는 적용되지 않습니다.
그래서 런처는 UI_PORT, SBOM_LANG, SBOM_PULL, SBOM_IMAGE_TAR, SBOM_SCANNER_IMAGE,
SBOM_OUTPUT_DIR, SBOM_UI_MOUNT_DIR을 텍스트 파일에서도 읽습니다.
scripts/bomlens.settings.example.txt를 스크립트 옆에 bomlens.settings.txt로 복사하거나
%USERPROFILE%\.bomlens\settings.txt에 두면 됩니다. 실제 환경변수가 있으면 그쪽이 우선합니다.
출력 플래그 상세는 보고서 생성 가이드를, 공급사 SBOM 검증은 공급사 SBOM 검증을 참고하세요.
산출물 위치¶
스캔마다 자체 {Project}_{Version}/ 하위 폴더에 격리되므로, 한 번 실행에서 나온 파일이 한곳에 모이고 CLI가 스캔하는 소스 트리를 오염시키지 않습니다. 이 하위 폴더는 베이스 디렉터리 아래에 만들어집니다.
- CLI(
scan-sbom.sh): 베이스는 명령을 실행한 디렉터리입니다.--output-dir <dir>(별칭-o)로 바꿉니다. - 데스크톱 앱과 웹 UI: 베이스는
~/sbom-output(Windows는C:\Users\<사용자>\sbom-output)입니다.SBOM_OUTPUT_DIR환경변수로 바꿉니다.
--git이나 아카이브 수집 시에도 클론과 해제는 종료할 때 정리되는 임시 디렉터리에서 이뤄지고, 출력 하위 폴더만 남습니다.
같은 프로젝트와 버전을 다시 스캔하면 기본적으로 그 하위 폴더를 덮어써 최신 결과만 남깁니다. 매번 따로 보관하려면 --timestamp를 붙입니다. 폴더 이름에 _YYYYMMDD-HHMMSS가 덧붙어, 예를 들어 MyApp_1.0.0_20260626-143000/가 됩니다. 이 옵션은 폴더 이름만 바꿀 뿐 SBOM 파일 이름과 내용은 그대로라서 --byte-stable과 함께 쓸 수 있습니다.
이전의 평면 배치, 즉 하위 폴더 없이 베이스에 파일을 바로 저장하던 방식으로 되돌리려면 SBOM_OUTPUT_FLAT=1을 설정합니다. 옛 경로를 기대하는 CI를 위한 옵션입니다.
특정 버전의 스캐너 이미지 사용¶
스캐너 이미지는 SBOM_SCANNER_IMAGE 환경변수로 재정의합니다.
SBOM_SCANNER_IMAGE="ghcr.io/sktelecom/bomlens:1.8.0" \
./scripts/scan-sbom.sh --project "MyApp" --version "1.0.0" --generate-only
트러블슈팅¶
Windows: 산출물이 생기지 않음¶
스캔이 끝났는데 산출물 파일이 PC에 보이지 않으면, 실행 폴더가 Docker 파일 공유에 포함된 경로인지 확인하세요. 홈 디렉터리(C:\Users\...) 아래는 Rancher Desktop과 Docker Desktop 모두 기본 공유되므로 안전합니다. 공유되지 않은 위치에서 실행하면 컨테이너가 결과를 호스트에 쓰지 못합니다.
Docker 권한 오류¶
현재 사용자를 docker 그룹에 추가합니다.
디스크 공간 부족¶
Docker 캐시를 정리합니다.
그 밖의 문제¶
VERBOSE=true ./tests/test-scan.sh로 상세 로그를 확인합니다.- Docker 이미지를 최신 버전으로 업데이트합니다:
docker pull ghcr.io/sktelecom/bomlens:latest - 해결되지 않으면 GitHub Issues에 환경 정보와 로그를 첨부해 제보해 주세요.
모드별 사용법은 입력 시나리오 가이드, 산출물 종류는 산출물 레퍼런스, 언어 감지는 지원 생태계를 참고하세요.