LabHub
はじめる
배우기 러닝패스 코스

閉域網のミラーとプライベート CA

取ってくる側、使う側、そしてミラーの三つの形

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

한 줄 요약

폐쇄망 인프라 작업은 늘 두 대의 컴퓨터로 나뉜다. 인터넷에 닿는 받는 쪽이 필요한 것을 정확한 버전으로 모으고 목록과 서명을 붙이면, 인터넷이 없는 쓰는 쪽이 그것을 사내 미러로 세우고 모든 도구가 그 미러와 사내 인증서를 믿게 만든다. 이 코스의 모든 모듈은 이 틀을 생태계마다 한 번씩 반복한다.

왜 이게 필요했나

폐쇄망 서버에서 pip install·npm ci·mvn package·go build·docker pull·dnf install 은 모두 같은 방식으로 실패한다 — 바깥 저장소에 닿지 못한다. 그런데 고치는 방법은 도구마다 다르다. 파이썬은 PEP 503 인덱스, npm 은 레지스트리 API, Maven 은 저장소 디렉터리 배치, Go 는 모듈 프록시 프로토콜, 컨테이너는 OCI 배포 규격, dnf 는 repodata 를 읽는다. 생태계마다 따로 외우면 끝이 없지만 틀은 하나다. 무엇을 어디서 받아, 무엇으로 묶어, 어떻게 가리키고, 무엇을 믿게 하는가.

어떻게 동작하나

받는 쪽과 쓰는 쪽. 받는 쪽은 대상 서버의 조건(운영체제·파이썬·JDK·CPU)을 알고 받아야 한다. 노트북에서 노트북용으로 받은 파일은 서버에서 틀린다. 쓰는 쪽은 매체를 검증하고, 미러를 세우고, 설정 한 줄로 도구들이 미러를 보게 한다. 둘 사이는 파일 묶음, 해시 목록, 서명뿐이다. 망분리 환경이라면 그 사이에 자료 전송 절차(승인된 매체나 전송 시스템, 반입 심의)가 끼고, 그 왕복이 보통 하루 단위다. 그래서 한 번에 완결된 묶음을 만드는 기술이 곧 폐쇄망 실무 능력이다.

미러의 세 가지 모양.

프록시 캐시   위(인터넷 저장소)를 당겨 남긴다. 연결된 동안 채우고, 끊으면 채운 것만 내준다
             verdaccio 의 uplink, Nexus 의 proxy 저장소, 레지스트리의 pull-through cache
원본 저장소   우리가 올린 것만 있다. 반입물을 올려 두거나 사내 산출물을 둔다
             Nexus 의 hosted 저장소, 파일을 늘어놓은 정적 웹 서버
스냅숏 동기화 특정 시점의 저장소를 통째로 복제한다. 목록이 아니라 "그날의 전체" 를 들고 들어간다
             배포판 저장소 복제, skopeo sync 같은 이미지 동기화

Nexus 문서는 저장소를 원격을 캐시하는 proxy, 원본인 hosted, 여럿을 한 주소로 묶는 group 으로 나눈다. 현장 장비가 무엇이든 이 세 가지의 조합이다. 다만 Nexus 3 는 공식 요구 사양이 호스트 메모리 8GB, 기본 힙 2703MB 라서 이 코스의 실습 파드(2Gi)에는 들어가지 않는다. 그래서 실습은 원리가 같은 가벼운 것(http.server, verdaccio, 정적 파일 서버, 배포 레지스트리)으로 하고, 읽기에서 Nexus 메뉴와 대응시킨다.

신뢰의 두 층. 미러를 세우면 두 가지를 믿게 해야 한다. 첫째, 이 서버가 그 미러가 맞는가 — TLS 인증서, 즉 사설 CA 를 도구마다의 신뢰 저장소에 넣는 일. 둘째, 이 파일이 원래 그 파일인가 — 해시와 서명. pip 의 해시 검사 모드, npm 잠금 파일의 integrity, go.sum, Maven 의 .sha1, rpm 의 GPG 서명, 이미지의 다이제스트가 모두 두 번째 층이다. 한 층을 믿는다고 다른 층을 꺼도 되는 것은 아니다.

이름과 시간도 인프라다. 사내 미러는 이름(예: pypi.airgap.internal)으로 불러야 인증서의 SAN 과 맞고, 서버가 바뀌어도 설정을 고치지 않는다. 그 이름을 푸는 사내 DNS 가 있어야 한다. 그리고 TLS 는 인증서의 유효 기간을 지금 시각과 비교하므로, 시계가 틀린 서버는 멀쩡한 인증서를 "아직 유효하지 않다" 거나 "만료됐다" 고 거절한다. 인터넷 시간 서버에 닿지 않는 폐쇄망에는 사내 시간 서버가 필요하다.

현장에서 만나는 모습

폐쇄망 반입 사고의 대부분은 세 가지 중 하나다. 의존성이 모자라 다시 나가는 것, 받는 쪽과 쓰는 쪽의 조건이 달라 안 맞는 것, 그리고 미러는 세웠는데 도구 하나가 인증서를 믿지 않아 검증을 꺼 버리는 것. 앞의 둘은 "도구가 풀어 준 결과를, 대상의 조건으로" 받으면 막히고, 마지막은 도구별 신뢰 저장소를 표로 알고 있으면 막힌다. 이 코스의 실습은 이 세 가지를 생태계마다 한 번씩 직접 겪게 설계했다. 실습 파드는 원래 바깥에 닿지 않는 방(DNS 만)이라 폐쇄망 쪽 연습에 그대로 맞고, 받는 쪽이 필요한 실습만 인터넷을 열되 폐쇄망 쪽 확인은 채점기가 바깥을 막은 채로 한다.

다음 모듈에서 할 것

pip 부터 시작한다. 받는 쪽에서 의존성까지 휠로 받고 해시로 고정한 뒤, 쓰는 쪽에 PEP 503 인덱스를 세워 pip.conf 로 가리킨다. 이어서 npm, Go, 사설 CA, Maven, RHEL 계열, 컨테이너 레지스트리, 사내 DNS·시간 서버를 차례로 하고, 마지막 모듈에서 요청서부터 서명 검증까지 반입 절차 전체를 한 번에 한다.

참고 문서: Nexus Repository Types · Nexus Formats · Nexus System Requirements · RFC 9525