DevOps/aws

[AWS] VPC(Virtual Private Cloud)를 활용한 네트워크 구성 및 보안 설정 W. TERRAFORM 예제

Sophie소피 2023. 7. 13. 17:30

AWS VPC는 클라우드 환경에서 가상 네트워크를 구축하고 관리할 수 있는 서비스이다.
이를 통해 사용자는 가상의 프라이빗 클라우드를 생성하고, 리소스를 격리하며
네트워크 구성을 세밀하게 제어할 수 있다.
이번 글에서는 AWS VPC의 구성 요소와 주요 개념과 실제 예시를 통해 자세히 살펴보도록하자.
 
 
 
Internet Gateway in AWS 
인터넷 게이트웨이는 AWS(Virtual Private Cloud) VPC 환경에서
인터넷과의 통신을 가능하게 하는 서비스이다.
VPC 내부의 리소스가 인터넷과 통신하기 위해서는 인터넷 게이트웨이가 필요하다.
이를 통해 VPC 내부의 인스턴스들은 인터넷으로 향하는 트래픽을 주고받을 수 있다.
 

  1. VPC 연결:
    VPC와 인터넷 게이트웨이 간의 연결은 하나의 VPC에 하나의 인터넷 게이트웨이만 연결할 수 있다.
  2. 퍼블릭 IP 주소 할당:
    인터넷 게이트웨이는 퍼블릭 IP 주소를 할당받는다.
    이를 통해 인터넷에서 VPC 내부의 리소스에 접근할 수 있게 된다.
    외부에서 VPC 내부의 리소스로의 접근은 이 퍼블릭 IP 주소를 통해 이루어진다.
  3. 라우팅 테이블 설정:
    인터넷 게이트웨이는 VPC 내의 라우팅 테이블에 추가되어야 한다.
    이를 통해 VPC 내부의 인스턴스들이 인터넷으로의 트래픽을 보낼 수 있게 된다.
    라우팅 테이블에 대한 설정을 통해 어떤 트래픽이 인터넷 게이트웨이를 통해 라우팅되어야 하는지 결정할 수 있다.
  4. 보안 그룹 및 네트워크 액세스 제어 목록 설정:
    인터넷 게이트웨이를 통해 허용되는 트래픽은 보안 그룹 및 네트워크 액세스 제어 목록(NACL)에 의해 제어된다.
    이를 통해 원하는 포트와 프로토콜에 대한 액세스를 제한할 수 있다.

VPC를 구성하기 위해서는 CIDR(Block) 블록을 선택해야 한다.
CIDR 블록은 VPC 내에서 사용할 IP 주소 범위를 지정하는 역할을 한다.
예를 들어, 10.0.0.0/16 CIDR 블록을 선택하면 약 65,536개의 IP 주소를 사용할 수 있다.
 
이렇게 선택한 CIDR 블록을 기반으로 VPC를 생성한다.
AWS 콘솔에서 VPC 서비스로 이동하여 "VPC 생성" 버튼을 클릭하고,
선택한 CIDR 블록을 입력한다.
 
이를 통해 VPC가 생성되고, 해당 VPC 내에서 리소스를 관리할 수 있다.
VPC 내에서는 하나 이상의 서브넷을 생성하여 리소스를 배치할 수 있다.
서브넷은 VPC 내에서 특정 영역을 나눈 것으로, 각 서브넷은 고유한 CIDR 블록을 가지며
가용 영역(Availability Zone)에 배치된다.

예를 들어, VPC의 CIDR 블록이 10.0.0.0/16이고 가용 영역이 두 개라면,
첫 번째 서브넷은 10.0.0.0/24 CIDR 블록을 가지고 첫 번째 가용 영역에 배치되고,
두 번째 서브넷은 10.0.1.0/24 CIDR 블록을 가지고 두 번째 가용 영역에 배치될 수 있다.
 
서브넷을 생성하기 위해서는 AWS 콘솔에서 VPC 서비스로 이동한 후,
해당 VPC를 선택하고 "서브넷 생성" 버튼을 클릭한다.
서브넷 생성 시 서브넷의 CIDR 블록과 가용 영역을 선택하고,
필요에 따라 다른 구성 옵션을 설정할 수 있다.
 
