Bastion host와 대안

민정·2025년 1월 28일
post-thumbnail

서론

프라이빗 서브넷의 인스턴스 접근을 위해 일반적으로 Bastion host를 사용한다. 그러나 Bastion host는 오버헤드가 지나치게 크다거나, 보안상 부적절하다는 비판을 받는다. 과연 Bastion host가 부적절하기만 한 것일까? 아래에서 bastion host와 이의 대안을 함께 알아보자!


Bastion host 사용하기

Bastion host란?

Bastion host는 프라이빗 서브넷의 인스턴스에 접근하기 위해 사용하는 인스턴스이다.

프라이빗 서브넷에 위치한 인스턴스는 퍼블릭 IP가 없어 직접 접근이 불가능하다. 따라서 퍼블릭 IP를 가진 인스턴스에 직접 접근하고, 이를 통해 프라이빗 서브넷의 인스턴스에 접근해야 한다. 이 인스턴스가 바로 Bastion host이다. Bastion host에 접근 후 이를 경유해 프라이빗 서브넷의 인스턴스에 접근한다.

Bastion host 구축하기

구축하기 매우 쉽다! 아래의 과정만 진행하면 된다.

Bastion host 인스턴스 생성

키페어 설정, 퍼블릭 서브넷 위치, 퍼블릭 IP 할당 설정이 필요하다. 이 외의 설정(OS, 인스턴스 유형 등)은 자유롭게 설정 가능하다.

NAT Instance를 Bastion host로도 사용 가능하다. NAT Instance에 아래의 설정(보안그룹, 키페어 전송)을 동일하게 진행하면 된다.

Bastion host 보안그룹 설정

아래의 인바운드 규칙을 보안그룹에 추가하자.

  • 유형: SSH / 소스 유형: 내 IP / 소스: -

위 규칙을 적용했는데 Bastion host 접속이 안된다면, 소스를 사용자 지정으로, IP를 0.0.0.0/0으로 설정하자. 모든 ssh 접근을 허용하므로 보안상 권장하는 설정은 아니다.

프라이빗 서브넷 인스턴스 보안그룹 설정

아래의 인바운드 규칙을 보안그룹에 추가하자. 이 규칙은 SSH 포트에 들어온 요청 중 Bastion host로부터 들어온 트래픽만 허용한다는 의미이다.

  • 유형: SSH / 소스 유형: 사용자 지정 / 소스: Bastion host 보안그룹

Bastion host에 프라이빗 서브넷 인스턴스의 키페어 전송

Bastion host에 scp 명령어를 사용해 프라이빗 서브넷 인스턴스의 ssh 키 파일을 전달한다.

scp -i "[인증 keypair 경로]" "[전송할 파일 경로]" [사용자 이름]@[ip 주소]:[파일 저장 경로]

위 명령어는 아래와 같이 사용할 수 있다.
scp -i "C:\Users\a-keypair.pem" "C:\Users\b-keypair.pem" ec2-user@x.x.x.x:/home/ec2-user/
  1. a-keypair.pem로 사용자명이 ec2-userx.x.x.x 프라이빗 IP를 가진 인스턴스를 인증한다.
  2. b-keypair.pem라는 파일을 로컬에서 전송해 /home/ec2-user/ 경로에 저장하겠다는 뜻이다.

키페어를 Bastion host에서 받은 후, 아래의 명령어를 입력해 키페어 파일의 사용 권한을 제한한다.

chmod 400 [키페어 저장 경로]

Bastion host로 인스턴스 접속하기

이제 bastion host를 사용해 인스턴스에 접속해보자. 먼저 EC2 인스턴스에서 연결을 누르고 bastion host에 접속한다. ssh 명령어를 사용해 cmd에서 접속해도 되고, AWS 콘솔에서 접속해도 된다.

접속한 bastion host에서 ssh 명령어를 입력해 프라이빗 인스턴스로 접속하면 된다.

만약 접속되지 않는다면 보안그룹 설정을 다시 확인하자.

장단점

  • 장점
    • 구축이 쉽고 간편하다.
    • 프리티어 범위에서 사용하는 경우 무료이다.
  • 단점
    • 단순히 인스턴스 접근 용도로 인스턴스를 사용하는 것은 지나친 낭비이다.
    • 보안상 부적절하다. SSH 키 관리가 어렵고, 키가 유출될 경우 보안 위험이 있다.
    • 세부적인 접근 제어나 세션 로깅 기능이 없다.

bastion host 용도로만 사용하는 것보다는 다른 용도(NAT 등)와 함께 사용하는 쪽이 좋아보인다.


Bastion host의 대안

System Manager Session Manager

구축하기

  • VPC 설정

    • DNS 호스트 이름, DNS 확인을 모두 활성화한다.
  • EC2

    • SSM Agent를 설치한다.
    • IAM 인스턴스 프로파일에 AmazonEC2RoleforSSM 정책을 추가한다.
  • VPC 엔드포인트 보안그룹 생성

    • 아래의 인바운드 규칙을 갖는 보안그룹을 생성한다.
    • 유형: HTTPS / 소스 유형: 사용자 지정 / 소스: VPC CIDR
  • VPC 엔드포인트 생성

    • 총 3가지 엔드포인트를 생성한다.
      • com.amazonaws.[region].ssm
      • com.amazonaws.[region].ssmmessages
      • com.amazonaws.[region].ec2messages
    • 서브넷은 접속할 인스턴스가 위치한 서브넷으로 선택한다.
    • 위에서 생성한 보안그룹을 적용한다.
    • DNS 이름 활성화 옵션은 활성화한다.
    • 서비스 액세스는 전체 액세스로 설정한다.

