검수요청.png검수요청.png

SSH

해시넷
k8679026 (토론 | 기여)님의 2020년 7월 28일 (화) 17:34 판
이동: 둘러보기, 검색

SSH(에스에스에이치) 또는 시큐어셸(Secure Shell, SSH)은 네트워크의 다른 컴퓨터에 로그인할 수 있으며 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 프로그램이다. 강력한 인증 방법으로 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공한다. 에스에스에이치라고 읽는다.

개요

1995년 핀란드의 타투 일로 넨(Tatu Ylonen)이 시큐어 셸의 첫 버전을 프리웨어로 내놓았고, 그해 7월에는 50개국에 약 2만명 이상이 사용할 정도로 큰 인기를 끌었다. 동년 10월, 'SSH Communications Security'이라는 회사를 창립하였고 시큐어 셸은 곧 상용 라이센스로 묶이게 되었다. 시큐어 셸은 네트워크상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프로토콜을 가리킨다. 이 프로토콜은 보안에 취약점을 가지고 있는 프로토콜, 즉 원격 로그인(rlogin), 원격 명령 실행(rsh), 원격 파일 복사(rcp), 원격 접속 서비스(telnet), 파일 전송용 프로토콜(ftp) 등을 대체하여 사용되며 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 암호화된 연결을 제공한다. 기본적으로는 22번 포트를 사용하며, 암호화 기법을 사용하기 때문에, 통신이 노출된다고 하더라도 이해할 수 없는 암호화된 문자로 보인다.

등장배경

기존의 프로토콜은 암호화가 되어있지 않아 네트워크 스니핑 과 같은 공격에 매우 취약하다. 스니핑은 네트워크상의 패킷을 감청하는 것을 말하는데, 이 패킷들에 아이디나 암호 같은 사용자 계정 정보나, 개인 신상 정보들에 이르기까지 사용자와 서버 간의 모든 통신 내용을 볼 수 있다는 문제가 있다. 특히 이 과정에서 서버의 관리자 계정이 탈취당할 수 있다. 이는 원격지에 파일을 전송한다던가 하는 경우에도 동일하게 적용된다. 원격지에 파일을 전송하기 위해 로그인을 하는 경우부터, 어떤 내용의 파일이 전송되었는지도 그대로 확인할 수 있다. 이러한 문제를 피하고자 "안전하지 않은 네트워크상에서, 암호화된 채널을 생성하여 안전하게 통신할 수 있는" 시큐어셸 프로토콜이 탄생했다. 이것을 이용하면, 설령 스니핑 공격으로 패킷을 감청당하더라도 해커는 그 내용을 전혀 알 수 없게 된다.

역사

  • 버전 1.x : 1995년 핀란드 헬싱키 공과 대학교의 연구원 타투 일로 넨(Tatu Ylonen)는 자신의 대학 망에서 발생한 암호 스니핑 공격을 이유로 'SSH-1'이라는 이름의 최초 버전의 시큐어 셸 프로토콜을 설계하였다. 1995년 7월, 프리웨어로 출시하였고 이 도구는 빠르게 인기를 끌게 되었다.
  • 버전 1.99 : 2006년 1월 버전 2.1이 잘 정착된 이후 RFC-4253은 시큐어 셸 버전 2.0 및 이하를 둘 다 지원하는 서버가 프로토 버전을 1.99로 식별해야 한다고 규정하였다. 이는 실제 버전은 아니며 하위 호환성을 식별하는 방식이다.
  • 오픈 시큐어 셸(Open SSH) : 1999년 오픈소스 라이센스로 풀린 1.2.12 버전을 사용했다. 이 버전을 기반으로 비 요른 그론 발(Bjorn Gronvall)이라는 개발자가 OSSH 를 제작했고, 이 OSSH 를 기반으로 다시 오픈BSD(Open Berkeley Software Distribution) 개발자들이 오픈 시큐어 셸을 개발하였다. 오픈 BSD 는 BSD 라이선스였으며, 거의 무제한으로 열려있었다. 이로 인해, 현존하는 대부분의 배포판에서는 오픈 시큐어 셸 가 제공되게 된다.
  • 버전 2.x : 2006년에 이 프로토콜의 개정판 시큐얼 셸 버전 2(SSH-2)가 표준으로 채택되었다. 이 버전은 버전 1과 호환되지 않는다. 현재, 국제 인터넷 표준화 기구(Internet Engineering Task Force, IETF)에서 시큐어 셸 버전 2의 표준을 관리하고 있으며 "Secsh"는 시큐어 셸 프로토콜 버전 2를 책임지는 IETF 워킹 그룹에 대한 IETF의 공식 명칭이다.[1]

