SSH 와 SSH Key, SFTP

2022. 1. 7. 08:21·Computer Science

예전에 원격 서버 접속에 익숙하지 않을 때는 매번 서버의 IP 주소를 입력하는 것이 번거롭다보니 Putty 를 이용해 서버 접속 세션을 관리했다. 어느 정도 익숙해진 뒤에는 .bat 나 .sh 의 스크립트에 OpenSSH Client 로 접속하는 실행 코드를 작성한 뒤, 스크립트 실행만으로 서버 접속을 할 수 있도록 구성했다. 그러다보니 프로그램이나 스크립트 실행만으로 서버 접속을 반복해, SSH 를 이용해 접속을 하고 있다는 사실조차 인지하지 못한 채로 서버 접속을 해왔다.

 

현재 코드스쿼드에서 미션을 진행하면서 VM (Virtual Machine) 에서 직접 OpenSSH Server 를 설치하고 SSH 를 통해 접속하는 과정을 직접 다루게 되었다. 이번 기회에 자주 사용하는 SSH 와 SSH Key, SFTP 에 대해 다뤄보고자 한다.

SSH

SSH (Secure Shell) 은 네트워크 프로토콜 중 하나로, 클라이언트와 서버 간 통신 시에 보안적으로 안전하게 통신을 하기 위해 사용하는 프로토콜이다. 사용자의 로컬 환경에서 openSSH 클라이언트 프로그램을 실행하면 SSH 클라이언트를 실행하고, 리눅스 서버에 openssh-server 패키지를 설치하고 sudo system start sshd 로 SSH 서버를 실행하면 SSH 프로토콜을 이용하여 통신할 수 있다.

 

 

 

 

다시 한번 말하면 SSH 는 네트워크 프로토콜이다. OSI 모델에서 분류하는 7계층 중에 Application Layer 에 속하며, 원격 접속 시 사용되는 Telnet 이나 파일 전송시 사용되는 FTP, SFTP 또한 여기에 속한다. 그리고 주로 하위 계층에 속하는 TCP 를 사용한다. SSH 프로토콜의 기본 설정에서 연결을 위해 TCP 포트 22 에서 수신 대기하는 것을 생각하면 이해하기 쉬울 것이다. 또한, SSH 는 TCP 를 사용하여 포트 터널링 및 포워딩을 수행할 수 있다.

 

 

 

 

그리고 SSH 는 보안을 중요시하는 프로토콜이다. 이전에 기존에 사용하던 Telnet 에 비해 SSH 로 접속하는 사용환경은 비슷하지만, 보안적으로 치명적인 결함을 지닌 Telnet 에 비해 SSH 보안을 중요시하다는 점이 다르다. 아래 링크에서 공용 네트워크에서 두 개의 프로토콜을 통해 전송했을 때 패킷의 식별여부가 다른 것을 확인할 수 있다.

 

 

 

SSH란 무엇이고 왜 사용하나요? Telnet과의 차이점은요? - JooTC

SSH란 (Secure Shell) 프로토콜은 이름에서도 알 수 있듯이 보안을 중시한 명령 셸입니다. 기존에는 Telnet을 사용하여 터미널 환경을 사용할 수 있었지만 보안에 치명적인 결함이 있어서 최근에는 대

jootc.com

 

 

SSH 의 구성 요소

SSH 에는 전송 계층 프로토콜 (Transport Layer Protocol, TLP), 사용자 인증 프로토콜, 연결 프로토콜의 3가지 구성 요소가 있다. 3개의 레이어는 다음을 수행한다.

 

  1. 전송 계층 프로토콜
    전송 계층 프로토콜은 서버를 인증하고 기밀성과 무결성을 설정하는 역할을 한다.
  2. 사용자 인증 프로토콜
    사용자 인증 프로토콜은 서버에 대해 사용자를 인증하여 클라이언트에 해당하는 에이전트의 ID 를 확인한다.
  3. 연결 프로토콜
    연결 프로토콜은 SSH 터널을 다중화하여, 단일 클라이언트-서버 연결에서 여러 데이터 스트림 혹은 논리적인 채널을 만든다.

 

위의 3가지 프로토콜 계층의 순차적인 작업을 통해, SSH 프로토콜은 성공적으로 연결을 보호하고, 데이터를 암호화하고, 채널에 따라 데이터를 전송할 수 있다.

 

 

SSH Key