접속하기

인스턴스 연결에서 Session Manager 연결이 가능한 것을 확인할 수 있다.


장단점

  • 장점
    • IAM 권한을 통한 접근 제어로 보안상 적절하다.
    • SSH 키를 사용하지 않으므로 키 관리 부담이 없다.
    • 로깅 등의 기능을 제공한다.
    • 22번 포트를 개방하지 않아도 된다.
  • 단점
    • 비싸다. VPC 인터페이스 엔드포인트를 3개 사용해야 해 시간당 서울 리전 기준 $0.013 * 3 = $0.039를 지불해야 한다.
    • 구축하기 번거롭다.



Instance Connect Endpoint

구축하기

  • VPC 엔드포인트 보안그룹 생성

    • 아래의 아웃바운드 규칙을 갖는 보안그룹을 생성한다.
    • 유형: SSH / 소스 유형: 사용자 지정 / 소스: 접속 인스턴스의 보안그룹
  • 접속 인스턴스 보안그룹 설정

    • 아래의 인바운드 규칙을 보안그룹에 추가한다.
    • 유형: SSH / 소스 유형: 사용자 지정 / 소스: VPC 엔드포인트 보안그룹
  • VPC 엔드포인트 생성

    • EC2 인스턴스 연결 엔드포인트 유형으로 선택한다.
    • 클라이언트 IP 보존은 비활성화한다.
    • 위에서 생성한 보안그룹을 적용한다.
    • 서브넷은 프라이빗 서브넷 중 아무 서브넷이나 선택한다. 서브넷 간 통신만 가능하다면 어느 서브넷에 설정해도 괜찮다.

접속하기

인스턴스 연결에서 Session Manager 연결이 가능한 것을 확인할 수 있다. 사용자 이름은 root 말고 사용하는 ami에서 정의한 사용자 이름으로 변경하자.

만약 콘솔 접속에서 오류가 발생한다면, aws-cli를 사용해 접속하자.

aws ec2-instance-connect ssh --instance-id [인스턴스 id] --connection-type eice

만약 위 명령어에서 키페어 관련 오류가 발생한다면, 키페어 파일경로를 지정하는 아래의 명령어를 사용해 접속하자.

aws ec2-instance-connect ssh --instance-id [인스턴스 id] --private-key-file [keypair 파일 경로]

장단점

  • 장점
    • 무료다.
    • SSH 없이 웹 브라우저를 통해 접근이 가능하다.
    • 추가적인 소프트웨어 설치나 SSH 키 관리가 필요 없다.
  • 단점
    • 하나의 VPC에 하나의 Instance Connect Endpoint만 생성 가능하다.



VPC Cloudshell

구축하기

  • VPC Cloudshell 보안그룹 생성하기

    • 보안그룹을 생성한다. 인바운드 규칙은 없어도 되며 모든 트래픽을 허용하는 아웃바운드 규칙을 수정하지 않는다.
  • 접속 인스턴스 보안그룹 설정

    • 아래의 인바운드 규칙을 보안그룹에 추가한다.
    • 유형: SSH / 소스 유형: 사용자 지정 / 소스: VPC Cloudshell 보안그룹
  • VPC Cloudshell 생성하기

    • Cloudshell로 접속한다.
    • create VPC environment를 클릭한 후 생성한다. 보안그룹은 위에서 생성한 보안그룹을 적용한다.
    • 인스턴스에 접속하기 위한 ssh 키를 생성한다. VPC Cloudshell은 파일 업로드가 불가능하기 때문에, ssh키 값을 붙여넣어 파일을 생성해야 한다. vi로 파일을 생성한 후 chmod 400으로 권한을 제한한다.
    • 이후 ssh 명령어를 사용해 접속한다.

장단점

  • 장점
    • 무료다.
  • 단점
    • 하나의 VPC에서 2개의 Cloudshell만 생성 가능하다.
    • SSH 키를 직접 생성하고 관리해야 하므로 보안상 부적절할 수 있다.



결론

모두 사용해본 결과, 다음과 같은 결론을 내릴 수 있었다.

  • bastion host: 인스턴스 접속을 위한 인스턴스 사용은 과하다.
  • session manager: 너무 비싸고 세팅이 복잡하지만 보안이나 로깅, 감사 등에서 좋다.
  • instance connect endpoint: 무료이고 사용하기 편리하다.
  • VPC Cloudshell: 불편하고 제약 사항이 많다.

단순 학습용 아키텍처를 구축하는 경우 instance connect endpoint를 적극 추천한다!
nat instance를 사용하는 경우, nat 겸 bastion host로 사용하는 것을 추천한다. 무조건 부적절하다고 하기보다는 프로젝트의 현재 상황에 맞게 적절한 방법을 선택해 사용하자.

profile
시스템 + 리눅스 + 클라우드

0개의 댓글