SSH 서버

Violet_Evgadn·2023년 5월 1일
0

Linux

목록 보기
28/34

원격 시스템 연결

Telnet 서버

Telnet은 사용자의 컴퓨터에서 네트워크를 통해 원격지 서버에 접속하여 자료를 교환할 수 있도록 한 초기 네트워크 프로토콜 중 하나이다.
텔넷은 사용자가 텍스트 모드로 입력하면 네트워크를 통해 텔넷 클라이언트에서 텔넷 서버 측으로 데이터를 전송하는 방식으로 동작한다.

초기 네트워크 프로토콜은 대부분 발전된 프로토콜로 대체되었지만, Telnet은 지금까지도 가끔 사용되고 있는 몇 안 되는 원본 프로토콜 중 하나이다.

Telnet은 "23"이라는 고유 포트 번호를 가진다.
HTTP가 "80", HTTPS가 "443" 포트 번호를 가지는 것과 유사하다고 생각하면 된다.

텔넷이 처음 개발되었을 때는 네트워크로 연결된 컴퓨터 사용자들이 대부분 학술 기관의 컴퓨터 부서나 대규모 민간이나 정부 시설에 있었으므로 보안적인 문제가 대두하지는 않았다.

하지만 인터넷에 접속 가능한 사람이 증가하고 그만큼 해커가 늘어나며 Telnet의 보안적 문제가 커졌다.

텔넷을 사용할 경우 무차별 대입 공격(Brute Force Attack), 스니핑 & 스푸핑, 텔넷 세션 하이재킹, 리버스 텔넷 등을 통해 해킹을 수행할 수 있었다.

따라서 보안적인 문제가 큰 Telnet의 대안 프로토콜이 필요하였고, 이를 위해 이번 Section의 대주제인 SSH가 나오게 되었다.

RDP 서버

RDP는 마이크로소프트사가 개발한 사유 프로토콜로써 다른 컴퓨터에 그래픽 사용자 인터페이스를 제공하는 프로토콜이다.

기본적으로 "3389" 포트 번호를 활용한다.

MS사가 개발한 만큼 Windows 운영체제에서 주로 호스팅 되지만 리눅스, 유닉스 등을 비롯한 여러 현대 OS에서도 존재한다.

VNC 서버

VNC는 컴퓨터에서 RFB 프로토콜을 사용해 다른 컴퓨터를 제어하는 그래픽 데스크톱 공유 시스템이다.

자판과 마우스 이벤트를 감지한 뒤 네트워크를 통해 다른 컴퓨터를 전송시킴으로써 그래픽 화면을 갱신하는 방식을 제공한다.

VNC 서버는 X-Window 환경으로 원격 접속을 수행하는데, 그래픽을 전송하기 때문에 서버 접속 속도가 매우 느리다.

VNC 서버는 Telnet이나 RDP 서버보다는 편리하지만 여전히 보안상 취약점을 가지고 있다.

SSH 서버

SSH 서버는 시큐어 셀(Secures Shell)의 약자로써 공개 키 방식의 암호 방식을 활용해 원격지 시스템에 접근할 수 있게 하는 서버이다.

SSH 서버는 패킷을 암호화하여 전송하는 보안을 중점으로 한 프로토콜이다.
시큐어 셀을 활용하며 흐르는 패킷이 모두 암호화되어 있기 때문에 중간에 정보를 도청당하는 패킷 스니핑이나 세션 하이재킹 등의 보안 공격에 효과적인 서버이다.

SSH 서버는 지금까지 나타난 원격지 접근 방식 중 보안성이 가장 높은 방식으로 평가되고 있으며 현재는 네트워크를 통해 다른 컴퓨터에 접속하기 위해 주로 활용되는 서버라고 할 수 있다.

SSH 서버는 일반적으로 22번 TCP 포트를 할당받고 있다.

한 눈에 보는 원격 접속 시스템

TelnetSSHVNC
속도빠름빠름느림
보안취약강함Telnet보다는 강하지만 취약
그래픽지원XXO
명령텍스트 모드텍스트 모드제한 없음
클라이언트 프로그램대부분 기본Linux : 기본, Window : 별도 설치별도 설치

SSH(Secure Shell Protocol)

SSH 활용 예시

SSH는 네트워크를 통해 통신할 때 보안 측면에서 안전하게 통신을 수행할 수 있게 해준다.

따라서 SSH는 현재 많이 활용되고 있으며 이 중 "데이터 전송"과 "원격 제어"에서 특히 많이 활용되고 있다.

데이터 전송의 대표적인 사용 예시는 Github가 있으며 원격 제어의 대표적인 사용 예시는 AWS 같은 클라우드 서비스가 존재한다.

SSH 인증 과정

SSH는 공개키 인증 방식을 활용하여 패킷을 암호화한 뒤 네트워크를 통해 전송한다.
그렇다면 어떻게 공개키 인증 방식으로 통신을 수행할 수 있는지 알아보자.

출처 : ssh.com

1. 버전 교환

클라이언트가 서버에 원격 접속을 하기 위해서는 서버의 TCP 22 포트에 SSH 접속 요청을 보내야 하는데 이것이 SSH 연결의 첫 단계이다.

