SSH

GreenBean·2021년 10월 5일
0
post-thumbnail

Secure Shell (SSH)

  • 리눅스를 처음 접할 때 터미널과 텔넷 혹은 SSH와 같은 프로토콜 등에 대한 용어와 쓰임새에 대해 혼동하는 경우가 많음

  • '리눅스 환경에서 터미널을 열었으니 SSH 접속이 된 것이다'라고 생각할 수 있으나, 이는 터미널 환경에서 명령어 셸을 통한 인터페이스가 제공된 것일 뿐이며 SSH 프로토콜을 사용한 것은 아님

  • 흔히 NBP나 AWS같은 클라우드 서비스에서 서버를 생성해보면 ‘인증키’나 ‘키 페어’라는 것을 생성하는 과정을 반드시 거치게 됨

  • 생성하면 pem이라는 낯선 형식의 파일을 다운로드받게 되는데, 이 파일은 우리가 생성한 서버에 원격으로 접속할 때 외부의 보안 위협으로부터 보호해주는 SSH라는 보안 방식이 적용서버에서 반드시 필요한 파일

  • 그만큼 SSH서버 보안에 있어서 가장 대표적이고 유용한 수단이기 때문에 많은 클라우드 서비스에서 제공

원격 터미널 접속이 필요한 이유

  • 리눅스 서버를 구축한다면 터미널이나 그래픽 유저 인터페이스 환경을 통해 여러가지 작업을 진행할 수 있음
  • 그러나 대부분의 리눅스 서버는 회사에서 사내 서버로서 한 장소에 묶어두거나, 호스팅 업체 및 클라우드 호스팅 등의 다양한 구성으로 이루어졌기 때문에 관리자와 멀리 떨어져 있는 곳에 서버가 위치한 경우가 많음
  • 서버 작업을 처리해야 할 일이 있을 때 마다 매번 해당 서버가 위치한 곳으로 이동할 수는 없고, 이동해서 관리하자니 관리해야 할 서버가 점차 많아지게 되면 각각의 서버로 이동하여 일일히 모니터를 연결하여 작업 할 수 없는 노릇
  • 이에 따라 원격 접속은 중요하고 필수적인 작업이 되었음
  • 다양한 원격 접속 프로그램을 사용하여 원격지에 있는 서버에 굳이 찾아가지 않고 해당 서버의 주소(IP 등)만 알고 있다면 다른 PC를 통해 바로 접속할 수 있음
    • 윈도우로 말하자면 원격 데스크톱 연결(RDP)를 예로 들 수 있음
  • 리눅스도 마찬가지이지만 일반적으로 RDP 프로토콜을 지원하지 않아 그래픽 데스크톱 환경에서 띄우기 위해 VNC나 XRDP, XDMCP와 같은 프로토콜을 사용해야 하며 연결이 가능해지도록 일련의 설정을 해주어야 함
    • 그러나 특수한 경우가 아니라면 일반적인 터미널 연결을 위해서 굳이 그래픽 데스크톱 환경을 띄워야 할 필요는 없을 것
  • 이러한 원격 접속을 이용하여 터미널 환경을 사용할 수 있도록 고안된 프로토콜이 텔넷, 최근들어 많이 사용되는 SSH

터미널과 터미널 에뮬레이터

  • 우리가 흔히 접하는 프로그램인 Xshell, PuTTY, iTerm이나 SecureCRT는 윈도우에서 원격 리눅스 서버로 터미널 접속 프로토콜을 사용하여 연결할 수 있도록 도와주는 터미널 에뮬레이터 클라이언트
    • 리눅스 내에서 실행되는 터미널 또한 마찬가지로 터미널 에뮬레이터로 불림
  • 터미널 에뮬레이터(Terminal Emulator)는 말 그대로 실존하는 것이 아닌 가상으로 구현된 복제품으로, 기존의 터미널은 포괄적으로 볼 수 있는 컴퓨터와 사용자 간의 소통을 위한 인터페이스에 가까움
  • 텔넷SSH와 같은 프로토콜은 원격지로 연결을 가능하도록 하는 네트워크 접속 도구
    • 리눅스 시스템 자체에 있는 터미널 클라이언트는 대개 원격 접속이 아니기 때문에 SSH 프로토콜을 사용하지 않음

SSH란?

  • 원격지 호스트 컴퓨터에 접속하기 위해 사용되는 인터넷 프로토콜로, 보통 축약해서 SSH라고 부르며 뜻 그대로 보안 셸
    • 기존의 유닉스 시스템 셸에 원격 접속하기 위해 사용하던 텔넷은 암호화가 이루어지지 않아 계정 정보가 탈취될 위험이 높으므로, 여기에 암호화 기능을 추가하여 1995년에 나온 프로토콜
    • 기본 포트는 22번
  • 셸로 원격 접속을 하는 것이므로 기본적으로 CLI 상에서 작업을 하게 됨
    • 그러나 X.org가 설치된 클라이언트에서 X.org가 설치된 서버로 접속할 경우 ssh 명령어 파라미터로 -X를 주면 GUI 프로그램을 클라이언트에서 창으로 띄울 수 있음
    • X.org는 현재 대부분 리눅스에서 사용하는 GUI 시스템이므로, 양쪽 리눅스를 GUI로 설치하면 대부분 사용 가능
  • SFTP 기능을 설정 파일(보통 리눅스에선 /etc/ssh/sshd_config)에서 활성화 하면 일부 FTP 클라이언트(FileZilla 등)에서 파일 공유를 위해 접속할 수 있음
  • 다만 ISP(인터넷 제공자)에 따라 이 22번 포트를 방화벽으로 막아버리는 곳이 존재
    • 아예 사설 IP로 회선을 임대해줘서 모든 인바운드 연결을 막아버리는 곳도 존재
  • 이런 곳에서는 VPN이나 외부에 중계 서버를 둬서 Remote SSH Tunneling 밖엔 방법이 없음
    • 보통 22번 포트를 막았다면 20번[FTP], 21번[FTP], 53번[DNS], 80번[HTTP], 443번[HTTPS], 3389번[RDP] 포트도 막혀 있음
    • 22번 SSH 포트만 살아있다면 SSH Tunneling 사용해서 방화벽으로 막은 사이트를 접근할 수 있음