VPC는 가상의 프라이빗 클라우드를 구축하고, 서브넷을 통해 리소스를 격리하며,
CIDR 블록을 통해 IP 주소를 관리하여 보안이 강화된 네트워크 환경을 구성할 수 있다.
 
 

웹 서버와 데이터베이스 서버에 대한 보안 그룹을 구성한다.
웹 서버 보안 그룹에서는 인바운드 액세스로
HTTP(포트 80)와 HTTPS(포트 443)를 허용하고,
아웃바운드 트래픽을 모두 허용한다.
 
데이터베이스 서버 보안 그룹에서는
인바운드 액세스로 데이터베이스에 필요한 포트만을 허용하고,
아웃바운드 트래픽을 모두 허용한다.
 
 

웹 서버 보안 그룹 구성:

AWS 콘솔에서 EC2 서비스로 이동→
"보안 그룹" 메뉴로 이동하여 "보안 그룹 생성" 버튼 클릭 →
"보안 그룹 생성" 페이지에서 보안 그룹 이름: 웹 서버 보안 그룹 이름을 지정 →
보안 그룹에 대한 설명을 추가 →
해당 보안 그룹을 생성할 VPC를 선택 
 

  1. "인바운드 규칙" 섹션에서 다음과 같이 인바운드 규칙을 추가한다:
    • 유형: "HTTP"를 선택하고, 포트 범위에 80을 입력
    • 유형: "HTTPS"를 선택하고, 포트 범위에 443을 입력
    • 출발지: 기본적으로 "0.0.0.0/0"이 선택되어 있어 모든 IP 주소에서의 액세스를 허용
  2. "아웃바운드 규칙"
  3. 섹션에서는 기본적으로 "모든 트래픽을 허용"으로 설정되어 있으므로 추가적인 설정은 필요X
  4. 설정을 확인한 후, "보안 그룹 생성" 버튼을 클릭하여 보안 그룹을 생성

 

데이터베이스 서버 보안 그룹 구성:

EC2 서비스에서 "보안 그룹" 메뉴로 이동하여 "보안 그룹 생성" 버튼을 클릭→
"보안 그룹 생성" 페이지 아래의 스펙과 같이 설정 →

  • 보안 그룹 이름: 데이터베이스 서버 보안 그룹 이름을 지정
  • 설명: 보안 그룹에 대한 설명을 추가
  • VPC: 해당 보안 그룹을 생성할 VPC를 선택
  1. "인바운드 규칙"
    섹션에서는 데이터베이스에 필요한 포트를 허용하는 규칙을 추가한다.
    예) MySQL 데이터베이스를 사용하는 경우, 다음과 같이 설정할 수 있다.
  • 유형: "MySQL/Aurora"를 선택하고, 포트 범위에 3306을 입력한다.

출발지: 웹 서버가 위치한 서브넷의 보안 그룹 ID를 선택한다.
이렇게 함으로써 웹 서버만이 데이터베이스 서버에 액세스할 수 있다.

2. "아웃바운드 규칙"
설정을 확인한 후, "보안 그룹 생성" 버튼을 클릭하여 보안 그룹을 생성한다.
섹션에서는 기본적으로 "모든 트래픽을 허용"으로 설정되어 있으므로 추가적인 설정은 필요X
 
 

