AWS

[AWS] Bastion Host 이해 및 구축

KAispread 2023. 9. 30. 15:41
728x90
반응형

Bastion Host 란?

Bastion이라는 단어의 뜻은 중세시대에 성 외각을 보호하기 위해 돌출된 부분을 의미합니다. Bastion Host도 이와 같습니다. 사용자에게 제공되는 컴퓨팅 리소스를 보호하기위한 Host로, 방화벽 역할을 하게됩니다. 특히, 사설 IP 대역에 위치한 리소스를 외부에서 접속하고자 할 경우, Bastion Host를 경유하여 리소스에 접근하도록 설계되곤 합니다.

설명을 돕기위해 다음의 AWS 인프라를 가진 서비스가 있다고 가정해보겠습니다.

위 구성에 대한 간단한 설명은 다음과 같습니다.

  • 2개의 AZ를 사용하고 있고 ALB 를 통해 클라이언트의 요청이 EC2에 띄워진 각 서버에 라우팅 됩니다.
  • 각 서버는 Public Subnet (공인 IP) 대역에 위치합니다.
  • DB는 RDS를 사용하며 Private Subnet (사설 IP)에 위치합니다.

위와같이 서버 인프라를 구축하게될 경우 여러가지 보안 취약점이 발생하게 됩니다.

각 서버가 모두 공인 IP 대역에 있기 때문에 외부에서 각 리소스에 쉽게 접근할 수 있는 환경이 제공되고, 이로 인해 외부 공격에 쉽게 노출됩니다. 공격자 입장에서는 외부에서 접근할 수 있는 포인트, 즉 공격 포인트가 많기때문에 이에 대한 보안 조치를 취하는 것도 힘들어집니다. 현재는 EC2 4대를 구축해놓은 상태이지만 만약, 서비스가 성장하여 더 많은 컴퓨팅 리소스를 사용한다면 어떨까요? 추가되는 모든 리소스에 대해 일일이 보안 조치를 취해야 할 것입니다.

만약, 리소스를 외부에서 접근할 수 없도록 막아두고

해당 리소스를 하나의 경로를 통해 접속할 수 있도록 설계한다면 어떨까요?

Bastion Host 예시

다음과 같이 컴퓨팅 리소스를 사설 IP 대역으로 위치시키고 Bastion Host를 통해 리소스에 접근 할 수 있도록 설계하여 보안을 강화할 수 있습니다. 즉, 클라이언트로부터의 요청은 ALB 가 수신하여 각 서버에 라우팅되고 개발자는 Bastion Host를 통해 WAS, DB 등에 접속하는 형태입니다.

위와같이 인프라를 구축하면, 각 리소스에 대한 접근은 Bastion Host를 통해 이루어지기 때문에 공격 포인트가 줄어들게됩니다. 리소스가 추가되더라도 Bastion만 보안적으로 안전하다면 문제 없겠죠? 반대로, Bastion Host가 해킹당하게 된다면 모든 리소스에 대한 접근이 가능해지기 때문에 Bastion Host에 대한 강력한 보안 조치는 필수적으로 진행되어야합니다.

 

Bastion Host 구성하기

Bastion을 통해 사설 IP 대역의 리소스에 접근할 수 있는 형태

Bastion Host 구성 실습은 위 그림과 같이 공인 IP 대역에 Bastion Host를 위치시키고, 2개의 AZ로 구분된 사설 IP 대역에 인스턴스를 생성할 예정입니다. 구성은 다음과 같은 순서로 진행하겠습니다.

  1. VPC / Subnet 생성 [Private 2, Public 2]
  2. EC2 생성 (Bastion용 1대, 서버용 2대)
  3. 연결 확인

 

#1 VPC 생성

먼저 사설 IP와 공인 IP 대역을 생성하기 위해 VPC 및 서브넷을 생성합니다.

AWS 콘솔 창 - VPC 검색 - VPC 생성 버튼 클릭 

 

VPC 생성에서는 다음과 같은 화면을 볼 수 있습니다. 기존에는 VPC와 서브넷, 라우팅 테이블, NAT를 따로 생성해서 연결시켜주어야 했지만, 현재는 생성할 리소스에서 VPC 등을 선택하면 VPC와 연관된 리소스들을 한꺼번에 생성할 수 있습니다.

본 포스팅에서는 VPC 등을 선택하여 VPC를 생성하겠습니다. 기존의 방법대로 VPC, Subnet등을 따로 생성하여 관리하고 싶으시다면 다음의 포스팅을 참고해주세요

 

[AWS] VPC 가상 네트워크 구성하기 #1 (Public, IGW, 라우팅 테이블)

Amazon VPC란? Amazon Virtual Private Cloud(Amazon VPC)를 이용하면 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작할 수 있습니다. 이 가상 네트워크는 AWS의 확장 가능한 인프라를 사용한다는 이점과 함

rachel0115.tistory.com

 

VPC 리소스 설정

생성한 리소스를 식별 할 수 있는 이름 태그와 CIDR 블록을 선택하여 IP 주소 대역을 설정합니다.
2개의 가용영역에 대해 퍼블릭/프라이빗 서브넷을 2개씩 생성합니다.

 

원래는 사설 IP 대역과 외부 네트워크와의 통신을 위해 NAT 게이트웨이를 생성하지만, 비용 문제가 발생할 수 있기에 본 실습에서는 생성하지 않겠습니다. 마찬가지로 VPC 엔드포인트도 생성하지 않겠습니다.

