아름이의 개발로그

[공부 기록] VPC

|

VPC를 회사에 적용하게 된 계기

DB에 디도스 같은 brute force 접속 시도가 발견되었습니다.
회사의 AWS 리소스는 모두 default VPC 환경에 구축되어 있었습니다.
보안 수준을 높일 필요가 있다고 생각하여 VPC에 대해서 동료들과 함께 스터디하고 적용해보았습니다.

아래와 같은 구조로 VPC를 설계하게 되었습니다.
IMG_62B351134AED-1

VPC

Virtual Private Cloud의 약자로 private한 IP를 기반으로 private한 network 환경을 만들 수 있는 개념이자 서비스입니다.
외부의 인터넷과는 분리된 별개의 공간입니다.
AWS에서 VPC를 만들고 DNS hostnames의 옵션을 켜줘야 EC2에서 DNS가 생성됩니다.

Internet Gateway

VPC와 바깥 인터넷과 연결해주는 통로입니다. VPC당 하나만 할당할 수 있습니다. VPC를 생성하면 자동으로 만들어주는 것 중 하나입니다.
줄임말로 IGW라고 합니다.

CIDR Block

IP의 범위를 나타내는 개념입니다.
앞의 000.000.000.000 부분은 시작 IP이고 뒤의 /00 부분은 크기를 나타냅니다.
크기는 192.168.0.0/n이라고 했을 때, 192.168.0.0부터 2의 32-n승 만큼을 나타냅니다. 예를 들면 n이 32라면 2의 (32-32)라서 개수가 1개입니다. 192.168.0.0 딱 이 IP만을 나타냅니다.
n이 24라면 2의 (32-24)승인 256 개입니다. 192.168.0.0 - 192.168.0.255 사이의 IP를 나타냅니다.
CIDR Block의 맨 앞과 맨 뒤의 IP는 미리 할당되어 사용할 수 없는 IP입니다.
이 사이트를 활용하면 CIDR Block을 쉽게 계산할 수 있습니다.

private IP는 사용할 수 있는 IP가 정해져있는데, 이를 RFC1918이라고 부르고 세 종류가 있습니다. 크기 순서대로 아래와 같습니다.
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
VPC를 세팅할 때 위의 IP 블록에서 원하는 만큼을 지정하여 사용할 수 있습니다.

Availability Zone

실제 물리적으로 분리되어 있는 공간을 나타냅니다. 자연재해나 사고로부터 한 AZ를 못 쓰게 되어도 다른 곳은 사용할 수 있게 되어 안전을 보장합니다.
때문에 한 region에는 최소 두 개 이상의 AZ가 있습니다.

Subnet

public한 subnet과 private한 subnet을 구분할 수 있습니다. subnet 자체에서 종류가 구분이 되어 있는 것은 아니고 인터넷 연결 여부에 따라서 구분합니다.
때문에 subnet에 적용될 Network ACL을 사용하여 인터넷 연결을 구분하고 이를 통해 public과 private을 구분합니다.

Route Table

VPC 외부에서 들어오는 데이터와 VPC 내부에서 발생하는 통신에 대하여 어느 subnet과 연결 할지에 대한 길을 알려주는 역할을 합니다.
VPC를 생성하면 디폴트로 하나 만들어줍니다. 디폴트는 Main의 값이 Yes가 되어있고 할당되지 않은 서브넷들이 자동으로 이 라우트 테이블에 할당됩니다.
Public route table은 Destination에 모든 아이피 (0.0.0.0/0)를 internet gateway로 향하도록 설정합니다.
private route table의 Destination에 모든 아이피 (0.0.0.0/0)를 nat gateway로 향하도록 설정합니다.

Network ACL

subnet마다 적용할 수 있는 보안 수준입니다. subnet 단위의 방화벽이라고 이해할 수 있습니다. NACL이라고도 부릅니다.
VPC를 생성하면 디폴트로 하나 만들어줍니다. Default 값이 Yes가 되어 있는 것이 그것입니다. 디폴트 NACL은 인바운드와 아웃바운드 룰에 트래픽이 모두 열려있습니다.
무엇을 allow할 지, deny할 지 설정할 수 있습니다.
Rule number는 작은 숫자부터 순서대로 체에 거르듯이 적용됩니다. 100 단위로 간격을 맞추는 것을 추천하고 있으며 필요에 따라 그 사이에 10 혹은 1 단위로 세세한 설정을 하는 것을 권장합니다.

Security Group

리소스마다(EC2, RDS) 적용할 수 있는 보안 수준입니다.
기본은 모두 deny이고 무엇을 allow할 지만 설정할 수 있습니다.

NAT

Network Address Translation의 약자입니다.
private subnet 안에 있는 리소스들은 외부와 직접적으로 통신할 수 없습니다. 그러나 업데이트 등으로 통신이 필요할 때 필요한 것이 NAT Gateway입니다.
AWS에서는 NAT을 구현하는 방식이 두 가지가 있는데, NAT Gateway를 사용하거나 NAT Instance를 만드는 것입니다.
NAT Gateway는 NAT 트래픽 처리에 최적화된 별도의 리소스입니다. NAT Instance와는 달리 적절한 유형을 선택할 필요가 없고 작업량에 따라 대역폭이 확장됩니다.
NAT Instance가 비용면에서는 훨씬 저렴하기 때문에 큰 트래픽이 필요하지 않다면 NAT 인스턴스의 사용을 추천합니다.

Bastion

중요한 리소스들을 모두 private subnet에 배치하고 이 리소스들에 접근할 수 있는 유일한 통로가 bastion입니다. 리소스들을 한 번 더 숨겨서 보안을 높일 수 있게 해주는 전략적 도구입니다.
특별한 리소스는 아니고 EC2 리소스로 만들 수 있습니다.
모든 직접적인 리소스(EC2, RDS)에 대한 접근을 Bastion을 통해서만 접속할 수 있도록 설정하면 됩니다.

SSH Forwarding Agent

Bastion에 pem키를 저장하지 않고도 리소스에 접속할 수 있는 기법입니다. 역시나 Bastion에 pem키를 보관하지 않으므로 보안을 한 층 더 높일 수 있습니다.
IMG_17F414F27147-1

참고 자료
가장 쉽게 VPC 개념 잡기
VPC 유튜브 강좌
SSH Forwarding Agent

Comments