LabHub
开始
学习 学习路径 课程

隔离网络镜像与私有 CA

让整个系统信任,还是只让一个仓库信任

在 LabHub 中继续学习

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

한 줄 요약

RHEL 계열의 사설 CA 는 /etc/pki/ca-trust/source/anchors/ 에 넣고 update-ca-trust extract 로 시스템 전체에 퍼뜨린다. 그런데 시스템 전체가 믿게 하는 것이 늘 정답은 아니다. 저장소 하나만 다른 CA 로 확인해야 한다면 .reposslcacert 가 그 범위를 좁힌다.

왜 이게 필요했나

폐쇄망 RHEL 서버의 dnf 는 사내 저장소를 본다. 그 저장소를 HTTPS 로 세우는 순간 Curl error (60) 계열 오류와 함께 Cannot download repomd.xml 이 난다. 흔한 땜질은 sslverify=0 이다. 그러면 사내망에서 저장소 행세를 하는 누구든 패키지 목록을 내줄 수 있다. 저장소 메타데이터는 "무엇을 어떤 해시로 설치할지" 를 정하는 문서라, 그 문서의 출처를 확인하지 않는 것은 설치 전체를 맡기는 일이다.

어떻게 동작하나

시스템 신뢰 저장소. RHEL 9 문서에 따르면 인증서를 /etc/pki/ca-trust/source/anchors/(또는 우선순위가 낮은 /usr/share/pki/ca-trust-source/anchors/)에 두고 update-ca-trust extract 를 돌린다. PEM·DER 둘 다 받는다. 확인은 p11-kit 의 trust list, 넣고 빼기는 trust anchor <파일>·trust anchor --remove 로도 할 수 있다. 이 실습 이미지(Rocky 9.3)에서 보면 /etc/pki/tls/certs/ca-bundle.crt/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem 을 가리키는 심볼릭 링크다. extract 가 다시 쓰는 것이 이 extracted 아래 파일들이고, curl·dnf 처럼 시스템 묶음을 보는 도구는 그 결과를 읽는다.

저장소 하나만 믿게 하기. dnf 설정 문서는 저장소 옵션 sslcacert 를 "SSL 인증서를 검증할 CA 파일 경로, 비어 있으면 시스템 기본값" 으로, sslverify 의 기본값을 참으로 적는다. 협력사가 자기 CA 로 세운 저장소를 받아야 하는데 그 CA 를 서버의 모든 프로그램이 믿게 하고 싶지는 않을 때, 그 저장소의 .repo 에만 sslcacert 를 적는다. 신뢰의 범위를 필요한 만큼으로 좁히는 방법이다.

저장소 만들기. createrepo_c <디렉터리> 는 rpm 들을 읽어 repodata/(repomd.xml 과 primary·filelists·other)를 만든다. dnf 는 baseurl 아래의 repodata/repomd.xml 부터 받는다. 웹 서버는 파일을 내주기만 하면 된다.

서명 검사는 따로다. TLS 는 "이 저장소 서버가 맞는가" 를, rpm 의 GPG 서명(gpgcheck)은 "이 패키지를 배포판이 만들었는가" 를 확인한다. 공식 저장소에서 복사해 온 rpm 에는 원래 서명이 그대로 있으므로, 배포판의 공개 키(/etc/pki/rpm-gpg/)를 gpgkey 로 가리키면 사내 저장소에서도 서명 검사를 켠 채 설치할 수 있다. 사내 저장소라서 둘 중 하나를 꺼도 된다는 논리는 성립하지 않는다.

현장에서 만나는 모습

이 실습 이미지에서 재 보았다. 사설 CA 인증서로 HTTPS 저장소를 띄우고 .repo 로 가리키자 dnf makecacheCurl error (60): SSL peer certificate or SSH remote key was not OK ... [SSL certificate problem: unable to get local issuer certificate] 를 거쳐 Cannot download repomd.xml ... All mirrors were tried 로 0.3초 만에 끝났다(-q 를 주면 앞의 원인 줄이 사라지고 마지막 줄만 남으니, 기록할 때는 빼고 돌린다). 루트를 anchors 에 넣고 update-ca-trust extract 를 돌리자 trust listlabel: Airgap Internal Root CA, trust: anchor, category: authority 가 나타났고, 같은 명령이 통과했다. tree 를 설치하자 dnf info --installed treeFrom repoairgap 이었다 — 어느 저장소에서 설치됐는지는 이 줄로 확인한다.

다음 실습에서 할 것

오프라인 저장소의 rpm 으로 /srv/rpmrepo 를 만들고 사설 CA 인증서로 repo.airgap.internal:8443 에 HTTPS 로 띄운다. .repo 를 쓰고 실패를 기록한 뒤 anchors 와 update-ca-trust 로 시스템이 믿게 해 tree 를 설치한다. 마지막에 다른 CA 로 세운 두 번째 저장소를 sslcacert 로 그 저장소만 믿게 한다.

참고 문서: RHEL 9 — Using shared system certificates · trust(1) · DNF Configuration Reference(sslcacert, sslverify)