학습 목표
소프트웨어 공급망 위협(의존성·빌드·레지스트리·CI)을 설명할 수 있다.
SBOM의 목적·형식(CycloneDX·SPDX)·생성·활용을 설명할 수 있다.
SLSA 레벨과 빌드 출처(provenance)·무결성 개념을 설명할 수 있다.
의존성·컨테이너 스캔을 16편 CI 게이트에 통합하는 패턴을 설명할 수 있다.
아티팩트 pin·서명(digest·cosign) 개요를 설명할 수 있다.
문제 상황
log4jCVE — transitive 의존성 어디 쓰는지 모름·패치 수개월- npm 패키지 탈취 — maintainer 계정 해킹·악성 버전 배포
- GitHub Action
@main— 공급망 공격 시 빌드 파이프라인 침해 - 베이스 이미지
latest— 프로덕션 에 알 수 없는 OS CVE 누적 - 12편 vulnerable components — 스캔 있지만 SBOM·SLA 없음 → 감사 불가
- SolarWinds 유형 — 빌드 시스템 침해 → 신뢰 배포 경로 자체 오염
Part 5 — 17편 Zero Trust가 런타임 신뢰를 재정의했다면, 본편은 빌드·배포 전 아티팩트 계보와 무결성을 **다룬다.
공급망 공격은 직접 침투 없이 합법 업데이트 경로로 유입된다. 방어는 인벤토리·검증·최소 신뢰 빌드다.
1. 공급망 공격 표면

| 구간 | 위협 | 통제 |
|---|---|---|
| 소스 | 악성 커밋·typosquat | code review·branch protection |
| 의존성 | CVE·탈취 패키지 | lockfile·SBOM·dep scan |
| CI/CD | compromised action·secret | pin digest·OIDC·least privilege |
| 아티팩트 | 이미지 변조 | sign·provenance·digest pin |
| 배포 | 레지스트리 침해 | private registry·admission policy |
- OWASP Top 10 A06 — 12편에서 개요; 본편은 운영 체계
- Platform CI/CD — 빌드 파이프라인이 공급망 일부
2. SBOM
SBOM (Software Bill of Materials) — 애플리케이션·이미지에 포함된 컴포넌트 목록과 버전·라이선스·해시.

| 형식 | 특징 |
|---|---|
| CycloneDX | OWASP·보안 중심·CVE 연동 풍부 |
| SPDX | Linux Foundation·라이선스 표준 |
// code/sbom-component.example.json (CycloneDX 발췌)
{
"bomFormat": "CycloneDX",
"specVersion": "1.5",
"components": [
{
"type": "library",
"name": "log4j-core",
"version": "2.14.1",
"purl": "pkg:maven/org.apache.logging.log4j/log4j-core@2.14.1"
}
]
}
| 활용 | |
|---|---|
| CVE 매칭 | Grype·Trivy·Dependency-Track |
| 라이선스 감사 | 법무·오픈소스 정책 |
| 인시던트 | log4j 유형 — 영향 범위 즉시 산출 |
| 규제 | 미국 EO 14028·EU CRA — SBOM 요구 추세 |
- 생성 —
syft,cyclonedx-npm,trivy sbom; CI에서 아티팩트와 함께 저장 - 저장 — OCI artifact·Dependency-Track·artifact repository
- diff — 릴리스 마다 SBOM 비교 — 신규 컴포넌트 탐지
3. SLSA와 빌드 출처
SLSA (Supply-chain Levels for Software Artifacts) — 빌드 무결성·출처 검증 성숙도 프레임워크.

