본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 9장: 공급망 공격 방어와 제로 트러스트
2026년 3월 23일·인프라·

9장: 공급망 공격 방어와 제로 트러스트

의존성 혼동, 타이포스쿼팅, CI 침투 등 공급망 공격 유형을 분석하고, SLSA 프레임워크와 어드미션 컨트롤러 기반의 제로 트러스트 방어 전략을 구축합니다.

16분565자8개 섹션
securitykubernetesdevopsinfrastructure
공유
container-security9 / 10
12345678910
이전8장: 시크릿 관리다음10장: 실전 프로젝트 — 컨테이너 보안 파이프라인 구축

학습 목표

  • 주요 공급망 공격 유형(의존성 혼동, 타이포스쿼팅, CI 침투)을 이해합니다.
  • SLSA 레벨 1-4의 요구사항과 구현 방법을 파악합니다.
  • **Provenance(빌드 출처 증명)**를 생성하고 검증하는 방법을 실습합니다.
  • 어드미션 컨트롤러로 제로 트러스트 배포 정책을 구현합니다.

공급망 공격이란

**Software Supply Chain Attack(소프트웨어 공급망 공격)**은 최종 타겟을 직접 공격하는 대신, 타겟이 의존하는 소프트웨어 구성 요소를 통해 침투하는 공격입니다.

현대 소프트웨어는 수백에서 수천 개의 오픈소스 패키지에 의존합니다. 이 의존성 체인의 어디든 공격자가 악성 코드를 삽입할 수 있다면, 그 패키지를 사용하는 모든 소프트웨어가 영향을 받습니다.


공급망 공격 유형

1. 의존성 혼동 (Dependency Confusion)

**Dependency Confusion(의존성 혼동)**은 공격자가 내부 패키지와 동일한 이름의 패키지를 퍼블릭 레지스트리에 등록하여, 빌드 시스템이 내부 패키지 대신 악성 패키지를 다운로드하도록 유도하는 공격입니다.

예를 들어 조직 내부에서 @mycompany/auth-utils라는 이름의 프라이빗 패키지를 사용한다고 가정합니다. 공격자가 npm 퍼블릭 레지스트리에 동일한 이름으로 더 높은 버전의 패키지를 등록하면, 패키지 매니저가 퍼블릭 버전을 우선 설치할 수 있습니다.

방어 방법:

.npmrc (npm 스코프 고정)
text
@mycompany:registry=https://npm.mycompany.com/
//npm.mycompany.com/:_authToken=${NPM_TOKEN}
.yarnrc.yml (Yarn Berry 스코프 고정)
text
npmScopes:
  mycompany:
    npmRegistryServer: "https://npm.mycompany.com/"
    npmAuthToken: "${NPM_TOKEN}"

내부 스코프를 프라이빗 레지스트리에 명시적으로 고정하면, 퍼블릭 레지스트리에서 동일 이름의 패키지를 가져오지 않습니다.

2. 타이포스쿼팅 (Typosquatting)

**Typosquatting(타이포스쿼팅)**은 인기 있는 패키지 이름과 유사한 이름으로 악성 패키지를 등록하는 공격입니다.

실제 패키지악성 패키지 (예시)
lodashlodahs, 1odash
expressexpres, expresss
requests (Python)request, requets

방어 방법:

  • package-lock.json, pnpm-lock.yaml 등 잠금 파일(lockfile)을 반드시 커밋합니다.
  • --frozen-lockfile 옵션으로 CI에서 잠금 파일과 다른 버전이 설치되는 것을 차단합니다.
  • 의존성 리뷰 도구(GitHub Dependency Review, Socket.dev)를 PR에 통합합니다.
.github/workflows/dependency-review.yml
yaml
name: Dependency Review
 
on:
  pull_request:
 
jobs:
  dependency-review:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
 
      - name: Dependency Review
        uses: actions/dependency-review-action@v4
        with:
          fail-on-severity: moderate
          deny-licenses: GPL-3.0, AGPL-3.0

3. CI/CD 파이프라인 침투

공격자가 CI/CD 시스템 자체를 타겟으로 삼는 공격입니다. 빌드 스크립트를 변조하거나, 빌드 환경에 악성 도구를 주입합니다.

대표적인 공격 벡터는 다음과 같습니다.

  • GitHub Actions 워크플로우에서 검증 없이 사용하는 서드파티 Action
  • 빌드 캐시 오염 (Cache Poisoning)
  • 빌드 환경의 시크릿 탈취

방어 방법:

pinned-actions.yml (Action 해시 고정)
yaml
steps:
  # 나쁜 예: 태그만 사용 (언제든 변경 가능)
  # - uses: actions/checkout@v4
 
  # 좋은 예: 커밋 해시로 고정
  - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11  # v4.1.1
Warning

서드파티 GitHub Actions를 사용할 때는 반드시 커밋 해시로 고정하세요. 태그는 악의적으로 변경될 수 있지만, 커밋 해시는 불변입니다. StepSecurity의 harden-runner와 같은 도구로 Action의 네트워크 활동을 모니터링하는 것도 효과적입니다.


