개요
이전 글에서 KONG을 docker로 실행하는 방법에 대해 알아보았다. 이번에는 이 kong 컨테이너 이미지에 인증서를 입혀 https를 이용해 들어갈 수 있도록 해보자 !
SSL 인증서란? CA란?
SSL(Secure Socket Layer) 프로토콜은 처음에 Netscape사에서 웹서버와 브라우저 사이의 보안을 위해 만들었다. SSL은 Certificate Authority(CA)라 불리는 서드 파티로부터 서버와 클라이언트의 인증을 하는데 사용된다. 아래는 SSL이 어떻게 작동하는지에 대한 간단한 과정을 설명한 것이다. 출처
아래에서 웹브라우저는 Chrome, 웹서버는 Nginx로 이해하자.
- [웹브라우저] SSL로 암호화된 페이지를 요청하게 된다. (일반적으로 https://가 사용된다)
- [웹서버] Public Key를 인증서와 함께 전송한다.
- [웹브라우저] 인증서가 자신이 신용있다고 판단한 CA(일반적으로 trusted root CA라고 불림)로부터 서명된 것인지 확인한다. 또한 날짜가 유효한지, 그리고 인증서가 접속하려는 사이트와 관련되어 있는지 확인한다.
- [웹브라우저] Public Key를 사용해서 랜덤 대칭 암호화키(Random symmetric encryption key)를 비릇한 URL, http 데이터들을 암호화해서 전송한다.
- [웹서버] Private Key를 이용해서 랜덤 대칭 암호화키와 URL, http 데이터를 복호화한다.
- [웹서버] 요청받은 URL에 대한 응답을 웹브라우저로부터 받은 랜덤 대칭 암호화키를 이용하여 암호화해서 브라우저로 전송한다.
- [웹브라우저] 대칭 키를 이용해서 http 데이터와 html문서를 복호화하고, 화면에 정보를 뿌려준다.
쉽게 말해,
HTTP는 웹서버에서부터 브라우저로 전송되는 정보가 암호화되지 않는다. HTTP는 정보를 단순 텍스트로 주고 받기 때문에 네트워크에서 전송 신호를 인터셉트하는 경우 원하지 않는 데이터 유출이 발생할 수 있다. (데이터 스니핑 등의 위험이 있다.)
따라서 HTTPS를 이용하여 암호화된 페이지를 만드는 것이다. 이 때 CA는 웹 브라우저와 웹 서버 간의 통신을 신뢰할 수 있게 만드는 역할을 해주는 역할을 한다.
이후 웹 브라우저는 사용자가 접속하려는 웹 사이트가 신뢰할 수 있는 사이트임을 확인하고, 보안된 통신을 수립할 수 있다.
kong container에 SSL 적용
docker compose 파일에서 이를 적용할 수 있었다. 자세한 내용은 아래에 설명하도록 하겠다.
아래는 docker compose 파일 속 kong에 대한 ssl을 적용한 파일 전문이다.
kong:
image: kong:latest
container_name: kong
networks:
- kong-net
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong123!!
KONG_CASSANDRA_CONTACT_POINTS: kong-database
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_SSL_CERT: /etc/kong/certificates/{url_co_kr}_NginX_cert.pem
KONG_SSL_CERT_KEY: /etc/kong/certificates/{url_co_kr}_NginX_nopass_key.pem
KONG_CLIENT_SSL_CERT: /etc/kong/certificates/{url_co_kr}_NginX_cert.pem
KONG_CLIENT_SSL_CERT_KEY: /etc/kong/certificates/{url_co_kr}_NginX_nopass_key.pem
KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 ssl"
KONG_ADMIN_LISTEN: "0.0.0.0:8001, 0.0.0.0:8444 ssl"
KONG_ssl: "on"
KONG_LOG_LEVEL: info
KONG_NGINX_USER: root
TZ: Asia/Seoul
ports:
- "8000:8000"
- "5005:8443"
- "127.0.0.1:8001:8001"
- "127.0.0.1:8444:8444"
volumes:
- ./ssl/{url_co_kr}_NginX_cert.pem:/etc/kong/certificates/{url_co_kr}_NginX_cert.pem
- ./ssl/{url_co_kr}_NginX_nopass_key.pem:/etc/kong/certificates/{url_co_kr}_NginX_nopass_key.pem
depends_on:
- kong-database
우선 CA 인증처리를 위한 {url_co_kr}_NginX_cert.pem과 {url_co_kr}_NginX_nopass_key.pem 을 server 내에 저장한다.
cert.pem 파일은 인증서에 대한 파일이고, key.pem은 개인 private 키 파일을 의미한다.
이 둘을 아래와 같이 볼륨 마운트로 kong 과 연동하여 kong 안에 etc/kong/certificates 파일 안에 넣어준다.
volumes:
- ./ssl/{url_co_kr}_NginX_cert.pem:/etc/kong/certificates/{url_co_kr}_NginX_cert.pem
- ./ssl/{url_co_kr}_NginX_nopass_key.pem:/etc/kong/certificates/{url_co_kr}_NginX_nopass_key.pem
이후 아래와 같이 KONG_ADMIN_LISTEN 설정과 KONG_SSL_CERT 및 KONG_CLIENT_SSL_CERT, 그리고 KONG_SSL_CERT_KEY와 KONG_CLINET_SSL_CERT_KEY에 각각 마운트해서 가져온 키값을 넣어주었다.
KONG_SSL_CERT: /etc/kong/certificates/{url_co_kr}_NginX_cert.pem
KONG_SSL_CERT_KEY: /etc/kong/certificates/{url_co_kr}_NginX_nopass_key.pem
KONG_CLIENT_SSL_CERT: /etc/kong/certificates/{url_co_kr}_NginX_cert.pem
KONG_CLIENT_SSL_CERT_KEY: /etc/kong/certificates/{url_co_kr}_NginX_nopass_key.pem
KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 ssl"
KONG_ADMIN_LISTEN: "0.0.0.0:8001, 0.0.0.0:8444 ssl"
KONG_ssl: "on"
KONG_LOG_LEVEL: info
KONG_NGINX_USER: root
TZ: Asia/Seoul
ports:
- "8000:8000"
- "5005:8443"
- "127.0.0.1:8001:8001"
- "127.0.0.1:8444:8444"
HOW??
해당 설정은 아래의 정보들을 활용해 집어넣었다.
Kong docs default ports 에 접속하면 아래와 같이 kong gateway가 listen하는 포트들을 알 수 있다. 한 번 같이 살펴보자!
우선 라우팅해서 services를 가져오기 위한 HTTPS traffic을 위해서는 8443 포트를 사용한다.
그리고 Admin API에서 가져오는 HTTPS 요청을 위해서는 8444 포트를 사용한다.
따라서 compose.yml 파일에 KONG_ADMIN_LISTEN을 설정하여 Kong의 관리 API에 대한 수신 주소와 포트를 설정하는 환경 변수를 설정해주었다. Kong Admin API가 리스닝할 IP 주소(0.0.0.0)와 포트(8001, 8444)를 지정하였으며 ssl을 덧붙여 SSL/TLS를 사용할 수 있도록 설정하였다.
port forwarding도 본래 5005:8000에서 5005:8443으로 변경하여 https 정보들이 반환되도록 변경하였다.
결과
본래 http://{kongIP 주소}:5005/google 로 접속하면 google 페이지가 나오도록 라우팅 해주었었다.
원래대로라면 구글 메인페이지가 나와야 하는데 이제는 400 Bad Request 응답으로 HTTPS 포트로 바뀌었다고 말해주고 있다.
이렇게 CA 에서 설정해준 도메인 주소로 들어가면 드디어 라우팅 처리가 잘 되고
주의요함에서 자물쇠가 잘 걸렸음을 확인할 수 있다 !
'INFRA' 카테고리의 다른 글
[kubernetes] 쿠버네티스 기초 이론 (7) | 2023.11.01 |
---|---|
[API GATEWAY] KONG API Gateway -2 (0) | 2023.10.25 |
[API GATEWAY] KONG API Gateway -1 (0) | 2023.10.23 |
[Docker] 도커를 공부하며.. 🐳 (2) | 2023.10.23 |
[ELK] Elastic Search ILM 정책 (+추가 에러 핸들링) (2) | 2023.09.25 |