SSH (Secure Shell)

쓰게된 계기

2019년 7월달에 구글 클라우드 서비스를 이용해보았다. 그리고 이번에는 공인 IP 내 특정 포트로 사설 IP 접속에 대한 포트포워딩을 설정하였다. 그리고 해당 IP의 특정 포트로 집에 있는 리눅스 서버로 접속을 해보기도 하였다. 이 과정에서 SSH 라는 원격 로그인 접속을 이용하게 되었고 단순 SSH 를 사용했다기 보다 좀 더 잘 알기 위함의 게시글을 쓰는 목적이 있다.

 

SSH 란

네트워크 상의 다른 컴퓨터에 로그인을 수행,

원격으로 명령을 내리도록 하는 UNIX 기반의 명령 인터페이스 및 응용프로그램 혹은 프로토콜이라고 표현한다. 

 

일반적으로 ftp, telnet, 기타 등등 (rsh, rcp 잘모름) 같은 프로토콜은 메세지들이 암호화되지 않기 때문에 스니핑에 취약하다.

 

스니핑이란, 전송 측에서 수신 측으로 전송한 패킷에 대해서 해커가 네트워크 트래픽을 도청하는 과정을 뜻한다. 도청하는 수준을 데이터를 패킷단위까지 분석하여 계정, 비밀번호, 프로토콜, 시스템 정보등의 유의미한 정보를 추출하는 해킹기법이다.

 

결국 SSH 란 앞선 스니핑 해킹기법에 대항하기 위한 프로토콜이고, 강력한 인증방법 및 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공한다. 기본적으로 22번 포트를 사용하고 있다. 

 

telnet 프로토콜 세션

telnet 과 같은 안전하지 않은 일반 텍스트 프로토콜을 사용하면 네트워크 상에 있는 제 3자가 민감한 정보를 스니핑할 수 있다. 위의 그림은 telnet 연결을 통해 원격 호스트에 로그인한 사용자가 표시되어 있다. 중간에 해커가 해당 패킷을 분석하여 데이터를 추출할 수 있다.

 

SSH 프로토콜 세션

SSH 를 이용하게 된다면 중간에 해커가 패킷을 중간에서 분석한다고 하더라도 암호화되어있는 내용이기 때문에 따로 해독을 할 수 없다.

 

일반적으로 Linux 및 UNIX 배포판은 기본적으로 설치되어 있는 SSH 패키지 버전과 함께 제공되므로 소스를 따로 다운로드하여 컴파일할 필요가 없다. 하지만 해당 플랫폼이 아닌 window 의 경우에는 WinSCP, Putty, FileZila, Cygwin 과 같은 무료 SSH 기반 도구를 사용해야 한다. 이러한 도구들은 windows 에서 Linux 혹은 UNIX 형태의 쉘 인터페이스를 제공하고 있다. 

 

나는 Putty 를 주로 사용한다.

 

 

SSH 동작원리

SSH 에는 개인 키와 공개 키 쌍이 주어진다. 신원의 유효성을 검증할 수 있도록 SSH에는 키 관리 기능과 함께 관련 에이전트가 있다. 공개 키 인증으로 구성된 경우 키를 사용하여 원격 SSH 호스트를 대상으로 신원을 입증한다. 

 

SSH 개인 키아웃바운드 SSH 연결에 필요한 사용자 신원이며, 비밀로 유지되어야 한다. 사용자가 원격 호스트나 서버로 SSH 나 SCP 세션을 시작할 때 이러한 사용자를 SSH 클라이언트라고 한다. 

 

SSH 공개 키는 게이트나 잠금 장치를 통해 인바운드 액세스(원격으로 접속)를 허용할 대상자를 나타낸다. 공개키는 비밀로 유지되어야 한다. 따라서 시스템을 위태롭게 하거나 보증되지 않은 사용자가 시스템에 액세스하는 데 공개 키를 사용해서는 안된다.

 

Linux 또는 UNIX 시스템에서는 개인 키와 공개 키 쌍이 ASCII 텍스트 파일로 저장되지만 Windows 시스템에서는 프로그램 중 일부는 이러한 키 쌍을 텍스트 파일로 저장하고 일부는 Windows 레지스트리에 저장한다.

 

인바운드
☞ 내부로 향하는 것
☞ 서버 내부로 들어오는 것
☞ 서버 또는 네트워크존 내부로 들어오는 것


아웃바운드
☞ 바깥으로 향하는 것
☞ 서버 바깥으로 나가는 것
☞ 서버 또는 네트워크존 외부로 송출

 

SSH 개인 키, 공개 키 쌍의 트랜잭션 다이어그램

 

SSH connection protocol

 

SSH user authentication protocol

클라이언트 단에서 공개키 및 비밀키(=개인키) 발행방식

  • 클라이언트는 공개키/개인키 ssh 키 한 쌍을 생성한다. 한 쌍을 생성하는 방법을 나는 두가지 이용해보았다.
    • 클라이언트에서 rsa 비대칭키를 생성한다. (공개키/개인키)
    • putty 설치 시, 깔리는 Putty Key Generator 를 이용한다.
    • Generate 버튼을 누른다. 이후에 Save Public Key 버튼을 통해 공개키를 저장하고, Save Private Key 를 통해 개인키를 저장한다.
    • ssh-keygen -t rsa
    • putty 내 puttyGen 프로그램을 이용
    • 위의 결과로 공개키 (public key) 는 id_rsa.pub 으로 저장된다.
    • 위의 결과로 비밀키 (private key) 는 id_rsa 으로 저장된다.
  • 위에서 생성된 파일들은 ~/.ssh 디렉토리에 위치시켜야 한다. 또는 생성이 해당 디렉토리로 될 것이다.
  • 링크참고

공개키 서버 설정방식

  • id_rsa.pub  내용이 원격서버 , /home/{user}/.ssh/authorized_keys  내용과 일치하여야 한다.
  • client server id_rsa.pub == remote server authorized_keys
    • id_rsa.pub 은 한 개지만, remote server  authorized_keys  내용에는 여러개의 id_rsa.pub  값이 있을 있다. (remote server  접근하는 다른 client server 있을 수도 있기 때문)
  • client server 가 remote server  최초에 접근시에 finger_print  요한다. 그리고 접속이 완료되고 이후에 client server  ~/.ssh 디렉토리에는 known_hosts 파일이 생긴다.
  • client server 의 id_rsa.pub 없는 상태로 remote server  접근하려면, invalid format 에러가 나온다.

 

참고링크

 

Posted by doubler
,