IT

IP로 Harbor HTTPS Access 가능하게 설정하며 과정 다시 되짚어보기

mokpolar 2022. 1. 5. 11:26
반응형

글 작성일: 2021.10.31

 

현재 서비스의 도커이미지 보관용 Private container registry로 Harbor를 사용하는 중이다.
Harbor를 Kubernetes에 구축하거나 Docker-compose를 사용해서 단독으로 구축을 하는 등 여러 케이스에 대응을 해야 하는 상황이다.
IP로 바로 접근할 수 있게 등록하는 것도 한 과정이다.

이미지를 pull이나 push등의 동작을 하는 데 있어서 Docker는 기본적으로 HTTPS 프로토콜을 사용한다.
HTTP를 사용하고 클라이언트의 docker daemon 설정에 insecure-registries 옵션을 주면 HTTPS를 사용하지 않아도 된다.
그러나 이는 임시방편에 불과하며 그런 상황은 한정적일 것이다.

그래서 Harbor documentation 에서 Self-signed certificate를 사용하여 HTTPS를 지원하는 단계들을 좀 더 자세하게 보면서 다시 HTTPS와 인증서에 대해서 공부해보기로 했다.

HTTPS 되짚어보기

HTTPS에 대해 다시 이해하기 위해 "HTTP 완벽가이드" 책을 뒤적여봤다. 인증 부분에 대한 내용이 설명되어 있다.

  • "중요한 트랜잭션에 대해서는, HTTP와 디지털 암호화 기술을 결합해야 한다"
  • 다음와 같은 요구사항을 만족할 수 있는 HTTP 보안 기술이 필요하다.
    • 서버 인증 : 클라이언트는 자신이 위조된 서버가 아닌 진짜와 이야기하고 있음을 알아야 한다.
    • 클라이언트 인증 : 서버는 자신이 가짜가 아닌 진짜 사용자와 이야기하고 있음을 알 수 있어야 한다.
    • 무결성, 암호화...
  • HTTPS를 사용할 때, 모든 HTTP 요청과 응답 데이터는 네트워크로 보내지기 전에 암호화 된다.
    • HTTPS는 HTTP의 하부에 전송 레벨 암호 보안 계층을 제공함으로써 동작
    • 이 보안 계층은 안전 소켓 계층 SSL(Secure Sockets Layer) 혹은 그를 계승 한 전송 계층 보안(Transport Layer Security, TLS)를 이용하여 구현된다...
  • 사용자가 HTTPS를 통한 웹 트랜잭션을 시작할 때, 최신 브라우저는 자동으로 접속한 서버에서 디지털 인증서를 가져온다.
  • 브라우저가 인증서를 받으면, 서명기관을 검사한다.
  • 만약 그 기관이 공공이 신뢰할만한 서명 기관이라면 브라우저는 그것의 공개키를 이미 알고 있을 것이며 (브라우저들은 여러 서명 기관의 인증서가 미리 설치된 채로 출하된다)
  • 브라우저는 그 서명을 검증할 수 있다.

그러니까 CA에 비용을 내지 않을거라면 직접 Root CA가 되어서 certificate에 서명을 해야 한다.

Harbor에서 Self-signed certificate를 사용하기 위한 절차

위에서 살펴본 내용을 미루어 Harbor documentation의 HTTPS Access 설정 부분을 살펴보자.

Harbor의 안내는 OpenSSL을 기준으로 되어있다.
OpenSSL은 TLS의 오픈 소스 구현판이며 암호화 기능과 유틸리티 함수들이 구현되어 있다(위키백과).
Root CA가 없기 때문에 스스로 OpenSSL을 사용하여 CA certificate를 생성해야 한다.
물론 Let's Encrypt를 사용해도 된다.

스스로 CA의 인증서 만들기

이번에 구축하는 Harbor의 host로는 IP를 사용할 것이다. IP를 가지고 키를 생성한다.

 

openssl genrsa -out ca.key 4096

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=YOUR_IP" \
 -key ca.key \
 -out ca.crt

서버 인증서 만들기

이제 웹 서버에서 사용하는 인증서를 만들어야 한다. 원래는 Root CA에게 보내서 인증서를 받아야 하지만 여기서는 스스로가 승인을 해주어야 한다.

프라이빗 키를 생성한다.

openssl genrsa -out YOUR_IP.key 4096

CSR을 생성한다.
CSR은 Certificate Signing Request이다. 여기에는 사용하고자 하는 도메인에 대한 여러가지 정보들이 들어간다.
여기서 key와 domain을 연결시키고 여러 정보들이 들어간다.

openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=YOUR_IP" \
    -key YOUR_IP.key \
    -out YOUR_IP.csr

x.509 v3 extention 파일을 생성한다. certificate에 대한 어떤 표준이라는 건 없는 것 같지만 많은 디지털 인증서(대부분?)들이 X.509라고 불리는 표준화된 서식에 정보를 저장한다고 한다. 현재는 v3 버전이다.
지금 생성하는 파일은 x.509 v3 extention이 요구하는 정보들을 포함하게 한다.

아래 보면 SAN 항목이 있다.
SAN 은 Subject Alternative Name으로 이 필드덕에 하나의 인증서에서 추가적인 도메인이나 IP를 다룰 수 있도록 허용한다.
도메인을 사용한다면 DNS.1 DNS.2 .. 이런식으로 적겠지만 여기서는 IP를 사용해야 한다.

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
IP.1=YOUR_IP
EOF

만들어진 v3.ext 파일을 Harbor host의 인증서를 생성하기 위해 사용한다.

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in YOUR_IP.com.csr \
    -out YOUR_IP.com.crt

Docker daemon은 .crt 파일을 CA certificate로 생각한다. 그래서 클라이언트 certificate로 생각하도록 변경 해줘야 한다.

openssl x509 -inform PEM -in YOUR_IP.crt -out YOUR_IP.cert

OS 별 Docker client 사용

OSX (Catalina 기준) 에서의 Self-signed key 적용

블로그에 설명이 나와있다.

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ca.crt

물론 docker daemon도 재시작해주어야 한다.

Ubuntu 18.04 에서의 Self-signed key 적용

생성한 certificate 들이 아래 경로에 들어있어야 한다.
물론 docker daemon도 재시작해주어야 한다.

/etc/docker/certs.d/
    └── YOUR_IP
       ├── YOUR_IP.cert  <-- Server certificate signed by CA
       ├── YOUR_IP.key   <-- Server key signed by CA
       └── ca.crt        <-- Certificate authority that signed the registry certificate

https 없이 사용하기 (임시로)

각 OS 의 docker daemon configure 파일에 설정을 해주면 된다.
OSX : /Users/mokpolar/.docker/daemon.json
Ubuntu : /etc/docker/daemon.json

아래와 같이 추가해주면 된다.

"insecure-registries": [
    "YOUR_IP OR DOMAIN"
  ]

Reference

반응형

'IT' 카테고리의 다른 글

Locust를 이용해서 부하 테스트를 해 본 후기  (0) 2022.01.05