[AWS] Bastion host와 VPC endpoint를 이용한 DynamoDB에서의 사설통신 환경 만들기

노라에몽·2023년 2월 26일
0

DynamoDB

목록 보기
1/1

📝서론

DynamoDB는 VPC 내부에서 돌아가는 서비스가 아닌 AWS region상에서 돌아가는 서비스이기 때문에 공인 IP를 통해 사용할 수 있는 서비스이다.
VPC 내부에 있는 어떤 EC2 인스턴스에서 DynamoDB에 대한 API를 호출한다면 자연스럽게 외부 인터넷에 연결되기 때문에 보안이 중요하다면 썩 좋은 상황이 아닐수도 있다. 따라서 VPC endpoint를 이용하는 것이 이런 상황을 해결할 수 있는 대안이 될 수 있다. 다음과 같은 그림과 같이 환경을 구성해보고자 한다.

VPC endpoint와 DynamoDB에서의 endpoint

VPC endpoint는 다른 리소스와의 연결 필요 없이 VPC 내부의 리소스들과 AWS 서비스 간의 연결을 설정해주는 서비스이다. 크게 Interface endpointGateway endpoint 두가지로 나뉜다.

Interface endpoint : Interface endpoint는 private IP를 이용하여 서비스에 접근하는 방식이다.
Gateway endpoint : Route table의 경로에 대한 대상인 게이트웨이이다. Amazon S3과 DynamoDB에서 사용된다.

오늘은 DynamoDB에 대해 작성할 것이므로, DynamoDB에서의 Gateway endpoint 특징을 간략히 적어보자면 다음과 같다.
1. 동일한 region 내에서만 사용이 가능하다.
2. IPv4 트래픽만 가능
3. DynamoDB는 리소스 기반 정책을 지원하지 않기 때문에 IAM user나 role에 대한 endpoint policy 또는 IAM policy를 통해 제어해야함.
4. AWS PrivateLink를 지원하지 않음.

Bastion host의 이해와 역할

VPC 내부에서는 사설 IP만으로도 통신이 가능하다. 하지만 외부에서는 사설 IP를 사용할 수 없다.
그럼 외부에서 VPC 내부의 사설 IP를 가진 리소스들과 통신하려면 어떻게 해야하는가?
이런 상황에서 Bastion host를 사용한다. Bastion host를 문지기라고 이해하면 편하다. 사설 IP를 가진 내부 리소스들은 외부와의 통신이 불가능하므로, 문지기 역할의 Bastion host를 통해 통신을 할 수 있게 되는 것이다. 오늘 이용할 Bastion host는 aws configure을 통해 user 구성을 하고 해당 user의 정책과 security group의 rule을 적용 받는 상태로 API call을 하게 된다.



🤜 본론

1. DynamoDB용 VPC endpoint 만들기

  • VPC 콘솔에서 endpoints로 들어간다. 아래와 같이 이름을 입력해주고 서비스 명을 'DynamoDB' 로 검색하여 선택해준다.

  • 사용할 VPC를 선택해준 뒤 라우트 테이블을 선택해준다. 여기서는 라우팅 테이블에 대한 추가 규칙이 생성되므로 네트워크 트래픽이 subnet으로부터 DynamoDB로 흐를 수 있게끔 해준다.

  • 정책 상 필요한 부분이 있다면 'Custom'으로 직접 입력하여 설정해준다.
  • Create endpoint 버튼을 눌러 endpoint를 생성해준다.

만든 resource들이 적절한 플로우로 흐르고 있는지 확인해준다. VPC 콘솔에서 내가 사용하고 있는 VPC를 선택해주면 'Resource map'을 확인할 수 있다.

  • endpoint를 설정해준 Route table을 확인해준다. 이때 라우팅 테이블 규칙인 rule ID를 기록해두자. pl-xxxxxxxx 꼴의 rule은 prefix list를 의미한다.




2. EC2 Bastion host 만들기

인스턴스 띄우기

  • 이용할 vpc pem key등을 적절히 설정해준 뒤 인스턴스를 하나 띄워준다.

security group 수정하기

  • inbound rule : 개발자 혹은 어드민의 IP 주소와 포트번호로 설정해주기

  • outbound rule : DynamoDB VPC endpoint로의 규칙 추가해주기 (아까 기록해둔 라우팅 테이블 규칙인 pl-xxxxxxxx 을 destination으로 설정해준다.)


3. IAM user access 권한 만들어주기

IAM user를 만들어준뒤 다음과 같이 Policy를 추가해준다. 이 부분은 용도에 맞게 custom해서 사용할 수도 있다. 나는 만들어둔 DynamoDB table이 없어서 급하게 테스트용으로 하나를 만들고 다음과 같이 작성해주었다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "dynamodb:*",
            "Effect": "Allow",
            "Resource": "arn:aws:dynamodb:*:${account_number}:*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": "${vpcendpoint_id}"
                }
            }
        }
    ]
}




4. 테스트

콘솔에서 테스트 해보기

만약 IAM user를 생성할 때 비밀번호를 설정해 콘솔로 접근할 수 있다면 테스트해볼 수 있는 방법이다.
지금 안 사실, user 설정에 들어가서 console access를 edit하면 비밀번호 설정을 통해 콘솔에 접근할 수 있다!
콘솔에 이용할 user를 이용해서 로그인하고 DynamoDB 서비스로 접속해보면 다음과 같이 access 권한이 없음을 확인할 수 있다!

내 local 환경에서 테스트해보기

터미널에 들어가 AWS CLI를 IAM user로 configure 해준다.

$ aws configure
AWS Access Key ID : ${your_user_AccessKey}
AWS Secret Access Key : ${your_user_SecretKey}
Default region name : ap-northeast-2
Default output format : json

잘 설정이 되었는지 확인해보기 위해 다음 명령어를 입력해보자. 내가 설정한 user로 맞게 출력되는지 아래와 같이 확인한다.

$ aws sts get-caller-identity

{
    "UserId": "내 user ID",
    "Account": "내 계정명",
    "Arn": "arn:aws:iam::계정번호:user/user_이름"
}

이제 local 환경에서 DynamoDB API를 호출해보자.

$ aws dynamodb list-tables

An error occurred (AccessDeniedException) when calling the ListTables operation: User: arn:aws:iam::내계정:user/user이름 is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:ap-northeast-2::table/* with an explicit deny in an identity-based policy

위와 같이 Access Denied error를 확인할 수 있다.

EC2 Bastion host로 DynamoDB 접근해보기

ssh 연결로 Bastion host에 접속해준다. local에서 설정했던 것 처럼 동일하게 CLI에 대해 configure를 해준다. (당연히 같은 user를 이용해야한다.) Bastion host인 instance의 outbound rule을 DynamoDB endpoint로 설정해주었기 때문에 다음과 같이 확인할 수 있다.

$ aws dynamodb list-tables

{
    "TableNames": [
        "ddb_test"
    ]
}



👏 마무리

이렇게 Bastion host와 VPC endpoint를 이용해서 DynamoDB 사설통신 환경을 구성해보았다.
구성이 그리 까다로운 편은 아니므로 시도해보시기를 바라며 오늘 글은 여기서 마무리하겠다!

profile
대나무 헬리콥터

0개의 댓글