[EKS] EKS: Public-Public EKS 클러스터 - 7. 보안그룹 아키텍처

· 7 분 소요

서종호(가시다)님의 AWS EKS Workshop Study(AEWS) 1주차 학습 내용을 기반으로 합니다.


TL;DR

배포 결과에서 워커 노드에 연결된 보안그룹 2개를 콘솔로 간단히 확인했다. 이번 글에서는 aws ec2 describe-security-groupsVPC 안의 보안그룹 전체를 조회하고, 각 규칙이 어떤 통신을 허용하는지 분석한다.

  • 보안그룹은 총 5개: VPC 기본 1개, EKS 모듈 생성 2개, EKS 자동 생성 1개, Terraform 직접 정의 1개
  • 컨트롤 플레인 → 노드 통신에 열려 있는 포트와 그 이유
  • 노드 ↔ 노드 통신에 필요한 포트 (CoreDNS, ephemeral ports)
  • FromPort/ToPort, IpPermissions/IpPermissionsEgress의 의미


보안그룹 기본 개념

보안그룹이란

AWS 보안그룹(Security Group)은 ENI(Elastic Network Interface) 수준의 가상 방화벽이다. EC2 인스턴스, EKS 노드, RDS, Lambda(VPC 모드) 등 ENI가 붙는 모든 리소스에 적용된다.

핵심 특성:

특성 설명
허용 규칙만 거부(deny) 규칙은 없다. 매칭되지 않으면 자동 차단
상태 저장(Stateful) 인바운드로 허용된 요청의 응답 트래픽은 아웃바운드 규칙 없이도 자동 허용
ENI 단위 하나의 인스턴스에 여러 보안그룹 부착 가능. 규칙은 합집합(OR)
소스/대상에 SG 지정 가능 CIDR 대신 다른 보안그룹 ID를 소스로 지정하면, 해당 SG가 붙은 모든 ENI에서 오는 트래픽을 허용

AWS API 필드 읽는 법

aws ec2 describe-security-groups 출력의 핵심 필드:

필드 의미
IpPermissions 인바운드(Ingress) 규칙
IpPermissionsEgress 아웃바운드(Egress) 규칙
IpProtocol 프로토콜. "-1"모든 프로토콜
FromPort / ToPort 대상 포트 범위. “어디서 온” 포트가 아니라, “이 포트 범위로 들어오는 트래픽“을 허용한다는 뜻
IpRanges CIDR 기반 소스/대상
UserIdGroupPairs 보안그룹 기반 소스/대상. GroupId로 다른 SG를 참조

FromPort/ToPort 주의: 이름이 “From/To”라서 출발지 포트처럼 오해하기 쉽지만, 실제로는 허용할 대상 포트의 시작/끝 범위다. FromPort: 443, ToPort: 443이면 “포트 443으로 들어오는 트래픽을 허용”이라는 뜻이다. FromPort: 1025, ToPort: 65535이면 “포트 1025~65535 범위로 들어오는 트래픽을 허용”이다.


보안그룹 전체 조회

aws ec2 describe-security-groups | jq
전체 출력
<!-- TODO: 유저가 제공한 전체 JSON 출력 -->

EKS VPC(vpc-0bbe44f398f6fc948)에 속한 보안그룹은 총 5개다.

# Name GroupId 생성 주체 적용 대상
1 myeks-VPC-default sg-073486a208c8d2710 VPC 생성 시 자동 VPC 기본 SG (미사용)
2 myeks-node sg-05759c46248be71f5 EKS Terraform 모듈 워커 노드 ENI (node shared SG)
3 myeks-node-group-sg sg-0a6afe6fd37744d7f Terraform 직접 정의 (eks.tf) 워커 노드 ENI (추가 SG)
4 eks-cluster-sg-myeks-* sg-0776f9de59b07e26a EKS 서비스 자동 생성 컨트롤 플레인 ENI + 워커 노드 ENI (primary/cluster SG)
5 myeks-cluster sg-07ca47ee2acbb5ccd EKS Terraform 모듈 컨트롤 플레인 ENI