| 레벨 | 요구 요약 |
|---|---|
| L1 | provenance 존재 — 누가 빌드했는지 기록 |
| L2 | hosted 빌드·서명 된 provenance |
| L3 | hardened 빌드·비 변조 소스·감사 가능 |
provenance 예시 필드:
builder.id, buildType, source.repo, source.digest,
materials[].uri, materials[].digest
- 목표 — 빌드 결과가 선언된 소스·의존성에서 왔음 증명
- Sigstore cosign + GitHub attestations — 실무 L2 근접
- L3 — Hermetic build·두 인 검토 — 대부분 조직은 로드맵
4. 의존성 스캔
| 도구 | 대상 |
|---|---|
pip-audit / npm audit |
lockfile 기반 |
| OSV / Dependabot | CVE DB 연동 |
| Renovate | 자동 PR 업데이트 |
| Grype / Trivy | SBOM·파일시스템 |
# code/ci-dependency-scan.example.yml (발췌)
- name: pip audit
run: pip-audit -r requirements.lock --strict --desc on
- name: generate SBOM
run: syft packages dir:. -o cyclonedx-json > sbom.json
- name: scan SBOM
run: grype sbom:sbom.json --fail-on critical
| 정책 | |
|---|---|
| lockfile 필수 | requirements.txt 만 금지 (prod) |
| critical | merge block (16편) |
| high | SLA 7일 패치 |
| 예외 | ticket·만료·완화 — 영구 금지 |
- transitive — 직접 dep 만 고쳐도 하위 CVE 잔존 가능 → SBOM 전체 스캔
5. 컨테이너·베이스 이미지
| 위험 | 통제 |
|---|---|
FROM ubuntu:latest |
digest pin·minimal 베이스 (distroless·alpine) |
| root 실행 | non-root USER·12편 misconfig |
| OS 패키지 CVE | Trivy image scan CI |
| 레이어 비밀 | BuildKit secret (13편) |
# code/ci-container-scan.example.yml (발췌)
- name: Build image
run: docker build -t app:${{ github.sha }} .
- name: Trivy scan
uses: aquasecurity/trivy-action@0.28.0
with:
image-ref: app:${{ github.sha }}
severity: CRITICAL,HIGH
exit-code: 1
# code/Dockerfile.non-root.example (발췌)
FROM gcr.io/distroless/nodejs20-debian12@sha256:abc123...
WORKDIR /app
COPY --chown=nonroot:nonroot dist/ ./
USER nonroot:nonroot
- admission — Kyverno·OPA — 서명 없는·critical CVE 이미지 거부 (Platform 연계)
6. CI/CD·아티팩트 pin·서명

| 통제 | 예 |
|---|---|
| Action pin | actions/checkout@v4 → digest 또는 버전 고정 |
| 의존성 | lockfile + audit + SBOM |
| 이미지 | scan + digest deploy |
| 서명 | cosign sign·GitHub artifact attestation |
| provenance | SLSA generator·in-toto |
# code/action-pin-digest.example.yml (발췌)
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- 16편 게이트에 SBOM 생성·저장 단계 추가
- fork PR — secret 제한; supply chain 스캔은 fork에서도 실행 권장
7. 인시던트 대응
| 단계 | 조치 |
|---|---|
| 1 탐지 | CVE 공지·Dependabot·NVD |
| 2 영향 | SBOM 쿼리 — 어떤 서비스·이미지 |
| 3 패치 | 버전 업·베이스 재빌드 |
| 4 검증 | 재스캔·staging smoke |
| 5 감사 | 15편 audit — 누가 예외 승인했는지 |
- log4j 교훈 — 인벤토리 없으면 대응 시간 = 수동 grep 전체 repo
8. 체크리스트
| 항목 | 확인 |
|---|---|
| SBOM | per release, CycloneDX or SPDX stored |
| Dep scan | lockfile, critical blocks merge |
| Image scan | Trivy or Grype in CI |
| Base image | digest pin, minimal, non-root |
| CI actions | version or digest pin |
| Provenance | SLSA L1+ attestation where possible |
| SLA | patch timeline for high/critical |
| Exception | ticket + expiry, no permanent ignore |
| 안티패턴 | |
|---|---|
npm audit 만 warn |
critical block 없음 |
| SBOM 수동 1회 | 릴리스 마다 자동 |
latest 태그 배포 |
digest 핀 |
@main action |
공급망 침해 표적 |
9. 정리
- 공급망 — 소스·dep·CI·이미지·배포 전 구간 각각 통제
- SBOM — 인벤토리·CVE 대응·규제 기반
- SLSA — 빌드 출처·무결성 성숙도 로드맵
- 스캔 + pin + 서명 — 16편 게이트 확장
- Cloud IAM·워크로드 신원은 다음 편에서 클라우드 권한 계층 정리
다음에 다룰 것
- Cloud IAM
- IAM policy·role, workload identity, least privilege
해당 내용은 OWASP SCVS, SLSA Framework, NTIA SBOM, CycloneDX Specification 의 내용을 기반으로 합니다.
'애플리케이션 보안' 카테고리의 다른 글
| Security Series를 마치며 (0) | 2026.07.07 |
|---|---|
| Cloud IAM (0) | 2026.07.06 |
| Zero Trust (1) | 2026.07.04 |
| 보안 체크리스트 (0) | 2026.07.03 |
| 로깅과 감사 (0) | 2026.07.02 |