SSH 로 서버에 접속할 때, 서버에서는 운영체제 내 등록된 사용자의 비밀번호를 입력하도록 요구한다. 하지만 SSH 에서는 보안을 중요시하는 만큼 비밀번호 입력 대신 SSH Key 를 이용해 인증을 거칠 수 있다. SSH Key 는 RSA 등의 암호화 방식으로 만들어지며, 다음의 경우에 사용할 수 있다.

 

  • 비밀번호보다 높은 수준의 보안을 필요로 할 때
  • 로그인 없이 자동으로 서버에 접속할 때

 

SSH Key 는 Public Key 와 Private Key, 한 쌍의 Key 를 통해 접속하려는 컴퓨터와 인증 과정을 거치게 된다. Public Key 와 Private Key 에 대한 설명은 다음과 같다.

 

 

  • Public Key : 공개되어도 비교적 안전한 Key 로, Public Key 를 통해 메시지를 전송하기 전 암호화를 한다. Public Key 로는 메시지의 암호화는 가능하지만 복호화는 불가능하다.
  • Private Key : 외부에 노출되지 않아야하는 Key 로, 클라이언트 내부에 저장한다. Private Key 로 메시지의 복호화가 가능하다.

 

Private Key 는 로컬 머신 (클라이언트) 에 위치해야하고, Public Key 는 리모트 머신 (서버) 에 위치해야한다. SSH 접속을 시도하면 SSH 클라이언트가 로컬 머신의 Private Key 를 서버에 넘겨주면서 접속을 허용해달라고 요청하며, SSH 서버는 자신이 가지고 있는 Public Key 중 넘겨받은 개인키와 대응되는 것이 있는지 확인하고 접속을 허용해준다.

 

 

 

 

즉, 로컬 머신에 설치되어 있는 개인키가 비밀번호의 역할을 하게 된다.

 

 

ssh-keygen

위에 따르면 SSH Key 를 사용하기 위해, 먼저 로컬 머신에서 Private Key 와 Public Key 를 생성해야한다. 그리고 리모트 머신이 Public Key 를 가지고 있어야 하므로, 로컬 머신에서 리모트 머신으로 Public Key 를 전송하고 authorized_keys 로 등록해야한다.

 

먼저 윈도우의 WSL 에서 ssh-kegen 으로 SSH Key 를 생성한다.

 

Local (Windows WSL)

 

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/miller/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/miller/.ssh/id_rsa
Your public key has been saved in /home/miller/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:3kmyToATppwNKPXXs1mySNBAr8050b2Z7uRQvoY8rEE miller@DESKTOP-F8FMUV8
The key's randomart image is:
+---[RSA 3072]----+
|  ..+o           |
| o . o.o .       |
|o . + = = o      |
|.. * O + B +     |
|  + = E S *      |
|     o + O .     |
|      .o=.*      |
|       +==..     |
|      ...o+      |
+----[SHA256]-----+

 

SSH Key 생성 시 저장할 위치와 passphrase (일종의 비밀번호로, 입력한 값으로 비공개 키를 암호화) 를 지정할 수 있다. passphrase 를 생략할 경우 자동 로그인이 가능하지만, 보안 상으로 위험할 수 있기 때문에 주의해야 한다. 자세한 내용은 아래 링크를 참고한다.

 

 

 

Passphrase explained - what it is, what is a good passphrase, generating passphrase, how to use with SSH keys.

Passphrase explained - what it is, what is a good passphrase, generating passphrase, how to use with SSH keys.

www.ssh.com

 

 

생성된 키를 확인하면 아래와 같다.

 

Local (Linux)

 

$ ls -al ./.ssh
total 4
drwx------ 1 miller miller 4096 Jan  7 07:08 .
drwxr-xr-x 1 miller miller 4096 Jan  6 19:31 ..
-rw------- 1 miller miller 2610 Jan  7 07:08 id_rsa
-rw-r--r-- 1 miller miller  576 Jan  7 07:08 id_rsa.pub
-rw-r--r-- 1 miller miller  222 Jan  6 19:32 known_hosts

 

생성된 파일 중 id_rsa 는 Private Key, id_rsa.pub 은 Public Key 에 속한다. 여기서 Public Key 를 리모트 머신의 $HOME/.ssh/authorized_keys 파일에 추가해야 한다. 그렇게 해야 SSH 서버에서는 SSH 클라이언트로 부터 넘겨받은 id_rsa 를 authorized_keys 의 id_rsa.pub 와 대응되는지 확인하고 접속을 허용할 수 있다.

 

