mir.pe (일반/밝은 화면)
최근 수정 시각 : 2024-10-09 13:04:45

Secure Shell

1. 개요2. 기능3. 서버 설치 및 운용
3.1. OpenSSH 설치3.2. 접속 테스트3.3. 공개키/개인키 쌍을 생성하여 비밀번호 입력 없이 접속할 수 있도록 구성하기
3.3.1. PuTTY용 개인키 생성하기
3.4. OpenSSH 호스트 설정3.5. SSH 터널링을 프록시로 사용하기
4. 추천 클라이언트
4.1. SSH 클라이언트4.2. SFTP 클라이언트4.3. SSH 디렉토리를 로컬 드라이브/디렉토리처럼 이용하기
5. 관련 문서

1. 개요

Secure Shell, SSH
원격지의 셸에 접속하기 위해 사용되는 네트워크 프로토콜. 보통 축약해서 SSH라고 부른다. 뜻 그대로 보안 셸이다. 기존의 유닉스 시스템 셸에 원격 접속하기 위해 사용하던 텔넷은 암호화가 이루어지지 않는 텍스트 기반 통신[1]인지라 모든 통신 내용이 탈취될 위험이 높으므로, 여기에 키 교환 알고리즘 기반의 암호화 기능을 추가하여 1995년에 공개된 프로토콜이다. # 기본 포트는 22번.

2. 기능

3. 서버 설치 및 운용

SSH 서버를 구현하는 패키지는 수없이 많은데, 가장 널리 사용되는 무료 패키지는 OpenSSH를 꼽을 수 있다. 역사가 오래 된 만큼 점점 무거워지는 경향이 있어 리눅스에서는 dropbear를 대체제로 이용하는 경우도 있지만, 여기에서는 OpenSSH 서버를 구성하는 방법에 대해 기술한다.

3.1. OpenSSH 설치

3.2. 접속 테스트

$ ssh <호스트 계정>@localhost -p 22 <- 루프백 접속 테스트}}}

3.3. 공개키/개인키 쌍을 생성하여 비밀번호 입력 없이 접속할 수 있도록 구성하기

