SSH 이해하기: 초보자를 위한 가이드

발행: (2025년 12월 2일 오후 02:06 GMT+9)
11 min read
원문: Dev.to

Source: Dev.to

정확히 SSH란 무엇인가?

SSHSecure Shell의 약자입니다. 암호화된 네트워크 프로토콜로 다음을 할 수 있게 해줍니다:

  • 원격 컴퓨터에 안전하게 로그인
  • 물리적으로 접근할 수 없는 머신에서 명령 실행
  • 파일을 전송하면서 누군가 엿보지 못하도록 보호
  • 다른 네트워크 트래픽을 위한 암호화 터널 생성

“서버에 SSH로 접속한다”는 말은 원격 머신에 안전하게 연결해 명령줄을 통해 제어한다는 의미입니다.

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 키 종류

키 유형일반 파일명권장 사용
RSAid_rsa레거시; 아직 지원됨
ECDSAid_ecdsa속도와 보안의 균형이 좋음
ED25519id_ed25519최신, 빠르고 매우 안전(많은 도구의 기본)
DSAid_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 서버 보안 강화

  1. SSH‑1 비활성화/etc/ssh/sshd_config에서 Protocol 2를 설정합니다.
  2. 공개키 인증 강제PasswordAuthentication no로 설정합니다.
  3. 기본 포트 변경(선택) – 예: Port 2222.
  4. 사용자 제한AllowUsers alice bob.
  5. Fail2Ban 등 사용 – 반복된 로그인 실패를 차단합니다.
  6. 2단계 인증 활성화 – 예: Google Authenticator PAM 모듈.
  7. 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_configUseDNS 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 기본 개념, 프로토콜 작동 방식, 그리고 안전하게 사용하기 위한 모범 사례를 간결하게 정리한 것입니다.

Back to Blog

관련 글

더 보기 »