Tip! 텔넷이란?

  • 원격지의 호스트 컴퓨터에 접속하기 위해 사용되는 인터넷 프로토콜
  • 사용자가 원거리에 위치한 컴퓨터를 사용할 수 있도록 하는 기능을 가지고 있음
  • 사용자는 네트워크 상의 컴퓨터에 로그인하여 원격지 컴퓨터의 기능을 사용할 수 있음
  • 고유 포트 번호는 23번
  • 현재는 보안 문제 때문에 SSH를 사용하는 추세

Tip! 셸(Shell)이란?

  • 명령어와 프로그램을 사용할 때 쓰는 인터페이스
  • 좀 더 자세하게 표현하자면 커널과 사용자 간의 다리 역할을 하는 것으로, 사용자로부터 명령을 받아 그것을 해석하고 실행하는 역할을 함
  • 흔히 검은 바탕에 흰 글자가 나오는 명령어 입력 환경을 떠올리면 됨

SSH의 작동원리

  • SSH의 보안 방식에는 다양한 종류가 있지만 여기서는 가장 대중적으로 쓰이는 방식에 대해서 핵심적인 내용만 언급
  • SSH를 구성하는 가장 핵심적인 키워드는 ‘KEY(키, 열쇠)
  • 사용자(클라이언트)서버(호스트)각각의 키를 보유하고 있으며, 이 키를 이용해 연결 상대를 인증하고 안전하게 데이터를 주고 받게 됨
  • 여기서 키를 생성하는 방식이 두 가지가 있는데, 그것이 SSH를 검색했을 때 가장 쉽게 볼 수 있는 ‘대칭키’와 ‘비대칭키(또는 공개 키)’ 방식

비대칭키 방식

  • 가장 먼저 사용자와 서버가 서로의 정체를 증명해야 하는데 이 시점에서 사용되는 것이 비대칭키 방식
  • 비대칭키 방식에서는 서버 또는 사용자가 Key Pair(키 페어, 키 쌍)를 생성
    • 키 페어는 공개 키와 개인 키의 두 가지로 이루어진 한 쌍을 뜻하며, 보통 공개 키의 경우 .pub, 개인 키의 경우 .pem의 파일 형식을 띄고 있음
      • 사용자가 키 페어를 생성했을 경우, 공개 키를 서버에 전송
      • 공개 키는 말 그대로 ‘공개’된 키이기 때문에 누구나 가질 수 있기 때문에 전송과정에서 유출되어도 크게 문제가 되지 않음
      • 서버는 공개 키를 받아서 이 공개 키로 만들어진 랜덤한 값을 생성하는데, 이 값은 사용자가 올바른 키 페어를 가지고 있는지 시험하는 일종의 시험지와 같음
      • 시험지를 받은 사용자는 가지고 있는 개인 키를 이용해 이 시험지를 푸는데 앞서 말씀드린 것처럼 공개 키와 개인 키는 하나의 커플 관계와도 같기 때문에, 다른 공개 키나 개인 키를 이용해서 풀어낼 수 없음
      • 오직 키 페어 생성 시 함께 생성된 개인 키와 공개 키만 서로 해석이 가능하며 개인 키를 제외한 그 어떤 방법으로도 이 시험지를 풀어낼 수 없음
      • 시험지를 풀어서 나온 값을 사용자는 다시 서버에 전송
      • 서버는 사용자로부터 전송받은 값을 자신이 처음에 낸 값과 비교해서 두 값이 같으면 “이 사용자는 내 공개 키에 대응하는 올바른 개인 키를 보유하고 있으니, 내가 아는 사용자가 맞다!” 라고 판단하고 접속을 허용
    • 위의 과정에 따라 최초 접속 시 사용자와 서버 간의 인증 절차비대칭키 방식을 통해 완료
  • 개인 키는 공개 키와 달리 다른 어디에도 보여주지 않는 소중한 파일이기 때문에 결과적으로 개인 키가 서버와 사용자 간의 사이를 증명하는 수단이 됨

대칭키 방식

  • 서로가 누군지를 알았으니 이제 정보를 주고받을 차례
  • 주고받는 과정에서 정보가 새어나가지 않기 위해 정보를 암호화해서 주고받는데, 여기서 사용되는 과정이 대칭키 방식
  • 대칭키 방식에서는 비대칭키 방식과 달리 한 개의 키만을 사용하는데, 우리는 이것을 대칭 키라고 함
    • 사용자 또는 서버는 하나의 대칭 키를 만들어 서로 공유
    • 공유된 대칭 키를 이용해 정보를 암호화하면, 받은 쪽에서 동일한 대칭 키로 암호를 풀어 정보를 습득하게 됨
    • 정보 교환이 완료되면 교환 당시 썼던 대칭 키는 폐기되고, 나중에 다시 접속할 때마다 새로운 대칭 키를 생성하여 사용
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글