서버는 클라이언트에게 서버가 지원하는 프로토콜 버전을 응답으로 보내주고 클라이언트는 서버가 지원하는 프로토콜 버전 중 자신과 일치하는 것이 있다면 SSH 연결 과정을 진행한다.

2. 공개키 전송

서버는 자신의 Public Key를 통신하고자 하는 컴퓨터(클라이언트)에 전송하고 클라이언트는 이를 저장한다.

클라이언트 측에서는 .ssh 경로 안에 있는 known_hosts 파일에 서버의 공개키를 저장하게 된다.

3. 보안 채널(Secure Shell) 확립

클라이언트 측에서는 SSH로 원격 접속하는 서버가 유효한 서버인지 확인할 필요가 있다.
이를 위해 클라이언트는 known_hosts에 저장된 서버 공개키를 활용하여 정상적인 서버인지 확인하는 작업을 수행하는데 그 단계는 아래와 같다.

  1. 클라이언트에서 난수를 생성
  2. 난수를 서버 공개키로 암호화한 뒤 서버에 전송
  3. 서버는 서버의 개인키로 데이터를 복호화한 뒤 난수를 추출
  4. 서버에서 복호화된 난수 값을 클라이언트에 전송
  5. 1번 과정에서 생성했던 난수와 서버에서 받은 난수값을 비교하여 동일하면 올바른 서버임

서버 측에서도 서버에 접근을 하려고 하는 클라이언트가 유효한지 판단해야 한다.

가장 간단한 방법은 패스워드 인증으로 로그인하려는 계정의 아이디 및 패스워드를 통해 서버 접근 권한이 있는지 파악하는 것이다.

많이 활용되고 권장되는 방법은 SSH 키 쌍을 활용하는 것이다.
클라이언트가 인증할 키 쌍의 ID를 서버에 전송하면 서버가 .ssh/authroized_keys 파일을 확인하여 매칭되는 공개키가 있는지 파악한다.
만약 해당 파일에 매칭되는 클라이언트 공개키가 존재한다면 이후 서버 측에서 난수를 생성한 뒤 위에서 설명했던 과정을 서버와 클라이언트만 바꾼 채로 다시 실행한다.

이처럼 서버 측과 클라이언트 측에서 통신 상대가 모두 유효함을 파악했다면 그제야 SSH 통신을 수행할 수 있는 상태가 되는 것이다.

SSH 프로토콜 접속 조건

  • 서버 측의 방화벽에서 22번 TCP 포트가 열려 있어야 함
  • 서버 측에서 SSH 프로그래밍 설치 및 구동되고 있어야 함
    • 최신 리눅스 배포판은 SSH 서버가 기본적으로 탑재되어 있다.
  • SSH 클라이언트가 필요
  • SSH 서버가 동작하고 있어야 함(전원이 켜져 있어야 함)

SSH 연결 수행 과정

1. 리눅스에서 SSH 서비스 확인

systemctl status sshd

SSH 서비스가 서버 측에 존재하고 있지 않다.
따라서 SSH를 먼저 설치해 줘야 한다.

2. SSH 설치

# SSH 설치
sudo apt-get install openssh-server
  
# ssh 설치 확인
which sshd

3. 방화벽에서 22번 포트 열어주기

firewall-cmd --zone=public --add-port=22/tcp --permanent

firewall-cmd는 텍스트 모드로 방화벽을 확인하며 설정할 수 있는 명령문이다.

--add-port=22/tcp를 통해 22번 TCP 포트를 public으로 열어줬으며 --permanent를 통해 설정을 영구적으로 적용하였다.

이젠 설정이 모두 종료되었으니 한 번 접속해 보자.

4. 서버 IP 주소 확인 & SSH 접속

ip addr

위 명령을 리눅스 서버에 입력하여 리눅스의 inet 주소를 파악한다.

그리고 SSH 접속 툴(putty, Termius 등)에 이 IP address를 입력해 주면 된다.

리눅스에 SSH 접속을 하기 위해 필요한 값은 총 4가지이다.

  • Address
  • Port
  • Username
  • Password

Address는 ip addr 명령으로 확인한 IP 주소를, Port는 SSH 서버 접속을 수행할 것이므로 22를, Username과 Password는 리눅스에서 사용하고 있는 계정의 Username과 패스워드를 입력하면 된다.

만약 설정을 바꾸지 않았다면 Username : root, Password : root를 입력할 경우 Root 계정으로 SSH 접속이 가능할 것이다.

리눅스에서 다른 리눅스로 SSH 접속

위에서 설명한 것은 Windows에서 리눅스 서버에 SSH 접속을 수행하는 방법이다.
대부분 이런 상황으로 SSH 접속을 수행하겠으나 가끔 리눅스에서 다른 리눅스 서버로 접속하고 싶을 수도 있을 것이다.

이 경우 아래와 같이 사용하면 된다.

ssh [Username]@[IP Address]
# 이렇게 입력하면 패스워드 입력 창이 뜨는데 Username에 해당하는 패스워드를
# 입력하면 된다.
profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글