기본 VPC(vpc-0c4484c1cccb8e8fe)의 default SG는 EKS와 무관하므로 제외한다.


보안그룹 상세 분석

1. myeks-VPC-default — VPC 기본 보안그룹

Description: "default VPC security group"
GroupId: sg-073486a208c8d2710
방향 규칙
인바운드 없음
아웃바운드 없음

VPC를 생성하면 자동으로 만들어지는 기본 보안그룹이다. Terraform VPC 모듈이 manage_default_security_group = true로 설정하여 기본 규칙(자기 자신 참조)을 제거한 상태다.

실제로 어떤 리소스에도 명시적으로 연결되어 있지 않다.


2. myeks-node — EKS 노드 공유 보안그룹

Description: "EKS node shared security group"
GroupId: sg-05759c46248be71f5

EKS Terraform 모듈(terraform-aws-modules/eks/aws)이 자동으로 생성하는 워커 노드용 보안그룹이다. 규칙이 가장 많고, EKS 클러스터의 핵심 통신 경로를 정의한다.

인바운드 규칙

FromPort ToPort Protocol 소스 SG Description 용도
443 443 TCP sg-07ca47ee2acbb5ccd (cluster) Cluster API to node groups HTTPS. API 서버 → 노드 API 통신
4443 4443 TCP sg-07ca47ee2acbb5ccd (cluster) Cluster API to node 4443/tcp webhook VPC Admission Webhook 등
6443 6443 TCP sg-07ca47ee2acbb5ccd (cluster) Cluster API to node 6443/tcp webhook
8443 8443 TCP sg-07ca47ee2acbb5ccd (cluster) Cluster API to node 8443/tcp webhook
9443 9443 TCP sg-07ca47ee2acbb5ccd (cluster) Cluster API to node 9443/tcp webhook AWS Load Balancer Controller 등
10250 10250 TCP sg-07ca47ee2acbb5ccd (cluster) Cluster API to node kubelets kubelet API. kubectl logs, kubectl exec
10251 10251 TCP sg-07ca47ee2acbb5ccd (cluster) Cluster API to node 10251/tcp webhook
53 53 TCP sg-05759c46248be71f5 (self) Node to node CoreDNS DNS 쿼리 (TCP)
53 53 UDP sg-05759c46248be71f5 (self) Node to node CoreDNS UDP DNS 쿼리 (UDP)
1025 65535 TCP sg-05759c46248be71f5 (self) Node to node ingress on ephemeral ports 노드 간 통신 (ephemeral ports)

아웃바운드 규칙

Protocol 대상 Description
-1 (전체) 0.0.0.0/0 Allow all egress

규칙 해석

컨트롤 플레인 → 노드 (소스: cluster SG sg-07ca47ee2acbb5ccd)

API 서버가 워커 노드의 각종 포트로 접근해야 하는 이유:

  • 10250 (kubelet): kubectl exec, kubectl logs, 메트릭 수집 등 API 서버가 kubelet에 직접 통신
  • 443, 4443, 6443, 8443, 9443 (webhooks): Kubernetes Admission Webhook, Mutating/Validating Webhook을 실행하는 파드들이 노드에서 돌아감. API 서버가 요청 검증/변환을 위해 이 파드들에 접근
  • 10251:

노드 ↔ 노드 (소스: self SG sg-05759c46248be71f5)

  • 53 (DNS): CoreDNS 파드가 노드에서 실행됨. 다른 노드의 파드가 DNS 쿼리를 보내려면 노드 간 53 포트 통신이 필요
    • DNS는 기본적으로 UDP를 먼저 사용하고, 응답이 512바이트를 초과하거나 zone transfer 시 TCP fallback
  • 1025–65535 (ephemeral ports): 노드 간 파드 통신에 사용. 커널이 동적으로 할당하는 임시 포트 범위(ephemeral port range). Linux 기본값은 보통 32768–60999이지만, AWS는 더 넓게 1025–65535로 설정