웹 서버 인스턴스 배치:

  1. AWS 콘솔에서 EC2 서비스로 이동한다.
  2. "인스턴스 시작" 버튼을 클릭
  3. AMI(Amazon Machine Image) 선택:
    • 웹 서버에 적합한 AMI를 선택 예) Amazon Linux 2 AMI를 선택
  4. 인스턴스 유형 선택:
    • 사용 요구 사항에 맞는 인스턴스 유형을 선택한다
    1. 범용 인스턴스 (General Purpose Instances):
      • 예: t3, m5, m6g
      • 일반적인 컴퓨팅 작업에 적합한 인스턴스 유형이다. CPU와 메모리를 균형 있게 제공하여 다양한 응용 프로그램에 적합하다.
    2. 컴퓨팅 최적화 인스턴스 (Compute Optimized Instances):
      • 예: c5, c6g
      • CPU 성능이 중요한 작업에 적합한 인스턴스 유형이다. 컴퓨팅 성능을 극대화하고 고성능 컴퓨팅 작업을 수행하는 데 최적화되어 있다.
    3. 메모리 최적화 인스턴스 (Memory Optimized Instances):
      • 예: r5, x1e
      • 대용량의 메모리를 요구하는 작업에 적합한 인스턴스 유형이다. 데이터베이스, 대규모 캐시, 실시간 분석 등의 메모리 집약적인 작업에 사용된다.
    4. 스토리지 최적화 인스턴스 (Storage Optimized Instances):
      • 예: i3, d3
      • 대용량의 로컬 스토리지를 필요로 하는 작업에 적합한 인스턴스 유형이다. 대용량 데이터베이스, 분산 파일 시스템, 데이터 웨어하우스 등의 스토리지 집약적인 작업에 사용된다.
    5. 가속화된 컴퓨팅 인스턴스 (Accelerated Computing Instances):
      • 예: p3, g4
      • GPU 또는 FPGA와 같은 가속화 장치를 포함한 작업에 적합한 인스턴스 유형이다. 그래픽 처리, 머신 러닝, 고성능 컴퓨팅 등에 사용된다.
  5. 인스턴스 구성:
    • 웹 서버 인스턴스의 구성을 설정한다. 예), 서브넷, 키페어(MAC은 .pem, 윈도우는 .ppk), 보안 그룹 등을 선택하거나 생성
    • "서브넷"에서는 웹 서버가 배치될 VPC 내의 서브넷을 선택
    • "보안 그룹"에서는 앞서 구성한 웹 서버 보안 그룹을 선택
  6. 스토리지 추가:
    • 인스턴스에 연결할 스토리지를 선택하거나 추가 설정
  7. 인스턴스 세부 정보 구성:
    • 필요에 따라 추가적인 설정을 구성한다.
  8. 태그 추가:
    • 인스턴스에 태그를 추가하여 관리 및 식별을 위해 필요에 따라 설정해도되고 안해도된다,
  9. 보안 그룹 검토:
    • 인스턴스의 보안 그룹 설정을 검토한다. 웹 서버 보안 그룹이 제대로 할당되었는지 확인한다.
  10. 시작하기:
    • 설정을 확인한 후 "시작하기" 버튼을 클릭하여 인스턴스를 시작을 진행한다.

 
 
 

데이터베이스 서버 인스턴스 배치

위의 웹 서버 인스턴스 배치와 유사한 단계를 따라 데이터베이스 서버 인스턴스를 배치한다.

  1. AMI 선택:
    • 데이터베이스에 적합한 AMI를 선택한다. 예를 들어, Amazon RDS 또는 Aurora와 같은 관계형 데이터베이스를 사용하는 경우, 해당 데이터베이스의 AMI를 선택할 수 있다.
  2. 인스턴스 구성:
    • "서브넷"에서는 데이터베이스 서버가 배치될 VPC 내의 서브넷을 선택
    • "보안 그룹"에서는 앞서 구성한 데이터베이스 서버 보안 그룹을 선택
    • 데이터베이스 서버에 대한 추가적인 구성 옵션이 있는 경우 해당 설정을 완료한다.

 
위의 단계를 따라 웹 서버와 데이터베이스 서버 인스턴스를 생성한 후,
각 인스턴스에는 앞서 구성한 보안 그룹이 할당된다. 이렇게 하면
보안 그룹의 규칙에 따라 허용된 포트로의 인바운드 액세스가 가능해지고
웹 서버와 데이터베이스 서버 간의 통신이 보안 그룹에 의해 제어된다.
VPC는 AWS 클라우드에서 가상 네트워크 환경을 구축하는 중요한 도구이다.
VPC를 사용함으로써 리소스의 보안과 격리를 강화하고 네트워크 구성을
세밀하게 제어할 수 있다.
 
