How We Protect Karrot’s Internal PyPI Proxy from Supply Chain Attacks
두줄요약
내부 PyPI 프록시 앞단에 얇은 프록시를 두어 CodeArtifact를 PyPI처럼 사용하도록 구성했습니다. 또한 PEP 691의 upload-time을 활용해 cooldown 정책을 중앙에서 적용했습니다.
문제 상황
- 내부 Python 패키지 배포 경로가 CodeArtifact 직접 노출과 환경별 AWS 인증 설정에 의존해 사용성과 운영 복잡도가 높았음
- 공급망 공격 대응을 위해 패키지 업로드 직후 설치를 늦추는 cooldown 정책을 적용할 필요가 있었음
- PEP 503 HTML 응답만으로는 업로드 시점을 알 수 없어 cooldown 필터링 기준을 만들기 어려웠음
구조와 흐름
- CodeArtifact 앞단에 얇은 프록시를 두고, 클라이언트에는 PyPI처럼 보이는 단일 진입점 제공
- 프록시가 요청을 받아 CodeArtifact 인증 헤더를 붙여 전달하고, 대용량 파일은 스트리밍으로 응답
- PEP 503은 기존 설치 호환성 유지용으로, PEP 691 JSON은 upload-time 확인용으로 활용
성능/운영 포인트
- 토큰 만료를 대비해 백그라운드 스레드에서 자동 갱신, Lock으로 공유 상태 보호
- 짧은 만료 시간과 사전 갱신, jitter로 토큰 노출과 동시 갱신 부하 완화
- /health에서 토큰 유효성까지 검사해 갱신 실패 시 재시작 유도
적용해볼 점
- 내부 패키지 트래픽을 단일 프록시로 모아 보안 정책과 관측 지점 통합
- 클라이언트별 설정 대신 서버 측 정책으로 cooldown 일괄 적용
- PEP 503/691처럼 호환성과 메타데이터 활용을 분리한 설계 고려
