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

SSH

해시넷
Asadal (토론 | 기여)님의 2020년 8월 22일 (토) 10:57 판
이동: 둘러보기, 검색

SSH(에스에스에이치) 또는 시큐어셸(Secure Shell, SSH)은 사용자의 컴퓨터에서 네트워크를 이용하여 원격지에 떨어져 있는 서버에 안전하게 접속하여 자료를 교환할 수 있는 보안 프로토콜이다. 기존의 텔넷(telnet) 프로토콜의 보안상 약점을 보완하기 위해 사용한다. 포트 번호는 22번이다. SSH는 강력한 인증 방법으로 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공한다. 에스에스에이치라고 읽는다.

개요

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

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

역사

  • 버전 1.x : 1995년 핀란드 헬싱키 공과대학교의 연구원 타투 일로넨은 자신의 대학 망에서 발생한 암호 스니핑 공격을 이유로 '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과 호환되지 않는다. 현재, 국제 인터넷 표준화 기구(IETF)에서 시큐어셸 버전 2의 표준을 관리하고 있으며 "Secsh"는 시큐어셸 프로토콜 버전 2를 책임지는 국제 인터넷 표준화 기구 워킹 그룹에 대한 국제 인터넷 표준화 기구의 공식 명칭이다.[1]

특징

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

작동원리

작동환경

서버에 시큐어셸로 접속하기 위해서는 서버에 시큐어셸 서비스가 실행 중이어야 하며 방화벽에서 22번 포트로의 접근이 허용되어 있어야만 서버에 접속이 가능하게 된다.

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

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

  • 공개키(Public Key) : 단어 뜻 그대로 공개되어도 비교적 안전한 키이며 이 공개키를 통해 메시지를 전송하기 전에 암호화를 하게 되지만 복호화는 불가능하다.
  • 비밀키(Private Key) : 암호화된 메시지를 복호화 할 수 있으며 본인의 컴퓨터 내부에 저장하게 되어있다. 비밀키가 유출될 시 공개키가 등록된 서버에 이 키를 이용하여 아무나 접속할 수 있기 때문에 유출되지 않게 각별히 신경을 써야 한다.
  • 암호화 과정: 공개키를 통신하고자 하는 컴퓨터에 복사하여 저장한다. 요청을 보낸 클라이언트 컴퓨터와 서버 컴퓨터에 저장된 공개키와 쌍을 이루는 비밀키와 비교를 하여 서로 한 쌍의 키인지 아닌지를 검사한다. 이렇게 서로 관계를 맺고 있는 키라는 것이 증명이되면 비로소 두 컴퓨터 사이에 암호화된 채널이 형성이되어 키를 활용해 메시지를 암호화하고 복호화하며 데이터를 주고받을 수 있는 상태가 된다.

키 생성

아래 명령어를 통해 키를 생성한다. '-t rsa'는 RSA 암호화 방식으로 키를 생성한다는 뜻이다.

 [user@localhost ~]$ ssh-keygen -t rsa

위와 같이 명령어를 실행하면 키를 저장할 위치를 물어본다. 키 인증을 사용할 때 기본적으로 사용자의 홈 폴더의 '.ssh' 폴더의 키를 이용해서 인증을 시도한다. 특별한 이유가 없다면 엔터를 눌러 넘어간다.

 [user@localhost ~]$ ssh-keygen -t rsa
 Generating public/private rsa key pair.
 Enter file in which to save the key (/home/user/.ssh/id_rsa):

