Introduction
AWS로 public web application을 구축하려는 경우 자사 서비스나 DB 접근을 외부에서 접근하지 못하도록 설계하고 싶을 것이다. 이 때, public subnet에 있는 웹서버가 private subnet에 있는 DB나 서비스와 통신할 수 있도록 네트워크 설정 ( VPC 생성부터 Security Group 및 Routing 설정) 을 어떻게 해야하는지 정리해보았다.
위와 같이 구축하기 위해 우리가 설정해야 할 네트워크 설정들이다.
1. VPC 만들기 ( Virtual Private Cloud ) - 우리만의 네트워크를 만들자.
VPC 생성할 때 IPv4 CIDR block에 EC2인스턴스의 수 또는 생성할 subnet 수에 맞게 사용할 개인 네트워크 주소의 범위를 설정합니다. 최소 "/28"(16IP 주소)에서 최대 "/16"(65,536IP 주소)까지 설정할 수 있다.
VPC 생성 후에 변경할 수 있는 항목이 있다.
설정 항목 |
Default |
설명 |
DNS resolution |
YES |
VPC 내부에서 DNS 기능을 사용할지 설정합니다. |
DNS hostnames |
NO |
인스턴스에 DNS 호스트 이름을 추가할지 설정합니다. Route 53을 사용하고 싶은 경우 Yes로 설정합니다. |
그리고 Route Table, Network ACL, Security Group이 자동으로 생성됩니다. ( 이후에 설명하겠습니다. )
2. Subnet 만들기 - VPC에 배정된 수많은 IP 주소를 적절한 단위로 나누자
Subnet이란? 위에서 생성한 네트워크 주소 ( ex : 10.0.0.0/16 ) 에서 작은 네트워크( ex: 10.0.0.0 /24, 10.0.1.0 / 24 (로 분할해서 관리할 때의 관리 단위가 되는 네트워크를 말한다. 즉, 같은 종류의 통신이 발생하는 서버끼리 작은 네트워크 단위로 분할하여 보안을 높이는 네트워크 설계방식이다. 우리는 "인터넷과 통신하는지"라는 관점에서 네트워크를 분할하여 public-subnet과 private-subnet을 만들 것이다.
우리는 Public, Private용 Subnet을 1개씩 만들면 된다. 여기까지 성공하면 아래와 같은 화면을 볼 수 있을 것이다.
3. Internet Gateway 만들기 - 외부 인터넷과 통신을 위한 설정
VPC 생성을 통해 우리만의 네트워크를 구축하였다. 이제 인터넷을 통한 외부와 통신이 필요하다. 이를 위해 아래와 같이 Internet Gateway를 만들어야 한다. 생성 후에 보면 State가 "detached"로 되어 있을텐데, Internet Gateway를 선택하고 Attach to VPC를 클릭해서 VPC에 연결해야 한다.
4. Route Table 만들기
Route Table은 Subnet 단위로 설정할 수 있다. Subnet과 Route Table 연결하기 위해, 아래 그림의 Subnet Associations 탭을 클릭하여 설정하면 된다. 이 설정을 하지 않으면, Default route table과 연결이 되는데, 권장하는 방법은 아니다. 왜냐하면, 나중에 default Route Table을 변경하면 Route Table을 설정하지 않은 Subnet까지 의도치 않게 변경이 되기 때문이다.
아래 그림에 나온 Route Table은 인터넷 통신을 위해 3번 과정에서 만들었던 Internet Gateway를 라우팅 대상으로 지정한 것이다. Destination을 "0.0.0.0/0"으로 설정했기 때문에 모든 주소와 매치된다.
5. Network ACL(Access Control List) 만들기 - 네트워크 보안 설정 (1)
네트워크 보안을 위한 첫번째 방법으로 명시적으로 통신을 거부하기 위해 Network ACL을 만들어보자. Network ACL은 Subnet 단위로 적용할 수 있다. 우리는 Public-subnet과 Private-subnet 용으로 2개의 ACL을 만들면 된다.
아래는 Public용 ACL 설정이다. 모든 IP에 80,443,22 port를 열어준( Inbound ) 것이다. Private용 ACL도 만들어보자. 필요한 규칙중에 하나를 예시로 들면, Public web application이 Private-subnet에 있는 RDS를 조회해야 하는 경우가 있을 것이다. 위와 같은 경우는 Inbound Rules에 Edit을 누른 다음, 10.0.0.0/16 ( 우리 VPC에 있는 IP)에게 port 3306 ( Mysql default port )를 열어주면 될 것이다.
Outbound Rules는 외부로 나가는 통신 규칙이다. 반환 트래픽에 사용햐는 포트 번호는 임의로 사용되기 때문에 1024번 이후의 포트 ( Emphemeral Port) 를 모두 개방해야 한다.
주의할 점은, 규칙 번호가 작은것부터 적용되기 때문에 Deny Rule#보다 밑에 있는 규칙들은 아무리 ALLOW를 해놔도 적용이 되지 않는다. 덕분에 시간을 날린 경험이 있다.
6. Security Group 만들기 - 네트워크 보안 설정 (2)
네트워크 보안을 위한 두번째 방법으로 기본적인 통신 제어를 위한 Security Group을 만들어보자. 우리가 흔히 설정하는 방화벽과 같은 것이다. Security Group은 인스턴스 단위로 적용할 수 있다.
curl을 이용하여 다른 EC2 instance를 호출하였는데 connection timed out 에러를 내뱉는다면 해당 설정을 먼저 확인해보자.
7. NAT Gateway 만들기 - Private Subnet이 외부와 통신하기 위한 설정
보안 안전을 위해 외부와의 통신이 필요없는 RDS나 EC2를 위해 private subnet을 만들었었다. 하지만 다음과 같은 경우 외부와의 연결이 필요하다.
- Private subnet에 있는 EC2 instance에서 apt install 명령을 실행하기 위해 외부 인터넷에 연결이 필요한 경우
- Private Subnet에 있는 EC2 instance가 다른 서비스를 사용해야 하는 경우
1) NAT Gateway를 만들어보자
- Subnet : public 통신이 가능한 subnet에 생성하면 된다. 맨 처음에 나온 그림을 다시보면 이해가 될 것이다.
- EIP : NAT Gateway에 연결할 EIP를 할당한다.
2) NAT Gateway를 Route Table에 연결해보자.
Route Tables > Private용으로 만든 route-table 선택 > Routes > Edit 를 클릭하여 0.0.0.0/0의 target을 위에서 만든 NAT Gateway에 연결하면 된다.
마무리하며
엔터프라이즈 시스템을 가동하는 인프라의 경우 보안 문제는 매우 중요하다. 위의 글에서 공부한 내용을 토대로 우리 인프라의 보안 설정을 해나갈 수 있을 것이다. 다음 포스팅에서 실제 서비스를 실행하기 위해 Load Balancer, EC2 설정에 대해 살펴볼 것이다.
'DevOps > AWS' 카테고리의 다른 글
AWS DynamoDB - (3) AWS SDK for Java 설정하기 (0) | 2018.07.20 |
---|---|
AWS DynamoDB - (2) 인증 및 접근 제어 ( Authentication and Access Control ) (0) | 2018.07.18 |
AWS DynamoDB - (1) Local with Docker + Spring Boot 연동 (0) | 2018.07.18 |
Private Subnet에 RDS 구축 및 연결하기 ( Hiding a DB Instance in a VPC from the Internet ) (0) | 2018.07.05 |
보안 설정하기 ( securing your system - IAM, security groups, VPC ) (0) | 2018.06.22 |