이제 scp 를 이용해 id_rsa.pub 파일을 리모트 머신으로 전송하고, 서버에서 전송받은 id_rsa.pub 의 내용을 authorized_keys 파일에 추가해보자.

 

 

Local (Windows WSL)

아래 로컬 머신에서 실행할 코드는 VirtualBox 에서 Ubuntu 가 설치된 VM 에 id_rsa.pub 를 전송한다.

 

 scp $HOME/.ssh/id_rsa.pub miller@192.168.56.1:id_rsa.pub

 

 

Remote (Linux)

아래 리모트 머신에서 실행할 코드는 전송받은 id_rsa.pub 를 $HOME/.ssh/authorized_keys 파일에 이어붙인다.

 

cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys

 

 

이제 아래와 같이 ssh 이용 시 -i 옵션으로 id_rsa 가 저장된 디렉토리를 지정하면 비밀번호 입력 없이 원격 서버와 접속할 수 있다. 혹은 id_rsa 가 저장된 디렉토리에서 ssh 를 호출할 경우엔 옵션없이도 가능하다.

 

Local (Windows WSL)

 

$ ssh miller@192.168.56.1
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.11.0-44-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

161 updates can be applied immediately.
84 of these updates are standard security updates.
추가 업데이트를 확인하려면 apt list --upgradable 을 실행하세요.

Your Hardware Enablement Stack (HWE) is supported until April 2025.
Last login: Fri Jan  7 07:17:46 2022 from 10.0.2.2

 

 

SFTP

FileZilla 를 이용해 로컬 머신에서 리모트 머신으로 파일을 전송할 때마다 파일 전송 프로토콜로 SFTP-SSH File Transfer Protocol 을 선택한 적이 많다. FTP 는 SSH 와 유사한 포트 번호 (20, 21) 를 사용하기도 하던데, SFTP 는 또 어떤건지 알아보고 넘어가고자 한다.

 

 

 

 

FTP (File Transfer Protocol)

FTP (File Transfer Protocol) 는 파일을 전송하는 통신 규약으로, 한 호스트에서 다른 호스트로 파일을 복사하는 TCP/IP 의 프로토콜이다. 한 호스트에서 다른 호스트로 파일을 전송하는 것은 간단하지만, 운영체제 별로 파일 이름 규칙이나 디렉토리 구조가 다를 수 있으므로 데이터를 표현하는데 다른 방법을 가지는 문제를 가질 수도 있다.

 

 

 

 

FTP 는 이를 해결하기 위해 명령어 전송을 위한 포트 (21) 로 데이터 전송을 위한 포트 (20) 에 2개의 연결을 설정하여 위에 대한 해결책을 제공한다. 또한, 명령어와 데이터를 별도로 연결하므로 다른 클라이언트서버 연결보다 더 효율적이다.

 

 

SFTP (SSH File Transfer Protocol)

SFTP (SSH File Transfer Protocol) 는 SSH 의 파일 전송 버전으로, FTP 와 . FTP 에서는 일반 텍스트 형태로 파일을 전송하므로, 호스트와의 연결을 설정하기 위해 암호를 넘겨주는 경우엔 보안 상으로 위험하다. 하지만 SFTP 의 경우 SSH 에 의해 생성된 보안 채널에서 파일을 전송하므로, FTP에 비해 파일을 안전하게 전송할 수 있다.

 

 

출처

https://opentutorials.org/module/432/3738

https://opentutorials.org/module/432/3742

https://www.n-able.com/blog/ssh-network-protocol-overview

https://jootc.com/p/201808031460

https://baked-corn.tistory.com/52

https://ko.gadget-info.com/difference-between-ftp

'Computer Science' 카테고리의 다른 글

주소 공간과 세그먼트 (segment)  (0) 2022.01.18
VirtualBox 설치 및 SSH 연결  (0) 2022.01.06
'Computer Science' 카테고리의 다른 글
  • 주소 공간과 세그먼트 (segment)
  • VirtualBox 설치 및 SSH 연결
밀러 (miller)
밀러 (miller)
  • 밀러 (miller)
    밀러의 데브로그
    밀러 (miller)
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Java
      • Node.js
      • Production
      • Books
      • Computer Science
      • TIL
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
    • LinkedIn
  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
밀러 (miller)
SSH 와 SSH Key, SFTP
상단으로

티스토리툴바