ecsimsw

EKS Endpoint access 를 private 으로 본문

EKS Endpoint access 를 private 으로

JinHwan Kim 2023. 8. 30. 15:59

Diagram

 

EKS는 2가지 VPC로 구성되어 있다. Kubernetes control plane를 AWS에서 관리하는 AWS VPC, 그리고 사용자가 직접 관리하는 Customer VPC가 있다.

 

사용자는 K8S의 control plane를 직접 관리하지 않고, 실질적으로 사용해야 하는 서비스들을 AWS EC2를 Worker node로 하는 Customer VPC에 집중하도록 한다. 

 

Cluster endpoint access 

이때 이 cluster의 Endpoint, 즉 AWS VPC의 kubernetes api server의 접근 가능 VPC를 설정할 수 있다. 

 

public은 요청자의 VPC에 상관없이 endpoint에 접속할 수 있고, 반대로 private 은 cluster 내 VPC 또는 그와 피어링된 VPC 안에서의 요청만이 접근 가능하다. 그리고 public and private 으로 하면 엑세스를 허용 할 수 있는 IP 목록을 지정 할 수 있게 된다.

 

요청 권한 여부에 따라 cluster domain으로 접속했을 때 DNS가 반환하는 IP 주소가 달랐다. 같은 eks cluster의 API server endpoint를 사용하더라도 lookup 시 endpoint access가 public이면 외부 IP를 반환하,  private 이면 내부 IP를 반환했다. 즉 cluster endpoint access option은 cluser api server 주소를 내부 ip로 해서 VPC 내부로 제한할지, 외부 ip로 해서 제한을 두지 않을지를 결정한다고 생각해도 될 것 같다.

 

이때 외부 IP는 위 도표에서 AWS VPC의 LB의 공인 주소를 말한다. 즉 EKS는 control plane를 관리하는 VPC와 전면에서 요청을 처리하는 LB가 AWS에 의해 생성되고 관리되는데, 이 LB에 kubectl 조작이 요청되고 이게 control plane으로 전달되면서 Cluster를 조작하는 것이다.

 

 

Make EKS endpoint private with VPN

보안을 위해 EKS endpoint를 private으로 하려고 한다. 그리고 사용자들은 VPN으로 접근하도록 설정할 것이다. 

 

사용자를 같은 VPC 내부로 생각하고 VPC 내부에 Bastion을 두고 그 노드에서만 cluster를 조작하도록 할 수도 있을 것 같다. 이 경우 VPN은 불필요해지지만 모든 cluster 접근자가 동일한 노드에서, (다른 방식이 아니라면 노드에 설정된) 동일한 AWS 로그인 정보로 cluster를 접근하기 때문에 각 사용자마다 role을 부여하거나 access log를 분리하기 위한 설정이 더 까다로울 것이라 생각했다.

 

차라리 인증된 사용자만 VPN으로 접근을 허가하고 사용자마다의 AWS 계정 정보로 cluster 접근을 관리하는게 더 편할 것 같다는 판단이었다.

 

 

1. AWS Client VPN

 

1-1. https://openvpn.net/community-downloads/ 에서 openVPN을 설치한다.

1-2. https://github.com/OpenVPN/easy-rsa/releases의 Asset에서 easy-rsa를 설치한다. 

1-3. easy-rsa 를 실행한다.

 

./EasyRSA-Start

 

1-4. 인증서, 키 생성

 

./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server nopass
./easyrsa build-client-full client1.domain.tld nopass

 

2. AWS Certificate Manager

2-1.  https://console.aws.amazon.com/acm/home -> Import a certificate 

 

 

2-2. 위 Cert form에 server 정보를 입력하면 서버 인증서가 발급된다.

 

body : server.crt
private key : server.key
chain : ca.crt

 

 

2-3. 똑같이 client 정보를 입력하여 인증서를 발급한다. 

 

body : client1.domain.tld.crt
private key : client1.domain.tld.key
chain : ca.crt

 

3. VPN -> Client vpn endpoints -> Create client VPN endpoint 

3-1. 'Use mutual authentication'을 선택하고 Client IP 범위 (Cluster endpoint ip range), server certificate ARN과 client certificate ARN에 생성한 cert 정보를 각각 선택한다.

 

 

 

3-2. Associate target network에 cluster vpc와 cluster 내부의 private subnet를 등록한다. 이 target network 생성을 cluster의 모든 private subnet에 대해 생성한다.

 

 

3-3 Authorization rule 추가 -> Destination endpoint로 VPC CIDR를 입력한다.

 

 

3-4. Client configuration 을 다운 받는다.

 

 

4. AWS client VPN application 준비

https://aws.amazon.com/ko/vpn/client-vpn-download/ 에서 Client VPN application을 다운 받고 앞선 configuration file을 등록하여 Profile을 생성한다.

 

5. EKS inbound rule

EKS security group으로 443 port 를 열어줘 접속을 허용한다. 

 

6. 확인

적용 여부는 VPN의 Connect 여부에 따라 kubectl 명령어 처리 결과가 다름으로 명확하게 확인 할 수 있다.

 

 

Comments