SSH 키 생성 알고리즘 완벽 가이드: RSA vs ECDSA vs Ed25519
1. Telnet에서 SSH로의 전환
과거 서버 관리에는 Telnet이 널리 사용되었습니다. 하지만 Telnet은 모든 데이터를 평문으로 전송하기 때문에 네트워크 상에서 패킷을 가로채면 비밀번호를 포함한 모든 정보가 노출되는 치명적인 보안 취약점이 있었습니다.
이러한 문제를 해결하기 위해 SSH(Secure Shell)가 개발되었습니다. SSH는 암호화된 통신 채널을 제공하여 안전한 원격 서버 접속을 가능하게 합니다. 특히 공개키 암호화 방식을 사용한 키 기반 인증은 비밀번호 인증보다 훨씬 안전하고 편리한 접속 방법을 제공합니다.
2. SSH 키 생성 알고리즘의 종류
SSH 키를 생성할 때 ssh-keygen 명령어를 사용하며, -t 옵션으로 알고리즘을 선택할 수 있습니다. 주요 알고리즘은 다음과 같습니다.
2.1 RSA (Rivest-Shamir-Adleman)
RSA는 가장 오래되고 널리 사용되는 공개키 암호화 알고리즘입니다. 1977년에 개발되어 현재까지도 광범위하게 지원됩니다.
RSA의 보안성은 큰 소수의 곱셈은 쉽지만 그 결과를 다시 소인수분해하는 것은 매우 어렵다는 수학적 원리에 기반합니다. 키 길이는 일반적으로 2048비트 이상을 사용하며, 더 높은 보안이 필요한 경우 4096비트를 사용합니다.
장점으로는 거의 모든 시스템과 SSH 서버에서 지원되며, 오랜 기간 검증된 안정성을 가지고 있습니다. 단점으로는 키 크기가 크고 연산 속도가 상대적으로 느리며, 동일한 보안 수준을 제공하는 최신 알고리즘에 비해 효율성이 떨어집니다.
2.2 DSA (Digital Signature Algorithm)
DSA는 NIST에서 표준으로 제정한 디지털 서명 알고리즘입니다. 1991년에 개발되었으며, 주로 디지털 서명 용도로 설계되었습니다.
DSA는 1024비트 키 길이로 제한되어 있으며, 이는 현대 보안 기준으로는 충분하지 않습니다. OpenSSH 7.0 버전부터는 기본적으로 비활성화되었으며, 새로운 키 생성 시 사용이 권장되지 않습니다.
레거시 시스템과의 호환성을 위해 여전히 지원되지만, 보안성이 취약하고 키 길이 확장이 불가능하여 신규 용도로는 적합하지 않습니다.
2.3 ECDSA (Elliptic Curve Digital Signature Algorithm)
ECDSA는 타원곡선 암호화(ECC)를 기반으로 한 디지털 서명 알고리즘입니다. 2005년경부터 SSH에 도입되었습니다.
ECDSA는 RSA보다 작은 키 크기로 동일한 수준의 보안을 제공합니다. 예를 들어, 256비트 ECDSA 키는 약 3072비트 RSA 키와 비슷한 보안 수준을 제공합니다. 키 크기 옵션으로는 256비트, 384비트, 521비트를 선택할 수 있습니다.
작은 키 크기로 인해 빠른 연산 속도와 낮은 대역폭 사용량을 자랑하며, 현대적인 대부분의 시스템에서 지원됩니다. 하지만 타원곡선 파라미터 선택에 대한 논란이 있으며, 일부에서는 NSA가 백도어를 심었을 가능성을 제기하기도 합니다.
2.4 Ed25519 (Edwards-curve Digital Signature Algorithm)
Ed25519는 2011년에 Daniel J. Bernstein이 개발한 EdDSA(Edwards-curve Digital Signature Algorithm) 서명 방식의 구현체입니다. Curve25519 타원곡선을 사용합니다.
Ed25519는 고정된 256비트 키 길이를 사용하며, 이는 약 3072비트 RSA와 동등한 보안 수준을 제공합니다. 모든 현대 알고리즘 중에서 가장 빠른 서명 및 검증 속도를 자랑하며, 구현이 간단하고 부채널 공격에 강합니다.
타이밍 공격과 같은 부채널 공격에 대한 저항성이 설계 단계부터 고려되었으며, 결정론적 서명 방식으로 난수 생성기의 취약점으로부터 안전합니다. OpenSSH 6.5 이상에서 지원되며, 현재 SSH 키 생성 시 가장 권장되는 알고리즘입니다.
3. 알고리즘 비교표
각 알고리즘의 특징을 한눈에 비교하면 다음과 같습니다.
| 특성 | RSA | DSA | ECDSA | Ed25519 |
|---|---|---|---|---|
| 키 길이 | 2048-4096비트 | 1024비트 | 256-521비트 | 256비트 |
| 보안 수준 | 중~상 | 낮음 | 상 | 매우 높음 |
| 연산 속도 | 느림 | 보통 | 빠름 | 매우 빠름 |
| 키 크기 | 큼 | 보통 | 작음 | 매우 작음 |
| 호환성 | 매우 높음 | 높음 | 높음 | 중간 |
| 권장 여부 | 조건부 | 비권장 | 권장 | 가장 권장 |
4. ssh-keygen 사용법
SSH 키를 생성하는 기본 명령어와 주요 옵션들을 살펴보겠습니다.
4.1 기본 키 생성 명령어
가장 간단한 형태의 키 생성은 다음과 같습니다.
1
ssh-keygen -t ed25519 -C "your_email@example.com"
이 명령어는 Ed25519 알고리즘을 사용하여 키를 생성하며, -C 옵션으로 주석을 추가합니다. 주석은 일반적으로 이메일 주소나 키의 용도를 입력하여 나중에 키를 식별하기 쉽게 만듭니다.
4.2 알고리즘별 생성 명령어
RSA 키 생성은 키 길이를 지정할 수 있습니다. 최소 2048비트 이상을 사용해야 하며, 보안이 중요한 경우 4096비트를 권장합니다.
1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ECDSA 키 생성 시에는 키 크기를 256, 384, 521비트 중에서 선택할 수 있습니다.
1
ssh-keygen -t ecdsa -b 521 -C "your_email@example.com"
Ed25519는 고정 길이이므로 -b 옵션이 필요 없습니다.
1
ssh-keygen -t ed25519 -C "your_email@example.com"
4.3 주요 옵션 설명
-f 옵션으로 저장할 파일 경로와 이름을 지정할 수 있습니다. 기본값은 ~/.ssh/id_알고리즘명입니다.
1
ssh-keygen -t ed25519 -f ~/.ssh/github_key -C "github용 키"
-N 옵션으로 패스프레이즈를 명령줄에서 직접 지정할 수 있습니다. 빈 문자열을 사용하면 패스프레이즈 없이 키를 생성합니다.
1
ssh-keygen -t ed25519 -N "your_passphrase" -f ~/.ssh/deploy_key
-a 옵션은 KDF(Key Derivation Function) 라운드 수를 지정합니다. 높은 값은 브루트포스 공격에 대한 저항성을 높이지만 키 로딩 시간이 증가합니다. 기본값은 16이며, 보안이 중요한 경우 100 이상을 사용합니다.
1
ssh-keygen -t ed25519 -a 100
-o 옵션은 OpenSSH의 새로운 키 포맷을 사용합니다. OpenSSH 7.8 이후로는 기본값이지만, 이전 버전과의 호환성을 위해 명시적으로 지정할 수 있습니다.
4.4 키 생성 실행 과정
키 생성 명령어를 실행하면 다음과 같은 프롬프트가 나타납니다.
1
2
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
원하는 파일명을 입력하거나 Enter를 눌러 기본값을 사용합니다.
1
2
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
패스프레이즈를 입력합니다. 추가 보안 계층을 제공하지만, 자동화된 작업에서는 불편할 수 있습니다.
1
2
3
4
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:랜덤문자열 your_email@example.com
키 생성이 완료되면 개인키(id_ed25519)와 공개키(id_ed25519.pub) 두 파일이 생성됩니다.
5. 권장 알고리즘 선택 가이드
상황별로 적합한 알고리즘을 선택하는 방법을 알아보겠습니다.
5.1 일반적인 경우
대부분의 경우 Ed25519를 사용하는 것이 최선의 선택입니다. 뛰어난 보안성과 성능을 제공하며, 최신 시스템에서 널리 지원됩니다. 특별한 이유가 없다면 Ed25519를 사용하는 것을 강력히 권장합니다.
1
ssh-keygen -t ed25519 -a 100 -C "your_email@example.com"
5.2 레거시 시스템 호환성이 필요한 경우
오래된 서버나 시스템과의 호환성이 필요하다면 RSA 4096비트를 사용합니다. 거의 모든 SSH 서버에서 지원되며, 충분한 보안성을 제공합니다.
1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
5.3 여러 시스템을 관리하는 경우
다양한 환경에서 작업한다면 Ed25519를 기본으로 사용하되, 호환성이 필요한 특정 서버를 위해 RSA 키를 별도로 생성하여 관리하는 것이 좋습니다. SSH config 파일을 사용하면 서버별로 다른 키를 자동으로 사용하도록 설정할 수 있습니다.
1
2
3
4
5
6
7
8
# ~/.ssh/config
Host modern-server
HostName server1.example.com
IdentityFile ~/.ssh/id_ed25519
Host legacy-server
HostName server2.example.com
IdentityFile ~/.ssh/id_rsa
5.4 사용하지 말아야 할 알고리즘
DSA는 어떤 경우에도 새로 생성하지 말아야 합니다. 보안 수준이 낮고 OpenSSH에서도 기본적으로 비활성화되어 있습니다. 기존 DSA 키가 있다면 Ed25519나 RSA로 교체하는 것을 권장합니다.
6. SSH 키의 다양한 활용 사례
SSH 키는 서버 접속 외에도 여러 용도로 활용됩니다.
6.1 GitHub 및 GitLab 인증
GitHub, GitLab, Bitbucket 등의 Git 호스팅 서비스는 SSH 키를 통한 인증을 지원합니다. 이를 통해 저장소에 접근할 때마다 비밀번호를 입력할 필요가 없습니다.
GitHub에 SSH 키를 등록하려면 공개키 내용을 복사하여 GitHub 설정의 SSH Keys 섹션에 추가합니다.
1
cat ~/.ssh/id_ed25519.pub
여러 GitHub 계정을 사용하는 경우 각 계정별로 별도의 키를 생성하고 SSH config로 관리할 수 있습니다.
1
2
3
4
5
6
7
8
9
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/work_key
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/personal_key
6.2 자동화 및 배포 파이프라인
CI/CD 파이프라인에서 자동 배포를 수행할 때 SSH 키가 사용됩니다. 이 경우 패스프레이즈가 없는 키를 생성하여 자동화 서버에 배치합니다. 보안을 위해 해당 키는 배포 작업에 필요한 최소한의 권한만 가지도록 설정해야 합니다.
6.3 포트 포워딩 및 터널링
SSH는 안전한 터널을 생성하여 암호화되지 않은 프로토콜을 보호하는 데도 사용됩니다. 로컬 포트 포워딩, 원격 포트 포워딩, 동적 포트 포워딩(SOCKS 프록시) 등 다양한 방식으로 활용할 수 있습니다.
1
2
3
4
5
# 로컬 포트 8080을 원격 서버의 80번 포트로 포워딩
ssh -L 8080:localhost:80 user@server.com
# 동적 포트 포워딩으로 SOCKS 프록시 생성
ssh -D 1080 user@server.com
6.4 원격 백업 및 파일 동기화
rsync나 scp 같은 도구는 SSH를 통해 안전하게 파일을 전송합니다. 자동화된 백업 스크립트에서 패스프레이즈 없는 SSH 키를 사용하면 무인 백업 시스템을 구축할 수 있습니다.
1
rsync -avz -e ssh /local/path/ user@backup-server:/backup/path/
6.5 점프 서버(Bastion Host) 접속
보안이 강화된 네트워크 환경에서는 점프 서버를 통해서만 내부 서버에 접근할 수 있습니다. SSH 키와 ProxyJump 설정을 조합하면 편리하게 다단계 접속이 가능합니다.
1
2
3
4
5
6
7
8
9
Host internal-server
HostName 10.0.1.100
User admin
ProxyJump jump-server
Host jump-server
HostName jump.example.com
User jumpuser
IdentityFile ~/.ssh/jump_key
7. 보안 모범 사례
SSH 키를 안전하게 관리하기 위한 몇 가지 중요한 지침이 있습니다.
개인키 파일의 권한은 반드시 소유자만 읽을 수 있도록 설정해야 합니다. 권한이 너무 개방적이면 SSH가 키 사용을 거부합니다.
1
2
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
일반적인 서버 접속에는 항상 패스프레이즈를 설정하는 것이 좋습니다. 개인키가 유출되더라도 패스프레이즈가 추가 보호 계층 역할을 합니다. ssh-agent를 사용하면 세션 동안 한 번만 패스프레이즈를 입력하면 됩니다.
1
2
3
4
5
# ssh-agent 시작
eval "$(ssh-agent -s)"
# 키 추가 (패스프레이즈 한 번만 입력)
ssh-add ~/.ssh/id_ed25519
용도별로 다른 SSH 키를 생성하여 사용하는 것을 권장합니다. 예를 들어 개인 프로젝트용, 업무용, GitHub용으로 각각 별도의 키를 만들면 보안이 강화됩니다. 하나의 키가 손상되어도 다른 용도의 접근은 안전하게 유지됩니다.
정기적으로 키를 교체하는 것도 좋은 보안 습관입니다. 특히 퇴사자가 발생하거나 키 유출 가능성이 있는 경우 즉시 새 키를 생성하고 이전 키는 서버에서 제거해야 합니다.
서버의 authorized_keys 파일에서 불필요한 공개키는 주기적으로 정리합니다. 사용하지 않는 오래된 키가 쌓여있으면 보안 위험이 됩니다.
8. 마치며
SSH 키 생성은 서버 관리의 기본이자 중요한 보안 요소입니다. 현재 가장 권장되는 알고리즘은 Ed25519이며, 레거시 시스템 호환성이 필요한 경우에만 RSA 4096비트를 사용하는 것이 좋습니다. DSA는 더 이상 사용하지 않아야 합니다.
적절한 알고리즘을 선택하고 보안 모범 사례를 따르면 안전하고 효율적인 SSH 기반 인프라를 구축할 수 있습니다. 키 관리는 한 번 설정하고 끝나는 것이 아니라 지속적인 관리와 업데이트가 필요한 영역입니다.