이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Docker

17. Harbor private registry 구축 및 image push, pull

이쿠우우 2022. 1. 13. 21:31
반응형

 

 
 

Harbor private registry 구축

 
 

 

Certification 생성

 
인증서 생성 및 기타 작업을 수행하기 위한 디렉터리를 생성함.
 
[명령어]
mkdir /certs
cd /certs
 

CA Certificates 생성

실제 RootCA (신뢰할 수 있는 루트 인증 기관)를 사용하는게 아니라면, 
직접 CA (인증 기관)를 생성하여 Server의 인증서가 안전하다고 인증해주어야 함.
따라서 아래의 명령어로 개인용 Root CA 역할을 할 CA.key를 생성하고, 
CA.key의 짝이 되는 CA.crt 공개키를 생성함.
 
[Root CA의 비밀키 생성]
openssl genrsa -out ca.key 4096

 
[Root CA의 비밀키와 짝을 이룰 공개키 생성]
openssl req -x509 -new -nodes -sha512 -days 365 \
-key ca.key \
-out ca.crt
 
[주의]
Common Name 항목은 private registry domain 주소를 입력해줘야함.
ex) iksoon.registry.com
이외는 모두 enter로 넘어감.

 

Server Certificates 생성

서버의 인증서를 생성. 
Root CA의 비밀키와 공개키를 만들 때와 마찬가지로 서버의 비밀키를 생성하고, 
생성한 비밀키를 넣어 CSR 파일을 생성함. 
CSR 파일은 Certificate Signing Request 파일로, 
인증서를 발급하기 위해 필요한 정보를 담고 있는 데이터임. 
CSR 파일은 SSL 발급을 신청하기 위해 해당 파일 내용을 Root CA에 제출하는 용도로 사용함.
 
[Server의 비밀키 생성]
openssl genrsa -out server.key 4096

 
[Server의 CSR 파일 생성]
openssl req -sha512 -new \
-key server.key \
-out server.csr

 
 
 

SAN 등록

 
이제 위에서 생성한 서버의 CSR 파일을, 
직접 만든 Root CA에 인증해달라고 요청하는 작업을 수행함. 
CSR 파일을 가지고 서버의 인증키를 생성하게 됩니다.
 
[설정 파일 생성]
vi v3ext.cnf
subjectAltName = IP:10.0.2.5,IP:127.0.0.1,DNS:iksoon.registry.com
참고 : 10.0.2.5는 private registry ip 주소이고 iksoon.registry.com은 domain 주소.

 
[SAN 등록하는 작업 수행]
openssl x509 -req -sha512 -days 365 \
-extfile v3ext.cnf \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt

 
 

Certificate 업데이트

Docker에서는 .crt 파일을 CA (인증 기관)의 인증서라고 간주함. 
서버의 인증서라는 것을 표현하고 싶다면 
".crt" 형식이 아닌 ".cert" 형식으로 변환해주어야 함.
따라서 server.crt 파일을 server.cert 파일로 변환함.
 
[명령어]
openssl x509 -inform PEM -in server.crt -out server.cert

 
만들어진 인증서 파일들을 Docker와 Host에 등록, 업데이트하는 작업을 수행
[명령어]
cp server.cert /etc/docker/certs.d/iksoon.registry.com
cp server.key /etc/docker/certs.d/iksoon.registry.com
cp ca.crt /etc/docker/certs.d/iksoon.registry.com
 
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/
sudo cp server.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
 
 
 

 
 

Harbor package 다운로드

 
Harbor는 Offline Install과 Online Install 두 가지 방식으로 설치를 지원하고 있음. 
본 포스트에서는 Offline Install 을 기준으로 설치함.
현재 2022년 1월 04일 기준으로 v2.4.1 릴리즈가 최신
 
[설치 파일 다운로드]
 
[압축 해제]
tar xzvf harbor-offline-installer-v2.4.1.tgz
 
[harbor 디렉터리 이동]
cd ~/harbor

 

 

harbor.yml 작성

 
바로 위 문단에서 이동한 디렉터리에서 아래의 작업을 수행함. 
기본적으로 디렉터리 내에는 harbor.yml.tmpl 파일이 존재함. 
이 파일의 이름을 harbor.yml로 수정하고 내용을 필요에 맞게 수정해야함.
 
