RHEL:HTTPS 社内リポジトリと update-ca-trust
한국어 원문으로 표시합니다.
목표
RHEL 계열에서 사내 dnf 저장소를 HTTPS 로 세우고, 사설 CA 를 시스템 신뢰에 넣어 설치한다. 신뢰의 범위를 저장소 하나로 좁히는 sslcacert 도 쓴다.
왜 중요한가
사내 저장소를 HTTPS 로 바꾸면 dnf 가 인증서 검증에서 멈추고, 가장 흔한 대응은 sslverify=0 이다. 저장소 메타데이터는 무엇을 설치할지 정하는 문서라 출처 확인을 끄면 안 된다. 시스템 전체 신뢰(update-ca-trust)와 저장소별 신뢰(sslcacert)를 골라 쓸 줄 알면 땜질 없이 해결된다. 이 파드는 바깥에 닿지 않는다(DNS 만). 패키지는 이미지 안의 /opt/localrepo 에서 가져온다.
단계
/opt/localrepo의 tree rpm 을/srv/rpmrepo에 복사하고createrepo_c로 저장소를 만든다./root/pki에 루트(ca.crt·ca.key, CNAirgap Internal Root CA)와repo.airgap.internal인증서(repo.crt·repo.key, SAN)를 만들고/etc/hosts에 이름을 더한다./root/pki/serve.py로/srv/rpmrepo를https://repo.airgap.internal:8443/에 띄운다./etc/yum.repos.d/airgap.repo에 저장소airgap을 적는다(서명 검사 켬, 배포판 키/etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9).- 다른 저장소를 끄고
airgap만으로dnf makecache를 돌려 실패하는 출력을/root/rhel/tls-fail.txt에 저장한다. - 루트를 시스템 신뢰에
airgap-root.crt로 넣고 추출을 다시 한다. airgap저장소만으로 tree 를 설치한다.- 협력사 CA(
/root/pki/team-ca.crt, CNPartner Team CA)로team.airgap.internal인증서를 발급해 9443 에 같은 저장소를 띄우고,/etc/yum.repos.d/airgap-team.repo의sslcacert로 그 저장소만 이 CA 를 믿게 한다. 협력사 CA 는 시스템 신뢰에 넣지 않는다.
참고
- 저장소 하나만으로:
dnf --disablerepo='*' --enablerepo=airgap makecache - 시스템 신뢰 보기:
trust list | grep -A3 Airgap· 추출:update-ca-trust extract - 어디서 설치됐나:
dnf info --installed tree의From repo - 흔한 실수 1:
sslverify=0으로 넘기기. 채점기는 이 설정을 거절합니다. - 흔한 실수 2: 협력사 CA 까지 anchors 에 넣기. 그 순간 서버의 모든 프로그램이 그 CA 를 믿습니다.
createrepo_c 로 사내 저장소 만들기
/opt/localrepo 의 tree rpm 을 /srv/rpmrepo 에 복사하고 createrepo_c 로 저장소를 만든다.
저장소는 rpm 파일과 그것을 설명하는 repodata 디렉터리입니다. createrepo_c 에 디렉터리를 주면 repomd.xml 과 목록 파일들을 만듭니다.
사설 CA 와 저장소 인증서
/root/pki 에 루트(ca.crt·ca.key)와 repo.airgap.internal 인증서(repo.crt·repo.key, SAN)를 만들고 /etc/hosts 에 이름을 더한다.
루트는 자기 서명에 CA:TRUE, 서버 인증서는 루트로 서명하면서 SAN 을 확장 파일로 줍니다. 사설 CA 모듈과 같은 절차입니다.
HTTPS 로 저장소 내주기
/root/pki/serve.py 로 /srv/rpmrepo 를 https://repo.airgap.internal:8443/ 에 띄운다.
파이썬 표준 라이브러리의 http.server 를 ssl 컨텍스트로 감쌉니다. 이 이미지의 파이썬은 3.9 입니다. 백그라운드로 띄우고 --cacert 를 준 curl 로 repomd.xml 을 받아 보세요.
.repo 파일 쓰기
/etc/yum.repos.d/airgap.repo 에 저장소 airgap 을 적는다(서명 검사 켬, 배포판 키 지정).
섹션 이름이 저장소 id 입니다. baseurl 은 repodata 가 있는 디렉터리의 주소이고, 서명 검사와 공개 키 파일 경로를 함께 적습니다. 인증서 검증을 끄는 줄은 쓰지 않습니다.
인증서 검증 실패 기록
다른 저장소를 끄고 airgap 만으로 dnf makecache 를 돌려 실패하는 출력을 /root/rhel/tls-fail.txt 에 저장한다.
--disablerepo 와 --enablerepo 를 함께 쓰면 저장소 하나만 볼 수 있습니다. 출력 전체(표준 오류 포함)를 저장하세요.
시스템 신뢰에 루트 넣기
루트를 시스템 신뢰에 airgap-root.crt 로 넣고 추출을 다시 한다.
RHEL 계열은 anchors 디렉터리에 두고 추출 명령을 돌립니다. trust list 로 레이블과 신뢰 종류를 확인하세요.
사내 저장소에서 설치
airgap 저장소만으로 tree 를 설치한다.
저장소 하나만 켠 채 설치하면 다른 곳에서 올 수가 없습니다. 설치 뒤 dnf info --installed 로 어느 저장소에서 왔는지 보세요.
저장소 하나만 다른 CA 로
협력사 CA(/root/pki/team-ca.crt, CN Partner Team CA)로 team.airgap.internal 인증서를 발급해 9443 에 같은 저장소를 띄우고, /etc/yum.repos.d/airgap-team.repo 의 sslcacert 로 그 저장소만 믿게 한다.
협력사 CA 는 anchors 에 넣지 않습니다. .repo 에는 저장소별로 CA 파일을 지정하는 옵션이 있습니다. 확인은 그 저장소만 켠 makecache 로, 그리고 시스템 curl 이 여전히 거절하는지로 하세요.