AWS 활용하기 (Bastion Host)

김대현·2023년 2월 11일
0

Bastion Host

가장 기본적이고 많이 사용되는 패턴인 Bastion Host 를 구축해보겠습니다.

Bastion Host 란?

먼저 Bastion Host 에 대해서 간단하게 알아 보겠습니다.

Bastion
Bastion [ˈbæstiən]. "요새", "보루"를 뜻하는 영어 단어이다. 성형 요새에서 돌출 지점마다 건설된 포루를 의미하기도 한다. 이때에는 능보(稜堡), 치성(雉城)이라고도 흔히 번역된다.
-나무위키-

먼저 Bastion 은 '요새' 라는 의미를 가진 단어입니다. 뭔가를 방어하기 위해 보호 대상의 앞 단에 위치하기 위한 역할이라고 생각하시면 될거 같습니다. 오버워치를 해보신 분들은 바스티온이라는 캐릭터를 아실겁니다.

이처럼 Bastion Host 란 무언가를 보호하기 위해 존재하는 Host 를 의미합니다.

위의 이미지와 같이 VPC 내의 Public 서브넷을 Bastion Host 로 두고, 그 뒤에 보호 대상인 Private 서브넷을 두는 구조입니다.
앞 단에 위치한 Public 서브넷은 보안그룹을 통해 Private 서브넷에 대한 인바운드와 아웃바운드를 제어합니다.
이를 통해 Private 서브넷을 향한 모든 통신은 Bastion Host 를 통하게 됩니다. 중간에 레이어가 추가되었기 때문에 보안과 관리적인 측면에서 유리해집니다.

이제 Bastion Host 를 간단하게 구축해보겠습니다.

Bastion Host 구축

전체적인 흐름은 다음과 같습니다.
1. VPC 생성
2. 서브넷 생성 (Public / Private)
3. 보안 그룹 생성 (Public <-> Private)
4. NAT GateWay

1. VPC 생성하기

AWS 를 시작하기 전 알아두면 좋은 기초 지식 (VPC)
AWS -> VPC -> VPC 생성

주의할 점은 IPv4 CIDR 에 들어갈 값의 CIDR 블록 크기는 /16 ~ /28 사이여야 합니다.
또한 AWS 는 Private IP 사용을 권장합니다. 만약 Public IP 를 사용하는 경우 동일한 Public IP 를 다른 사이트에서 사용하는 경우 해당 IP 주소를 통해 VPC 로 접근이 불가합니다. VPC 에 지정한 IP 는 VPC 내에서만 동작하기 때문입니다.

AWS 권장 Private IP

  • A Class 10.0.0.0/8
  • B Class 172.16.0.0/12
  • C Class 192.168.0.0/16

2. 서브넷 생성

먼저 bastion host 역할을 해줄 public 서브넷을 생성합니다.
서브넷의 CIDR 블록은 속한 VPC CIDR 블록보다 같거나 작아야합니다.
VPC : 10.0.0.0/24
PUBLIC SUBNET : 10.0.0.0/26
PRIVATE SUBNET : 10.0.0.64/26

같은 방식으로 private 서브넷도 생성하게 되면 vpc 안에 서브넷 두개가 생성됩니다.

3. 라우팅 테이블 생성

VPC를 생성하면서 디폴트로 생성되는 라우팅 테이블이 하나 있습니다. 해당 라우팅 테이블을 bastion_public_rt 로 이름을 변경한 뒤 private 라우팅 테이블을 새로 생성하였습니다.

4. 라우팅 테이블 서브넷 연결

이제 각각의 라우팅 테이블을 private, public 서브넷에 연결합니다.

5. 인터넷게이트웨이

인터넷게이트웨이를 생성한 뒤 VPC 에 연결합니다.

6. NAT게이트웨이

NAT게이트웨이를 생성해줍니다.
연결유형은 퍼블릭으로하며 탄력적 IP를 할당해줍니다.

생성한 NAT게이트웨이를 private 라우팅테이블에 등록합니다.

7. EC2 인스턴스 생성

이제 public 서브넷에 인스턴스를 생성합니다.

아마존 리눅스 프리티어 기본값으로 설정하였습니다.

인증에 사용될 키페어를 생성합니다.

ssh를 사용할 예정이기 때문에 pem 형식으로 선택합니다.

VPC : study-bastion-host
서브넷 : study-bastion-host-public
퍼블릭IP : 활성화
보안그룹생성 : study-bastion-public-sg

보안그룹은 ssh TCP 22포트 기본값으로 사용하고 소스 유형만 내 IP 로 변경합니다.

같은 방식으로 private 서브넷에 인스턴스를 생성합니다.

public 서브넷에 생성한 인스턴스와 다른 부분은 퍼블릭 IP 자동 할당을 비활성화하고 보안그룹을 public sg 로 설정하여 외부에서의 접근을 차단합니다.

8. public 인스턴스 접속

다운받았던 pem 파일을 통해 ssh 로 접속합니다.
먼저 pem 파일의 권한을 400으로 변경합니다. 작성자 이외의 권한이 있는 경우 에러가 발생합니다.
chmod 400 <xxx.pem>

아마존 리눅스의 경우 기본 usename 은 ec2-user입니다.
public IPv4 주소로 접속합니다.
ssh -i <xxx.pem> ec2-user@<public IPv4주소>

접속이 완료되며 아래와 같은 로그가 출력되면서 public ec2 인스턴스에 접속됩니다.

다시 로컬로 돌아와서 다운받았던 private 인스턴스의 pem 파일을 public 인스턴스로 전송합니다.
scp -i <public pem 경로> <private pem 경로> ec2-user@<public IPv4>:~/
ssh -i <xxx.pem> ec2-user@<public IPv4주소>
public instance>> ls -al

pem 파일이 잘 옮겨진거를 확인할 수 있습니다.

9.private 인스턴스 접속

public 인스턴스에 접속한 상태에서
ssh -i <private pem> ec2-user@<private ip>

0개의 댓글