공급망
CI/CD 보안
CI/CD 보안은 소프트웨어를 빌드, 테스트, 출시하는 파이프라인을 보호하는 활동입니다. 파이프라인은 여러 출처의 코드를 실행하고, 프로덕션 시크릿을 보유하며, 고객이 설치하는 결과물을 만들어 냅니다. 그래서 회사에서 가장 가치 있는 공격 대상 중 하나이면서도, 가장 덜 감시되는 곳인 경우가 많습니다.
업데이트
파이프라인이 공격 대상이 되는 이유
- 열쇠를 쥐고 있습니다. 클라우드 자격 증명, 레지스트리 토큰, 서명 키가 모두 CI를 거칩니다.
- 다른 사람의 코드를 실행합니다. 모든 종속성, 설치 스크립트, 서드파티 액션이 러너에서 실행됩니다.
- 프로덕션에 닿습니다. 파이프라인에서 나온 것은 무엇이든 신뢰받고, 서명되고, 출시됩니다. 빌드에 침투한 공격자는 모든 고객에게 한꺼번에 도달합니다.
- 지켜보는 사람이 적습니다. 워크플로 파일은 거의 변경되지 않으며 애플리케이션 코드보다 검토를 덜 받습니다.
tj-actions 침해 사고와 Shai-Hulud npm 웜은 모두 CI의 시크릿을 노렸습니다. 이러한 공격이 어떻게 전개되는지는 공급망 공격이란 무엇인가를 참고하세요.
주요 CI/CD 보안 위험
OWASP Top 10 CI/CD Security Risks가 표준 참고 자료입니다. 무엇이 잘못되는지에 따라 묶으면 다음과 같습니다.
| 영역 | OWASP 위험 | 나타나는 모습 |
|---|---|---|
| 누가 무엇을 변경할 수 있는가 | 불충분한 흐름 제어, 부적절한 ID 및 접근 관리 | 검토 없이 코드가 프로덕션에 도달하거나, 오래된 계정이 접근 권한을 유지함 |
| 파이프라인에서 무엇이 실행되는가 | 종속성 체인 악용, 오염된 파이프라인 실행(poisoned pipeline execution) | 악성 패키지나 변경된 워크플로가 작업의 권한으로 실행됨 |
| 작업이 무엇에 접근할 수 있는가 | 불충분한 파이프라인 기반 접근 제어, 불충분한 자격 증명 관리 | 하나의 작업이 모든 시크릿을 읽을 수 있고, 토큰이 수년간 유지됨 |
| 어떻게 구성되어 있는가 | 안전하지 않은 시스템 구성, 통제되지 않은 서드파티 서비스 사용 | 패치되지 않은 러너, 필요 이상의 권한을 가진 통합 |
| 무엇을 입증할 수 있는가 | 부적절한 아티팩트 무결성 검증, 불충분한 로깅 및 가시성 | 릴리스에 무엇이 들어갔는지, 작업이 어디에 연결했는지 아무도 알 수 없음 |
각 위험을 러너 통제에 매핑한 내용은 러너 보안 비교를 참고하세요.
CI/CD 보안 모범 사례
- 파이프라인 정의를 프로덕션 코드처럼 다루세요. 워크플로 파일에 검토를 필수로 하고, 신뢰할 수 없는 풀 리퀘스트가 시크릿에 접근하지 못하게 하세요.
- 각 작업이 할 수 있는 일을 제한하세요. 토큰에는 필요한 최소 권한만 부여하고, 저장된 시크릿보다 수명이 짧은 자격 증명을 우선 사용하세요.
- 서드파티 액션을 커밋 해시로 고정하세요. 태그는 다른 코드로 옮겨질 수 있습니다.
- 작업을 격리하세요. 각 작업을 새로운 환경에서 실행하여 다음 작업으로 아무것도 이어지지 않게 하세요.
- 아웃바운드 트래픽을 통제하세요. 빌드에는 알려진 소스와 알려진 목적지만 필요합니다. 그 밖의 모든 것을 차단하면 탈취된 시크릿이 밖으로 나가는 것을 막을 수 있습니다. GitHub Actions 이그레스 정책을 참고하세요.
- 무슨 일이 있었는지 기록하세요. 각 빌드의 SBOM과 네트워크 활동 로그를 보관하면 나중에 질문에 답할 수 있습니다.
단계별 버전은 CI/CD 파이프라인 보안 체크리스트를 참고하세요.
CI/CD 보안 도구의 유형
| 유형 | 하는 일 | 예시 |
|---|---|---|
| 러너 보안 | 작업을 격리하고 실행 중 접근할 수 있는 대상을 제어 | CRACI, StepSecurity |
| 보안 태세 관리 | 위험한 파이프라인 및 리포지토리 설정을 찾아냄 | Legit Security, Cycode, Apiiro, OX Security |
| 코드 및 종속성 스캔 | 변경될 때마다 코드, 종속성, 시크릿을 검사 | GitHub Advanced Security, Snyk, Semgrep |
| SBOM 및 증거 | 각 릴리스에 무엇이 들어갔는지 기록 | CRACI, Syft, Anchore |
이 도구들은 서로 다른 단계에서 작동하므로 대부분의 팀이 함께 사용합니다. 스캐너는 빌드 전에 파일을 살펴보고, 보안 태세 도구는 설정을 살펴보며, 러너 보안은 작업이 실행되는 동안 작동합니다. 악성 패키지가 행동하는 시점이 바로 그때입니다. 소프트웨어 공급망 보안 도구 비교와 DevSecOps 도구 비교를 참고하세요.
CRACI의 역할
CRACI는 빌드가 실행되는 동안 빌드를 보호합니다. GitHub 호스팅 러너를 더 빠르고 비용이 낮은 러너로 대체합니다. 각 작업은 격리된 자체 가상 머신에서 실행되고, 이그레스 정책이 빌드에 필요 없는 연결을 차단하며, 작업이 가져오는 모든 패키지가 SBOM에 기록됩니다. 정책은 빌드에 필요한 것만 허용하므로, 아무도 본 적 없는 공격에 대해서도 보호를 제공합니다.
CRACI는 워크플로 구성을 점검하거나, 소스 코드나 시크릿을 스캔하거나, 출처 증명에 서명하지 않습니다. 이러한 기능을 위한 도구는 유지하거나 추가하세요. 현재 지원되는 CI 시스템은 GitHub Actions이며, 다른 CI 시스템은 로드맵에 있습니다.
CI/CD 보안: 자주 묻는 질문
CI/CD 보안이란 무엇인가요?
소프트웨어를 빌드, 테스트, 출시하는 파이프라인을 보호하는 활동으로, 파이프라인의 자격 증명, 실행하는 코드, 생성하는 아티팩트를 모두 포함합니다.
가장 큰 CI/CD 보안 위험은 무엇인가요?
악성 종속성과 서드파티 액션, 오염된 파이프라인, 과도한 권한을 가진 토큰과 수명이 긴 시크릿, 그리고 빌드가 무엇을 했는지에 대한 가시성 부족입니다. OWASP Top 10 CI/CD Security Risks가 표준 목록입니다.
오염된 파이프라인 실행(poisoned pipeline execution)이란 무엇인가요?
공격자가 파이프라인이 실행하는 내용을 바꾸는 것입니다. 예를 들어 풀 리퀘스트를 통해 워크플로 파일이나 워크플로가 호출하는 스크립트를 수정하여, 자신의 코드가 파이프라인의 권한으로 실행되게 합니다.
CI/CD 파이프라인은 어떻게 보호하나요?
파이프라인 변경 사항을 검토하고, 각 작업에 필요한 최소 권한만 부여하고, 서드파티 액션을 커밋 해시로 고정하고, 작업을 격리하고, 아웃바운드 트래픽을 제한하며, 각 빌드가 무엇을 했는지 기록하세요.
CI/CD 보안과 DevSecOps의 차이는 무엇인가요?
DevSecOps는 소프트웨어 개발 방식 전반에 보안을 녹여 내는 더 넓은 활동입니다. CI/CD 보안은 파이프라인 자체에 초점을 맞추며, DevSecOps 도구 역시 이 파이프라인에 의존합니다.
GitHub Actions에는 추가 보안이 필요한가요?
GitHub는 토큰 권한과 시크릿 스캔 같은 통제 기능을 제공하지만 직접 구성해야 하며, 호스팅 러너는 기본적으로 아웃바운드 트래픽을 제한하지 않습니다. 대부분의 팀은 고정, 검토 규칙, 러너 통제를 추가합니다.