2.4.2. 수동으로 레지스트리 보안
TLS를 통해 트래픽을 제공하도록 레지스트리를 수동으로 보호하려면 다음을 수행합니다.
- 레지스트리를 배포합니다.
레지스트리의 서비스 IP 및 포트를 가져옵니다.
$ oc get svc/docker-registry NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE docker-registry ClusterIP 172.30.82.152 <none> 5000/TCP 1d
기존 서버 인증서를 사용하거나 지정된 CA에서 서명한 지정된 IP 및 호스트 이름에 유효한 키와 서버 인증서를 생성할 수 있습니다. 레지스트리 서비스 IP 및 docker-registry.default.svc.cluster.local 호스트 이름에 대한 서버 인증서를 생성하려면 Ansible 호스트 인벤토리 파일에 나열된 첫 번째 마스터(기본값 /etc/ansible/hosts )에서 다음 명령을 실행합니다.
$ oc adm ca create-server-cert \ --signer-cert=/etc/origin/master/ca.crt \ --signer-key=/etc/origin/master/ca.key \ --signer-serial=/etc/origin/master/ca.serial.txt \ --hostnames='docker-registry.default.svc.cluster.local,docker-registry.default.svc,172.30.124.220' \ --cert=/etc/secrets/registry.crt \ --key=/etc/secrets/registry.key
라우터가 외부에 노출되는 경우
--hostnames
플래그에 공용 경로 호스트 이름을 추가합니다.--hostnames='mydocker-registry.example.com,docker-registry.default.svc.cluster.local,172.30.124.220 \
외부에서 액세스할 수 있도록 기본 인증서 업데이트에 대한 자세한 내용은 레지스트리 및 라우터 인증서 재배포 를 참조하십시오.
참고oc adm ca create-server-cert
명령은 2년 동안 유효한 인증서를 생성합니다. 이는--expire-days
옵션으로 변경할 수 있지만 보안상의 이유로 이 값보다 커지지 않는 것이 좋습니다.레지스트리 인증서의 보안을 생성합니다.
$ oc create secret generic registry-certificates \ --from-file=/etc/secrets/registry.crt \ --from-file=/etc/secrets/registry.key
레지스트리 Pod의 서비스 계정에 보안을 추가합니다( 기본 서비스 계정 포함).
$ oc secrets link registry registry-certificates $ oc secrets link default registry-certificates
참고시크릿을 참조하는 서비스 계정에만 제한하는 것은 기본적으로 비활성화되어 있습니다. 즉, 마스터 구성 파일에서
serviceAccountConfig.limitSecretReferences
가false
(기본 설정)로 설정되면 서비스에 시크릿을 연결할 필요가 없습니다.docker-registry
서비스를 일시 중지합니다.$ oc rollout pause dc/docker-registry
레지스트리 배포 구성에 시크릿 볼륨을 추가합니다.
$ oc set volume dc/docker-registry --add --type=secret \ --secret-name=registry-certificates -m /etc/secrets
레지스트리 배포 구성에 다음 환경 변수를 추가하여 TLS를 활성화합니다.
$ oc set env dc/docker-registry \ REGISTRY_HTTP_TLS_CERTIFICATE=/etc/secrets/registry.crt \ REGISTRY_HTTP_TLS_KEY=/etc/secrets/registry.key
자세한 내용은 Docker 문서의 레지스트리 구성 섹션 을 참조하십시오.
HTTP에서 HTTPS로 레지스트리의 활성 프로브에 사용된 스키마를 업데이트합니다.
$ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{ "name":"registry", "livenessProbe": {"httpGet": {"scheme":"HTTPS"}} }]}}}}'
처음에 OpenShift Container Platform 3.2 이상에 레지스트리가 배포된 경우 레지스트리의 준비 상태 프로브에 사용된 체계를 HTTP에서 HTTPS로 업데이트합니다.
$ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{ "name":"registry", "readinessProbe": {"httpGet": {"scheme":"HTTPS"}} }]}}}}'
docker-registry
서비스를 다시 시작합니다.$ oc rollout resume dc/docker-registry
레지스트리가 TLS 모드에서 실행 중인지 확인합니다. 최신 docker-registry 배포가 완료될 때까지 기다린 후 레지스트리 컨테이너의 Docker 로그를 확인합니다.
:5000, tls에서 수신
대기할 항목을 찾아야 합니다.$ oc logs dc/docker-registry | grep tls time="2015-05-27T05:05:53Z" level=info msg="listening on :5000, tls" instance.id=deeba528-c478-41f5-b751-dc48e4935fc2
Docker 인증서 디렉터리에 CA 인증서를 복사합니다. 클러스터의 모든 노드에서 이 작업을 수행해야 합니다.
$ dcertsdir=/etc/docker/certs.d $ destdir_addr=$dcertsdir/172.30.124.220:5000 $ destdir_name=$dcertsdir/docker-registry.default.svc.cluster.local:5000 $ sudo mkdir -p $destdir_addr $destdir_name $ sudo cp ca.crt $destdir_addr 1 $ sudo cp ca.crt $destdir_name
- 1
- ca.crt 파일은 마스터의 /etc/origin/master/ca.crt 의 사본입니다.
인증을 사용하는 경우 일부 버전의
docker
에서도 OS 수준에서 인증서를 신뢰하도록 클러스터를 구성해야 합니다.인증서를 복사합니다.
$ cp /etc/origin/master/ca.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt
다음을 실행합니다.
$ update-ca-trust enable
/etc/sysconfig/docker 파일에서 이 특정 레지스트리에 대해서만
--insecure-registry
옵션을 제거합니다. 그런 다음 데몬을 다시 로드하고 docker 서비스를 다시 시작하여 이 구성 변경을 반영합니다.$ sudo systemctl daemon-reload $ sudo systemctl restart docker
docker
클라이언트 연결을 확인합니다. 레지스트리에서docker push
를 실행하거나 레지스트리에서docker pull
을 실행하면 성공해야 합니다. 레지스트리에 로그인 했는지 확인합니다.$ docker tag|push <registry/image> <internal_registry/project/image>
예를 들면 다음과 같습니다.
$ docker pull busybox $ docker tag docker.io/busybox 172.30.124.220:5000/openshift/busybox $ docker push 172.30.124.220:5000/openshift/busybox ... cf2616975b4a: Image successfully pushed Digest: sha256:3662dd821983bc4326bee12caec61367e7fb6f6a3ee547cbaff98f77403cab55