이그레스 정책
이그레스 정책은 시스템이 맺을 수 있는 아웃바운드 네트워크 연결을 목적지, 프로토콜, 포트별로 정의하고, 그 밖의 모든 연결을 어떻게 처리할지 정합니다.
최종 업데이트: 2026년 11월 11일
이그레스 정책은 시스템이 맺을 수 있는 아웃바운드 네트워크 연결을 목적지(도메인 또는 IP 범위), 프로토콜, 포트별로 정의하고, 그 밖의 모든 연결을 어떻게 처리할지 정합니다. 이그레스 필터링은 방화벽, 프록시 또는 네트워크 정책으로 이러한 정책을 적용하는 것입니다. 이그레스 방화벽은 이를 적용하는 장치나 기능입니다.
기본 허용과 기본 거부
기본 허용 정책은 알려진 악성 목적지 목록을 차단하고 나머지는 모두 통과시킵니다. 기본 거부 정책은 알려진 안전한 목적지 목록을 허용하고 나머지는 차단합니다. Kubernetes도 같은 방식으로 작동합니다. 파드는 네트워크 정책이 이그레스 대상으로 선택하기 전까지는 어디든 접근할 수 있고, 그 이후에는 정책이 허용하는 연결만 가능합니다(Kubernetes 네트워크 정책).
아무도 예상하지 못한 목적지로 가는 트래픽을 막는 것은 기본 거부뿐이며, 공격자의 서버가 바로 그런 목적지입니다. 대가는 운영 부담입니다. 허용 목록을 만들고 최신 상태로 유지해야 합니다.
Kubernetes의 기본 거부 이그레스 정책
Kubernetes 문서는 네임스페이스의 모든 파드를 선택하고 아웃바운드 트래픽을 전혀 허용하지 않는 다음 정책을 소개합니다(Kubernetes network policies).
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
spec:
podSelector: {}
policyTypes:
- Egress
이 정책은 DNS도 차단하므로, 이름을 조회하는 워크로드에는 클러스터 DNS 서비스로의 아웃바운드 트래픽을 허용하는 두 번째 정책이 필요합니다. 허용할 대상은 그다음 파드, 네임스페이스 또는 IP 범위(ipBlock)별로 정책을 하나씩 추가합니다.
FQDN 기반 정책
표준 NetworkPolicy는 파드, 네임스페이스, IP 범위를 대상으로 하며 도메인 이름은 지정할 수 없습니다. 패키지 레지스트리는 주소가 바뀌는 CDN 뒤에 있으므로, 레지스트리 허용 목록은 이름으로 작성합니다. 일부 네트워크 플러그인이 추가하는 FQDN 기반 정책입니다. Cilium의 toFQDNs 규칙은 matchName으로 정확한 이름을, matchPattern으로 와일드카드를 지정하고, DNS 프록시가 본 DNS 응답에서 주소를 학습합니다(Cilium DNS-based policies). Calico Cloud와 Calico Enterprise는 이그레스 허용 규칙에 domains를 지정합니다(Calico DNS policy).
CI에 이그레스 정책이 필요한 이유
빌드 작업은 배포 키, 클라우드 자격 증명, 토큰을 보유하고, 다운로드한 패키지의 설치 스크립트를 실행합니다. 손상된 의존성은 CI 러너가 접근할 수 있는 어디로든 이 시크릿을 보낼 수 있으며, CI에서 토큰 탈취는 이렇게 일어납니다. 대부분의 러너는 기본적으로 모든 아웃바운드 트래픽을 허용합니다.
작업의 환경 변수를 알 수 없는 호스트로 전송하는 npm postinstall 스크립트를 예로 들어 보겠습니다. npm 레지스트리와 아티팩트 저장소만 허용하는 기본 거부 정책이 있으면 요청은 실패하고 시크릿은 작업 안에 남습니다.
정책이 차단할 때 빌드에는 무엇이 보이나요
연결이 실패하고, 빌드는 일반적인 네트워크 오류를 보고합니다. 정책이 어디에서 적용되는지에 따라 연결 거부나 재설정, 시간 초과, DNS 조회 실패, TLS 핸드셰이크 오류로 나타나며, 패키지 관리자가 재시도한 뒤에 표시되는 경우도 많습니다. 개발자에게는 불안정한 레지스트리처럼 보이기 때문에, 좋은 이그레스 정책은 차단한 모든 연결을 대상과 이유와 함께 기록합니다.
확인할 사항
- 유형이 지정된 목적지. 패키지 레지스트리는 주소가 바뀌는 콘텐츠 전송 네트워크 뒤에 있으므로, IP 주소만이 아니라 소스로 이름을 지정할 수 있어야 합니다.
- 작업 시작 전 검증: 잘못된 정책이 절반만 적용되지 않고 눈에 띄게 실패하도록 합니다.
- 실패 시 차단: 적용할 수 없을 때 작업이 보호 없이 실행되지 않도록 합니다.
GitHub Actions에서의 도입 방법은 GitHub Actions 이그레스 정책을 참조하세요.
CRACI
CRACI는 러너에서 기본 거부 또는 허용 이그레스 정책을 적용하며, 24개의 기본 제공 소프트웨어 소스 프리셋과 npm, PyPI, apt, apk, Go 프록시, Nix, Cargo, OCI 레지스트리, HTTPS 및 SSH를 통한 Git용 유형 지정 사용자 정의 소스를 제공합니다. 정책은 작업 시작 전에 검증되고 실패 시 차단되며, 위반 시 알림이 발생합니다. 같은 작업이 허용된 연결을 통해 어떤 패키지가 들어왔는지도 기록합니다. 러너 보안 비교를 참조하세요.
CRACI의 정책이 연결을 차단하면 작업에는 403 Forbidden, 연결 재설정, EOF, TLS 핸드셰이크 실패 같은 일반적인 오류가 보이고, 작업의 네트워크 트레이스에는 해당 연결이 프록시 위반 항목에 이유와 함께 표시됩니다. 예를 들어 어떤 프리셋, 소스, 규칙도 대상과 일치하지 않으면 no_match입니다. 트레이스는 작업이 실행되는 동안 작업 화면에 실시간으로 표시되며 API로도 조회할 수 있습니다(CRACI 문서: 네트워크 문제 디버그).
Kubernetes 워크로드, 서버, 계속 사용하는 GitHub 호스팅 러너의 이그레스 통제에는 네트워크 정책, 클라우드 방화벽 또는 러너 에이전트를 사용하세요. CRACI는 자체 러너에만 정책을 적용하며, 차단 전 감사 모드는 로드맵에 있습니다.