특징

  • 암호화된 패킷을 전송 : 시큐어 셸에서는 기본적으로 패킷을 포함한 전송하는 모든 트래픽을 암호화해서 전송한다. 이는 도청이나 세션 하이재킹, 패킷스니핑 등 보안 공격을 방지하는 데 효과적이라서 보안성이 뛰어나다는 평을 받는다.
  • 클라이언트와 서버라는 관계가 존재 : 시큐어 셸을 사용할 때 두 패키지(시큐어 셸-서버, 시큐어 셸-클라이언트) 사이에 TCP라는 보안 채널을 별도로 생성한다. 이 보안 채널을 통해 서로를 인증한 뒤, 서버가 클라이언트를 인증할 수 있도록 여러 프로그램을 호출한다. 보안 채널이 형성되고 나면 클라이언트에서는 여러 개의 세션을 사용할 수 있다.
  • SFTP(Secure File transfer protocol)를 지원 : 연결된 두 시스템 간의 안전한 파일전송을 위해서 SFTP 기능을 지원한다. 서버에 접속할 계정과 해당 파일의 위치만 알고 있다면 SFTP를 이용해서 서버에 있는 파일을 가져와 사용할 수 있다.
  • 패스워드 없이 로그인이 가능 : 초기에 서버와 클라이언트는 계정명과 IP주소를 입력한 뒤 패스워드(passwd)를 요구한다. 이후에 원격접속을 시도할 때는 별도의 패스워드 없이 바로 로그인할 수도 있다.
  • SCP(secure copy)기능 지원 : 서버와 클라이언트 사이에 로그인하지 않고도 SCP를 이용해 원격으로 파일을 복사할 수 있는 기능이다.[2]


작동원리

서버작동

시큐어 셸을 사용하기 위해서는 먼저 시큐어 셸 서버가 작동되어야 한다.

  • 리눅스 : 대부분의 유닉스(Unix) 계열의 운영체제는 시큐어 셸 서버를 설치하여 작동한다. 설치되어 있지 않을 경우, 우분투 또는 일부 데비안 운영체제라면 "sudo apt install openssh-server" 명령어로 설치할 수 있다.
  • macOS : 시스템 환경설정 > 공유 > 원격 로그인을 활성화하면 바로 SSH 서버가 작동한다.
  • 윈도우10 : 리눅스 하위시스템(WSL)을 설치하여 리눅스와 동일한 방법으로 사용하면 된다. 다만 리눅스 하위시스템에 기본 설치된 시큐어 셸 서버는 제대로 동작하지 않으니 삭제 후 재설치해 주어야 한다.[3]

시큐어 셸은 공개키 암호방식을 사용한다. 공개키 암호방식은 암호를 걸 때와 풀 때 사용하는 키가 다르기 때문에 비대칭 암호방식이라고도 불린다. 다른 컴퓨터와 통신을 하기 위해 접속을 할 때 기본적으로 공개키(Public Key)와 비밀키(Private Key)로 이루어진 한 쌍의 키(Key)를 통해 접속하려는 컴퓨터와 인증 과정을 거치게 된다.

  • 공개키: 단어 뜻 그대로 공개되어도 비교적 안전한 키이며 이 공개키를 통해 메시지를 전송하기 전에 암호화를 하게 되지만 복호화는 불가능하다.
  • 비밀키: 암호화된 메시지를 복호화 할 수 있으며 본인의 컴퓨터 내부에 저장하게 되어있다. 비밀키가 유출될 시 공개키가 등록된 서버에 이 키를 이용하여 아무나 접속할 수 있기 때문에 유출되지 않게 각별히 신경을 써야 한다.