[명령어]
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
 
[추가 내용]
hostname: iksoon.regsitry.com
https.certificate: {server.cert로 수정 (예시, /etc/docker/certs.d/iksoon.registry.com/server.cert)
https.private_key: {server.key로 수정 (예시, /etc/docker/certs.d/iksoon.registry.com/server.key)

 
 

 
docker-compose 설치
 
harbor 설치 시 docker compose 가 필요함
 
[docker compose 파일 download]
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 
[docker compose 적용]
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
 
[설치 확인]
docker-compose --version

 
[참고]
 

 

Harbor Deploy

 
위 문단에서 작업한 harbor.yml의 작성이 끝나면, 
Harbor 설치의 사전 작업을 수행하는 prepare 스크립트를 실행함. 
prepare 스크립트는 결과적으로 prepare 컨테이너를 생성함.
 
[Harbor 설치 명령어]
./prepare
./install.sh

 
[설치 확인]
docker-compose ps

 

 

Harbor dashboard 접속

 
상위에서 설정한 domain인 
iksoon.registry.com으로 접속하면 확인 가능.
 
[최초 ID, PW]
ID : admin
PW : Harbor12345

 
 

 

Harbor project 생성

 
test를 위해  public 으로 생성

 

 

Harbor registry image push

 

Harbor registry에 접속할 host는 아래 명령어로 인증서를 등록해줘야함.
server.crt는 harbor server 설치할 때 생성한 공개키임.
 
[명령어]
sudo cp server.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
 
[docker login 명령어]
docker login iksoon.registry.com
id : admin
pw : Harbor12345

 

image 생성

기존의 peksoon/iksoon_tomcat:1.0.6 image를 push 하기 위해 
tag 명령으로 harbor push 용 image 생성
 
[명령어]
docker tag peksoon/iksoon_tomcat:1.0.6  iksoon.registry.com/testproject/tomcat:1.0.0
 
[image name 설명]
iksoon.registry.com : harbor 주소
testproject : harbor project 이름
tomcat:1.0.0 : image 이름
 
[harbor registry의 testproject에 image push]
docker push iksoon.registry.com/testproject/tomcat:1.0.0

 
[harbor page에서 결과 확인]

 

 

 

Harbor registry image pull (Docker)

 
다른 host에서 docker로 상위에서 구성한 harbor registry images를 pull하는 방법을 정리
 

harbor registry domain 추가

vi /etc/hosts
10.0.2.5 iksoon.registry.com
 
 

harbor https 접속 용 인증서 설정

상위 harbor 설치 시 사용했던 ca.crt, server.crt, server.cert, server.key 파일을 가져옴
그리고 아래 명령어 실행.
 
mkdir  server.cert /etc/docker/certs.d/iksoon.registry.com
cp server.cert /etc/docker/certs.d/iksoon.registry.com
cp server.key /etc/docker/certs.d/iksoon.registry.com
cp ca.crt /etc/docker/certs.d/iksoon.registry.com
 
cp server.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
 
 

docker login

docker login iksoon.registry.com

 

docker image pull

 

 
 

Harbor registry image pull (ContainerD)

 

harbor registry image pull 시도

 
[명령어]
 
[결과]
추가 설정 없이 image pull을 하게 되면
인증관련 오류가 발생하며 image pull이 되지 않음.

 

containerd 설정 

 
[containerd 설정 파일 이동]
/etc/contaienrd/config.toml

 
[private registry 관련 설정 추가]
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://registry-1.docker.io"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."iksoon.registry.com"]
          endpoint = ["https://iksoon.registry.com"]
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."iksoon.registry.com".auth]
          username = "admin"
          password = "Harbor12345"
        [plugins."io.containerd.grpc.v1.cri".registry.configs."iksoon.registry.com".tls]
          ca_file = "/root/certs/ca.crt"
          cert_file = "/root/certs/server.cert"
          key_file = "/root/certs/server.key"
 
 
 

containerD restart

systemctl restart containerd
 

결과 확인

harbor private registry로 부터 정상적으로 images 를 받아옴.

 

 

 

 

 
 
참고

 

반응형