SSH 키 인증. 비밀번호를 없애는 요령이 아니라 서버 신원 확인, 개인 키 보호, 공개 키 배포, 새 세션 검증과 로그인 정책 강화가 이어지는 신뢰 절차입니다. 개인 키는 클라이언트 밖으로 복사하지 않고 passphrase와 ssh-agent로 보호합니다.
이 가이드는 SSH 키 인증을 Ed25519 기준으로 설정하되 FIPS 모드의 RSA 대안, known_hosts 검증, authorized_keys 권한, sshd 구성 검사, 키 폐기와 장애 복구까지 운영 순서로 설명합니다.

SSH 키 인증: 두 가지 검증을 구분
| 검증 대상 | 저장 위치 | 실패했을 때 위험 |
|---|---|---|
| 서버가 진짜인가 | 클라이언트 known_hosts | 중간자 서버에 접속할 수 있음 |
| 사용자가 허가됐는가 | 서버 authorized_keys | 도난·미승인 키가 로그인할 수 있음 |
공개 키 사용자 인증만 맞아도 안전하다고 볼 수 없습니다. 서버 host key 지문을 신뢰할 수 있는 콘솔, 자산 관리 시스템 또는 별도 채널로 확인해야 목적지 서버를 바꿔치기한 공격을 탐지할 수 있습니다.
클라이언트에서 passphrase가 있는 키 생성
일반 환경에는 Ed25519가 간결하고 안전한 기본값입니다. 다만 Ed25519는 FIPS 모드에서 허용되지 않을 수 있으므로 해당 정책에서는 충분한 길이의 RSA 키를 사용합니다. 기존 키 파일을 덮지 않도록 용도별 파일 이름을 지정하십시오.
install -d -m 0700 ~/.ssh
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_ops -C 'ops-admin@client'
chmod 0600 ~/.ssh/id_ed25519_ops
chmod 0644 ~/.ssh/id_ed25519_ops.pub
FIPS 정책의 RSA 대안
ssh-keygen -t rsa -b 3072 -o -a 100 -f ~/.ssh/id_rsa_ops -C 'ops-admin@client'
ssh-agent로 키 잠금 해제 상태 관리
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_ops
ssh-add -l
서버 host key 지문을 별도 채널로 검증
서버 콘솔에서 공개 host key 지문을 출력하고 클라이언트가 처음 보는 지문과 대조합니다. ssh-keyscan은 키를 수집할 뿐 그 키가 진짜 서버의 것인지 증명하지 않으므로 결과를 무검증으로 신뢰하면 안 됩니다.
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
sudo ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
ssh-keyscan -t ed25519 server.example.com > /tmp/server.hostkey
ssh-keygen -lf /tmp/server.hostkey
install -m 0600 /tmp/server.hostkey ~/.ssh/known_hosts.ops
rm -f /tmp/server.hostkey
SSH 키 인증: 공개 키를 authorized_keys에 배포
SSH 키 인증을 처음 설정할 때는 현재 허용된 비밀번호나 콘솔로 한 번 접속해 공개 키를 추가합니다. ssh-copy-id를 사용할 수 있으면 중복과 권한 처리가 간단합니다.
ssh-copy-id -i ~/.ssh/id_ed25519_ops.pub ops@server.example.com
ssh-copy-id가 없을 때 수동 배포
cat ~/.ssh/id_ed25519_ops.pub | ssh ops@server.example.com 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'
chmod 0700 ~/.ssh
chmod 0600 ~/.ssh/authorized_keys
restorecon -RFv ~/.ssh
SELinux가 활성화된 RHEL 계열에서는 파일 권한뿐 아니라 컨텍스트도 맞아야 합니다. 홈 디렉터리가 다른 사용자에게 쓰기 가능하지 않은지도 확인하십시오.
클라이언트 별칭과 명시적 키 선택
Host prod-app-01
HostName server.example.com
User ops
IdentityFile ~/.ssh/id_ed25519_ops
IdentitiesOnly yes
UserKnownHostsFile ~/.ssh/known_hosts.ops
chmod 0600 ~/.ssh/config
ssh -v prod-app-01
SSH 키 인증: 비밀번호 로그인을 끄기 전 검증
ssh -o PreferredAuthentications=publickey -o PasswordAuthentication=no prod-app-01
sudo -v
whoami
sshd 설정 문법과 실제 적용값 확인
sudo sshd -t
sudo sshd -T | grep -E '^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '
키 인증이 검증된 뒤 drop-in 파일로 정책을 분리합니다. 배포판의 include 순서와 Match 블록에 따라 최종 값이 달라질 수 있으므로 파일 내용이 아니라 sshd -T 출력으로 확인해야 합니다.
sudo install -d -m 0755 /etc/ssh/sshd_config.d
sudo tee /etc/ssh/sshd_config.d/20-key-auth.conf >/dev/null <<'CONF'
PubkeyAuthentication yes
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
CONF
sudo sshd -t
sudo systemctl reload sshd
ssh -o PreferredAuthentications=publickey prod-app-01
sudo journalctl -u sshd --since '-10 minutes' --no-pager
SSH 키 인증: 키 범위 제한과 폐기
자동화 키는 사람의 범용 관리자 키와 분리하고, 필요한 경우 authorized_keys 옵션으로 출발지나 기능을 제한합니다. 제한 옵션은 서비스가 실제로 필요한 터널링·PTY 동작을 막을 수 있으므로 테스트 환경에서 먼저 검증합니다.
from="198.51.100.0/24",restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... deploy-key
키가 유출되거나 사용자가 떠나면 해당 공개 키 줄을 제거합니다. 중앙 폐기가 필요하면 OpenSSH KRL을 만들고 sshd의 RevokedKeys에 연결할 수 있습니다.
sudo ssh-keygen -k -f /etc/ssh/revoked.krl compromised_key.pub
sudo chmod 0644 /etc/ssh/revoked.krl
sudo sshd -t
sudo systemctl reload sshd
SSH 키 인증: 문제 해결
ssh -vvv prod-app-01
ssh-add -l
ssh-keygen -lf ~/.ssh/id_ed25519_ops.pub
sudo journalctl -u sshd -b --no-pager
sudo namei -l /home/ops/.ssh/authorized_keys
sudo ls -ldZ /home/ops /home/ops/.ssh /home/ops/.ssh/authorized_keys
sudo sshd -T
- Offering public key 뒤 거부되면 사용자, 공개 키 줄, 권한과 SELinux 컨텍스트를 확인합니다.
- Too many authentication failures면 IdentitiesOnly와 IdentityFile을 명시합니다.
- REMOTE HOST IDENTIFICATION HAS CHANGED는 무조건 삭제하지 말고 서버 재설치·DNS 변경 여부를 검증합니다.
- 설정 변경 후 접속 불가라면 기존 세션이나 콘솔에서 drop-in을 되돌리고 sshd -t를 실행합니다.
공식 문서와 관련 운영 가이드
- Red Hat: OpenSSH로 안전한 통신 구성
- OpenSSH sshd_config 매뉴얼
- OpenSSH ssh-keygen 매뉴얼
- Ansible 플레이북과 SSH 자동화 보안
- Kubespray의 관리 계정과 host key 검증
SSH 키 인증은 키 생성보다 운영 수명주기 관리가 더 중요합니다. 개인 키를 클라이언트에만 두고, 서버 지문을 검증하고, 새 세션을 확인한 뒤 정책을 강화하며, 유출 키를 즉시 폐기할 수 있어야 비밀번호 없는 접속이 실제 보안 향상으로 이어집니다.