GitHub이 10월 20일 npm 패키지 방화벽을 공개 프리뷰로 냈다. 레지스트리 주소를 바꾼 곳만 막고, Copilot 에이전트는 npm에 직접 닿는다. 러너·에이전트마다 npm이 받아 오는 주소부터 확인한다.
공급망 보안 도구를 들일 때 회의 시간 대부분은 정책 값에 쓰인다. 새 버전을 며칠 묵힐지, 어떤 심각도부터 막을지. 이름이 방화벽이니 네트워크 앞에 한 번 세우면 뒤쪽 머신이 전부 그 아래로 들어온다고 여기기도 쉽다.
10월 20일 GitHub 변경 공지를 읽으면 이 방화벽은 그렇게 동작하지 않는다. 방화벽은 Actions 러너·코딩 에이전트와 업스트림 레지스트리 사이에서 메타데이터 요청과 다운로드를 검사하는데, 엔드포인트가 방화벽으로 요청을 보내도록 따로 설정해야 한다. 정책 값보다 먼저 셀 것은 그 설정을 가진 머신의 수다.
패키지 방화벽은 네트워크 장비가 아니라 npm의 registry 값이다
GitHub 설정 문서의 절차는 짧다. 사용자 수준 ~/.npmrc의 registry를 https://package-firewall.githubapp.com/npm/enterprises/<엔터프라이즈 슬러그>로 바꾸고, 인증 토큰은 GITHUB_TOKEN 환경 변수에서 읽게 한다. 문서는 이 설정이 없는 엔드포인트는 보호받지 못한다고 못 박았다.
정책 화면의 기본값은 아래와 같다.
| 정책 | 기본값 | 조정 범위 |
|---|---|---|
| Block known malware | 켜짐 | 활성 악성코드 권고 기준 |
| Block vulnerability advisories | Critical only | High·Medium·Any까지 확대 |
| Block attestation downgrades | 켜짐 | 이전 버전의 SLSA 증명이 빠진 버전 차단 |
| Block newly-introduced install scripts | 켜짐 | 설치 스크립트를 새로 넣은 버전 차단 |
| Minimum package age | 1일 | 1~365일, 0이면 끔 |
프리뷰 동안 무료이고, 정식 출시 뒤에는 Actions처럼 사용량으로 과금한다.
최소 패키지 나이 1일은 cohttp 수정 PR 10분 뒤 공격 탐침이 왔다, 보안 권고 없이 나온 패치는 Dependabot 3일 쿨다운에 걸린다에서 다룬 긴장을 그대로 들여온다. 권고 없이 나온 보안 패치도 하루 동안 막히고, 풀려면 엔터프라이즈 관리자나 보안 관리자가 예외 요청을 승인해야 한다.
설치 스크립트 차단은 npm 12의 7월 기본값 변경과 작동 지점이 다르다. npm 12는 allowScripts로 허용한 스크립트만 실행하고, 방화벽은 스크립트를 새로 넣은 버전을 내려주지 않는다. npm 11 이하 러너에는 방화벽 한 겹만 남는다.
Copilot 클라우드 에이전트는 방화벽 주소 없이도 npm을 받는다
Copilot 클라우드 에이전트에는 별도의 에이전트 방화벽이 있다. 에이전트 방화벽 문서에 따르면 의존성 다운로드용 권장 허용 목록이 기본으로 켜진다. 허용 목록 참조 문서의 Node.js 항목에는 registry.npmjs.org, registry.yarnpkg.com, get.pnpm.io가 있고, package-firewall.githubapp.com은 문서 어디에도 없다.
에이전트 세션의 npm 설정을 건드리지 않은 저장소라면 npm install은 공개 레지스트리로 곧장 가고, 에이전트 방화벽은 그 요청을 통과시킨다. 패키지 방화벽 문서는 AI 에이전트 세션을 보호한다고 쓰면서 에이전트 쪽 설정 절차는 싣지 않았다. copilot-setup-steps.yml 설정 단계와 MCP 서버 프로세스는 에이전트 방화벽의 직접 적용 범위 밖이다.
설정을 어디에 넣느냐도 결과를 바꾼다. npm 설정 문서는 명령줄 플래그, npm_config_ 환경 변수, npmrc 파일 순으로 우선한다고 적고, 파일 목록에서 프로젝트 .npmrc를 사용자 ~/.npmrc보다 앞에 둔다. 저장소에 registry= 줄이 든 .npmrc가 있으면 GitHub 문서대로 사용자 파일을 고쳐도 프로젝트 값이 이긴다. 러너와 에이전트 환경 변수에 npm_config_registry를 넣으면 두 파일보다 앞선다.
GitHub도 우회 경로를 안다. 같은 설정 문서는 Artifactory 가상 저장소에서 공개 npm 레지스트리를 직접 받는 원격 저장소를 빼라고 적었다. 남겨 두면 방화벽을 건너뛴다.
가져갈 것
- Actions 러너와 Copilot 클라우드 에이전트 세션에서
npm config get registry가package-firewall.githubapp.com/npm/enterprises/<슬러그>를 돌려주는가? - 저장소 루트
.npmrc에 공개 레지스트리를 가리키는registry=줄이 남아 있는가? - Copilot 에이전트 방화벽의 Recommended allowlist가 Disabled가 아니라면,
registry.npmjs.org직접 접근을 막을 다른 장치가 있는가? -
copilot-setup-steps.yml의npm ci가 방화벽 주소로 가는지 로그로 확인했는가? 이 단계는 에이전트 방화벽 밖에서 돈다. - 취약점 차단 기준을 기본값 Critical only로 둘지 High or higher로 올릴지 정했는가?
- 최소 패키지 나이 1일에 걸린 보안 패치의 예외 요청을 누가 몇 시간 안에 승인하는지 정해 두었는가?
안 되는 경우
- 프리뷰 대상은 GitHub Enterprise Cloud 고객뿐이고 지원 생태계는 npm 하나다. pip·Maven 의존성이 중심인 팀에는 이 점검이 아무것도 막지 못한다.
- 자체 호스팅 러너에서 Copilot 에이전트를 돌리면 에이전트 환경 문서대로 에이전트 방화벽을 꺼야 한다. 허용 목록 문제는 사라지고 네트워크 통제가 전부 조직 몫이 된다.
- 소스가 밝히지 않은 것: Copilot 클라우드 에이전트에서 방화벽 주소를 쓰는 공식 절차, 에이전트 방화벽이
package-firewall.githubapp.com을 상시 허용 호스트로 다루는지 여부, 정식 출시 시점과 과금 단가.
이번 주에 바꿀 것은 정책 값이 아니라 엔드포인트 목록이다. npm을 부르는 러너·에이전트·개발자 노트북을 한 줄씩 적고 각각의 registry 값을 옆 칸에 붙인다. 방화벽 주소가 아닌 칸이 남아 있으면 쿨다운을 며칠로 잡든 그 머신에는 적용되지 않는다. 코딩 에이전트를 검토할 때는 패키지를 받는 주소도 권한 검토 항목에 넣기를 권한다.