AWS VPC에 점프 박스 구축하기 - 점프 박스를 통한 SSH

jsbak·2022년 2월 27일
0

AWS

목록 보기
3/5

VPC

방화벽을 통과하지 않고 지나가는 NIC 가
NIC 가 아닌 Routing 을 통해서 우회해서 접근해야한다. ( 보안성 )

방화벽을 우회하는 경우 다른 서버들도 NIC를 발판 삼아 DB로 접속 할 수 있다.
때문에 다른 네트워크로 접속할 땐 네으퉈크 인터페이스가 아닌 라우팅에 의존해야한다.

따라서 L3에 라우팅 설정하여 우측 프라이빗 서버로 보내는 트래픽을 방화벽에 전달 할수 있다.

(빨간색 공간: 프라이빗, 파란색 공간: 퍼블릭)

  1. NIC: Network Interface Card)

AWS Jump Box 만들기

  • what is a jumpbox

    • 점프 서버, 점프 호스트 또는 점프 박스는 별도의 보안 영역에 있는 장치에 액세스하고 관리하는 데 사용되는 네트워크의 시스템
    • 두 개의 서로 다른 보안 영역에 걸쳐 있고 이들 사이에 제어된 액세스 수단을 제공하는 강화되고 모니터링되는 장치
    • 모든 관리자가 관리 작업을 시작하기 전에 먼저 연결하거나 다른 서버 또는 신뢰할 수 없는 환경에 연결하기 위한 시작점으로 사용하는 보안 컴퓨터
  • AWS의 점프 박스를 통한 SSH

    “ 점프 서버 , 점프 호스트 또는 점프 박스 는 별도의 보안 영역에 있는 장치에 액세스하고 관리하는 데 사용되는 네트워크 의 시스템입니다 . 점프 서버는 두 개의 서로 다른 보안 영역에 걸쳐 있고 이들 사이에 제어된 액세스 수단을 제공하는 강화 되고 모니터링되는 장치입니다." — 위키피디아

jump box - public network 에서 private network 와 소통할 때의 게이트웨이가 필요한데 이것을 EC2 서버에서 처리하려고 할 때 사용 하는듯 하다.

1부
1.VPC
2.Subnet
3.Internet G/W (VPC에 붙이기,
	라우팅 테이블에서 퍼블릭/ 프라이빗 끼리 묶어서 사용하며 퍼블릭 라우팅 테이블에 IGW를 가져다가 붙였다.)
4.RouteTable 생성 => public + IGW => private
2부
5.EC2 => Public subnet, sg 설정
6.EIP (퍼블릭 아이피인 고정 IP 생성 및 EC2에 연결)
7.JUMP BOX 설정

  1. Jumpbox 가 있는 Public subnet 을 외부에서 관리하는 서버라 가정 (SSH 용 server 라고 하면)
  2. Private subnet 은 내부에서 외부와 소통하지 못하고 Jumpbox 와만 소통 가능한 터널을 뜷어 둔다.
  3. 포트포워딩을 통해 내 PC에서 Jumpbox 로 요청을 xxx.xxx.xxx.xxx:3900 으로 요청 보내면 Private subnet 에 존재하는 XXX.XXX.XXX.XXX:5600 번으로 요청을 보내준다.

VPC 설정

1. VPC 생성 클릭

2. VPC 설정

  • VPC 설정 후 생성 버튼 클릭

이름 설정

  • 리소스 명명 규칙을 이렇게 정의 했다고 하면
    • {서비스} - {국가코드 2자리}{AZ 마지막 2자리} - {리소스명} - {단계} - {서버명}
    • VPC는 이렇게 정의 하고 {서비스} - {국가코드 2자리} - vpc - {단계}
      • serviceName-kr-vpc-dev 이런식으로 명명한다.

IPv4 CIDR 설정

  • CIDR
    • Classless Inter-Domain Routing : 클래스 없는 도메인간 라우팅 기법
    • Class 체계보다 더 유연하게 IP주소를 여러 네트워크 영역 나눈다고 합니다.
    • 여튼 NetMask 가 16이기 때문에 앞에 10.10.x.x 고정이고, 10.10.0.0 ~ 10.10.255.255 까지 쓸 수 있습니다.

Subnet 설정

1. 서브넷 생성 클릭

2. 서브넷 설정

  • 이름 설정서브넷을 추가하여 등록한 뒤 서브넷 생성 버튼을 누른다.

