TLS 인증 구성하기

개요

본 문서에서는 사설 TLS 인증서를 발급하여 해당 TLS 인증서를 가진 클라이언트만 ETCD3 클러스터에 접근하여 데이터 CRUD를 수행할 수 있도록 구성하는 방법에 대하여 설명합니다.


인증서 생성

필요한 Tool 설치

사설 인증서 설치 및 관리를 위해 Cloudflare의 cfssl, cfssljson 을 설치합니다.

#!/bin/bash
CFSSL_VERSION=1.6.5
CFSSL_PATH=/usr/local/bin
ARCH=amd64

curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl_${CFSSL_VERSION}_linux_${ARCH}" -o cfssl
curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssljson_${CFSSL_VERSION}_linux_${ARCH}" -o cfssljson
curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl-certinfo_${CFSSL_VERSION}_linux_${ARCH}" -o cfssl-certinfo

chmod +x cfssl cfssljson cfssl-certinfo
sudo cp cfssl cfssljson cfssl-certinfo ${CFSSL_PATH}/

인증서 발급하기

참고

ETCD3 클러스터를 위한 인증서 발급 예시를 참조합니다.

https://github.com/etcd-io/etcd/tree/main/hack/tls-setup

Makefile을 필요에 따라 아래와 같이 수정합니다.

  • 해당 예시의 경우, 파일 관리 편의성을 위해 cfssljson 명령어로 export 하여 생성하는 .pem 파일의 이름 템플릿을 변경하였습니다.

인증서 CSR (Certificate Signing Request) 를 필요에 따라 아래와 같이 수정합니다.

  • “CN” 항목은 삭제합니다. 현 Patroni에서 ETCD에 접근하기 위해 클라이언트로 이용하는 Python gRPC gateway가 TLS Common Name이 적용된 인증서를 지원하지 않습니다.

  • host 항목에 구성할 ETCD 클러스터의 IP 주소 및 호스트 이름 (필요시) 을 배열로 입력합니다.

인증기관 (CA) CSR 을 필요에 따라 아래와 같이 수정합니다.

  • “CN” 항목은 삭제합니다.

  • 필요에 따라 names 항목을 아래와 같이 수정합니다.

make 를 실행하여 인증서를 생성합니다.

  • 설정한 infra0, infra1, infra2 환경변수 값은 생성된 .pem 인증서의 파일 이름으로 사용됩니다.


ETCD 연동

  • ETCD 실행 시 환경변수 파일 /etc/etcd/etcd.env 혹은 명령줄 인자를 통해 https 연결과 인증서를 설정합니다.

    • 생성한 인증기관 (CA) 인증서 etcd-ca, etcd-ca-key 를 이용해 서명된 인증서를 가지고 있는 클라이언트만 이 ETCD 인스턴스에 접근할 수 있게 됩니다.

/etc/etcd/etcd.env 파일 혹은 ETCD 실행 시 명령줄 인자를 통해 ADVERTISE_CLIENT_URLS, LISTEN_CLIENT_URLS 변경합니다.

  • http://127.0.0.1:2379 는 Local 환경에서의 사용을 위한 것으로 불필요하면 삭제 가능합니다.

  • #Certs 항목은 위 과정을 통해 발급한 인증서들을 등록합니다. peer 는 Client, 나머지는 Server 사이드 TLS 인증서로 활용됩니다.

    • ETCD_TRUSTED_CA_FILE : 서버가 신뢰할 TLS 인증서의 인증 기관 (CA) 인증서 경로입니다. 유효한 인증서가 구성된 경우 ETCD 서버는 모든 클라이언트의 인증서를 검증하게 됩니다. 별도 인증 기관을 설정하지 않고 클라이언트 인증을 활용하는 경우 ETCD_CLIENT_CERT_AUTH=true 옵션을 활용해야 합니다.

    • ETCD_CERT_FILE : Client - Sever 통신에 사용할 TLS 인증서 경로입니다.

    • ETCD_KEY_FILE : Client - Server 통신에 사용할 TLS Key 경로입니다.

    • ETCD_PEER_TRUSTED_CA_FILE : ETCD Peer간 통신에 사용할 TLS 인증서의 인증 기관 (CA) 인증서 경로입니다.

    • ETCD_PEER_CERT_FILE : ETCD Peer간 통신에 사용할 TLS 인증서 경로입니다.

    • ETCD_PEER_KEY_FILE : ETCD Peer간 통신에 사용할 TLS Key 경로입니다.

Last updated