블로그 구독

프라이빗 레지스트리는 내부의 제어된(그리고 잠재적으로 더 안전한) 인프라에 애플리케이션의 Linux 컨테이너 이미지를 저장하는 데 유용할 수 있습니다.

Linux 컨테이너는 실행에 필요한 모든 파일을 포함한 전체 런타임 환경에서 애플리케이션의 패키징 및 분리를 가능하게 하는 기술로서, 여러 환경(개발, 테스트, 프로덕션 등) 간에 포함된 애플리케이션을 손쉽게 이동할 수 있게 해줍니다.

2023 Gartner® Magic Quadrant™에서 리더로 선정된 Red Hat

Red Hat은 Gartner 2023 Magic Quadrant 컨테이너 관리 부문의 실행 능력 및 비전의 완성도에서 최고점을 획득했습니다.

이 문서에서는 OCP 연결이 해제된 상태에서 배포를 수행할 수 있도록, 일반적으로 컨테이너 저장에 사용할 수 있는 더 강력한 보안 상태를 갖춘 간단한 SSL/TLS 지원 프라이빗 레지스트리를 생성하는 방법과 Red Hat OpenShift와 통합하는 방법을 제시합니다. OperatorHub에서 인터넷에 액세스할 수 없는 경우에도 사용할 수 있습니다.

필수 요건

다음과 같은 요건이 필요합니다.

  • FQDN: registry.rhbrlabs.com
  • OS: Red Hat Enterprise Linux 8.6 이상
  • SELinux: 실행
  • Firewalld: 활성화됨
  • 레지스트리: Podman
  • Apache 툴
  • 볼륨: /data에 마운트된 100Gb

이 레지스트리는 OpenShift의 연결이 해제된 상태의 설치를 완벽히 지원합니다.

설치

시스템 보안을 극대화하기 위한 설치는 Linux에서 이미 사용할 수 있는 보안 기능 외에도 암호화를 사용해 구성됩니다.

필수 디렉터리를 생성합니다.

[root@registry ~]# mkdir -p /data/registry/{auth,certs,data}

인증서

컨테이너 레지스트리에 대한 인증서를 생성합니다. 이 예시에서는 10년 동안 유효한 인증서를 생성합니다.

[root@registry ~]# openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout /data/registry/certs/registry.rhbrlabs.com.key -x509 -days 3650 \
-out /data/registry/certs/registry.rhbrlabs.com.crt \
-subj "/C=US/ST=NorthCarolina/L=Raleigh/O=Red Hat/OU=Engineering/CN=registry.rhbrlabs.com" \
-addext "subjectAltName = DNS:registry.rhbrlabs.com"

운영 체제는 생성된 인증서를 신뢰해야 합니다.

생성된 인증서를 앵커의 신뢰할 수 있는 디렉터리에 복사하고 update-ca-trust:를 실행합니다.

[root@registry ~]# cp /data/registry/certs/registry.rhbrlabs.com.crt /etc/pki/ca-trust/source/anchors/

[root@registry ~]# update-ca-trust

사용자 계정

레지스트리에 대한 액세스를 제어하려면 사용자 계정을 생성해야 합니다. 다음 예시에서는 사용자 레지스트리에 대한 계정을 생성합니다.

이미지 레지스트리에 대한 인증 파일을 생성합니다.

[root@registry ~]# dnf -y install httpd-tools

[root@registry ~]# htpasswd -bBc /data/registry/auth/htpasswd registry redhat12345678

HTTP 시크릿

사용자 계정 외에도 액세스의 신뢰성을 높이기 위해 시크릿이 필요합니다.

임의의 시크릿을 생성합니다.

[root@registry ~]# date | md5sum

10f207a4cbba51bf00755b5a50718966

레지스트리 소프트웨어

필요한 데이터를 준비했다면 이제 레지스트리를 생성할 차례입니다.

docker.io/library/registry:2 이미지를 사용하여 컨테이너 레지스트리를 생성합니다.

[root@registry ~]# dnf -y install podman

[root@registry ~]# podman create --name ocp-registry --net host -p 5000:5000 \ -v /data/registry/data:/var/lib/registry:z -v /data/registry/auth:/auth:z \ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry" \ -e "REGISTRY_HTTP_SECRET=10f207a4cbba51bf00755b5a50718966" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /data/registry/certs:/certs:z \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.rhbrlabs.com.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/registry.rhbrlabs.com.key docker.io/library/registry:2

위의 커맨드는 다음과 같은 메시지를 생성합니다.

Trying to pull docker.io/library/registry:2...
Getting image source signatures
Copying blob fd4a5435f342 done 
Copying blob 213ec9aee27d done 
Copying blob 4583459ba037 done 
Copying blob b136d5c19b1d done 
Copying blob 6f6a6c5733af done 
Copying config dcb3d42c17 done 
Writing manifest to image destination
Storing signatures
Port mappings have been discarded as one of the Host, Container, Pod, and None network modes are in use
22633f37262a4ab2d64fc8beb44bb80618b11802974fb2f45d31d98db3cf14e8