이름 설정

  • 리소스 명명에 규칙에 Subnet 명명은 {서비스} - {국가코드 2자리}{AZ 마지막 2자리} - subnet - {단계} - {public/private/db/..}{숫자 인덱스 01,02,…}
    • serviceName-kr1a-subnet-dev-public01, serviceName-kr1a-subnet-dev-private01, serviceName-kr1a-subnet-dev-db01

서브넷 설정

  • 가용 영역 설정 및 IPv4 CIDR 블록 설정
  • CIDR 블록은 VPC에서 10.10.0.0/16 으로 설정 했기에 10.10.x.x 대역 안에서 정하며 서브넷 또한 구분 하기 위해서 10.10.x.x/24 로 서브넷당 255개의 주소를 할당할 수 있다.
  • public과 private 서브넷을 두개씩 만들었다.
    • public01 : 10.10.1.0/24
    • private01 : 10.10.10.0/24
    • public02 : 10.10.2.0/24
    • private02 : 10.10.20.0/24

Internet G/W 설정

1. VPC 에 붙이기
2. 라우팅 테이블에서 퍼블릭/ 프라이빗 끼리 묶어서 사용하며 퍼블릭 라우팅 테이블에 IGW를 가져다가 붙였다.

1. IGW 생성 클릭

2. IGW 설정

이름 설정

  • 리소스 명명에 규칙에 IGW 명명은 {서비스} - {국가코드 2자리} - igw - {단계}{숫자 인덱스 01,02,…} 라하면
    • serviceName-kr-igw-dev01

3. VPC 에 붙이기

  • 생성된 IGW 를 우클릭 해보면 VPC에 연결 이 나오는데 이것을 클릭한다.
  • VPC 를 선택하고 IGW를 연결한다.

Route Table 설정

  • 💢 라우팅 테이블은 순서대로 적용된다. 💢

1. 라우팅 테이블 생성 클릭

2. 라우팅 테이블 설정

  • 이름 명명 후 라우팅테이블에 대해 사용할 VPC 설정을 해준다.
  • private 와 public에 관한 테이블 두개 설정한다.

이름 설정

  • 리소스 명명에 규칙에 RouteTable 명명은 {서비스} - {국가코드 2자리} - rtb - {단계} - {public/private/db/..}{숫자 인덱스 01,02,…}
    • serviceName-kr-rtb-dev-public01

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

3-1. 💘 서브넷 연결 편집 클릭

3-2. 💘 연결할 서브넷 설정 및 저장, public에 관한 라우팅 테이블이기 때문에 public 만 묶음 마찬가지로 private도 priave 서브넷 끼리 묶는다.

  • private 라우팅 테이블을 기본 테이블 설정 해둔다?
  • 안해도 되는듯 그냥 명시적으로 설정 하면 되는 듯하다...

3-3. 💘 public 라우팅테이블과 IGW 연결

#### 💘 private 라우팅테이블과 NAT(NAT 게이트웨이) 연결

💦 IGW / NAT 자료

VPC NAT Gateway
VPC Internet Gateway

NAT (Network Address Translation)

  • private subnet 안에 있는 private instance 가 외부의 인터넷과 통신하기 위한 방법, 외부의 internet 이 private instance 와 소통하는 방법은 Bastion host 를 이용
    • NAT Instance는 단일 Instance (EC2)
    • NAT Gateway는 aws에서 제공하는 서비스 (서비스)
  • NAT Instance는 Public Subnet에 있어야 함.
  • NAT 게이트 웨이 특징
    • NAT 게이트웨이는 소스 IP 변환이 주 목적이다. 퍼블릭 유형프라이빗 유형이 있다.
    • 퍼블릭 유형은 프라이빗 IP 만 소유한 서비스가 인터넷 접속이 필요할 때 사용하고, 프라이빗 유형은 인터넷 접속과 관계없이 소스 주소 변환의 목적으로만 사용한다.
    • NAT 게이트웨이의 패런트는 서브넷이다.
    • NAT 게이트웨이는 라우팅 ENI를 사용하는 서비스다.
      • 라우팅 ENI는 SG를 사용하지 않으며 소스/대상 확인 옵션이 꺼져 있다. 즉, 트래픽을 단순 포워딩한다.
    • NAT 게이트웨이의 ENI는 요청자 관리형이다. 그러므로 ENI 화면에서 옵션 변경이 불가능하다.
    • 퍼블릭 유형의 NAT 게이트 웨이를 생성하려면 인터넷 접속에 필요한 탄력적 IP를 연결해야 한다. 연결할 시점에 리전에 할당된 탄력적 IP가 없으면 NAT 게이트웨이 생성 단계에서 탄력적 IP 할당과 동시에 연결할 수도 있다.
    • NAT 게이트웨이를 라우팅 타깃으로 설정하면 라우팅 대상의 모든 트래픽은 NAT 게이트웨이로 전달된다.
    • 퍼블릭 유형의 NAT 게이트웨이로 진입한 트래픽은 탄력적 IP로써 인터넷에 전송된다.

