SSH 이해하기: 초보자를 위한 가이드
Source: Dev.to
정확히 SSH란 무엇인가?
SSH는 Secure Shell의 약자입니다. 암호화된 네트워크 프로토콜로 다음을 할 수 있게 해줍니다:
- 원격 컴퓨터에 안전하게 로그인
- 물리적으로 접근할 수 없는 머신에서 명령 실행
- 파일을 전송하면서 누군가 엿보지 못하도록 보호
- 다른 네트워크 트래픽을 위한 암호화 터널 생성
“서버에 SSH로 접속한다”는 말은 원격 머신에 안전하게 연결해 명령줄을 통해 제어한다는 의미입니다.

SSH가 만들어진 이유
SSH가 존재하기 전, 시스템 관리자는 데이터를 평문으로 전송하는 도구들을 사용했습니다:
| 프로토콜 | 문제점 |
|---|---|
| Telnet | 모든 것을 평문으로 전송: 비밀번호, 명령어 등 |
| rlogin | 암호화 없음, IP 기반 신뢰(스푸핑 쉬움) |
| FTP | 비밀번호가 평문으로 전송 |
보안이 취약한 전송 예시
USER: admin
PASS: supersecret123
같은 네트워크에 있는 누구든 패킷 스니퍼를 실행해 자격 증명을 읽을 수 있었습니다.
1990년대, 한 핀란드 연구자가 대학 네트워크가 공격당하고 비밀번호가 직접 와이어에서 스니핑되는 사건을 겪은 뒤 SSH를 만들었습니다. SSH는 이론적 편집증이 아니라 실제 보안 사고에서 탄생했습니다.
비유: Telnet은 붐비는 방에서 은행 PIN을 외치는 것과 같습니다. SSH는 당신과 은행만이 해독할 수 있는 암호화 라디오로 속삭이는 것과 같습니다.
SSH 프로토콜 버전
| 버전 | 상태 | 비고 |
|---|---|---|
| SSH-1 | 사용 중단 | 알려진 취약점이 존재합니다. 절대 사용하지 마세요. |
| SSH-2 | 현재 표준 | 프로토콜 전체를 재설계했습니다. 거의 모든 최신 시스템에서 사용됩니다. |
SSH‑2는 완전한 재작성이며:
- 더 나은 키 교환 알고리즘
- 향상된 무결성 검사
- 하나의 세션에서 여러 인증 방법 지원
항상 시스템이 SSH‑2를 사용하도록 확인하세요. 대부분의 최신 시스템은 기본값이지만, 레거시 시스템은 그렇지 않을 수 있습니다.
SSH 실제 작동 방식
단계 1: TCP 연결
SSH는 일반적으로 포트 22에서 TCP 위에서 동작합니다. 클라이언트가 표준 TCP 핸드셰이크를 시작합니다:
Client → Server: SYN
Server → Client: SYN‑ACK
Client → Server: ACK
연결이 성립되었습니다. 이제 SSH 프로토콜이 시작됩니다.
단계 2: 프로토콜 버전 교환
양쪽이 자신의 SSH 버전을 알립니다:
Client: SSH-2.0-OpenSSH_8.9
Server: SSH-2.0-OpenSSH_8.4
양쪽 중 하나가 SSH‑1만 지원한다면, 최신 클라이언트는 (그리고 그래야 합니다) 연결을 거부합니다.
단계 3: 키 교환 (마법)
목표는 감청자가 알 수 없는 공유 비밀 키를 만드는 것입니다. 가장 일반적인 알고리즘은 **Elliptic Curve Diffie‑Hellman (ECDH)**입니다:
########### Key Exchange (Simplified) ###########
1. Client and Server agree on mathematical parameters
2. Client generates: private value (a), public value (A)
Server generates: private value (b), public value (B)
3. They exchange public values (A and B) [Attacker can see A and B]
4. Client computes: shared_secret = B^a
Server computes: shared_secret = A^b [Both arrive at the SAME secret!]
5. This shared secret derives the session encryption keys
공유 비밀은 전송되지 않으며; 모든 패킷을 감시하는 공격자도 이를 계산할 수 없습니다.
단계 4: 서버 인증 (호스트 키)
서버에 인증하기 전에, 서버가 먼저 클라이언트에게 인증합니다. 첫 연결 시 다음과 같은 메시지를 보게 됩니다:
The authenticity of host 'server.com (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:AbCdEf1234567890...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes를 입력하면 지문이 ~/.ssh/known_hosts에 저장됩니다. 이후 연결에서는 서버 키가 저장된 지문과 일치하는지 확인합니다.
지문이 바뀌면 SSH는 경고합니다:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
팁: 처음 사용할 때는 별도 채널(예: 제공업체 문서)을 통해 지문을 확인하세요.
단계 5: 사용자 인증
SSH는 여러 인증 방식을 지원합니다.
방법 1: 비밀번호 인증
ssh user@server.com
# Prompts for password
간단하지만 권장되지 않음합니다. 비밀번호는 무차별 대입에 취약하고, 키로거에 노출될 수 있으며, 매번 수동 입력이 필요합니다.
방법 2: 공개키 인증 (권장)
비대칭 암호화(키 쌍)를 사용합니다.
| 키 | 위치 | 목적 |
|---|---|---|
| Private Key | ~/.ssh/id_ed25519 (또는 유사) | 절대 머신을 떠나지 않음. 당신의 신원을 증명합니다. |
| Public Key | 서버의 ~/.ssh/authorized_keys | 자유롭게 공유 가능. 당신의 개인키 서명을 검증합니다. |
동작 원리

