Supply Chain 공격 방어 가이드 — npm, pip, 컨테이너 보안
Supply chain 공격 유형과 실제 사례, npm audit, lockfile 관리, SBOM, 컨테이너 이미지 스캔 방어 체크리스트.
한 줄 요약: Supply chain 공격은 의존성 패키지, 빌드 도구, 컨테이너 이미지를 통해 악성 코드가 배포 파이프라인에 침투하는 공격이다. lockfile 고정, SBOM 생성, 이미지 서명 검증을 조합하면 실질적 방어가 가능하다.
2021년 ua-parser-js, 2020년 event-stream 사건처럼 수백만 개 프로젝트가 의존하는 오픈소스 패키지가 악의적으로 수정된 사례가 반복되고 있다. 공격자는 소셜 엔지니어링으로 메인테이너 권한을 탈취하거나, 오타 스쿼팅(typosquatting)으로 유사 패키지명을 등록해 개발자를 속인다. 이 가이드는 npm, pip, 컨테이너 환경의 실질적 방어 전략을 다룬다.
Supply Chain 공격 유형과 실제 사례
Supply chain 공격은 소프트웨어 개발 및 배포 파이프라인의 어느 단계에서나 발생할 수 있다. 주요 공격 벡터는 다음과 같다.
npm 보안 강화 실전 가이드
npm 환경에서 supply chain 공격을 방어하는 핵심은 lockfile 고정 + audit + 패키지 검증의 조합이다.
Bash — npm audit 및 취약점 확인# 취약점 스캔 npm audit # 자동 수정 가능한 취약점 패치 npm audit fix # 세부 리포트 (JSON 형식) npm audit --json > audit-report.json # 심각도 레벨 지정 (critical/high만 실패 처리) npm audit --audit-level=high # CI에서 사용: 취약점 발견 시 빌드 실패 npm audit --audit-level=critical || exit 1
Bash — lockfile 무결성 검증# CI에서는 반드시 npm ci 사용 (package-lock.json 기반 정확 설치) # npm install은 lockfile을 변경할 수 있어 위험 npm ci # lockfile 변경 여부 검사 (CI 파이프라인에서 활용) npm install git diff --exit-code package-lock.json || { echo "package-lock.json이 변경됐습니다. 의도하지 않은 의존성 변경 확인 필요" exit 1 }
Bash — .npmrc로 레지스트리 고정 및 보안 설정# .npmrc 설정 (프로젝트 루트 또는 홈 디렉토리) # 공식 npm 레지스트리만 허용 registry=https://registry.npmjs.org/ # 스크립트 자동 실행 비활성화 (postinstall 악성 스크립트 방지) ignore-scripts=true # 패키지 설치 시 integrity 체크 강제 package-lock=true # audit 서버 설정 audit-registry=https://registry.npmjs.org/
ignore-scripts=true를 설정하면 일부 패키지(node-sass, sqlite3 등 네이티브 모듈)가 빌드 실패할 수 있다. 이 경우 신뢰하는 패키지만 선택적으로 스크립트 실행을 허용하는 방식(npm install --ignore-scripts 후 개별 실행)을 검토하자.pip/Python 환경 보안 강화
Python 생태계도 npm과 유사한 supply chain 위협에 노출돼 있다. PyPI에서 2022~2024년 사이 수백 개의 악성 패키지가 제거됐다. requirements.txt 해시 고정과 pip-audit 도구를 활용한 방어가 핵심이다.
Bash — pip 보안 강화# requirements.txt에 해시 고정 (pip-compile 활용) pip install pip-tools pip-compile --generate-hashes requirements.in -o requirements.txt # 해시 검증과 함께 설치 pip install --require-hashes -r requirements.txt # pip-audit으로 취약점 스캔 pip install pip-audit pip-audit pip-audit --requirement requirements.txt # 결과 JSON 저장 pip-audit --format json -o audit.json # Safety 도구 (OSV 데이터베이스 기반) pip install safety safety check
requirements.txt — 해시 고정 예시# pip-compile --generate-hashes로 생성된 형식 requests==2.31.0 --hash=sha256:58cd2187423839b4b35c9da0e4fa8d4af5ccf6c8e8ed8a71bfbbb7e7b04eb8e9 --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 certifi==2024.2.2 --hash=sha256:abc12345...
SBOM 생성과 컨테이너 이미지 보안
SBOM(Software Bill of Materials)은 소프트웨어에 포함된 모든 컴포넌트와 의존성 목록이다. Log4Shell 같은 취약점 발생 시 영향받는 시스템을 즉시 파악하는 데 필수적이다. 미국 NIST와 EU Cyber Resilience Act에서 SBOM 제출을 의무화하는 방향으로 가고 있다.
Bash — Syft로 SBOM 생성 (Node.js/컨테이너)# Syft 설치 (macOS) brew install anchore/syft/syft # Node.js 프로젝트 SBOM 생성 (SPDX 형식) syft . -o spdx-json > sbom.spdx.json # CycloneDX 형식 syft . -o cyclonedx-json > sbom.cyclonedx.json # Docker 이미지 SBOM 생성 syft ubuntu:22.04 -o table # Grype로 SBOM 취약점 스캔 brew install anchore/grype/grype grype sbom:./sbom.spdx.json
Bash — 컨테이너 이미지 보안 스캔 (Trivy)# Trivy 설치 (macOS) brew install aquasecurity/trivy/trivy # 이미지 취약점 스캔 trivy image nginx:latest # CRITICAL/HIGH만 출력 trivy image --severity CRITICAL,HIGH node:20-alpine # 파일시스템 스캔 (프로젝트 디렉토리) trivy fs . # CI에서 사용: 취약점 발견 시 빌드 실패 trivy image --exit-code 1 --severity CRITICAL myapp:latest # Cosign으로 이미지 서명 검증 brew install cosign cosign verify --certificate-identity-regexp='https://github.com/' --certificate-oidc-issuer='https://token.actions.githubusercontent.com' cgr.dev/chainguard/node:latest
방어 체크리스트와 CI/CD 통합
아래 체크리스트를 팀의 개발 프로세스와 CI/CD 파이프라인에 통합하면 supply chain 공격에 대한 실질적 방어선을 구축할 수 있다.
YAML — GitHub Actions 보안 강화 예시name: Secure Build on: [push, pull_request] jobs: security: runs-on: ubuntu-latest permissions: contents: read security-events: write steps: # 타사 액션은 커밋 SHA로 고정 (태그 아님) - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Setup Node.js uses: actions/setup-node@8f152de45cc393bb48ce5d89d36a731955982216 # v4.0.0 with: node-version: '20' cache: 'npm' # lockfile 기반 정확 설치 - run: npm ci # 취약점 스캔 - run: npm audit --audit-level=high # SBOM 생성 - name: Generate SBOM uses: anchore/sbom-action@78fc58e266e87a38d4194b2137a3d4e9baf7b82e # v0.15.0 with: format: spdx-json artifact-name: sbom.spdx.json
참고 자료:
- CISA Supply Chain 보안 가이드: cisa.gov
- OpenSSF Scorecard (오픈소스 보안 점수): securityscorecards.dev
- Sigstore/Cosign: docs.sigstore.dev
- Trivy 공식 문서: trivy.dev