[Home Lab #1] SSH Password 인증에서 Key 기반(Ed25519) 인증으로 갈아타기
미니 PC를 장만하면서 Ubuntu를 설치해 개인 서버로 운영하기 시작했습니다. 가장 먼저 마주한 과제는 ‘외부 접속’이었습니다. 미니 PC에 키보드, 마우스, 모니터를 연결해서 관리하는 것이 아니라, 본체는 전원만 연결해 구석에두고 노트북으로 작업하거나 카페에서도 제 서버에 자유롭게 접속하고 싶었습니다.
처음에는 가장 직관적인 ‘비밀번호 방식’으로 SSH를 열어두었습니다. 하지만 보안 공부를 할수록 비밀번호 방식이 얼마나 취약한지 알게 되었고, 더 안전한 SSH Key-based Authenticaion으로 전환하기로 결심했습니다.
1. 왜 비밀번호 방식을 버리고 Key를 선택했는가 ?
처음 서버를 구축했을 때는 단순히 “나만 아는 복잡한 비밀번호를 쓰면 괜찮겠지” 라고 생각했습니다. 당시에는 딱히 공격 로그를 분석해 보진 않았지만, 여러 보안 가이드를 읽으며 깨달은 점은 비밀번호라는 체계 자체가 가진 근본적인 한계였습니다.
- 무차별 대입 공격(Brute-force) : 아무리 복잡하게 설정해도 사람이 외울 수 있는 수준의 비밀번호는 컴퓨터의 연산 능력 앞에서는 무용지물입니다. 전 세계의 수많은 봇(Bot)들은 지금 이 순간에도 임의의 IP를 찾아내어 초당 수백 번씩 로그인을 시도하고 있습니다.
- 소유 기반 인증의 강력함 : 비밀번호는 ‘내가 알고 있는 것’을 증명하는 방식이지만, SSH Key는 ‘내가 소유하고 있는 물리적 파일’을 증명하는 방식입니다. 해커가 저의 비밀번호를 유추해는 것보다, 제 로컬 컴퓨터 안에 있는 Key 파일을 물리적으로 훔쳐가는 것이 훨씬 어렵기 때문에 보안 수준이 비약적으로 상승합니다.
2. SSH(Secure Shell)와 Key 인증의 원리
2.1 SSH란 무엇인가 ?
SSH는 네트워크상의 다른 컴퓨터에 접속할 때 사용하는 암호화 통신 프로토콜입니다. 예전의 Telnet 같은 방식은 데이터를 평문으로 전송했기에 중간에서 누가 패킷을 가로채면 비밀번호가 그대로 노출되었습니다.
SSH는 모든 데이터를 암호화하여 통로(Shell)를 보호합니다.
2.2 비대칭키 암호화
SSH key 인증의 핵심은 비대칭키 알고리즘입니다. 여기에는 한 쌍의 키가 존재합니다.
- Public Key (공개키) : 자물쇠와 같습니다. 누구에게나 공개되어도 상관없으며, 접속하고자 하는 원격 서버에 저장합니다.
- Private Key (비공개키) : 열쇠와 같습니다. 절대 유출되면 안 되며, 접속을 시도하는 내 로컬 컴퓨터에만 안전하게 보관합니다.
⇒ 공개키로 암호화한 데이터는 오직 그와 쌍을 이루는 비공개키로만 풀 수 있습니다. 이 원리를 이용해 “이 열쇠를 가진 사람이 진짜 주인인가?”를 확인합니다.
2.3 SSH Authentication 동작 방식
서버와 클라이언트가 연결될 때, 단순히 Key 파일을 주고받는 것이 아닙니다. 아래와 같은 정교한 과정을 거칩니다.

(이해를 돕기 위해 Gemini를 사용해 이미지를 생성했습니다.)
- Client → Server (접속 요청) : “저 접속하고 싶어요”라고 요청을 보냅니다.
- Server → Client (난수 메시지 전송) : 서버는 무작위로 생송한 난수 메시지(Challenge)를 보냅니다.
- Client → Server (암호화) : 클라이언트는 로컬의 비공개키로 이 메시지를 암호화하여 서버에 다시 보냅니다.
- Server (복호화) : 서버는 이미 가지고 있던 클라이언트의 공개키로 전달받은 메시지를 복호화합니다.
- Verification : 복호화된 내용이 처음에 보낸 난수와 일치하면 서버는 클라이언트를 신뢰하고 접속을 허용합니다.
3. 알고리즘 선택 : 왜 RSA가 아닌 Ed25519인가?
Key를 생성하려고 하면 RSA, Ed25519 등 다양한 알고리즘을 마주하게 됩니다. 저는 이들 중에서 Ed25519 를 선택했습니다.
3.1 RSA (Rivest-Shamir-Adleman)
오랫동안 표준으로 사용된 알고리즘으로, 큰 소수의 인수분해가 어렵다는 점을 이용합니다.
- 보안성을 위해 최소
3,072bit이상의 Key 길이가 권장됩니다. - Key 길이가 길어질수록 연산 속도가 느려지고 관리가 번거롭습니다.
3.2 Ed25519 (Edwards-curve Digital Signature Algorithm)
타원곡선 암호(ECC)를 기반으로 한 차세대 알고리즘입니다.
- 단
256bit의 Key 길이로도RSA3,072bit이상의 보안 수준을 제공합니다. - 서명 생성 및 검증 속도가
RSA보다 훨씬 빠르며 CPU 소모가 적습니다. - 부채널 공격(Side-channel attack) 등 현대적인 공격 기법에 내성을 갖도록 설계되었습니다.
⇒ 호환성이 극도로 중요한 구형 장비가 아니라면, 보안과 성능 면에서 월등한 Ed25519 를 사용하는 것이 최선이라고 생각했습니다.
4. SSH Key 생성 및 설정
환경 : Client (macOS), Server (Ubuntu 24.04 LTS)
1. 로컬 PC에서 Ed25519 Key 쌍 생성
먼저 내 컴퓨터(서버에 접속할 컴퓨터)의 터미널에서 Key를 생성합니다.
ssh-keygen -t ed25519 -C "{my_home_server}"
-t ed25519: 생성할 키의 알고리즘 타입(Type)을 지정합니다. 여기서는Ed25519를 선택했습니다.-C "comment": 주석을 추가합니다. 보통 어떤 서버용인지, 혹은 본인의 이메일을 적어 Key를 식별하는 데 사용합니다.
- 명령어 실행 후 저장 위치를 묻는데, 기본값(
~/.ssh/id_ed25519)을 유지하려면 Enter를 누릅니다. - Passphrase: Key 자체에 대한 비밀번호입니다. Key 파일이 유출되더라도 이 암호를 모르면 사용할 수 없으므로 설정을 권장합니다.
2. 서버로 공개키 전송
생성된 공개키(id_ed25519.pub)를 원격 서버에 등록해야 합니다.
ssh-copy-id -i ~/.ssh/id_ed25519.pub {username}@{your_server_ip}
-i: 전송할 신원 확인용 파일(Identity file)의 경로를 지정합니다. 반드시.pub확장자가 붙은 공개키를 보내야 합니다.- 이 명령을 실행하면 서버의
~/.ssh/authorized_keys파일에 저의 공개키가 자동으로 추가됩니다.
3. 서버 설정 변경 (비밀번호 접속 차단)
이제 Key가 없으면 비밀번호로도 들어올 수 없게 서버를 잠가야 합니다. 서버에 접속한 후 SSH 설정 파일을 수정합니다.
sudo vim /etc/ssh/sshd_config
저는 Vim 에디터를 사용하였고, 아래의 항목들을 찾아 수정해줍니다.
(Vim에서 / 를 눌러 검색하면 편합니다.)
PasswordAuthentication no: 비밀번호 기반 인증 비활성화PubkeyAuthentication yes: 공개키 기반 인증 활성화ChallengeResponseAuthentication no: 키보드 입력 인증 방식 차단
수정이 끝났다면 변경사항을 적용하기 위해 SSH 서비스를 재시작합니다.
sudo systemctl restart ssh
5. 마무리
이제 저의 미니 PC 서버는 오직 제가 가진 Ed25519 비공개키가 있어야만 접속할 수 있는 상태가 되었습니다. 비밀번호를 탈취당할 걱정에서 한시름 놓았습니다.
개인 서버를 운영한다면 이 설정은 ‘선택’이 아닌 ‘필수’라고 생각합니다.
참고 자료
[SSH] SSH의 key based authentication에 대하여 (공개키 암호화에 대한 이해)
댓글남기기