AWS/Project

온프레미스에서 VPC Endpoint를 사용하여 S3로 프라이빗 접근

jih0ssang 2024. 1. 13. 11:08

참조 사이트: https://aws.amazon.com/ko/blogs/networking-and-content-delivery/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/

온프레미스에서 VPC Endpoint를 사용하여 S3로 프라이빗 액세스

internal ALB  vpc endpoint 사용하여 s3 접근 url로 리다이렉션

 

1. VPC Endpoint 생성

S3 액세스 가능한 VPC Endpoint 유형은 Gateway, interface 두 가지가 있다.

퍼블릭 액세스의 경우 Gateway, 프라이빗 액세스의 경우 interface를 사용한다.

우리는 프라이빗 액세스를 위해 interface 유형을 선택한다.

 

ENI가 생기는 VPC Endpoint를 둘 VPC 및 서브넷, 가용 영역을 선택하고 (프라이빗이든, 퍼블릭 서브넷이든 상관 x)

보안그룹은 80 및 443 포트 허용해야 한다. (default 보안 그룹을 주면 ingress 트래픽 제한있으므로 피할 것 !! )

VPC 엔드포인트 정책은 "전체 액세스"를 선택한다. 

 

"전체 액세스"는 VPC에서 작업하는 모든 AWS 보안 주체가 모든 S3 버킷의 VPC 엔드포인트에 액세스할 수 있도록 한다. 이 정책을 사용하면 S3 버킷에 정의할 정책을 우회하지 않는다. 나중에 ALB를 생성하고나서 ALB에 대한 액세스만 허용하도록 정책을 제한할 수 있다.

 

2. S3 버킷 Policy 수정

{
   "Version": "2012-10-17",
   "Statement": [
     {
       "Sid": "Access-to-specific-VPCE-only",
       "Principal": "*",
       "Action": "s3:GetObject",
       "Effect": "Allow",
       "Resource": ["arn:aws:s3:::yourbucketname",
                    "arn:aws:s3:::yourbucketname/*"],
       "Condition": {
         "StringEquals": {
           "aws:SourceVpce": "vpce-1a2b3c4d"
         }
       }
     }
   ]
}

 

해당 정책은 VPC 엔드포인트 타고 들어온 것만 s3에 접근하도록 명시적으로 허용한 내용이다.

 

3. 내부 ALB 생성

대상 그룹 생성

HTTPS를 사용하여 IP를 대상으로 하는 새 대상그룹을 생성한다. 

 

상태 검사 프로토콜은 HTTP를 사용한다.

"고급 상태 검사 설정"에서 포트 재정의가 HTTP 프로토콜과 일치하도록 80으로 설정되어 있는지 확인한다.

 

ALB 상태 확인 호스트 헤더에는 도메인 이름이 포함되지 않으므로, S3는 200이 아닌 HTTP 응답 코드를 반환한다.

상태 확인 성공 코드에 "307,405"를 추가한다.

 

 

대상 등록에 이전에 생성했던 VPC Endpoint의 ip를 등록한다.

필자는 가용 영역 A, C 선택하여 2개의 ip가 생겼고 2개 모두 등록하였다.

 

내부 ALB 생성

"내부" 체계로 ALB를 생성한다.

VPC 및 서브넷, ACM 인증서를 선택한다.

 

보안그룹은 443 포트를 허용해야 한다.

리스너 프로토콜은 "HTTPS"로 두고 이전에 생성했던 대상 그룹을 선택하면 ALB 생성이 마무리 된다.

 

추가 리스너 규칙 구성

S3 접근하는 도메인으로 리다이렉션 할 규칙이 필요하다.

 

Amazon S3 PrivateLink 엔드포인트는 REST API 엔드포인트이다 . 즉, 후행 슬래시(/) 요청이 기본적으로 XML 디렉터리 목록을 반환한다는 의미이다. 후행 슬래시로 끝나는 모든 요청이 sample.txt를 가리키도록 리디렉션 규칙을 생성해야 한다.

 

규칙 추가

내부 ALB의 HTTPS: 443 리스너 표 에서 "규칙"을 선택한다.

"규칙 추가"를 선택하여 새롭게 규칙을 추가한다.

 

규칙 조건 유형은 "경로"를 선택하고, 값은 * 혹은 ""(빈칸)을 추가한다.

기존 클라이언트 요청을 유지하고 싶다면 포트는 #{port}, 호스트는 #{host}, 경로는 #{path} 를 작성한다.

하지만 필자는 특정 페이지로만 리다이렉션 하도록 지정하였다.

DNS 구성 및 ALB 테스트

프라이빗 호스팅 영역에 내부 ALB를 가리키는 A 레코드를 추가한다.

(Bastion Host에서 ALB에 대해 nslookup 했을 때, 뜨지 않는다면 아직 호스팅 영역에 In-Sync 되지 않은 것이다.)

 

 

 Bastion Host에서 ALB를 통과하면서 정상적으로 리다이렉션하여 S3에 접근하는 것을 볼 수 있다.