SSH
개요
SSH(Secure Shell)는 네트워크 환경에서 보안 통신을 제공하는 클라이언트-서버 프로토콜입니다. 사용자 인증, 데이터 암호화, 무결성 검증을 통해 안전한 원격 접속 및 명령 실행이 가능하도록 설계되었습니다. Telnet, FTP 등 기존 비보안 프로토콜의 대안으로 개발되었으며, 현재 클라우드 인프라, DevOps, 시스템 관리 등 다양한 분야에서 필수적인 기술로 활용되고 있습니다.
역사
SSH는 1995년 핀란드의 연구원 타투 욜로넨(Tatu Ylönen)이 암호 스니핑 공격을 방지하기 위해 개발했습니다. 초기 버전인 SSH-1은 보안 취약점이 발견되자 1996년 SSH-2로 개선되었으며, 현재는 IETF 표준(RFC 4251-4256)으로 지정되어 있습니다. OpenSSH 프로젝트는 1999년부터 오픈소스 구현체를 제공하며 널리 보급되는 데 기여했습니다.
핵심 개념
인증 방식
SSH는 두 가지 주요 인증 방식을 제공합니다:
- 비밀번호 인증: 간단한 방식이지만 브루트포스 공격에 취약
- 공개키 인증: RSA, ECDSA, Ed25519 알고리즘 기반의 키 쌍 사용
1. 클라이언트가 개인키 생성 (ssh-keygen 명령어)
2. 공개키를 서버의 ~/.ssh/authorized_keys 파일에 등록
3. 서버가 공개키로 클라이언트 인증
암호화 기술
프로토콜 계층
SSH 프로토콜은 세 가지 계층으로 구성됩니다:
1. 전송 계층: TCP 연결을 기반으로 암호화 채널 생성
2. 인증 계층: 사용자 신원 확인 (비밀번호/공개키)
3. 연결 계층: 다중 세션 관리 및 포트 포워딩 기능 제공
기술적 세부 사항
프로토콜 구조
SSH는 TCP/IP 기반의 애플리케이션 계층 프로토콜로 작동하며 기본 포트는 22입니다. 통신 과정은 다음과 같습니다:
1. 클라이언트-서버 간 버전 확인 (SSH-2.0 헤더 교환)
2. 암호화 알고리즘 협상
3. 키 교환 (Diffie-Hellman 알고리즘 사용)
4. 사용자 인증
5. 암호화된 셸 세션 생성
사용되는 암호화 알고리즘
| 알고리즘 유형 |
예시 |
| 대칭 암호화 |
AES-256, 3DES, ChaCha20 |
| 비대칭 암호화 |
RSA 4096, ECDSA P-521 |
| 해시 함수 |
SHA-256, SHA-512 |
| 메시지 인증 |
HMAC-SHA2-256 |
주요 활용 분야
원격 서버 접속
ssh username@remote_server_ip
- 보안 터미널 접속 제공
- GUI 애플리케이션 X11 포워딩 지원
터널링 (포트 포워딩)
- 로컬 포워딩:
ssh -L 8080:localhost:80 user@webserver
- 로컬 머신의 8080 포트를 원격 웹 서버의 80 포트로 매핑
- 리모트 포워딩:
ssh -R 3306:mysqlserver:3306 user@gateway
- 원격 게이트웨이에서 MySQL 서버 포트 접근 가능
- SCP:
scp local_file.txt user@remote:/home/user/
- SFTP: 대화형 파일 관리 인터페이스 제공
sftp user@remote
sftp> put local_file.txt
자동화 및 DevOps
보안 고려사항
권장 보안 설정
- root 로그인 금지:
- 비밀번호 인증 비활성화:
PasswordAuthentication no
- 접속 시도 제한:
- fail2ban 도구 활용: 반복된 로그인 실패 IP 차단
보안 취약점
- MITM(중간자 공격): 키 검증 없이 서버에 접속할 경우 위험
- 약한 알고리즘 사용: SSH-1, SHA-1, MD5 등 구형 알고리즘은 비보안
- 키 관리 부실: 개인키 유출 시 전역 시스템 침해 위험
구현 및 사용 예시
SSH 키 페어 생성
ssh-keygen -t ed25519 -C "user@example.com"
# 생성된 키: ~/.ssh/id_ed25519 (개인키), ~/.ssh/id_ed25519.pub (공개키)
공개키 서버 등록
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_server
SSH 서버 설정 (sshd_config)
Port 2222
PermitRootLogin no
PasswordAuthentication no
AllowUsers admin_user developer_user
관련 프로토콜 및 기술
- TLS/SSL: 웹 보안을 위한 대표 프로토콜 (HTTPS 기반)
- IPSec: 네트워크 계층 보안 프로토콜
- OpenSSH: 가장 널리 사용되는 오픈소스 구현체
- Dropbear: 임베디드 시스템용 경량 SSH 서버
고급 기능 및 확장
SSH 에이전트 포워딩 (Agent Forwarding)
에이전트 포워딩은 로컬 머신에 저장된 개인키를 원격 서버로 복사하지 않고도, 해당 서버를 거쳐 또 다른 서버로 인증을 이어갈 수 있게 하는 기능입니다.
- 작동 방식: ssh-agent가 로컬에서 개인키를 관리하며, -A 옵션을 통해 인증 요청을 로컬 에이전트로 전달(Forwarding)하여 서명합니다.
- 장점: 여러 대의 서버를 징검다리 식으로 접속할 때, 중간 서버에 개인키를 저장할 필요가 없어 보안성이 높습니다.
SSH 설정 최적화 (~/.ssh/config)
매번 긴 접속 명령어를 입력하는 대신, 설정 파일을 통해 별칭(Alias)과 옵션을 미리 정의할 수 있습니다.
설정 예시 (~/.ssh/config):
# 개발 서버 설정
Host dev-server
HostName 192.168.1.10
User developer
Port 2222
IdentityFile ~/.ssh/id_ed25519
# 운영 서버 설정 (Bastion 호스트 경유)
Host prod-server
HostName 10.0.0.50
User admin
ProxyJump dev-server
IdentityFile ~/.ssh/id_prod_key
위와 같이 설정하면
ssh prod-server 명령어만으로 복잡한 경로와 키 설정을 자동으로 적용하여 접속할 수 있습니다.
현대적 보안 트렌드
SSH 인증서 (SSH Certificates)
전통적인 공개키 방식은 서버마다 authorized_keys에 공개키를 일일이 등록해야 하는 관리적 부담이 큽니다. SSH 인증서는 신뢰할 수 있는 인증 기관(CA, Certificate Authority)이 공개키에 서명하여 유효 기간과 권한을 부여하는 방식입니다.
- 중앙 집중식 관리: 서버는 CA의 공개키만 가지고 있으면, CA가 서명한 모든 사용자의 인증서를 신뢰합니다.
- 유효 기간 설정: 인증서에 만료 시간을 설정하여, 키 유출 시에도 일정 시간이 지나면 자동으로 무효화됩니다.
Just-In-Time (JIT) 액세스
상시 접근 권한을 부여하는 대신, 필요할 때만 일시적으로 권한을 생성하는 방식입니다. 요청 승인 후 짧은 시간 동안만 유효한 SSH 인증서를 발급함으로써 공격 표면(Attack Surface)을 최소화합니다.
하드웨어 기반 물리 인증 (FIDO2)
최근 OpenSSH는 FIDO2/U2F 표준을 지원하는 하드웨어 보안 키(예: YubiKey)를 이용한 인증 방식을 도입했습니다. 이는 개인키가 하드웨어 칩 내부에 저장되어 외부로 유출되는 것을 물리적으로 방지합니다.
FIDO2 인증키 설정 및 등록 과정
- 키 생성:
-t sk-ecdsa-sha2-nistp256 또는 -t sk-ssh-ed25519@openssh.com 옵션을 사용하여 하드웨어 키 기반의 키 쌍을 생성합니다.
ssh-keygen -t sk-ssh-ed25519@openssh.com
- 물리적 상호작용: 키 생성 및 인증 시, 보안 키의 버튼을 직접 터치하여 사용자의 물리적 존재를 확인합니다.
- 공개키 등록: 생성된
sk- 접두사가 붙은 공개키를 서버의 ~/.ssh/authorized_keys에 등록합니다.
- 인증 수행:
ssh 접속 시 서버가 챌린지를 보내면, 하드웨어 키가 이를 서명하고 사용자가 버튼을 눌러 승인함으로써 접속이 완료됩니다.
동적 포워딩(-D 옵션)을 사용하면 SSH 서버를 SOCKS 프록시 서버로 변환하여, SSH 터널을 통해 모든 TCP 트래픽을 전송할 수 있습니다.
활용 시나리오
- 내부망 자원 접근: 외부에서 접근 불가능한 사내망(Intranet) 서버에 접속할 때, SSH 게이트웨이를 통해 브라우저나 DB 툴의 트래픽을 우회시켜 내부 웹 페이지나 DB에 접근할 수 있습니다.
- IP 우회 및 보안: 공공 Wi-Fi 등 신뢰할 수 없는 네트워크에서 웹 서핑을 할 때, 신뢰할 수 있는 원격 서버를 프록시로 설정하여 트래픽을 암호화하고 서버의 IP로 외부에 노출시킵니다.
실행 예시:
ssh -D 1080 user@remote_gateway
이후 브라우저 설정에서
SOCKS5 프록시: localhost:1080으로 설정하면 모든 웹 트래픽이
remote_gateway를 통해 나갑니다.
강화된 보안 설정 방안
비표준 포트(Non-standard Port) 사용
기본 포트인 22번은 자동화된 봇(Bot)에 의한 무차별 대입 공격(Brute-force)의 주 타겟입니다. 포트를 2222나 49152 등 임의의 높은 번호로 변경하는 것만으로도 단순 스캔 공격의 90% 이상을 차단하는 효과가 있습니다.
2단계 인증(2FA/MFA) 도입
공개키 인증 외에 추가적인 인증 계층을 도입하여 보안을 강화합니다.
- Google Authenticator (TOTP): libpam-google-authenticator를 설치하여 SSH 접속 시 모바일 앱의 6자리 일회용 비밀번호를 추가로 입력하게 설정합니다.
- 설정 방법: /etc/ssh/sshd_config에서 AuthenticationMethods publickey,keyboard-interactive 설정을 통해 '공개키 + OTP' 두 가지 조건을 모두 만족해야 로그인이 가능하도록 강제합니다.
참고 자료
# SSH
## 개요
SSH(Secure Shell)는 네트워크 환경에서 보안 통신을 제공하는 클라이언트-서버 프로토콜입니다. 사용자 인증, 데이터 암호화, 무결성 검증을 통해 안전한 원격 접속 및 명령 실행이 가능하도록 설계되었습니다. Telnet, FTP 등 기존 비보안 프로토콜의 대안으로 개발되었으며, 현재 클라우드 인프라, DevOps, 시스템 관리 등 다양한 분야에서 필수적인 기술로 활용되고 있습니다.
### 역사
SSH는 1995년 핀란드의 연구원 타투 욜로넨(Tatu Ylönen)이 암호 스니핑 공격을 방지하기 위해 개발했습니다. 초기 버전인 SSH-1은 보안 취약점이 발견되자 1996년 SSH-2로 개선되었으며, 현재는 IETF 표준(RFC 4251-4256)으로 지정되어 있습니다. OpenSSH 프로젝트는 1999년부터 오픈소스 구현체를 제공하며 널리 보급되는 데 기여했습니다.
## 핵심 개념
### 인증 방식
SSH는 두 가지 주요 인증 방식을 제공합니다:
- **비밀번호 인증**: 간단한 방식이지만 브루트포스 공격에 취약
- **공개키 인증**: RSA, ECDSA, Ed25519 알고리즘 기반의 키 쌍 사용
1. 클라이언트가 개인키 생성 (ssh-keygen 명령어)
2. 공개키를 서버의 `~/.ssh/authorized_keys` 파일에 등록
3. 서버가 공개키로 클라이언트 인증
### 암호화 기술
- **대칭 암호화**: AES-256-GCM, ChaCha20-Poly1305 등 실시간 통신 보호
- **비대칭 암호화**: Diffie-Hellman 키 교환을 통한 안전한 공유 비밀 생성
- **해시 함수**: SHA-256, SHA-512로 데이터 무결성 검증
### 프로토콜 계층
SSH 프로토콜은 세 가지 계층으로 구성됩니다:
1. **전송 계층**: TCP 연결을 기반으로 암호화 채널 생성
2. **인증 계층**: 사용자 신원 확인 (비밀번호/공개키)
3. **연결 계층**: 다중 세션 관리 및 포트 포워딩 기능 제공
## 기술적 세부 사항
### 프로토콜 구조
SSH는 TCP/IP 기반의 애플리케이션 계층 프로토콜로 작동하며 기본 포트는 22입니다. 통신 과정은 다음과 같습니다:
1. 클라이언트-서버 간 버전 확인 (SSH-2.0 헤더 교환)
2. 암호화 알고리즘 협상
3. 키 교환 (Diffie-Hellman 알고리즘 사용)
4. 사용자 인증
5. 암호화된 셸 세션 생성
### 사용되는 암호화 알고리즘
| 알고리즘 유형 | 예시 |
|---------------|------|
| 대칭 암호화 | AES-256, 3DES, ChaCha20 |
| 비대칭 암호화 | RSA 4096, ECDSA P-521 |
| 해시 함수 | SHA-256, SHA-512 |
| 메시지 인증 | HMAC-SHA2-256 |
## 주요 활용 분야
### 원격 서버 접속
```bash
ssh username@remote_server_ip
```
- 보안 터미널 접속 제공
- GUI 애플리케이션 X11 포워딩 지원
### 터널링 (포트 포워딩)
- **로컬 포워딩**: `ssh -L 8080:localhost:80 user@webserver`
- 로컬 머신의 8080 포트를 원격 웹 서버의 80 포트로 매핑
- **리모트 포워딩**: `ssh -R 3306:mysqlserver:3306 user@gateway`
- 원격 게이트웨이에서 MySQL 서버 포트 접근 가능
### 파일 전송 (SCP, SFTP)
- **SCP**: `scp local_file.txt user@remote:/home/user/`
- **SFTP**: 대화형 파일 관리 인터페이스 제공
```bash
sftp user@remote
sftp> put local_file.txt
```
### 자동화 및 DevOps
- CI/CD 파이프라인에서 Ansible, Jenkins 등과 연동
- 인프라 구성 관리 도구(Puppet, Chef)의 원격 실행 엔진
## 보안 고려사항
### 권장 보안 설정
- **root 로그인 금지**:
```bash
PermitRootLogin no
```
- **비밀번호 인증 비활성화**:
```bash
PasswordAuthentication no
```
- **접속 시도 제한**:
```bash
MaxAuthTries 3
```
- **fail2ban 도구 활용**: 반복된 로그인 실패 IP 차단
### 보안 취약점
- **MITM(중간자 공격)**: 키 검증 없이 서버에 접속할 경우 위험
- **약한 알고리즘 사용**: SSH-1, SHA-1, MD5 등 구형 알고리즘은 비보안
- **키 관리 부실**: 개인키 유출 시 전역 시스템 침해 위험
## 구현 및 사용 예시
### SSH 키 페어 생성
```bash
ssh-keygen -t ed25519 -C "user@example.com"
# 생성된 키: ~/.ssh/id_ed25519 (개인키), ~/.ssh/id_ed25519.pub (공개키)
```
### 공개키 서버 등록
```bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_server
```
### SSH 서버 설정 (sshd_config)
```bash
Port 2222
PermitRootLogin no
PasswordAuthentication no
AllowUsers admin_user developer_user
```
## 관련 프로토콜 및 기술
- **TLS/SSL**: 웹 보안을 위한 대표 프로토콜 (HTTPS 기반)
- **IPSec**: 네트워크 계층 보안 프로토콜
- **OpenSSH**: 가장 널리 사용되는 오픈소스 구현체
- **Dropbear**: 임베디드 시스템용 경량 SSH 서버
## 고급 기능 및 확장
### SSH 에이전트 포워딩 (Agent Forwarding)
에이전트 포워딩은 로컬 머신에 저장된 개인키를 원격 서버로 복사하지 않고도, 해당 서버를 거쳐 또 다른 서버로 인증을 이어갈 수 있게 하는 기능입니다.
- **작동 방식**: `ssh-agent`가 로컬에서 개인키를 관리하며, `-A` 옵션을 통해 인증 요청을 로컬 에이전트로 전달(Forwarding)하여 서명합니다.
- **장점**: 여러 대의 서버를 징검다리 식으로 접속할 때, 중간 서버에 개인키를 저장할 필요가 없어 보안성이 높습니다.
### SSH 설정 최적화 (`~/.ssh/config`)
매번 긴 접속 명령어를 입력하는 대신, 설정 파일을 통해 별칭(Alias)과 옵션을 미리 정의할 수 있습니다.
**설정 예시 (`~/.ssh/config`):**
```text
# 개발 서버 설정
Host dev-server
HostName 192.168.1.10
User developer
Port 2222
IdentityFile ~/.ssh/id_ed25519
# 운영 서버 설정 (Bastion 호스트 경유)
Host prod-server
HostName 10.0.0.50
User admin
ProxyJump dev-server
IdentityFile ~/.ssh/id_prod_key
```
위와 같이 설정하면 `ssh prod-server` 명령어만으로 복잡한 경로와 키 설정을 자동으로 적용하여 접속할 수 있습니다.
## 현대적 보안 트렌드
### SSH 인증서 (SSH Certificates)
전통적인 공개키 방식은 서버마다 `authorized_keys`에 공개키를 일일이 등록해야 하는 관리적 부담이 큽니다. SSH 인증서는 신뢰할 수 있는 **인증 기관(CA, Certificate Authority)**이 공개키에 서명하여 유효 기간과 권한을 부여하는 방식입니다.
- **중앙 집중식 관리**: 서버는 CA의 공개키만 가지고 있으면, CA가 서명한 모든 사용자의 인증서를 신뢰합니다.
- **유효 기간 설정**: 인증서에 만료 시간을 설정하여, 키 유출 시에도 일정 시간이 지나면 자동으로 무효화됩니다.
### Just-In-Time (JIT) 액세스
상시 접근 권한을 부여하는 대신, 필요할 때만 일시적으로 권한을 생성하는 방식입니다. 요청 승인 후 짧은 시간 동안만 유효한 SSH 인증서를 발급함으로써 공격 표면(Attack Surface)을 최소화합니다.
## 하드웨어 기반 물리 인증 (FIDO2)
최근 OpenSSH는 FIDO2/U2F 표준을 지원하는 하드웨어 보안 키(예: YubiKey)를 이용한 인증 방식을 도입했습니다. 이는 개인키가 하드웨어 칩 내부에 저장되어 외부로 유출되는 것을 물리적으로 방지합니다.
### FIDO2 인증키 설정 및 등록 과정
1. **키 생성**: `-t sk-ecdsa-sha2-nistp256` 또는 `-t sk-ssh-ed25519@openssh.com` 옵션을 사용하여 하드웨어 키 기반의 키 쌍을 생성합니다.
```bash
ssh-keygen -t sk-ssh-ed25519@openssh.com
```
2. **물리적 상호작용**: 키 생성 및 인증 시, 보안 키의 버튼을 직접 터치하여 사용자의 물리적 존재를 확인합니다.
3. **공개키 등록**: 생성된 `sk-` 접두사가 붙은 공개키를 서버의 `~/.ssh/authorized_keys`에 등록합니다.
4. **인증 수행**: `ssh` 접속 시 서버가 챌린지를 보내면, 하드웨어 키가 이를 서명하고 사용자가 버튼을 눌러 승인함으로써 접속이 완료됩니다.
## SOCKS 프록시 및 동적 포워딩 활용
동적 포워딩(`-D` 옵션)을 사용하면 SSH 서버를 SOCKS 프록시 서버로 변환하여, SSH 터널을 통해 모든 TCP 트래픽을 전송할 수 있습니다.
### 활용 시나리오
- **내부망 자원 접근**: 외부에서 접근 불가능한 사내망(Intranet) 서버에 접속할 때, SSH 게이트웨이를 통해 브라우저나 DB 툴의 트래픽을 우회시켜 내부 웹 페이지나 DB에 접근할 수 있습니다.
- **IP 우회 및 보안**: 공공 Wi-Fi 등 신뢰할 수 없는 네트워크에서 웹 서핑을 할 때, 신뢰할 수 있는 원격 서버를 프록시로 설정하여 트래픽을 암호화하고 서버의 IP로 외부에 노출시킵니다.
**실행 예시:**
```bash
ssh -D 1080 user@remote_gateway
```
이후 브라우저 설정에서 `SOCKS5 프록시: localhost:1080`으로 설정하면 모든 웹 트래픽이 `remote_gateway`를 통해 나갑니다.
## 강화된 보안 설정 방안
### 비표준 포트(Non-standard Port) 사용
기본 포트인 22번은 자동화된 봇(Bot)에 의한 무차별 대입 공격(Brute-force)의 주 타겟입니다. 포트를 `2222`나 `49152` 등 임의의 높은 번호로 변경하는 것만으로도 단순 스캔 공격의 90% 이상을 차단하는 효과가 있습니다.
### 2단계 인증(2FA/MFA) 도입
공개키 인증 외에 추가적인 인증 계층을 도입하여 보안을 강화합니다.
- **Google Authenticator (TOTP)**: `libpam-google-authenticator`를 설치하여 SSH 접속 시 모바일 앱의 6자리 일회용 비밀번호를 추가로 입력하게 설정합니다.
- **설정 방법**: `/etc/ssh/sshd_config`에서 `AuthenticationMethods publickey,keyboard-interactive` 설정을 통해 '공개키 + OTP' 두 가지 조건을 모두 만족해야 로그인이 가능하도록 강제합니다.
## 참고 자료
- [RFC 4251 - The Secure Shell Protocol Architecture](https://tools.ietf.org/html/rfc4251)
- [OpenSSH 공식 문서](https://www.openssh.com/manual.html)
- [NIST SSH 보안 가이드](https://csrc.nist.gov/publications/detail/sp/800-131a/rev-2/final)