아웃바운드: 전체 허용

노드에서 나가는 트래픽은 전부 허용한다. ECR에서 이미지 풀, API 서버 통신, 인터넷 통신 등 다양한 외부 접근이 필요하기 때문이다.


3. myeks-node-group-sg — Terraform 직접 정의 보안그룹

Description: "Security group for EKS Node Group"
GroupId: sg-0a6afe6fd37744d7f

코드 분석에서 살펴본 aws_security_group.node_group_sg다. eks.tf에서 직접 정의하고, vpc_security_group_ids로 노드 그룹에 연결했다.

인바운드 규칙

Protocol 소스 CIDR 용도
-1 (전체) 121.xxx.xxx.xxx/32 var.ssh_access_cidr — 내 공인 IP
-1 (전체) 192.168.1.100/32 bastion host용 예비 허용

아웃바운드 규칙

없음.

규칙 해석

protocol = "-1"(모든 프로토콜, 모든 포트)로 설정했기 때문에 지정된 IP에서 오는 모든 트래픽을 허용한다. SSH(22)뿐만 아니라 ping(ICMP), HTTP 등 모든 접근이 가능하다.

아웃바운드 규칙이 없지만, 보안그룹이 Stateful이므로 인바운드로 들어온 요청의 응답은 자동으로 나간다. 노드에서 먼저 시작하는 외부 통신(ECR pull 등)은 같이 붙어 있는 myeks-node SG의 전체 허용 아웃바운드가 커버한다.

배포 결과에서 콘솔로 확인한 것과 동일한 보안그룹이다.


4. eks-cluster-sg-myeks-* — EKS Primary 보안그룹

Description: "EKS created security group applied to ENI that is attached to EKS Control Plane master nodes, as well as any managed workloads."
GroupId: sg-0776f9de59b07e26a

EKS 서비스가 클러스터 생성 시 자동으로 만드는 보안그룹이다. Terraform 모듈이 아닌 AWS EKS 자체가 생성한다. 컨트롤 플레인 ENI와 관리형 노드 그룹 ENI 양쪽 모두에 연결된다.

인바운드 규칙

Protocol 소스 SG Description
-1 (전체) sg-0776f9de59b07e26a (자기 자신) Allows EFA traffic, which is not matched by CIDR rules.

아웃바운드 규칙

Protocol 대상 Description
-1 (전체) 0.0.0.0/0 (기본 아웃바운드)
-1 (전체) sg-0776f9de59b07e26a (자기 자신) Allows EFA traffic, which is not matched by CIDR rules.

규칙 해석

자기 자신을 소스로 참조하는 self-referencing 규칙이다. 이 SG가 붙은 모든 ENI 간에 전체 통신이 허용된다. 컨트롤 플레인과 워커 노드 양쪽에 이 SG가 붙어 있으므로, 컨트롤 플레인 ↔ 워커 노드 간 모든 포트가 양방향으로 열린다.

앞서 myeks-node SG에서 포트별로 세밀하게 열어 놓은 것과 중복이지만, 이 SG는 EKS가 자체적으로 관리하는 기본 통신 보장 레이어다.

EFA(Elastic Fabric Adapter) 언급은 HPC(고성능 컴퓨팅) 워크로드용이지만, 실제로는 self-referencing으로 전체 트래픽을 허용하는 범용 규칙이다.


5. myeks-cluster — EKS 클러스터 보안그룹

Description: "EKS cluster security group"
GroupId: sg-07ca47ee2acbb5ccd

EKS Terraform 모듈이 생성하는 컨트롤 플레인 전용 보안그룹이다.

인바운드 규칙

FromPort ToPort Protocol 소스 SG Description
443 443 TCP sg-05759c46248be71f5 (node shared) Node groups to cluster API

아웃바운드 규칙

없음.

규칙 해석

노드 → API 서버 방향의 HTTPS(443) 통신만 허용한다. kubelet이 API 서버에 상태를 보고하고, 파드가 API 서버에 접근할 때 이 경로를 사용한다.