NAT 게이트 웨이 예시 - 92.75.20.100 (프라이빗 인스턴스)의 접속 순서


92.75.20.0/24(프라이빗 서브넷) 라우팅 테이블은 nat-08f62d78(NAT 게이트웨이)을 타깃으로 설정했다. 122.248.192.71에 접속하는 트래픽은 nat-08f62d78을 전달된다.
92.75.100./24(퍼블릭 서브넷) 라우팅 테이블은 igw-cd0794a6을 타깃으로 설정했다. 122.248.192.71에 접속하는 트래픽은 igw-cd0794a6 으로 전달돼 인터넷으로 나간다.

① ~ ② 과정에서 트래픽 IP가 변환되는 모습

92.75.20.0/24(프라이빗 서브넷) 에서 122.248.192.71 (인터넷 서버)을 향하는 트래픽을 생성하면 먼저 Router 를 통해 nat-08f62d78(NAT 게이트웨이 / 퍼블릭 서브넷에 존재) 로 이동 ➡ 소스 IP가 NAT 게이트웨어의 프라이빗 IP 주소로 변환되어 igw-cd0794a6 으로 전달 ➡ IGW(인터넷 게이트웨이)에서 소스 IP(NAT G/W IP)에서 매핑되는 주소 Ex) 3.5.136.95 로 변환해 트래픽을 전송

💘 IGW에 연결된 게이트웨이 라우팅 테이블 작동 순서

(1) 인바운드 트래픽이 IGW(Internet gate way)로 유입되면 NAT 변환(퍼블릭 ➡ 프라이빗)을 수행한다.
(2-1) 엣지 연결(게이트웨이 라우팅 테이블)이 없으면 (1) 에서 변환한 프라이빗 IP로 트래픽을 전달 한다.
(2-2) 엣지 연결이 있으면 (1) 에서 변환된 프라이빗 IP를 게이트웨이 라우팅 테이블에서 확인한 후 관련 타깃으로 트래픽을 전달한다.

퍼블릭 및 프라이빗 서브넷

"" 서브넷이 인터넷 게이트웨이로 향하는 라우팅이 있는 라우팅 테이블과 연결되는 경우, 이를 퍼블릭 서브넷이라고 합니다. 서브넷이 인터넷 게이트웨이로 향하는 라우팅이 없는 라우팅 테이블과 연결되는 경우 이를 프라이빗 서브넷이라고 합니다. ""

"" 퍼블릭 서브넷의 라우팅 테이블에서 라우팅 테이블에 명시적으로 알려지지 않은 모든 대상에 대한 인터넷 게이트웨이의 라우팅을 지정할 수 있습니다(IPv4의 경우 0.0.0.0/0 또는 IPv6의 경우 ::/0). 또는 라우팅을 더 좁은 범위의 IP 주소(예: AWS 외부에 있는 회사 퍼블릭 엔드포인트의 퍼블릭 IPv4 주소 또는 VPC 외부에 있는 다른 Amazon EC2 인스턴스의 탄력적 IP 주소)로 지정할 수 있습니다. ""

Private 네트워크에 있는 서버가 외부로 나가려면 Public 서브넷의 NAT 게이트웨이 통해서 다시 인터넷 게이트웨이로 나가는데요. 프라이빗 서브넷의 서버가 NAT 게이트웨이 통하지 않고 바로 인터넷 게이트웨이로 나가는 방법은 안될까요?

"" 여기서 Public Subnet 은 Public 용 Routing Table 의 IGW 항목을 참조하게 되고 Private Subnet 은 Private 용 Routing Table 에 IGW 항목이 없기 때문에 인터넷 통신이 되지 않는 것입니다. 그래서 출발지가 Private Subnet 의 EC2 가 인터넷상의 통신을 하고자 한다면 NAT Gateway 를 통해야 하는 것입니다. ""

Bastion host

  • 인터넷에서 Private Instance에 접근하기 위한 수단
  • Public subnet 내에 위치하는 EC2

