[42서울] Born2beroot_SSH와 포트포워딩

jabae·2022년 5월 22일
0

42Seoul

목록 보기
10/20

🗂 SSH

SSH(Secure Shell Protocol)은 컴퓨터와 컴퓨터가 인터넷 같은 퍼블릭 네트워크 상에서 통신할 때, 안전하게 통신할 수 있도록 해주는 보안 프로토콜이다.

기존의 유닉스 시스템 shell에 원격 접속하기 위해 Talnet을 사용했었는데, 암호화 과정이 없어 비밀번호나 파일 내용을 탈취당할 위험이 높았다. 여기에 암호화 기능을 추가하여 나온 프로토콜이 바로 SSH이다.

Talnet
텔넷은 인터넷이나 로컬 영역 네트워크 연결에 쓰이는 네트워크 프로토콜이다. 보안 문제 때문에 사용률이 감소해, 원격 제어를 위해 SSH로 대체되기도 했다.

🔸 SSH 작동방식

SSH는 한 쌍의 Key를 통해 접속하조가 하는 컴퓨터와 인증 과정을 거치고, 안전한 통신 채널을 만든다. 일반적으로 생각하는 비밀번호 대신, Key를 제출하는 방식으로 인증한다.

  • public key: 메세지를 전송하기 전 암호화(복호화는 불가능)
  • private key: 암호화된 메세지를 복호화(‼️절대 노출되어선 안됨)

사용자(Client)가 키를 생성하면 공개키(public key)와 개인키(private key)가 만들어진다. 공개키를 통신하고자 하는 컴퓨터(Server)에 복사하여 저장한다.

  1. 클라이언트가 통신하고자 하는 서버에 요청을 보낸다.
  2. 응답을 하는 서버가 저장하고 있던 공개키를 보낸다.
  3. 클라이언트는 해당 공개키가 자신의 개인키와 한 쌍의 키가 맞는 지 검사한다.
    (클라이언트에서 자물쇠와 키를 만들어 키를 서버에 보내고, 통신하고자 할 때 다시 그 키가 자물쇠에 맞는 지 확인하는 것이라고 이해하면 쉽다.)
  4. 한 쌍의 키가 맞는 것이 증명되면 드디어 두 컴퓨터 사이에 암호화된 채널이 생성된다.

암호화 된 채널이 생성되면 이 키를 활용해 데이터를 암호화 복호화하여 주고 받게 된다. 즉, 사용자와 서버는 각각의 키를 보유하고, 이 키를 이용해 상대를 인증한 뒤 안전하게 데이터를 주고 받게 되는 것이다. 이 과정에서 개인키는 절대 노출되지 않는다.

🔸 왜 SSH일까?

보안적 이유 때문이다. 일반적으로 FTP, Telnet 등의 프로토콜은 메시지들이 암호화 되지 않은 방식이므로 해킹에 매우 취약하다. FTP나 Telnet은 정보를 직접 네트워크를 통해 넘기기 때문에 누구나 해당 정보를 열어볼 수 있다. 반면에 SSH는 해커가 public key를 알아냈다 하더라도, private key가 없으면 접근이 불가능하기 때문에 훨씬 안전하다.

FTP
파일 전송 프로토콜(File Transfer Protocol, FTP)은 TCP/IP 프로토콜을 가지고 서버와 클라이언트 사이의 파일 전송을 하기 위한 프로토콜이다. 보안 프로토콜로 계획되지 않았기 때문에 수많은 보안 취약점이 존재한다. 강한 보안을 원한다면 SFTP, SCP 등 다른 방법을 사용해 파일을 전송해야 한다.

🔸 대표적인 사용

원격 저장소인 github에 데이터를 전송하는 경우가 있다. 내가 처음 42서울에 왔을 때, 과제를 제출하기 위해서 공개키를 인트라에 저장했던 기억이 떠올랐다.(/id_rsa.pub 😊) 그리고 AWS와 같은 클라우드 서비스를 이용하는 경우에도 인스턴스 서버에 접속해 해당 머신에 명령을 내리기 위해서 ssh가 사용된다.

  • 데이터 전송
  • 원격 제어

🔸 SSH 설정하기

우선 사용하기에 앞서 openssh가 깔려 있는지 확인하고 설정을 한다. SSH 관련 설정 파일은 ssh_configsshd_config가 있다. 우리는 sshd_config파일을 수정할 것이다. 두 차이는 뭘까?

SSH와 SSHD

SSHD는 SSH Daemon이다. Daemon은 백그라운드 상에서 요청을 기다리는 프로그램을 뜻한다. 즉, SSH 연결을 받아주기 위해 대기하는 프로세스이다.

  • SSH: 나가는 요청 (outbound)
  • SSHD: 들어오는 요청 (inbound)

따라서 두 파일은 완전히 다른 설정 파일이다.

  • ssh_config : 나가는 설정 (outbound)
  • sshd_config : 들어오는 설정 (inbound)

우리는 들어오는 요청에 대한 제한만 하면 되기 때문에 sshd_config 파일을 수정해주면 된다.

$ apt --installed list openssh-server # openssh가 깔려 있는지 확인(기본적으로 깔려있음)

$ apt install openssh-server # openssh 설치(없다면)

$ sudo ufw allow 4242 # 4242 포트 허용

$ sudo vim /etc/ssh/sshd_config # 포트 번호 변경과 외부에서 루트 로그인 허용을 위해 파일 열어 수정

$ sudo systemctl restart ssh # 수정 후, 다시 시작해서 설정 적용

$ systemctl status ssh # openssh 실행 여부, 사용 포트 확인

ufw
다음에 정리

🗂 Port Forwarding

포트포워딩(Port Forwarding)은 특정한 포트로 들어오는 데이터 패킷을 다른 포트로 바꿔서 다시 전송해주는 작업을 하는 것이다. 네트워크와 원격 기기 사이를 직접적으로 연결하는 경우에 유용하다.

클러스터의 네트워크와 내 가상머신의 네트워크를 연결하여, 클러스터 터미널에서 가상머신을 사용할 수 있다. 가상머신 셋팅의 포트포워딩을 해보자.

  • HOST IP: 127.0.0.1(localhost, 자기 자신) 또는 ifconfig | grep inet의 값
  • GuestIP: hostname -I의 값
  • HOST PORT: 5000(임의로 설정해줌)
  • GUEST PORT: 4242(앞서 가상머신에서 허용해 준 포트번호)

그리고 클러스터 컴퓨터에서 다음과 같이 입력한다.

$ ssh jabae@127.0.0.1 -p 5000 # ssh <사용자 이름>@<HOST IP> -p HOST PORT

이제 5000번의 포트가 4242포트로 연결되어 클러스터 맥에서 가상머신을 사용할 수 있게 되었다.

혹시 안된다면, HOST PORT를 확인해보자. 다른 프로세스가 사용 중일 수 있다.

📚 참고

profile
it's me!:)

0개의 댓글