SSH 보안 : SSH Key Forwarding, SSH Tunneling을 통해 클라우드의 private instance에 접근하는 법, SSH 포트 변경

박재하·2023년 11월 20일
0

private 인스턴스 접근 방법

네트워크 구성도

구성도

클라우드로 배포되는 일반적인 웹서버는 위 그림과 같다.

  • AWS, NCP 등의 클라우드 서비스 네트워크에 개인별로 VPC 네트워크를 구성함
  • VPC 네트워크 내에 public용 subnet, private subnet을 구성함
  • 외부와의 연결을 위해 IG(인터넷 게이트웨이)를 생성해서 VPC 라우터에 연결해줌
  • 라우팅 테이블을 통해 public subnet은 VPC 내부 IPlocal로, 그 외 IPIG와 연결되도록 구성
  • 라우팅 테이블을 통해 private subnet은 VPC 내부 IPlocal로 연결되도록 구성

이렇게 되면 private subnet 내에서 생성된 인스턴스(그림에서 DB 인스턴스)는 외부에서의 직접 접근이 불가능하다(그래야만 한다).

그런데도 내 local 환경에서 이 private 인스턴스에 접근하려면 어떻게 해야할까?

가장 기본적인 방법은 위 그림처럼

  1. SSH로 public 인스턴스에 접속
  2. public 인스턴스에서 다시 SSH로 private 인스턴스에 접속

이 두 단계를 거쳐서(-i 옵션으로 키페어를 전달해서) 접근이 가능하다.

문제

하지만 여기서 문제는 클라우드 서비스에서 생성된 인스턴스들은
일반적으로 SSH 접속을 키페어 파일(.pem)을 통해서 한다는 점이다.

scp -i public-keypair.pem ./private-keypair.pem root@[public instance 주소]:/root

위 명령 등으로 private 키페어를 public 인스턴스에 직접 전송해두고

ssh -i private-keypair.pem root@[private instance 주소]

private 인스턴스에 옮긴 키페어로 접근하면 되겠지만, 이는 보안상 매우 위험한 방법이다.
(password bruteforce든 뭐든 public 인스턴스에 대한 접근권한만 얻으면 private도 같이 털리니까,,)

따라서 private 키페어 파일은 반드시 로컬에서만 저장하고 관리해야 안전하다고 한다.

그래서 로컬에 저장된 키페어 파일을 원격(public)에 SSH로 접속한 상태에서 사용할 수 있는 다음의 두 가지 방법을 소개한다!

  • SSH key forwarding (SSH 키 포워딩)
  • SSH tunneling (SSH 터널링)

SSH key forwarding

키 포워딩은 ssh에서 제공하는, 키페어 파일(.pem)을 로컬 메모리에다 저장해두고, 이를 필요시 자동으로 가져다 쓰는 기능을 이용한 방식이다.

원래 -K 옵션이였으나, 맥os 기준 현재는 다음 옵션으로 등록할 수 있다.

ssh-add --apple-use-keychain ./private-keypair.pem # 등록
ssh-add -L # 확인
스크린샷 2023-11-20 오후 10 20 43

잘 등록되었다면 public으로 접속해본다. (난 public도 등록해둠)

ssh root@[public 인스턴스 주소]
스크린샷 2023-11-20 오후 10 21 03

접속 잘 됨. 이어서 private 인스턴스로 ssh (i옵션 없이) 시도! 두구두구

스크린샷 2023-11-20 오후 10 21 37

성공! 키페어를 따로 파라미터로 전달 안해도 잘 처리된다!

스크린샷 2023-11-20 오후 10 22 01

이제 위험한 public 인스턴스 내 private 키페어는 일말의 고민도 없이 삭제해준다.

SSH Tunneling

SSH 터널링은 로컬 PC에서 포트포워딩을 통해 원격(private) 인스턴스에서의 SSH 접속을 로컬에서 다이렉트(내부적으로는 public을 거쳐서)로 할 수 있게 구성해주는 방식이다.

이해하기에 좀 헷갈릴 수 있는데, 결과적으로 내 로컬 PC의 특정 포트에 SSH로 접속하면, 미리 public에 접속해 둔 SSH 세션을 통해 private 인스턴스 SSH 접속을 로컬에서 하는 것 같은 효과를 내는 거라고 생각하면 된다.

그래도 헷갈린다면 다음 과정을 보고 여러차례 곱씹어보자.

# Local Port Forwarding 설정
ssh root@[public 인스턴스 주소] -p [public 인스턴스 포트] -L [localhost에서 사용할 포트]:[private 인스턴스 주소]:[private 인스턴스 포트]

-L 옵션이 핵심이다.

스크린샷 2023-11-20 오후 11 51 36

이렇게 입력하면 비밀번호를 묻는데, 이건 public 인스턴스의 비밀번호를 물어보는 거다. public 인스턴스의 ssh 세션을 열어두고 이걸 localhost 포트(여기선 6789)에다가 포워딩시켜주는 것!

스크린샷 2023-11-21 오전 12 33 21

설명도 어렵네 아무튼 잘 됨ㅋ

놀랍게도 localhost:6789로 접속했는데 private 쉘이 떨어진다!

스크린샷 2023-11-20 오후 11 58 21
ssh root@[public 인스턴스 주소] -p [public 인스턴스 포트] -Nf -L [localhost에서 사용할 포트]:[private 인스턴스 주소]:[private 인스턴스 포트]

백그라운드에 실행시켜놓으려면 -f 옵션을 추가해주시면 되겠다. -N 옵션은 포트포워딩을 유지하는 거랜다.

스크린샷 2023-11-21 오전 12 00 48
ps -ef | grep ssh | grep [localhost에서 사용하는 포트]
kill -9 [PID(결과에서 2번째 컬럼)]

중간에 찝찝해서 끄고싶으면? ps -ef로 찾아서 kill -9 [PID] 해주면 됨

스크린샷 2023-11-21 오전 1 08 29

당연히 위에서처럼 ssh-add 해놓으면 -i옵션 없이 접근할 수 있음

끝!

SSH 포트 변경

bruteforce로 해킹당했다는 동료들의 제보도 있고 해서,,
22번 포트로 스캐닝 돌려서 공격하는 녀석들을 피할 수 있게 SSH 추가 보안을 위해 SSH 포트 변경도 실시해줬다.

sudo vim /etc/ssh/sshd_config
스크린샷 2023-11-20 오후 9 57 13
Port [변경할 포트]
...

주석처리되어있는 #Port 22 구문을 원하는 포트로 변경해준다.

sudo systemctl restart ssh
스크린샷 2023-11-20 오후 9 57 48

ssh 데몬 재시작해줘야 설정 적용됨

스크린샷 2023-11-20 오후 9 58 57

ACG(AWS의 SG)나 방화벽, 라우터 ACL(NACL) 설정이 22번 포트 기준으로 되어있었다면 다시 막고 변경된 포트를 허용처리해준다.

뭐 당연히 잘됨. private 인스턴스도 동일한 방식으로 변경해주면 된다.

진짜끝!

profile
해커 출신 개발자

1개의 댓글

comment-user-thumbnail
2023년 11월 21일

ㅋㅋㅋ오 저 어제 저 명령어 실행해보려다가 망하면 재하님한테 혼날까봐 안했는데 저게 맞군요 여윽시

답글 달기