Search

AWS 보안 인프라 구축하기

Tags
AWS

1. 개요

오늘 포스팅에서는 다음과 같은 시스템 아키텍쳐를 직접 구축해보는 과정을 서술해보겠습니다.

2. VPC

VPC란 AWS 클라우드의 프라이빗 가상 네트워크 환경 입니다.
VPC는 하나의 큰 덩어리이며 서브넷을 통해 VPC를 나눕니다.
우선 VPC를 생성해보겠습니다.
vpc의 이름 같은 경우 [사용자 이름]-[리전]-vpc 와 같은 형태를 많이 사용한다고 합니다.

3. 서브넷

서브넷은 퍼블릭 서브넷과 프라이빗 서브넷으로 구분됩니다.
퍼블릿 서브넷은 인터넷에 직접 엑세스 가능합니다. 따라서 인터넷 게이트 웨이를 VPC에 연결하고 퍼블릿 서브넷의 라우팅 테이블을 업데이트 하여 외부에서 오는 트래픽을 인터넷 게이트 웨이로 보낸다면 퍼블릭 서브넷으로 사용할 수 있습니다.
반면에 프라이빗 서브넷은 인터넷에 직접 엑세스 불가능한 서브넷입니다.
퍼블릿 서브넷 생성 마찬가지로 서브넷을 생성해줍니다.
서브넷의 이름은 통상 [사용자 이름]-[리전]-[public/private]-[subnet]-[가용영역] 으로 설정합니다.
저느 다음과 같이 두 개의 퍼블릿 서브넷을 생성해주었습니다.
프라이빗 서브넷 생성 앞의 과정과 동일하게 서브넷을 만들되 public 만 private으로 변경해서 구상해봅시다.
완료했다면 다음과 같은 서브넷이 생성됩니다.

4. 인터넷 게이트웨이

퍼블릭 서브넷 역할을 하려면 인터넷으로 서브넷을 접속할 수 있어야 합니다. 인터넷 게이트웨이를 VPC와 연결하여 서브넷으로 설정해주면 해당 서브넷이 퍼블릭 서비넷 역할을 할 수 있습니다.
인터넷 게이트웨이 역시 [사용자 이름]-[리전]-igw 형식에 맞춰서 이름을 설정해줍니다.
그리고 방금 만든 인터넷 게이트웨이와 위에서 만든 VPC를 연결해줍니다.

5. 라우팅 테이블

인터넷을 통해 사용자에게 요청이 들어왔을 때, 라우팅 테이블이 없다면 어디로 가야할 지 알 수 없습니다. 라우팅 테이블을 통해 어떤 요청이 들어왔을 때 어디로 가야하는지 알 수 있습니다.
[사용자 이름]-[리전]-public-route로 라우팅 테이블을 생성해주고, 라우팅 편집을 통해 인터넷 게이트 웨이를 추가해줍니다.
인터넷 게이트웨이를 추가하였다면, 해당 게이트웨이와 연결된 서브넷 목록이 뜰 건데 이 또한 추가해줍니다.
︎ 추가적으로 프라이빗 라우팅 테이블에 대한 NAT Gateway 설정을 추가하여 프라이빗 서브넷에 있는 EC2 인스턴스가 외부와의 연결을 할 수 있도록 수정하였습니다.
프라이빗 라우팅 테이블에 NAT Gateway를 추가한 모습입니다.

7. NAT Instance

프라이빗 라우팅 테이블에는 NAT Gateway 혹은 NAT Instance를 연결해야 합니다.
NAT Gateway 혹은 Instance의 역할은 다음과 같습니다.
private ip를 public ip로 변환하여 private ip는 숨기고 외부와 통신을 가능케한다.

8. EC2 인스턴스 생성

퍼블릭 서브넷에 위치할 Bastion 서버와 프라이빗 서브넷에 위치할 Service 서버를 EC2 인스턴스로 생성해줍니다.
Bastion 서버는 NAT 인스턴스로 만들 예정이니 소스/대상 확인 중지를 꼭 해야 합니다.
탄력적 IP 주소 까지 할당 받았으면, 다시 프라이빗 라우팅 테이블을 설정할 차례입니다.
이렇게 한다면 프라이빗 서브넷에 있는 EC2 인스턴스가 NAT 인스턴스를 통해 나와 외부를 바라볼 수 있습니다.
이제는 프라이빗 인스턴스를 프라이빗 서브넷에 생성해주면 됩니다.

9. ALB

이제 로드 밸런서를 생성해 줄 차례입니다.
로드 밸런서는 둘 이상의 가용 영역에서 EC2 인스턴스, 컨테이너, IP 주소 등 여러 대상에 걸쳐 수신되는 트래픽을 자동으로 분산하는 서비스입니다.
우선 타겟 그룹을 먼저 만들어줘야 합니다.
타겟 그룹의 인스턴스는 프라이빗 서브넷 내에 있는 server 인스턴스로 지정합니다.
다음과 같은 리스너 규칙을 추가해야 합니다. 대상 그룹에 연결된 인스턴스로 트래픽이 분산됩니다.
로드 밸런서의 아웃 바운드 트래픽을 확인해야 합니다. 인바운드 트래픽만 설정했다면 트래픽이 외부로 빠져나가지 않을 수 있습니다.

10. Tunneling

관련 명령어들의 모음집입니다.
scp -i bastion.pem service.pem ec2-user@43.201.59.56:/home/ec2-user
Plain Text
복사
ssh -i bastion.pem -N -L 18888:19.19.140.8:22 ec2-user@43.201.59.56
ssh -i service.pem -p 18888 ec2-user@localhost
service 인스턴스 내부에서는 8181 포트로 돌고 있는 상태
ssh -i bastion.pem -N -L 8080:19.19.140.8:8181 ec2-user@43.201.59.56

11. 도메인 연결

이미 도메인을 보유하고 있다고 가정하고 진행하겠습니다. AWS에서 도메인은 Route 53 을 통해 진행합니다.
도메인 이름의 경우 구입한 도메인 명을 작성해줍니다.
직접적으로 인스턴스에 접근하는게 아닌 ALB를 통해 프라이빗 서브넷에 있는 인스턴스에 접근하기 때문에 ALB 를 등록해주어야 합니다.
레코드 생성 클릭 후 별칭 사용을 클릭하면 드롭다운 형식으로 ALB의 도메인 주소를 선택할 수 있습니다.
추가적으로 ACM 인증서 발급을 위해 CNAME 유형으로 다음을 생성해줍니다. 해당 정보들은 ACM에서 제공하는 정보입니다.

12. ACM

HTTPS를 설정해봅시다. 인증서 요청을 클릭하면 다음과 같은 화면이 뜹니다.
여기 CNAME 이름을 주목해야 합니다.
가비아에 다음과 같이 등록해줍니다.
ALB 리스너에 HTTPS를 추가해줍니다.

13. EC2 인스턴스에 도커 컨테이너 추가

sudo usermod -aG docker $USER
Plain Text
복사

Reference