SLSA 프레임워크 심화

5장에서 **SLSA(Supply chain Levels for Software Artifacts)**를 소개했습니다. 이번 장에서는 각 레벨의 구체적인 요구사항과 구현 방법을 심화하여 다룹니다.

SLSA 레벨별 요구사항

레벨빌드 요구사항소스 요구사항출처 증명
L1문서화된 빌드버전 관리기본 Provenance
L2호스팅된 CI/CD버전 관리서명된 Provenance
L3격리된 빌드2인 리뷰검증 가능한 Provenance
L4재현 가능2인 리뷰 + 브랜치 보호완전한 Provenance

Provenance 생성과 검증

**Provenance(출처 증명)**는 "이 아티팩트가 어디서, 어떻게, 무엇으로 빌드되었는가"를 기록한 메타데이터입니다.

slsa-provenance-example.json (간략화)
json
{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [
    {
      "name": "ghcr.io/myorg/myapp",
      "digest": {
        "sha256": "abc123..."
      }
    }
  ],
  "predicateType": "https://slsa.dev/provenance/v1",
  "predicate": {
    "buildDefinition": {
      "buildType": "https://github.com/slsa-framework/slsa-github-generator",
      "externalParameters": {
        "source": {
          "uri": "git+https://github.com/myorg/myapp@refs/heads/main",
          "digest": {
            "sha1": "def456..."
          }
        }
      }
    },
    "runDetails": {
      "builder": {
        "id": "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@refs/tags/v2.0.0"
      },
      "metadata": {
        "invocationId": "https://github.com/myorg/myapp/actions/runs/12345"
      }
    }
  }
}
Provenance 검증
bash
# slsa-verifier로 출처 증명 검증
slsa-verifier verify-image \
  ghcr.io/myorg/myapp@sha256:abc123... \
  --source-uri github.com/myorg/myapp \
  --source-branch main
 
# cosign으로 attestation 검증
cosign verify-attestation \
  --type slsaprovenance \
  --certificate-identity-regexp=".*slsa-framework/slsa-github-generator.*" \
  --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
  ghcr.io/myorg/myapp@sha256:abc123...

어드미션 컨트롤러 기반 정책

**Admission Controller(어드미션 컨트롤러)**는 쿠버네티스 API 서버로 들어오는 요청을 가로채어 정책을 적용하는 메커니즘입니다. 이미지 정책, 서명 검증, SLSA 레벨 확인 등을 배포 시점에 강제할 수 있습니다.

Kyverno 정책 예시

kyverno-policy-comprehensive.yaml
yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: container-security-policy
spec:
  validationFailureAction: Enforce
  rules:
    # 규칙 1: 허용된 레지스트리만 사용
    - name: restrict-registries
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "허용된 레지스트리의 이미지만 사용할 수 있습니다."
        pattern:
          spec:
            containers:
              - image: "ghcr.io/myorg/* | cgr.dev/chainguard/*"
 
    # 규칙 2: latest 태그 금지
    - name: deny-latest-tag
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "latest 태그는 사용할 수 없습니다. 구체적인 버전을 지정하세요."
        pattern:
          spec:
            containers:
              - image: "!*:latest"
 
    # 규칙 3: 이미지 서명 검증
    - name: verify-signature
      match:
        any:
          - resources:
              kinds:
                - Pod
      verifyImages:
        - imageReferences:
            - "ghcr.io/myorg/*"
          attestors:
            - entries:
                - keyless:
                    subject: "https://github.com/myorg/*"
                    issuer: "https://token.actions.githubusercontent.com"
 
    # 규칙 4: SLSA Provenance 검증
    - name: verify-slsa-provenance
      match:
        any:
          - resources:
              kinds:
                - Pod
      verifyImages:
        - imageReferences:
            - "ghcr.io/myorg/*"
          attestations:
            - type: "https://slsa.dev/provenance/v1"
              attestors:
                - entries:
                    - keyless:
                        subject: "https://github.com/slsa-framework/*"
                        issuer: "https://token.actions.githubusercontent.com"
              conditions:
                - all:
                    - key: "{{ buildDefinition.externalParameters.source.uri }}"
                      operator: Equals
                      value: "git+https://github.com/myorg/*"

이 정책은 네 가지 규칙을 한번에 적용합니다.

  1. 허용된 레지스트리(GHCR, Chainguard)의 이미지만 배포 가능
  2. latest 태그 사용 금지
  3. Cosign 키리스 서명 검증 통과 필수
  4. SLSA Provenance 존재 및 출처 검증
Info

정책을 처음 도입할 때는 validationFailureAction: Audit로 설정하여 모니터링 모드로 운영하세요. 기존 워크로드에 영향을 주지 않으면서 정책 위반 현황을 파악할 수 있습니다. 충분히 검증된 후에 Enforce로 전환합니다.


제로 트러스트 아키텍처

**Zero Trust(제로 트러스트)**는 "아무것도 신뢰하지 않고, 항상 검증한다"는 원칙입니다. 컨테이너 환경에서 제로 트러스트를 구현하려면 다음 계층 모두에서 검증이 이루어져야 합니다.