개념을 단순화하자면 공개키는 도어락이나 자물쇠, 개인키는 RF태그나 열쇠 정도로 이해하면 된다. 호스트에 특정 계정이 접속을 시도할 때 클라이언트로서의 자격증명을 상호 보유한 키 쌍의 매칭 여부로 판단하고 비밀번호 입력 과정을 생략하는 것이다. 물론 파일이므로 쉽게 복사될 수 있고 내용을 읽을 수 있기 때문에 개인키에 PassPhrase라고 하는 암호 구문을 사용하도록 설정할 수 있다.
윈도우/리눅스 등에 관계 없이 셸에서 다음과 같이 입력해 공개키/개인키 쌍을 생성한다. 호스트의 로컬/원격 셸이든 클라이언트의 셸이든 어디에서 작업을 진행해도 무방하다.[8] 단지 공개키는 호스트, 개인키는 클라이언트가 소유해 반드시 한 쌍이 되어야 하는 점을 기억하면 된다.[9]
#!syntax sh $ ssh-keygen -t <암호화 알고리즘> -b <암호화 비트>
알고리즘은 dsa ecdsa ecdsa-sk ed25519 ed25519-sk rsa 를 이용할 수 있다. 주로 rsa 2048/4096비트나 ed25519가 이용된다.
Generating public/private rsa key pair.
Enter file in which you want to save the key (<계정의 홈 디렉토리>/.ssh/id_rsa):   <- 일반적으로 기본값을 그대로 사용한다
Enter passphrase (empty for no passphrase):   <- 비워도 문제는 없지만, 개인키 파일이 유출될 경우를 대비해 비밀번호를 걸어두도록 하자
Enter same passphrase again:   <- 위의 비밀번호를 재입력한다
Your identification has been saved in <홈 디렉토리>/.ssh/id_rsa.  <- 개인키 파일. 파일 이름에 암호화 알고리즘 이름이 붙고, 확장자가 없다
Your public key has been saved in <홈 디렉토리>/.ssh/id_rsa.pub.  <- 공용키 파일. 마찬가지로 암호화 알고리즘 이름이 붙고, pub 확장자가 있다
The key fingerprint is:
SHA256:<SHA256 해쉬 값> <계정 이름>@<생성작업을 진행한 컴퓨터의 hostname>
The key`s randomart image is:
+---[RSA 2048]----+       <-- 알고리즘 종류
|   .. +o+.       |
|  .  o.o.o.      |
| . ..+..... .    |
| o.=+ .+.  o     |
| o=oo.BooS  .    |       <-- 생성된 키를 표현하는 텍스트 그림
| .ooo.o%+..  E   |
|   .o== o.       |
|    o.+          |
|    +*           |
+----[SHA256]-----+       <-- 해쉬
이렇게 생성된 공개키/개인키는 다음과 같이 처리한다. 클라이언트 측에서 다음의 명령을 실행해 비밀번호 없이 키 기반 접속이 가능한지 확인한다.#!syntax sh $ ssh <호스트 계정>@<호스트 IP주소 또는 도메인> -p <접속 포트> -i <개인키 경로>/<개인키 파일 이름>개인키를 이용하여 접속할 때 권한과 관련된 경고[12]가 뜨고 접속이 안되는 경우가 있다. 개인키 파일에 대한 권한이 다중으로 지정되어 있기 때문인데, 소유자의 계정 외에도 개인키를 사용할 수 있다고 판단해 SSH 클라이언트가 자체적으로 연결 시도 자체를 중단하는 것이다. 소유자 계정만 파일을 읽을 수 있도록 권한을 변경해야 한다.
#!syntax sh 리눅스에서는 개인키 파일 권한에 400을 준다.
$ chmod 400 ~/.ssh/id_rsa
#!syntax sh 윈도우에서는 개인키 파일의 속성을 열고 보안 탭에서 고급(V) 버튼을 누르면 고급 보안 설정 창이 뜬다.
상속 사용 안함(I)을 선택한 뒤 팝업창에서 '이 개체에서 상속된 사용 권한을 모두 제거합니다.'를 선택해 모든 권한을 지운다.
추가(D)를 선택하여 현재 접속한 사용자를 추가하고, 오직 한 계정만 읽기 및 실행 권한만 있는지 확인하고, 확인 버튼으로 모든 창을 다 종료한다.

3.3.1. PuTTY용 개인키 생성하기

PuTTY에서 키 기반 접속을 위해서는 셸에서 생성한 개인키가 아니라 PuTTY용으로 변환된 개인키를 이용해야 한다. 변환된 개인키 파일은 PuTTY 뿐 아니라 FileZilla, WinSCP, 안드로이드용 CX파일탐색기 등의 클라이언트에서도 사용 가능하므로, 셸에서 생성한 개인키와 함께 변환된 개인키를 함께 보유하는 것이 권장된다.

3.4. OpenSSH 호스트 설정

3.5. SSH 터널링을 프록시로 사용하기

윈도우 : C:\ProgramData\ssh에서 sshd_config를 관리자 권한으로 실행한 메모장 등으로 수정}}}
- D 127.0.0.1:5000 : 로컬 SOCKS 프록시 서버를 연다(다른 포트를 사용해도 무방하다)
- N : 원격 명령을 실행하지 않고 포트 포워딩으로만 사용
- v : 디버깅 메시지를 출력 (필수 옵션은 아니다.)
- C : 터널에서 데이터를 압축한다 (대역폭 절약을 위함)

개인키 파일 사용시 아래 옵션을 추가한다
-i <개인키 경로>/<개인키 파일 이름>}}}

4. 추천 클라이언트

4.1. SSH 클라이언트

4.2. SFTP 클라이언트

4.3. SSH 디렉토리를 로컬 드라이브/디렉토리처럼 이용하기


net use y: \\sshfs\[your id]@192.168.XXX.XXX!22\[your id] /user:[your id]}}}

5. 관련 문서


[1] 1990년대의 PC통신을 생각하면 된다 [2] 일례로 윈도우의 원격 데스크톱(3389) 등은 직접적인 암호화 기능이 없어 보안 문제 발생 가능성이 크기 때문에 인터넷 서비스 업체(ISP)가 아예 포트를 막아버리는데, 터널링을 이용하면 SSH 서버를 경유해 호스트 컴퓨터로의 원격 데스크톱을 이용할 수 있다. [3] 통상적으로 이러한 기능은 호스트가 설정/제어 권한을 갖는데, 특이하게도 SSH 터널링은 클라이언트에게 제어 권한이 있다. [4] 클라이언트가 VPN 서버에 접속 시 VPN 서버 하위의 사설망 내부에서 물리적으로 연결된 단말로 취급되며 별개의 사설망 IP를 부여받는다. [5] HTTP/HTTPS 도메인 바인딩 뿐 아니라 TCP/UDP 포트 스트리밍도 가능하다. 자세한 내용은 구글에서 NGINX streaming을 검색해보자. [6] 리눅스나 유닉스는 화면 출력용 비트맵 데이터 덩어리를 X11 Display 서버를 경유해 모니터로 전달한다. 그 모니터를 원격 호스트의 하드웨어가 아닌 클라이언트의 리모트 세션으로 설정하는 것이다. 리모트 디스플레이에 특화된 터널링이라 할 수 있으며, 그 일련의 과정을 SSH에서 네이티브로 지원한다. [7] 스포티파이 꼼수앱인 xManager와는 다른, 1997년부터 시작된 역사가 깊은 프로그램이다. 이런건 제대로 된 설명이 없고 어째서 꼼수앱이 먼저 등재된걸까… [8] 어느 시스템에서든 SSH 클라이언트로서 키 쌍을 생성할 수 있으므로 작업 위치에 구애받지 않는다는 의미이다. 키 파일의 특성이나 권한 부여 문제 등의 이유로 클라이언트에서 작업하는 것이 권장되긴 한다. [9] 키 쌍을 사용할 수 있는 위치가 특정되지 않기 때문에 한번 생성해놓으면 무한히 복사해서 사용할 수 있다. 개인이 잘 관리하면 유용한 기능이지만 허술하면 해킹으로 이어지기 쉽다. [10] 혼자 사용할 SSH 서버라면 다른 이름을 이용해도 무방하지만, 차후 설정 단계에서 파일 이름을 정확히 지정해야 접속이 가능하다. [11] 리눅스/유닉스 시스템에서는 디렉토리나 파일의 이름이 마침표로 시작하면 숨김 속성이 부여되어 일반적인 파일/디렉토리 탐색 시에는 표시되지 않는다. [12] WARNING: UNPROTECTED PRIVATE KEY FILE! [13] https://www.netsarang.com/ko/xshell-download/ [14] 2024-08-01 기준 KRW 99,000(vat외), USD 99