키 생성

  • 'ssh-keygen -t rsa'명령어를 통해 키를 생성하게 된다. RSA 암호화 방식으로 키를 생성한다는 뜻으로 -t rsa을 사용. 이후 키를 저장할 위치를 물어보는데 기본적으로 사용자의 홈 폴더의 '.ssh' 폴더의 키를 이용해서 인증을 시도한다. 특별한 이유가 없다면 엔터를 눌러 넘어간다. 다음으로는 'passphrase'를 물어본다. 이 부분은 키에 대한 암호를 물어보는 것으로 비밀번호 없이 시큐얼 셸 접속을 하려는 경우라면 역시 엔터로 넘어간다. 이후 아래와 비슷한 화면과 함께 키가 생성된다.
    • Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
3e:0a:33:aa:46:dd:de:69:f2:10:7e:68:66:79 user@localhost
The key`s randomart image is
  • 최종적으로 'ls-al' 명령어 실행을 통해 2개의 파일이 생성된 것을 확인할 수 있다. 비공개키 파일인 'id_rsa'와 공개키 파일인 'id_rea.pub'가 생성이 된다.
    • [user@localhost ~]$ ls -al .ssh
total 24
drwx------. 2 user user 4096 May 23 23:39 .
drwx------. 44 user user 4096 May 14 11:14 ..
-rw-------. 1 user user 1675 May 23 23:39 id_rsa
-rw-r--r--. 1 user user 393 May 23 23:39 id_rsa.pub
-rw-r--r--. 1 user user 2400 Apr 18 16:47 known_hosts

키적용

생성한 키로 시큐어 셸 접속을 하기 위해서는 먼저 공개키인 id_rsa.pub 파일을 접속하고자 하는 서버에 올려야 한다. 접속하고자 하는 계정의 홈 폴더의 .ssh 폴더 안에 authorized_keys 파일에 공개키를 추가하면 키를 통해 비밀번호 없이 시큐어 셸 접속을 할 수 있다.

  • scp 명령 등으로 공개키 파일을 접속할 서버에 올린다. 아래와 같이 실행하면 서버의 홈 폴더에 파일이 업로드된다.
[user@localhost ~]$ scp .ssh/id_rsa.pub user@server:./
  • 서버에 시큐어 셸 접속을 하여 인증키 파일 안에 공개키를 추가해준다. 아래와 같이 실행하면 기존에 만들어져 있던 인증키 파일에 내가 올린 공개키가 추가된다.
[user@localhost ~]$ cat id_rsa.pub >> .ssh/authorized_keys
  • 만약 서버에 인증키 파일이 없다면 아래와 같이 에러가 발생한다.
[user@localhost ~]$ cat id_rsa.pub >> .ssh/authorized_keys
.ssh/authorized_keys: No such file or directory
  • 인증키 파일을 만들어주고 공개키 추가 명령어를 다시 실행한다.
[user@localhost ~]$ mkdir .ssh // 만약 .ssh폴더가 없다면 만들어준다.
[user@localhost ~]$ chmod 700 .ssh // 인증키 등이 보관되는 폴더이므로 다른 사람이 보지 못하도록 권한을 설정해야 한다.
[user@localhost ~]$ touch .ssh/authorized_keys // 빈 인증키 파일 생성
[user@localhost ~]$ chmod 600 .ssh/authorized_keys // 다른 사람이 읽지 못하도록 권한 설정
[user@localhost ~]$ cat id_rsa.pub >> .ssh/authorized_keys // 올린 공개키를 인증키 파일에 추가하기


연결과정

공개키를 통신하고자 하는 컴퓨터에 복사하여 저장한다. 요청을 보낸 클라이언트 컴퓨터와 서버 컴퓨터에 저장된 공개키와 쌍을 이루는 비밀키와 비교를 하여 서로 한 쌍의 키인지 아닌지를 검사한다. 이렇게 서로 관계를 맺고 있는 키라는 것이 증명이되면 비로소 두 컴퓨터 사이에 암호화된 채널이 형성이되어 키를 활용해 메시지를 암호화하고 복호화하며 데이터를 주고받을 수 있는 상태가 된다.



각주

참고자료


같이 보기


  검수요청.png검수요청.png 이 SSH 문서는 인터넷에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.