제로 트러스트 체크리스트

계층검증 항목도구
코드의존성 리뷰, 2인 리뷰Dependency Review, Branch Protection
빌드격리 빌드, Provenance 생성SLSA GitHub Generator
이미지서명, SBOM, 취약점 스캔Cosign, Syft, Trivy
배포서명 검증, 정책 적용Kyverno, OPA Gatekeeper
런타임시스콜 모니터링, 행동 감지Falco
네트워크기본 거부, mTLSCilium, Istio
접근RBAC, 시크릿 로테이션Vault, ESO

실제 공급망 공격 사례와 교훈

SolarWinds (2020)

공격자가 SolarWinds의 빌드 시스템에 침투하여 Orion 소프트웨어의 업데이트에 악성 코드를 삽입했습니다. 이 업데이트를 적용한 18,000여 조직이 영향을 받았습니다.

교훈: 빌드 시스템 자체의 보안이 중요하며, SLSA Level 3 이상의 격리된 빌드 환경이 이런 공격을 방지할 수 있습니다.

Codecov (2021)

공격자가 Codecov의 Bash Uploader 스크립트를 변조하여 CI 환경의 환경 변수(시크릿 포함)를 외부로 유출했습니다.

교훈: CI/CD에서 실행하는 서드파티 스크립트와 Action의 무결성을 검증해야 하며, 해시 고정이 필수적입니다.

event-stream (2018)

npm 패키지 event-stream의 유지 관리자가 악의적인 개발자에게 소유권을 이전했고, 해당 개발자가 암호화폐 지갑을 탈취하는 악성 코드를 삽입했습니다.

교훈: 오픈소스 패키지의 유지 관리자 변경을 모니터링하고, 의존성 업데이트를 자동으로 리뷰하는 체계가 필요합니다.

Warning

공급망 공격은 단일 방어선으로 막을 수 없습니다. 이 시리즈에서 다룬 모든 보안 계층 - 이미지 스캐닝, SBOM, 서명, 런타임 감지, 네트워크 정책 - 이 함께 동작해야 효과적인 방어가 가능합니다.


정리

이번 장에서는 공급망 공격의 유형과 방어 전략을 다루었습니다.

  • 의존성 혼동은 내부 패키지 스코프를 프라이빗 레지스트리에 고정하여 방어합니다.
  • 타이포스쿼팅은 잠금 파일과 의존성 리뷰 도구로 방어합니다.
  • CI/CD 침투는 서드파티 Action의 해시 고정과 빌드 환경 격리로 방어합니다.
  • SLSA 프레임워크는 빌드 프로세스의 신뢰 수준을 체계적으로 높이는 로드맵을 제공합니다.
  • 어드미션 컨트롤러로 서명 검증, Provenance 확인, 레지스트리 제한을 강제합니다.
  • 제로 트러스트는 코드부터 런타임까지 모든 계층에서 검증하는 것을 의미합니다.

다음 장에서는 이 시리즈에서 배운 모든 내용을 하나로 통합하는 실전 프로젝트를 수행합니다. 빌드부터 스캔, 서명, 배포, 런타임 모니터링까지 완전한 보안 파이프라인을 구축합니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#security#kubernetes#devops#infrastructure

관련 글

인프라

10장: 실전 프로젝트 — 컨테이너 보안 파이프라인 구축

빌드, 스캔, 서명, 배포, 런타임 모니터링까지 전체 컨테이너 보안 파이프라인을 GitHub Actions와 쿠버네티스 기반으로 통합 구축하는 실전 프로젝트입니다.

2026년 3월 25일·18분
인프라

8장: 시크릿 관리

쿠버네티스 Secrets의 한계를 이해하고, HashiCorp Vault, External Secrets Operator, Sealed Secrets로 안전한 시크릿 관리 체계를 구축합니다.

2026년 3월 21일·14분
인프라

7장: 네트워크 정책과 서비스 메시

쿠버네티스 NetworkPolicy로 기본 거부 정책을 구현하고, Calico/Cilium 네트워크 정책과 Istio mTLS로 컨테이너 간 통신을 안전하게 제어합니다.

2026년 3월 19일·14분
이전 글8장: 시크릿 관리
다음 글10장: 실전 프로젝트 — 컨테이너 보안 파이프라인 구축

댓글

목차

약 16분 남음
  • 학습 목표
  • 공급망 공격이란
  • 공급망 공격 유형
    • 1. 의존성 혼동 (Dependency Confusion)
    • 2. 타이포스쿼팅 (Typosquatting)
    • 3. CI/CD 파이프라인 침투
  • SLSA 프레임워크 심화
    • SLSA 레벨별 요구사항
    • Provenance 생성과 검증
  • 어드미션 컨트롤러 기반 정책
    • Kyverno 정책 예시
  • 제로 트러스트 아키텍처
    • 제로 트러스트 체크리스트
  • 실제 공급망 공격 사례와 교훈
    • SolarWinds (2020)
    • Codecov (2021)
    • event-stream (2018)
  • 정리