교차계정으로 타계정 S3에 VPC 엔드포인트로 접속
- Aws
- May 9, 2022
클라우드 아키텍처를 설계하다 보면 타계정의 있는 서비스를 사용해야 하는 경우가 있습니다.
AWS는 그러한 상황에 대비하여 ‘교차계정’ 이라는 서비스를 제공합니다.
교차 계정이란 쉽게 설명해서 타계정도 리소스를 사용할 수 있게 허락해주는 것입니다.
그렇다고 허락만 하면 리소스를 자동으로 쓸 수 있는 건 아닙니다.
리소스마다 차이가 있겠지만 여기서는 VPC 엔드포인트를 교차계정으로 사용하는 법을 다뤄 보겠습니다.
VPC를 연결하는 방식은 아래의 링크에 잘 나와있습니다.
(아쉽게도 원글의 그림과 설명은 안 맞네요)
3 options for cross-account VPC access in AWS
아래의 이미지는 3가지 방식의 VPC 연결에 대한 간략한 비교 표입니다.
이 글에서는 VPC연결 방법 자체를 다룰건 아니기에 VPC를 연결할 필요 없이 S3를 VPC endpoint 서비스를 이용해서 다이렉트로 프라이빗으로 연결하는 방법에 대해서만 다뤄 보겠습니다.
앞서 VPC Endpoint를 이해할 필요가 있는데요 VPC endpoint란 AWS에서 제공해주는 서비스들 예를 들어 S3, DynanoDB, Kinesis stream 등을 인터넷이나 VPN없이 사설망으로 바로 접속할 수 있게 해주는 서비스입니다.
(VPC Endpoint에 대해 궁금하면 아래 링크로 들어가면 된다.)
종류는 3가지가 있는데 이 글에서 다룰 내용은 S3연결에 적합한 Gateway VPC Endpoint입니다.
설계한 아키텍처는 타계정의 S3를 Endpoint 통해 내부망 접속하는 아키텍처로 그림으로 보면 아래와 같습니다.
해당 아키텍처의 장점은 타계정의 S3를 내부망으로 보안 강화해서 접속 할 수 있는 것입니다.
하지만 타계정에 접속하는 것이기에 타계정의 S3를 사용할 권한을 습득해야 합니다.
교차계정 권한 주는 방식은 아래 링크에 자세히 나와 있습니다. 저는 가이드에서 첫번째 방법을 적용해보겠습니다.
실습에 앞서 S3가 없는 타계정을 A계정이라고 하고 S3를 소유한 계정을 B계정이라고 지정하고 진행해 보겠습니다.
먼저 B계정에 있는 S3내 권한에 A계정에서 사용할 수 있도록 정책을 JSON으로 만들고 권한에 추가합니다.
(그 전에 ec2에 적용할 역할이 미리 준비 되어 있어야 한다. 필자는 s3 full로 했다.)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{API를 사용할 타계정 번호}:role/{S3 사용 권한을 가진 ec2 역할}"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::{s3 이름}/*"
}
]
}
그리고 나서 A계정에 VPC 엔드포인트를 생성합니다.
라우팅 테이블을 지정하는 것을 잊으면 안됩니다.
저는 여기서 JMJ-PRI-RTB(private subnet)만 라우팅 테이블에 추가했습니다.
엔드포인트 목록에서 아래와 같이 엔드포인트 정보가 표시되면 정상적으로 만들어 진 것입니다.
그리고 나서 A계정의 EC2로 접속하여 S3에 있는 자료를 다운 받아 보겠습니다.
정상적으로 다운 받은 것을 확인 할 수 있습니다.
사실 VPC 엔드포인트를 지워도 다운 받는 것에는 문제가 없습니다.
만약 지우게 된다면 인터넷 망(퍼블릭)으로 받을 수 있기 때문입니다.
그렇다면 VPC 엔드포인트가 있다면 프라이빗 망을 통한다는 사실은 어떻게 확인 할 수 있을까요?
2가지 방식으로 확인이 가능합니다.
- S3 권한에 특정 VPC 엔드포인트만 허가
- S3 액세스 서버 로깅을 활성화하여 remote ip 확인
첫번째 방식은 간단합니다.
실습 초반에 추가했던 JSON 정책에 아래의 코드를 추가하면 된다.
{
"Sid": "Access-to-specific-VPCE-only",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::{S3 이름}",
"arn:aws:s3:::{S3 이름}/*"
],
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-{엔드포인트 id}"
}
}
}
위 코드에서 엔드포인트 id를 별도의 다른 id로 입력을 하고 EC2에서 전과 같이 다운로드를 시도하면
403 에러가 발생합니다.
즉 등록한 VPC endpoint를 제외한 모든 소스는 거부하는 효과가 생깁니다.
2번째 방법은 S3 액세스 서버에서 로그로 확인이 가능합니다
로그 확인하는 방법은 아래의 글을 참고하시면 됩니다.
Athena에서 Cloud Trail과 S3 액세스 로그 보는 법
VPC 엔드포인트를 지우면 Remote Ip가 public ip로 표시되고 VPC 엔드포인트를 설치하면 private ip로 표시가 됩니다.
아래의 그림이 Athena에서 S3 엑세스 로그를 조회한 결과입니다.
remote ip 부분을 보면 public ip와 private ip가 번갈아 보이는 것을 확인 할 수 있습니다.
VPC 엔드포인트를 지웠을 때는 52로 ip가 시작하고 VPC 엔드포인트가 있을때는 10으로 ip가 시작합니다.
VPC 엔드포인트가 있다면 자동적으로 내부망을 사용한다는 것을 확인 할 수 있습니다.
이로써 VPC 엔드포인트로 타계정 S3에 접속이 가능한 것을 알 수 있습니다.