개인키는 절대 머신을 떠나지 않으며, 서버는 당신이 해당 키를 가지고 있음을 증명하는 정보만을 받습니다.
방법 3: 인증서 기반 인증
기업 환경에서 사용됩니다. 인증 기관(CA)이 사용자 키에 서명하고, 서버는 개별 키가 아니라 CA를 신뢰합니다.
단계 6: 암호화된 세션
인증이 끝나면 모든 트래픽은 대칭 암호화(AES‑256, ChaCha20 등)로 보호됩니다. 대칭 암호는 비대칭 암호보다 약 1000배 빠릅니다.
각 패킷에는 **MAC(메시지 인증 코드)**도 포함되어 변조를 감지합니다.
SSH 키 종류
| 키 유형 | 일반 파일명 | 권장 사용 |
|---|---|---|
| RSA | id_rsa | 레거시; 아직 지원됨 |
| ECDSA | id_ecdsa | 속도와 보안의 균형이 좋음 |
| ED25519 | id_ed25519 | 최신, 빠르고 매우 안전(많은 도구의 기본) |
| DSA | id_dsa | 사용 중단; 피하세요 |
새 키 쌍 생성 (ED25519 예시):
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C "your_email@example.com"
-a 100은 KDF(키 파생 함수) 라운드 수를 늘려 개인키에 대한 무차별 공격을 어렵게 합니다.-C는 키를 식별하기 위한 주석(보통 이메일)을 추가합니다.
자주 쓰는 SSH 명령
| 명령 | 설명 |
|---|---|
ssh user@host | 원격 호스트에서 인터랙티브 쉘을 엽니다 |
ssh -i /path/to/key user@host | 특정 개인키 사용 |
scp file.txt user@host:/remote/path/ | 파일을 원격 호스트로 복사 |
scp -r dir/ user@host:/remote/dir/ | 디렉터리를 재귀적으로 복사 |
ssh -L 8080:localhost:80 user@host | 로컬 포트 포워드 생성(원격 웹 서비스에 localhost:8080으로 접근) |
ssh -R 9090:localhost:22 user@host | 원격 포트 포워드 생성(로컬 SSH를 원격에 노출) |
ssh -N -f -L 3306:db.internal:3306 user@bastion | 쉘을 열지 않고(-N) 백그라운드(-f)에서 터널 설정 |
SSH 서버 보안 강화
- SSH‑1 비활성화 –
/etc/ssh/sshd_config에서Protocol 2를 설정합니다. - 공개키 인증 강제 –
PasswordAuthentication no로 설정합니다. - 기본 포트 변경(선택) – 예:
Port 2222. - 사용자 제한 –
AllowUsers alice bob. - Fail2Ban 등 사용 – 반복된 로그인 실패를 차단합니다.
- 2단계 인증 활성화 – 예: Google Authenticator PAM 모듈.
- OpenSSH 최신 상태 유지 – 보안 패치는 정기적으로 제공됩니다.
문제 해결 팁
- “Permission denied (publickey)” – 서버의
~/.ssh/authorized_keys에 공개키가 올바르게 배치되었는지, 파일 권한이 제한적(chmod 600 ~/.ssh/authorized_keys)인지 확인합니다. - Host key verification failed –
~/.ssh/known_hosts에서 오래된 항목을 삭제(ssh-keygen -R hostname)하고 다시 연결합니다. - Connection timed out – 방화벽에서 포트 22(또는 사용자 지정 포트)가 열려 있는지, SSH 데몬이 실행 중인지 확인합니다.
- Slow login – DNS 역방향 조회가 원인일 수 있습니다.
sshd_config에UseDNS no를 추가해 보세요.
추가 자료
- OpenSSH Manual
- RFC 4251 – The Secure Shell (SSH) Protocol Architecture
- SSH, The Secure Shell: The Definitive Guide – Daniel J. Barrett, Richard E. Silverman, Robert G. Byrnes
이 가이드는 SSH 기본 개념, 프로토콜 작동 방식, 그리고 안전하게 사용하기 위한 모범 사례를 간결하게 정리한 것입니다.