SBOM 업로드
다른 도구로 만든 SBOM(software bill of materials, 소프트웨어 구성 명세)이 이미 있습니까? 기존 TRUSCA 프로젝트에 업로드하면 TRUSCA가 소스를 복제하거나 스캔하지 않고도 그 컴포넌트를 취약점 데이터와 매칭하고, 선언 라이선스를 분류하고, 의존성 그래프를 구성하고, SBOM의 적합성을 채점하고, 빌드 게이트를 실행합니다. CycloneDX-JSON과 SPDX(JSON 또는 Tag-Value)를 모두 받습니다.
엔드포인트는 POST /v1/projects/{project_id}/sbom-ingest 입니다. 비동기로 동작 합니다. 요청이 성공하면 큐에 들어간 스캔 행과 함께 202 Accepted를 반환하므로, 스캔을 폴링해 결과를 확인합니다.
자체 도구(예: 빌드에서 실행하는 cdxgen)로 CycloneDX JSON SBOM을 생성하고 TRUSCA로 분석하려는 엔지니어와 CI 파이프라인. TRUSCA API Key가 필요합니다 — API keys 참고.
TRUSCA는 Dependency-Track API 호환이 아닙니다. Dependency-Track 방식 — X-Api-Key 헤더와 autoCreate 폼 필드, base64 bom 필드를 쓰는 POST /api/v1/bom — 은 여기서 통하지 않습니다. 아래에 정리한 TRUSCA 엔드포인트와 Authorization: Bearer 헤더, multipart 필드를 사용하세요. 프로젝트는 사전에 존재해야 하며 자동 생성은 없습니다.
사전 조건
tos_<prefix>_<secret>형식의 TRUSCA API Key. /integrations → API keys → Create API key에서 생성하며, 스코프 모델은 API keys 참고.- 대상 프로젝트가 이미 존재. UUID는 Project Settings → CI/CD에서 복사합니다. SBOM 업로드는 프로젝트를 생성하지 않습니다.
- API Key의 스코프가 그 프로젝트를 커버 — 프로젝트에 바인딩된
project스코프 키이거나, 팀이 소유한 프로젝트라면team스코프 키. - CycloneDX-JSON 문서(지원하는
specVersion은1.2부터1.7. 1.7이 ML-BOM 필드를 담는 버전입니다 — AI SBOM 적합성 참고) 또는 JSON·Tag-Value 형식의 SPDX 문서. CVE 매칭에서는 Trivy가 포맷을 자동 감지하고, 컴포넌트 적재를 위해 SPDX는 CycloneDX로 변환됩니다. SPDX RDF/XML은 받지 않습니다. - 프로젝트에 큐 대기 중이거나 실행 중인 스캔이 없음(프로젝트당 진행 스캔 1개, 두 번째는
409반환).
SBOM 업로드 방법
문서를 multipart/form-data로 보냅니다.
| 필드 | 필수 | 예 | 설명 |
|---|---|---|---|
sbom | 예 | @bom.cdx.json | CycloneDX JSON SBOM 파일. |
ref | 아니오 | main | SBOM을 생성한 git ref(브랜치명·태그·전체 ref). TRUSCA가 보존 키로 정규화합니다. |
release | 아니오 | v1.2.3 | 결과 스냅샷에 붙일 릴리스/버전 레이블. |
API Key를 베어러 토큰으로 인증합니다. 헤더는 Authorization: Bearer <API_KEY> 이며, X-Api-Key가 아닙니다.
curl -X POST \
https://trustedoss.example.com/v1/projects/<PROJECT_ID>/sbom-ingest \
-H "Authorization: Bearer $TRUSTEDOSS_API_KEY" \
-F "sbom=@bom.cdx.json" \
-F "ref=main" \
-F "release=v1.2.3"
<PROJECT_ID>는 프로젝트 UUID로 바꾸고 TRUSTEDOSS_API_KEY는 환경에 설정합니다. cdxgen 기반 파이프라인은 빌드 단계에서 bom.cdx.json을 생성한 다음 위 명령으로 업로드할 수 있습니다.
성공하면 응답은 큐에 들어 간 스캔 행과 함께 202 Accepted 입니다.
{
"id": "3f9a2c10-7b4e-4d2a-9c11-0e8f5d6a1b22",
"project_id": "<PROJECT_ID>",
"kind": "sbom",
"status": "queued",
"ref": "main",
"release": "v1.2.3"
}
업로드된 SBOM의 kind는 항상 sbom이고 status는 queued로 시작합니다. id를 보관하세요 — 다음에 폴링할 스캔 id입니다.
스캔 완료 확인
같은 베어러 토큰으로 스캔이 최종 상태(succeeded, failed, cancelled)에 도달할 때까지 폴링합니다. GitHub Actions 연동이 쓰는 폴링 패턴과 동일합니다.
curl https://trustedoss.example.com/v1/scans/<SCAN_ID> \
-H "Authorization: Bearer $TRUSTEDOSS_API_KEY"
status는 queued → running → succeeded로 이동합니다. 30초에 한 번 폴링하는 주기가 적당합니다. status가 succeeded가 되면 포털에서 프로젝트를 열어 컴포넌트, 취약점, 라이선스를 확인합니다.
적합성(conformance) 결과 읽기
SBOM을 업로드하면 TRUSCA는 매칭 이전에(그리고 매칭 여부와 무관하게) SBOM의 품질