예전에 원격 서버 접속에 익숙하지 않을 때는 매번 서버의 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개의 레이어는 다음을 수행한다.
- 전송 계층 프로토콜
전송 계층 프로토콜은 서버를 인증하고 기밀성과 무결성을 설정하는 역할을 한다. - 사용자 인증 프로토콜
사용자 인증 프로토콜은 서버에 대해 사용자를 인증하여 클라이언트에 해당하는 에이전트의 ID 를 확인한다. - 연결 프로토콜
연결 프로토콜은 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
'Computer Science' 카테고리의 다른 글
주소 공간과 세그먼트 (segment) (0) | 2022.01.18 |
---|---|
VirtualBox 설치 및 SSH 연결 (0) | 2022.01.06 |