VPC Endpoint

  • Aws의 여러 서비스들과 VPC를 연결시켜주는 중간 매개체
    • Aws에서 VPC 바깥으로 트래픽이 나가지 않고 aws의 여러 서비스를 사용하게끔 만들어주는 서비스
    • Private subnet 같은 경우는 격리된 공간인데, 그 상황에서도 aws의 다양한 서비스들(S3,dynamodb,
      athena 등)연결할 수 있도록 지원하는 서비스
  • Interface Endpoint : Private ip를 만들어 서비스로 연결해줌(SQS, SNS, Kinesis, Sagemaker 등 지원)
  • Gateway Endpoint : 라우팅 테이블에서 경로의 대상으로 지정하여 사용(S3, Dynamodb 지원

EIP(탄력적 IP)

동적 클라우드 컴퓨팅을 위해 고안된 정적 IPv4 주소
인터넷에서 연결 가능한 퍼블릭 IPv4
문제가 생겨 인스턴스를 중지하고 다시 실행한다면 IP가 변경되기 때문에 정적인 탄력적 IP를 할당받아 사용

💥 주의
탄력적 IP 주소의 효율적인 사용을 위해 탄력적 IP 주소가 실행 중인 인스턴스와 연결되어 있지 않거나 중지된 인스턴스 또는 연결되지 않은 네트워크 인터페이스와 연결된 경우 소액의 시간당 요금이 부과됩니다.

  • EC2 콘솔 - 네트워크 및 보안 - 탄력적 IP - 탄력적 IP 주소 할당

1. EIP 할당 클릭

2. EIP 할당 결과

EC2

🆘 인스턴스를 VPN 게이트 웨이로 활용하려면 전달된 트래픽을 NAT 처럼 단순히 다른 네트워크로 전송해야되기 때문에 소스/대상 확인 옵션을 꺼야한다.

1. EC2 생성

  • EC2 콘솔 - 인스턴스 - 인스턴스 시작

1-1. 이름 설정

  • 리소스 명명에 규칙에 RouteTable 명명은 {서비스} - {국가코드 2자리}{az} - ec2 - {단계} - jump{숫자 인덱스 01,02,…}
    • serviceName-kr2a-ec2-dev-jump

1-2. 사용할 OS 이미지 선택

  • 원하는 OS를 선택

1-3. 인스턴스 및 키페어 선택

  • 인스턴스 유형과 키페어를 선택해준다. 키페어가 없다면 새로 만들어 준다.
    • 키 페어 생성

1-4. 네트워크 설정

  • [SG] 보안 그룹 설정 기본 설정으로 두고 아래 처럼 보안 그룹만 생성해준다.
    • 보안 그룹 생성
    • 명명 규칙에 따른 이름 작성
    • SSH용 인바운드 규칙설정 후 보안그룹 생성 버튼 클릭

1-5. 스토리지 구성

  • 원하는 대로 설정

1-6. 인스턴스 시작

  • 인스턴스 시작 버튼을 눌러서 인스턴스를 생성한다.

2. EIP (탄력적 IP) 연결

점프 박스 설정

1. 사용자 지정 SSH 포트

  • ssh 구성 파일을 열고 포트 행의 주석을 제거하고 포트를 변경하고 파일을 저장
  • ssh 서비스를 다시 시작 - 사용자 지정 포트가 활성화
    • 기본 SSH 포트를 변경하는 경우 방화벽 규칙을 변경해야한다.
$  sudo vi /etc/ssh/sshd_config

#port 22 # 이 줄의 주석을 제거하고 포트 번호를 2022로 변경

$ sudo systemctl restart sshd

AWS EC2 콘솔 - 보안 그룹으로 이동하여 사용자 지정 SSH 포트 2022에 대한 인바운드 규칙을 생성합니다. 소스를 공개 IP로 업데이트합니다. 이 규칙은 지정된 IP 주소 블록에서만 포트 2022에서 들어오는 연결을 허용

2. 보안 그룹 설정

  • 아까 만들어둔 보안 그룹을 인스턴스와 연결해준다.

3. pem 없이 ssh 접속 하는 방법

💢 [AWS EC2] pem key 없이 접속 가능하도록 설정하기 💢

💥 일반적으로 AWS EC2 는, EC2 생성 시 발급 받은 pem key 를 사용해 SSH 접속한다. 이는, brute force 공격에 의해 암호가 탈취되는 것을 막기 위한 보안 조치이다.
따라서 pem key 없이 AWS EC2 에 SSH 접속하는 방식은 보안 측면에서 위험하나 특수한 상황에 따라 pem key 없이, 임시적으로 User 를 생성하여, User-password 방식으로 EC2 에 SSH 접속 가능하도록 설정해야 할 수도 있다. 보통, 협업 시 접근 편의성을 위해 해당 방식을 사용한다.

3-1. EC2 접속

3-2. User 생성 및 Password 설정

sudo adduser "유저명" # 유저 생성
sudo passwd "유저명" # 비밀번호 변경

3-3. sudoers 파일에 생성한 User 추가

  • 설정파일 권한 변경 및 접근
    # 파일 권한 변경
    sudo chmod u+w /etc/sudoers 
    # 파일 접근
    sudo vi /etc/sudoers
  • 맨 하단에 내용 추가
    "유저명" ALL=(ALL:ALL) ALL

3-4. sshd_config 파일 설정 변경

  • 설정 파일 접근
    sudo vim /etc/ssh/sshd_config
  • pem key 없이 접속 설정
    • PasswordAuthencation 설정을 no ➡ yes 로 변경
      PasswordAuthencation yes

3-5. 서비스 재시작

sudo service sshd restart

3-6. 설정한 User-password 로 SSH 접속

ssh -p [변경한 포트] 생성한유저@ec2주소[or 도메인네임]

putty 사용해서 연결하기

AWS EC2 에 putty로 연결하기 PuTTYgen으로 pem파일을 ppk로 변환 필수 + AWS PuTTY 연결하기 + PuTTY 한글 깨짐 해결

이후

  • private EC2 생성

  • NAT 게이트웨이 생성( EIP 할당 및 (public) 서브넷 안에 생성)

  • private EC2 의 라우팅 테이블에 NAT 게이트 웨이 추가 (0.0.0.0/0 모든 요청)

  • VPC EndPoint 생성 하면 private ec2에 라우팅 테이블과 연동

  • SG 설정 및 라우팅 테이블 으로 Bastion Host 와 Resource 연결

    • DB 나 EC2 같은 것 과 연결 확인하기 port 설정 등등 ...
    • resource 중 ec2 같은 경우는 같은 .pem 을 사용하는 것이 아니면 bastion host 에서 ec2 로 ssh 연결 가능하게끔 .pem 관련 설정을 해야한다.

참고

VPC의CIDR블록의 사용이유와 설정방법
[네트워크] CIDR이란?(사이더 란?)

[가이드] 클라우드(Cloud) 리소스 명명 규칙

리소스 명명 규칙

공통

  • {서비스} - {국가코드 2자리}{AZ 마지막 2자리} - {리소스명} - {단계} - {서버명}
    • 예> knx-kr1a-ec2-dev-app, kns-kr1a-rds-dev-db
    • 예> knx-kr-vpc-dev

RDS

  • DB Name
    • {단계} - {서비스}
      • 예> DEV-KNX

S3

  • Bucket Name
    • fs - {서비스} - {단계} - {업무}
      • 예> fs-knx-dev-frontend, fs-knx-dev-nft

VPC

VPC

  • {서비스}-{국가코드 2자리}-vpc-{단계}
    • 예> knx-kr-vpc-dev

Subnet

  • {서비스} - {국가코드 2자리}{AZ 마지막 2자리} - subnet - {단계} - {public/private/db/..}{숫자 인덱스 01,02,…}
    • 예> knx-kr1a-subnet-dev-public01, knx-kr1a-subnet-dev-private01, knx-kr1a-subnet-dev-db01

Routing Table

  • {서비스} - {국가코드 2자리} - rtb - {단계} - {public/private/db/..}{숫자 인덱스 01,02,…}
    • 예> knx-kr-rtb-dev-public01

Internet Gateway

  • {서비스} - {국가코드 2자리} - igw - {단계}{숫자 인덱스 01,02,…}
    • 예> knx-kr-igw-dev01

Elastic IP

  • {서비스} - {국가코드 2자리} - eip - {단계} - {업무}
    • 예> knx-kr-eip-dev-natgw

Endpoint

  • {서비스} - {국가코드 2자리} - vpce - {리소스} - {단계}
    • 예> knx-kr-vpce-s3-dev

NAT Gateway

  • {서비스} - {국가코드 2자리} - natgw - {단계}{숫자 인덱스 01,02,…}
    • 예> knx-kr-natgw-dev01

Security Group

  • {서비스} - {국가코드 2자리}{AZ 마지막 2자리} - sg - {단계} - {업무}
    • 예> knx-kr1a-sg-dev-app

IAM - 역할

profile
끄적끄적 쓰는곳

0개의 댓글