아웃바운드 규칙이 없지만, 보안그룹이 Stateful이므로 인바운드 요청(노드 → API 서버)의 응답은 자동으로 나간다. API 서버에서 먼저 시작하는 통신(kubelet 접근, webhook 호출 등)은 primary SG(eks-cluster-sg-myeks-*)의 self-referencing 규칙이 커버한다.


통신 경로 정리

생성 주체별 분류

생성 주체 보안그룹 역할
AWS VPC myeks-VPC-default VPC 기본 SG. 사용 안 함
EKS 서비스 (AWS) eks-cluster-sg-myeks-* Primary SG. 컨트롤·데이터 플레인 간 전체 통신 보장
EKS Terraform 모듈 myeks-node 워커 노드 세밀한 인바운드 포트 관리
EKS Terraform 모듈 myeks-cluster 컨트롤 플레인 인바운드(443) 관리
Terraform 직접 정의 myeks-node-group-sg SSH/관리 접근용 CIDR 기반 허용

통신 방향별 정리

컨트롤 플레인 → 워커 노드

포트 프로토콜 용도 허용하는 SG
443 TCP HTTPS (API 통신) myeks-node
4443 TCP Webhook (VPC Admission 등) myeks-node
6443 TCP Webhook myeks-node
8443 TCP Webhook myeks-node
9443 TCP Webhook (ALB Controller 등) myeks-node
10250 TCP kubelet API myeks-node
10251 TCP Webhook myeks-node
전체 전체 self-ref eks-cluster-sg-myeks-*

워커 노드 → 컨트롤 플레인

포트 프로토콜 용도 허용하는 SG
443 TCP kubelet → API 서버, 파드 → API 서버 myeks-cluster
전체 전체 self-ref eks-cluster-sg-myeks-*

워커 노드 ↔ 워커 노드

포트 프로토콜 용도 허용하는 SG
53 TCP/UDP CoreDNS myeks-node
1025–65535 TCP 파드 간 통신 (ephemeral ports) myeks-node
전체 전체 self-ref eks-cluster-sg-myeks-*

외부 → 워커 노드

포트 프로토콜 소스 허용하는 SG
전체 전체 121.xxx.xxx.xxx/32 (내 IP) myeks-node-group-sg
전체 전체 192.168.1.100/32 (예비) myeks-node-group-sg


이중 보안 구조

EKS 클러스터에는 두 겹의 보안그룹 레이어가 있다:

  1. Primary SG (eks-cluster-sg-myeks-*): EKS 서비스가 자동 생성. self-referencing으로 컨트롤·데이터 플레인 간 전체 통신을 보장. EKS 내부 동작이 깨지지 않도록 하는 안전망
  2. 모듈 SG (myeks-node, myeks-cluster): Terraform 모듈이 생성. 포트 단위로 세밀하게 제어. 커스터마이징 가능

Primary SG만으로도 통신은 되지만, 모듈 SG가 있어야 불필요한 포트를 차단하는 최소 권한 원칙(Least Privilege)을 적용할 수 있다. 반대로 모듈 SG만 있으면 새로운 EKS 기능이 추가될 때 포트를 직접 열어야 하므로, Primary SG가 기본 동작을 보장한다.


온프레미스 비교

관점 온프레미스 (kubeadm) EKS
방화벽 위치 OS iptables/firewalld 또는 물리 방화벽 AWS 보안그룹 (ENI 레벨)
관리 방식 수동으로 포트 열기 (6443, 10250, 2379-2380 등) EKS 모듈 + EKS 서비스가 자동 구성
컨트롤 플레인 포트 6443(API), 2379-2380(etcd), 10250-10252(kubelet/scheduler/controller) etcd는 관리형이라 불필요. API는 NLB 뒤에 위치
노드 간 통신 보통 같은 L2 네트워크에서 제한 없이 통신 보안그룹 self-referencing으로 허용
커스텀 접근 직접 iptables 규칙 작성 vpc_security_group_ids로 추가 SG 연결


정리



hit count

댓글남기기