이제 레지스트리를 사용할 수 있습니다. 그러나 서비스 시작 및 중지를 제어하는 방법이 필요합니다.

시작 제어

부팅 시 컨테이너를 자동으로 시작하도록 레지스트리의 UNIT 파일을 생성합니다.

[root@registry ~]# cat /etc/systemd/system/ocp-registry.service

[Unit] Description=OCP Registry [Service] Restart=always ExecStart=/usr/bin/podman start -a ocp-registry ExecStop=/usr/bin/podman stop -t 10 ocp-registry [Install] WantedBy=network-online.target

컨테이너를 시작합니다.

[root@registry ~]# systemctl daemon-reload

[root@registry ~]# systemctl enable --now ocp-registry.service
Private registry running

프라이빗 레지스트리 실행 중

방화벽

로컬 방화벽을 사용하고 있으므로 레지스트리 서비스 포트에 권한을 부여해야 합니다.

Firewalld에서 TCP 5000 포트를 허용합니다.

[root@registry ~]# firewall-cmd --permanent --add-port=5000/tcp

[root@registry ~]# firewall-cmd --reload

레지스트리가 작동하는지 확인

이제 새 레지스트리에 대한 액세스를 확인하겠습니다.

인증 및 신뢰할 수 있는 SSL/TLS가 작동하는지 확인합니다.

[root@registry ~]# curl -u 'registry:redhat12345678' https://registry.rhbrlabs.com:5000/v2/_catalog

{"repositories":[]}

Red Hat OpenShift 통합

이 레지스트리를 OCP와 함께 사용하려면 인증 정보를 사용하여 base64 형식으로 파일을 생성합니다.

OpenShift 연결 해제된 설치에 대한 인증 정보를 사용하여 임시 파일을 생성합니다.

[root@registry ~]# cat <<EOF > ~/registry-secret.json
"registry.rhbrlabs.com:5000": {
   "email": "registry@redhat.com",
   "auth": "$(echo -n 'registry:redhat12345678' | base64 -w0)"
}
EOF

맺음말

이제 추가 보안 기능을 갖춘 새로운 프라이빗 레지스트리가 실행됩니다. 프라이빗 레지스트리 서비스를 사용하면 액세스를 제어하고 더 엄격한 보안 표준을 충족할 수 있습니다. 퍼블릭 레지스트리 서비스는 보안 문제에 더 취약하기 때문입니다.

이 글에서는 보안이 강화된 레지스트리를 처음부터 생성하는 방법을 안내했습니다. 기능적인 솔루션임에도 불구하고 고가용성, 미러링, 캐싱, 지오리플리케이션(geo-replication)과 같은 고급 기능이 부족합니다. 이러한 고급 기능은 이미 더 강력한 솔루션에 구현되어 있습니다.

이러한 모든 기능과 컨테이너 취약점 스캔, 오브젝트 스토리지 지원, 자동 스케일링이 Red Hat Quay에 통합되어 있습니다.

Red Hat Quay 컨테이너 레지스트리 플랫폼은 모든 인프라에서 컨테이너와 클라우드 네이티브 아티팩트의 보안 강화 스토리지, 배포 및 거버넌스를 제공합니다. 독립 실행형 구성 요소로 사용하거나 Red Hat OpenShift에서 실행할 수 있습니다.


저자 소개

Andre Rocha is a Consultant at Red Hat focused on OpenStack, OpenShift, RHEL and other Red Hat products. He has been at Red Hat since 2019, previously working as DevOps and SysAdmin for private companies.

Read full bio

채널별 검색

automation icon

오토메이션

기술, 팀, 인프라를 위한 IT 자동화 최신 동향

AI icon

인공지능

고객이 어디서나 AI 워크로드를 실행할 수 있도록 지원하는 플랫폼 업데이트

open hybrid cloud icon

오픈 하이브리드 클라우드

하이브리드 클라우드로 더욱 유연한 미래를 구축하는 방법을 알아보세요

security icon

보안

환경과 기술 전반에 걸쳐 리스크를 감소하는 방법에 대한 최신 정보

edge icon

엣지 컴퓨팅

엣지에서의 운영을 단순화하는 플랫폼 업데이트

Infrastructure icon

인프라

세계적으로 인정받은 기업용 Linux 플랫폼에 대한 최신 정보

application development icon

애플리케이션

복잡한 애플리케이션에 대한 솔루션 더 보기

Original series icon

오리지널 쇼

엔터프라이즈 기술 분야의 제작자와 리더가 전하는 흥미로운 스토리