SSH 키 인증. 비밀번호를 없애는 요령이 아니라 서버 신원 확인, 개인 키 보호, 공개 키 배포, 새 세션 검증과 로그인 정책 강화가 이어지는 신뢰 절차입니다. 개인 키는 클라이언트 밖으로 복사하지 않고 passphrase와 ssh-agent로 보호합니다.

이 가이드는 SSH 키 인증을 Ed25519 기준으로 설정하되 FIPS 모드의 RSA 대안, known_hosts 검증, authorized_keys 권한, sshd 구성 검사, 키 폐기와 장애 복구까지 운영 순서로 설명합니다.

SSH 키 인증 흐름: 클라이언트 개인 키와 agent, known_hosts, 서버 authorized_keys, 새 세션 검증
개인 키는 클라이언트에 남기고 서버 신원과 공개 키 인증을 확인한 뒤 로그인 정책을 강화

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'
개인 키 파일은 서버, 티켓, 메신저, Git 저장소에 올리지 않습니다. 서버에 배포하는 것은 확장자가 .pub인 공개 키 한 줄뿐입니다.

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
위 두 출력의 SHA256 지문이 별도 채널에서 확인한 값과 정확히 같을 때만 known_hosts 파일을 사용합니다. 불일치하면 접속을 중단하고 DNS, IP, 재설치 기록을 조사하십시오.

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 키 인증: 비밀번호 로그인을 끄기 전 검증

현재 관리자 세션을 닫지 않은 상태에서 별도 터미널로 공개 키 로그인을 확인하십시오. 콘솔 복구 수단과 sudo 권한도 검증하기 전에는 PasswordAuthentication을 끄지 않습니다.
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를 실행합니다.

공식 문서와 관련 운영 가이드

SSH 키 인증은 키 생성보다 운영 수명주기 관리가 더 중요합니다. 개인 키를 클라이언트에만 두고, 서버 지문을 검증하고, 새 세션을 확인한 뒤 정책을 강화하며, 유출 키를 즉시 폐기할 수 있어야 비밀번호 없는 접속이 실제 보안 향상으로 이어집니다.