이를 통해 보안을 강화하고 확장성 및 가용성을 향상시킬 수 있다.
따라서, AWS 사용자들은 VPC를 적극적으로 활용하여
안전하고 신뢰할 수 있는 클라우드 네트워크 환경을 구축해야 한다.
여기까지 다룬 내용은 외부에서 직접적으로 VPC 내의 인스턴스에 접속할 수 있는 상태이다.
 
보안 상의 문제를 겪지 않으려면 Bastion Host라는 친구를 배치해야한다.
배치하지않으면 인스턴스에 대한 접근 제어를 설정하기가 어렵다.
각 인스턴스에 대해 개별적으로 보안 그룹을 구성하여 접근을 제한할 수 있지만,
복잡성이 증가하고 관리가 어려워진다.
안전한 접근 지점으로 네트워크 보안 강화하는 더 확실한 방법에 대해 포스팅하도록 하겠다.
 
-------------TERRAFORM PRAC-------------
 
테라폼 코드는 다음과 같은 리소스를 생성한다.

  1. VPC (aws_vpc 리소스):
    지정된 CIDR 블록을 사용하여 VPC를 생성
  2. 인터넷 게이트웨이 (aws_internet_gateway 리소스):
    VPC에 대한 인터넷 게이트웨이를 생성하고 연결
  3. 라우팅 테이블 (aws_route_table 리소스):
    VPC에 대한 라우팅 테이블을 생성하고 인터넷 게이트웨이와 연결하여 인터넷 트래픽을 전달
  4. 서브넷 (aws_subnet 리소스):
    VPC 내에서 서브넷을 생성. 서브넷은 특정 가용 영역에 속하고, CIDR 블록을 할당받습니다.
  5. 보안 그룹 (aws_security_group 리소스):
    VPC에 대한 보안 그룹을 생성하고 인바운드 및 아웃바운드 규칙을 설정
  6. EC2 인스턴스 (aws_instance 리소스):
    지정된 AMI와 인스턴스 유형으로 EC2 인스턴스를 생성하고, 서브넷과 보안 그룹에 배치

아래 예시코드처럼 테라폼 코드를 실행하면, AWS에 정의된 리소스가 자동으로 생성되고 구성된다.
테라폼을 사용하면 인프라 구성을 관리하고 반복 가능한 인프라 환경을 구축할 수 있다.

# Provider 설정
provider "aws" {
  access_key = "YOUR_ACCESS_KEY"
  secret_key = "YOUR_SECRET_KEY"
  region     = "us-west-2"
}

# VPC 생성
resource "aws_vpc" "my_vpc" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "MyVPC"
  }
}

# 인터넷 게이트웨이 생성
resource "aws_internet_gateway" "my_igw" {
  vpc_id = aws_vpc.my_vpc.id
  tags = {
    Name = "MyIGW"
  }
}

# VPC에 대한 라우팅 테이블 생성 및 라우팅 설정
resource "aws_route_table" "my_route_table" {
  vpc_id = aws_vpc.my_vpc.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.my_igw.id
  }
}

# 서브넷 생성
resource "aws_subnet" "my_subnet" {
  vpc_id     = aws_vpc.my_vpc.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "us-west-2a"
  tags = {
    Name = "MySubnet"
  }
}

# 보안 그룹 생성
resource "aws_security_group" "my_security_group" {
  vpc_id = aws_vpc.my_vpc.id
  name   = "MySecurityGroup"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

# EC2 인스턴스 생성
resource "aws_instance" "my_instance" {
  ami           = "ami-0c94855ba95c71c99"
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.my_subnet.id
  vpc_security_group_ids = [aws_security_group.my_security_group.id]
  tags = {
    Name = "MyInstance"
  }
}

 
YOUR_ACCESS_KEY**와 **YOUR_SECRET_KEY를 본인의 AWS 액세스 키로 대체한다.
또한, region, cidr_block, availability_zone, instance_type 등을 프로젝트에 맞게 수정하면 된다.
 
 
 
 
 
 
강의해주신 버거짱 감사드립니다.