VPC 생성 버튼을 통해 앞서 정의한 리소스들을 생성합니다.

 

다음과 같이, VPC 리소스들이 생성됩니다.

 

결과적으로 다음과 같이 Subnet 4개, RT 3개, IGW 1개가 생성하였습니다.

 

 

#2 EC2 생성

다음은 Bastion 역할을 할 공인 IP 대역의 EC2 1대와, 서버 호스팅 역할을 할 사설 IP 대역의 EC2 2대를 생성하겠습니다.

 

Bastion Host  생성

Bastion Host는 다음과 같이 생성하겠습니다. 

  • Public Subnet 에 위치
  • Ubuntu
  • 이름 Test-Bastion
  • t2.micro
  • 키페어 = test-bastion-keypair

EC2는 위와 같은 설정으로 진행합니다. 중요한 부분은 네트워크 설정입니다.

  • 앞서 생성한 VPC를 선택하고 Public Subnet을 선택합니다.
  • 퍼블릭 IP 자동 할당을 활성화합니다. EIP를 따로 연결해도 상관없습니다.
  • 보안 그룹은 ssh 접속이 가능하도록 ssh 22번 포트에 대해 내 IP를 허용합니다.

 

사설 IP 대역에 EC2 생성

서버 호스팅 역할을 할 EC2 인스턴스 2대를 생성합니다.

  • Private Subnet 에 위치
  • Ubuntu
  • 이름 Test-Server-01, Test-Server-02
  • t2.micro
  • 키페어 = test-server-keypair

마찬가지로 위와 같이 EC2 인스턴스 2대를 생성하고 네트워크를 설정합니다. 

네트워크 설정을 보겠습니다.

  • 앞서 생성한 VPC 선택
  • 서브넷은 각각 private-ap-northeast-2a, private-ap-northeast-2b 를 선택합니다.
  • 퍼블릭 IP는 할당하지 않습니다.

 

다음으로 보안그룹 설정입니다.

  • ssh 22번 포트를 열어줄 IP를 할당합니다. 여기서 2가지 옵션이 존재하는데요,
    • 첫 번째는 VPC IP 대역을 할당하는 방법, 두 번째는 Bastion Host가 위치한 public subnet 대역을 할당하는 방법입니다.
    • 전자의 경우 VPC 내부에 있는 모든 리소스에서 접근이 가능하도록 허용하는 것이고, 후자의 경우는 특정 Subnet의 리소스만 접근할 수 있도록 허용합니다.
    • 저는 Bastion Host가 위치한 Subnet만 허용할 것이기 때문에 Public Subnet 1의 IP 대역인 10.0.0.0/20 을 입력하였습니다.
  • 이후 ping으로 연결을 확인할 것이기 때문에 ICMP도 추가해줍니다.

 

다음과 같이 3대의 EC2를 생성하였습니다.

 

 

#3 사설 IP 대역 EC2와 연결 확인

Bastion Host 구성은 끝났습니다. 다음과 같이 Bastion Host에 ssh로 접속하여 Bastion Host 리소스 내부에서 ping으로 사설 IP대역에 접속할 수 있는지 ping을 날려 테스트 해보겠습니다.

 

chmod 명령으로 pem키의 권한을 수정해줍니다.

chmod 400 test-bastion-keypair.pem
chmod 400 test-server-keypair.pem

ssh 명령으로 Bastion에 접속합니다.

ssh -i test-bastion-keypair.pem ubuntu@'Bastion 퍼블릭 IP'

 

사설 IP 대역에 있는 EC2에 할당된 프라이빗 IPv4 주소를 확인합니다. 

다음의 명령으로 EC2와 연결되는지 확인합니다.

ping 'EC2 프라이빗 IP'

다음과 같이 ping이 잘 간다면 성공입니다.

 

만약, EC2 내부 서버에 직접 접속하고싶다면 다음의 포스팅을 참고해주세요

 

[AWS] Bastion Host를 통해 내부서버에 접속하는 방법

[AWS] Bastion Host 이해 및 구축 Bastion Host 란? Bastion이라는 단어의 뜻은 중세시대에 성 외각을 보호하기 위해 돌출된 부분을 의미합니다. Bastion Host도 이와 같습니다. 사용자에게 제공되는 컴퓨팅 리

rachel0115.tistory.com

 

 

참고

지난 7월, SW 마에스트로에서 주최한 AWS office hour에 참석하여 AWS Korea에 재직중인 아키텍트님께 Bastion에 대한 이야기를 들을 수 있었습니다. Bastion Host라는 개념이 요즘에는 잘 사용되지 않는다는 것인데요, 대신 SSM 을 사용하여 리소스들을 관리하는 것이 더 편하고 효율적인 방식이라고 합니다.

SSM은 AWS 에서 제공하는 System Management 기능으로, Bastion을 위한 EC2를 따로 만들지 않아도 되고 어디에서나 바로 접속할 수 있어 더 간편한 방식입니다. 해당 내용은 기회가 된다면 따로 포스팅 하겠습니다만, 이미 잘 설명된 글이 있으니 관심 있으신분들은 참고하시면 될 것 같습니다.

https://musma.github.io/2019/11/29/about-aws-ssm.html 

 

AWS SSM으로 EC2 인스턴스에 접근하기 (SSH 대체)

목차 서론 들어가기: 더 좋은 방법 대상 독자 SSM: AWS Systems Manager 원격 호스트 접속 방법 비교: SSH (기존) vs. SSM (개선) S...

musma.github.io

 

728x90
반응형