보안 그룹, NACL, VPC 엔드포인트와 PrivateLink (VPC 안쪽 통제)
상태 저장 방화벽인 보안 그룹과 상태 비저장인 네트워크 ACL 의 차이와 규칙 설계, 게이트웨이 엔드포인트와 인터페이스 엔드포인트(PrivateLink)의 비용과 엔드포인트 정책, 내 서비스를 다른 VPC 에 PrivateLink 로 내주는 법을 정리합니다.
보안 그룹과 NACL
| 비교 | 보안 그룹 | 네트워크 ACL |
|---|---|---|
| 붙는 곳 | ENI(인스턴스, 태스크, RDS, 엔드포인트 등) | 서브넷 |
| 상태 | 상태 저장. 나간 요청의 응답은 자동 허용 | 상태 비저장. 응답 트래픽도 규칙으로 열어야 함 |
| 규칙 | 허용만 있음 | 허용과 거부, 번호 순서대로 평가 |
| 대상 지정 | CIDR, 접두사 목록, 다른 보안 그룹 | CIDR 만 |
| 기본값 | 새 그룹은 인바운드 없음, 아웃바운드 모두 허용 | 기본 NACL 은 모두 허용 |
실무의 기본 원칙은 보안 그룹으로 세밀하게, NACL 은 거칠게(또는 기본값 그대로) 입니다. NACL 은 특정 대역을 서브넷 단위로 확실히 막아야 할 때(예: 데이터 서브넷은 앱 서브넷 대역에서만) 씁니다. NACL 을 쓸 때는 응답이 돌아오는 임시 포트(1024-65535) 를 열어야 한다는 점을 잊지 않습니다.
보안 그룹 체이닝
IP 대신 보안 그룹을 대상으로 지정하면, 오토 스케일링으로 IP 가 바뀌어도 규칙을 고칠 필요가 없습니다.
| 보안 그룹 | 인바운드 규칙 |
|---|---|
| sg-alb | 443 from 0.0.0.0/0 (CloudFront 만 받으려면 CloudFront 관리형 접두사 목록) |
| sg-app | 8080 from sg-alb |
| sg-db | 5432 from sg-app |
aws ec2 authorize-security-group-ingress --group-id sg-db \
--ip-permissions 'IpProtocol=tcp,FromPort=5432,ToPort=5432,UserIdGroupPairs=[{GroupId=sg-app,Description="app to aurora"}]'한도
보안 그룹당 인바운드, 아웃바운드 규칙은 기본 60 개씩이고 ENI 하나에 보안 그룹은 기본 5 개까지 붙습니다. 두 값의 곱에는 상한이 있어서 하나를 올리면 다른 하나를 낮춰야 할 수 있습니다. 규칙이 넘치면 IP 를 나열하지 말고 관리형 접두사 목록으로 묶습니다. NACL 은 방향마다 기본 20 개(최대 40 개) 규칙입니다.
팁 보안 그룹은 "지금 연결된 것" 을 끊지 않을 수 있습니다. 추적 중인 연결은 규칙을 지워도 한동안 유지될 수 있으니, 사고 대응 때 즉시 끊어야 하면 NACL 의 거부 규칙을 함께 씁니다.
VPC 엔드포인트
프라이빗 서브넷의 리소스가 AWS 서비스를 부를 때, 인터넷이나 NAT 를 거치지 않고 AWS 네트워크 안에서 가는 길입니다.
| 종류 | 대상 | 동작 | 요금 |
|---|---|---|---|
| 게이트웨이 엔드포인트 | S3, DynamoDB | 라우팅 테이블에 접두사 목록 경로 추가 | 무료 |
| 인터페이스 엔드포인트 (PrivateLink) | 대부분의 AWS 서비스, SaaS, 다른 VPC 서비스 | 서브넷에 ENI 생성, 사설 IP 로 접근 | AZ 당 시간 요금 + 처리 GB |
| 게이트웨이 로드 밸런서 엔드포인트 | 방화벽 어플라이언스 | 라우팅으로 트래픽을 검사 장비로 | 시간 + GB |
| 리소스 엔드포인트, 서비스 네트워크 엔드포인트 | VPC Lattice 리소스(다른 VPC 의 DB 등) | 사설 접근 | 시간 + GB |
서울 리전 인터페이스 엔드포인트는 2026-10 기준 AZ 하나당 시간당 0.013 USD, 처리 GB 당 0.01 USD(월 1 PB 까지)입니다. 세 AZ 에 걸면 엔드포인트 하나에 한 달 약 28 USD 입니다. 엔드포인트를 수십 개 만들면 그것도 적지 않은 돈이라, 조직에서는 공유 서비스 VPC 에 엔드포인트를 모으고 Route 53 Resolver 와 Transit Gateway 로 다른 VPC 가 함께 쓰게 하기도 합니다.
어떤 엔드포인트부터 만드나
프라이빗 서브넷에서 컨테이너를 돌리면 보통 이 순서로 필요합니다.
s3(게이트웨이, 무료). ECR 이미지 레이어가 S3 에서 내려옵니다.ecr.api,ecr.dkrlogs(CloudWatch Logs)sts,secretsmanager,ssm,kms- Session Manager 를 쓰면
ssm,ssmmessages,ec2messages
프라이빗 DNS
인터페이스 엔드포인트에 프라이빗 DNS 를 켜면 secretsmanager.ap-northeast-2.amazonaws.com 같은 기본 이름이 그대로 엔드포인트의 사설 IP 로 풀립니다. 코드를 고칠 필요가 없습니다. VPC 의 enableDnsHostnames, enableDnsSupport 가 둘 다 켜져 있어야 합니다.
엔드포인트 정책
엔드포인트에도 리소스 정책을 붙여 "이 엔드포인트로는 우리 조직 버킷만" 같은 데이터 경계를 만듭니다.
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"],
"Resource": "*",
"Condition": { "StringEquals": { "aws:ResourceOrgID": "o-abc123example" } }
}]
}반대로 버킷 정책에 aws:SourceVpce 조건을 걸면 "이 엔드포인트를 거친 요청만" 받게 됩니다. 이 조건을 걸면 콘솔에서 버킷을 볼 때도 막히니 관리용 예외를 함께 둡니다.
내 서비스를 PrivateLink 로 내주기
다른 계정이나 고객 VPC 에 내 API 를 인터넷 없이 제공하려면 엔드포인트 서비스를 만듭니다.
- 서비스 앞에 NLB(또는 GWLB)를 둡니다.
- NLB 로 엔드포인트 서비스를 만들고, 허용할 주체(계정, 역할, 조직)를 등록합니다. 연결 요청을 수동 승인으로 둘 수 있습니다.
- 소비자는 자기 VPC 에 인터페이스 엔드포인트를 만들어 붙습니다.
양쪽 CIDR 이 겹쳐도 상관없고, 소비자 쪽에서 우리 VPC 의 다른 리소스는 전혀 보이지 않는다는 것이 피어링과 가장 큰 차이입니다. 2024-11 부터는 리전 간 PrivateLink 도 지원해서 다른 리전의 소비자도 붙을 수 있습니다(원격 리전마다 시간 요금 추가).
VPC Lattice
서비스 사이 통신이 많은 조직은 VPC Lattice 로 서비스 네트워크를 만들어, VPC 와 계정 경계를 넘는 HTTP, gRPC, TCP 연결과 인증 정책(IAM 기반)을 한 곳에서 관리할 수 있습니다. 서비스 메시를 직접 운영하지 않고 IAM 정책으로 서비스 간 권한을 거는 방식입니다.
자주 하는 실수
- 엔드포인트 보안 그룹에 443 을 안 염: 인터페이스 엔드포인트도 ENI 라서 보안 그룹이 붙습니다. 호출하는 쪽 대역이나 보안 그룹에서 443 을 허용해야 합니다.
- NACL 에서 임시 포트를 막음: 연결은 시작되는데 응답이 안 돌아와 타임아웃이 납니다.
- 게이트웨이 엔드포인트를 일부 라우팅 테이블에만 연결: 연결 안 된 서브넷은 여전히 NAT 로 S3 에 갑니다.
- 0.0.0.0/0 22 번 포트: SSH 는 Session Manager 로 바꾸고 22 번은 닫습니다. Security Hub 와 Config 규칙이 이런 그룹을 찾아 줍니다.