다음으로 'passphrase'를 물어본다. 이 부분은 키에 대한 암호를 물어보는 것으로 비밀번호 없이 시큐어셸 접속을 하려는 경우라면 엔터로 넘어간다.(한 번 더 물어본다.)

 Enter passphrase (empty for no passphrase):
 Enter same passphrase again:

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'가 생성이 된다.[4]

 [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

인증키 파일을 만들어주고 공개키 추가 명령어를 다시 실행한다.[4]

 [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 : 올린 공개키를 인증키 파일 추가

원격접속

리눅스

CentOS

오픈 시큐어셸 서버 설치 확인을 위해 다음 명령을 실행한다.

 rpm -qa | grep sshd

설치가 되어있지 않다면 설치해준다. 오류가 발생한다면 'yum'을 'dnf'로 바꾸어 입력한다.

 yum install openssh-server

아래 명령을 실행한다.

 systemctl enable sshd : 재부팅 후 자동등록 
 systemctl start sshd  : 서비스 시작 
 systemctl status sshd : 서비스 상태 확인 
 ps -ef | grep sshd    : 프로세스 상태 확인 

'nano /etc/ssh/sshd_config'명령으로 파일을 연 뒤 아래와 같이 수정한다.

 #Port 22 : 
 #ListenAddress 0.0.0.0 : 
 HostKey /etc/ssh/ssh_host_rsa_key 
 #HostKey /etc/ssh/ssh_host_dsa_key 
 HostKey /etc/ssh/ssh_host_ecdsa_key 
 HostKey /etc/ssh/ssh_host_ed25519_key 
 #PermitRootLogin no

'systemctl restart sshd' 명령으로 서비스를 재시작하여 활성화 해준다. 방화벽 설정을 해준다.

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

아래 명령을 시큐어셸 접속을 한다.[5]

 방법: ssh [사용자 계정]@[원격지 ip]
 예시: ssh root@192.168.159.129

우분투

  • 오픈 시큐어셸 서버 설치
  1. 패키지 데이터베이스 업데이트 : 우분투 터미널을 시작 한뒤 'sudo apt-get update' 명령어를 터미널에 입력한다.
  2. 설치된 패키지 업그레이드 : 리퍼지토리를 업데이트한 후 터미널에서 'sudo apt-get upgrade' 명령을 실행하여 설치된 패키지의 업그레이드를 확인한다.
  3. 오픈 시큐어셸 서버 설치 : 데이터베이스 패키지를 업데이트하고 업그레이드한 후 오픈 시큐어셸 서버를 설치하기 위해 'sudo apt-get install openssh-server' 명령을 실행한다.
  • 시큐어셸 서버 구성
ssh_config 파일에서 시큐어셸 서버의 기본 및 필수 구성을 설정해야 한다. 이를 위해 터미널에서 'sudo nano/etc/ssh/ssh_config' 명령을 실행하여 'ssh_config' 파일을 열어 아래와 같이 수정한다.
sudo nano /etc/ssh/ssh_config
 IdentityFile ~/.ssh/id_rsa
 IdentityFile ~/.ssh/id_dsa
 IdentityFile ~/.ssh/id_ecdsa
 IdentityFile ~/.ssh/id_ed25519
 port 22
 MaxAuthTries 4
 protocol 2
 Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
 MACs hmac-mdS,hmac-sha1,umac-64@openssh.com
 EscapeChar -
 Tunnel no
 TunnelDevice any:any
 PermitLocalCommand no
 VisualHostKey no
 proxyCommand ssh -q -w %h:%p gateway-example.com
 RekeyLimit 1G 1h
 sendEnv LANG LC_*
 HashKnowHosts yes
 GSSAPIAuthentication yes
시큐어셸 서비스 상태 확인 : 시큐어셸 서버가 실행 중인지를 확인하려면 터미널에서 다음 명령을 실행한다.
 sudo service ssh status
만약 시큐어셸 서비스가 실행 중이 아닌 경우 터미널에서 다음 명령을 실행하여 수동으로 실행한다. start 뒤에 stop으로 서비스를 중지할 수도 있다.
 sudo service ssh start
  • 클라이언트를 시큐어셸 접속 : 터미널 프로그램을 사용하여 우분투 시큐어셸 서버에 접속한다. 여기서 [원격 서버]는 원격 서버 이름 또는 IP이고 [포트 번호]는 시큐어셸 연결을 위한 원격 포트이다.
 $ssh [원격 서버][포트 번호]
다음 구문으로 원격 서버의 사용자 이름과 함께 명령을 입력할 수도 있다. [사용자 이름]은 원격 서버 사용자의 이름이다.
 ssh[사용자 이름]@[원격 서버][포트 번호]
연결을 계속할 것인지 묻는 메시지가 나타나면 "yes"를 입력 한다. 처음 연결하는 경우 알려진 호스트 목록에 사용자를 추가한다. 다음에 연결하면 메시지가 다시 표시되지 않는다. 이후 암호를 묻는 메시지가 표시되면 원격 사용자의 암호를 입력한다. 원격 서버에 연결되었으면 로컬 서버에 접속할 때와 같은 방법으로 모든 명령을 실행할 수 있다.[6]

윈도우 10

오픈 시큐어셸 클라이언트 설치
  1. 시작 버튼에서 마우스 오른쪽 단추를 눌러 [앱 및 기능]을 클릭
  2. [선택적 기능 관리] -> [기능 추가] 클릭
  3. [OpenSSH Client (Beta)]를 선택하여, [설치]
  4. 선택적 기능 관리 목록에 나타나는지 확인
  5. 시스템을 다시 시작한 후, C:\Windows\System32\OpenSSH 폴더에 가서 ssh.exe 등의 파일이 설치되어 있는지 확인. 설치되어 있다면 설치가 완료된 것이다.
  6. [윈도우 키 + R] 단축키로 실행 창이 나오면 'cmd'를 입력해 명령프롬프트 창을 띄운다.
  7. 'SSH' 를 입력해 엔터를 누르면 시큐어셸을 사용할 수가 있다.
클라이언트 사용하기

아래 명령으로 자신의 컴퓨터가 아닌 시큐어셸 서버로 접속할 IP주소와 아이디를 입력해 접속할 수 있다. 최초에는 보안 키를 설정하기 위해 'yes'로 대답하면 된다.[7]

 방법: ssh 사용자명@서버명(또는 IP 주소)
 예시: ssh hashnet@192.168.182.10

터널링

터널링(tunneling)은 시큐어셸 프로토콜을 통해 내부의 컴퓨터 또는 서버의 공개되지 않은 포트를 외부에서 접속 할 수 있도록 연결해주는 기술이다. 예를 들어 회사의 개인 컴퓨터를 집에서 원격 접속을 하고 싶다고 가정한다. 일반적으로 개인 컴퓨터는 사설 IP를 가지고 있고 외부에서 직접 접속을 할 방법은 없다. 또한 방화벽에 의해 연결되는 포트들은 막혀있다. 이럴 때 시큐어셸 터널링을 이용하여 외부에서도 개인 컴퓨터에 접속할 수 있도록 한다. 시큐어셸 터널링을 이용하기 위해서는 별도의 중계 서버가 필요하며 개인 컴퓨터에서 중계 서버로 시큐어셸 접속을 통해 터널을 생성한다. 그다음 원격접속을 하고자 하는 컴퓨터, 집에서 중계 서버로 또 하나의 시큐어셸 접속을 통해 터널을 생성한다. 두 개의 터널이 이어지면서 집에서 회사의 개인 컴퓨터로 원격 접속을 할 수가 있다. 또한, 터널 생성 시 포트를 지정할 수 있어 원격 접속뿐만 아니라 다른 포트의 서비스도 연결할 수 있다.[4]

사용방법

사용하고자 하는 중계 서버를 hostA.com 라 가정한다.

  • 원격 접속을 하고자 하는 PC에서 중계 서버로 SSH 터널 생성
방법 : ssh -R [중계 포트]:[호스트]:[원격접속포트] user@hostA.com
예시 : ssh -R 20001:localhost:22 user@hostA.com
  • 원격 접속을 할 PC에서 중계 서버로 SSH 터널 생성
방법 : ssh -L [원격접속에 사용할 포트]:[호스트]:[중계 포트] user@hostA.com
예시 : ssh -L 2222:localhost:20001 user@hostA.com
  • 원격 접속을 할 PC에서 원격 접속 PC로 원격 접속
방법 : ssh -p [원격접속에 사용할 포트] user@localhost
예시 : ssh -p 2222 user@localhost

각주

  1. 시큐어 셸 위키백과 - https://ko.wikipedia.org/wiki/%EC%8B%9C%ED%81%90%EC%96%B4_%EC%85%B8#cite_ref-1
  2. Omega2, 〈(리눅스) SSH 설정 및 사용방법 (원격접속)〉, 《티스토리》, 2020-02-17
  3. Secure Shell 나무위키 - https://namu.wiki/w/Secure%20Shell?from=SSH
  4. 4.0 4.1 4.2 http://www.incodom.kr/SSH -
  5. 에스타롯사, 〈리눅스 ssh 명령어 사용법 ( 원격 접속 프로토콜/centos7 )〉, 《티스토리》, 2019-05-12
  6. SSH 접속 우분투 리눅스 및 윈도우 10 - OpenSSh 도라가이드 - https://dora-guide.com/ssh-접속/
  7. archmond, 〈윈도우 10 팁: putty가 더 이상 필요없다! 내장 OpenSSH 클라이언트 설치하기〉, 《개인블로그》, 2017-12-24

참고자료

같이 보기


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