안녕하세요. 비전 IDC 기술팀입니다.
SSH 키 인증은 비밀번호 대신 한 쌍의 암호화 키(개인 키와 공개 키)로 서버에 로그인하는 방식입니다. 서버에는 공개 키만 등록하고, 개인 키는 접속하는 PC에만 보관하므로 비밀번호 추측이나 무차별 대입 공격으로 로그인될 위험을 크게 줄일 수 있습니다. 또한 백업 스크립트나 rsync 동기화처럼 사람이 비밀번호를 입력할 수 없는 자동화 작업에도 널리 사용됩니다.
이 문서에서는 Ed25519 키 생성, ssh-copy-id를 이용한 공개 키 등록, 수동 등록 시 올바른 권한 설정, 키 로그인 테스트, 그리고 테스트가 끝난 뒤 비밀번호 로그인을 비활성화하는 방법까지 CentOS와 Ubuntu 서버를 기준으로 설명합니다.
적용 환경
- 서버: CentOS 7, Rocky Linux / AlmaLinux 8·9, Ubuntu 20.04 / 22.04 / 24.04 (OpenSSH 서버)
- 클라이언트: Linux, macOS, Windows 10/11의 OpenSSH 클라이언트 (PuTTY 사용자는 별도 문서 참고)
- 권장 키 유형: Ed25519 (오래된 시스템과 호환이 필요하면 RSA 3072/4096비트)
- SSH 서비스명: CentOS·Rocky·AlmaLinux는
sshd, Ubuntu는ssh - 공개 키 등록 파일: 접속 계정의
~/.ssh/authorized_keys
1. SSH 키 인증 동작 방식
- 개인 키(예:
~/.ssh/id_ed25519): 접속하는 PC에만 보관하며 절대 외부에 공유하지 않습니다. - 공개 키(예:
~/.ssh/id_ed25519.pub): 서버 계정의~/.ssh/authorized_keys파일에 한 줄로 등록합니다. 공개 키는 노출되어도 로그인에 사용할 수 없습니다.
접속 시 서버는 등록된 공개 키로 클라이언트가 해당 개인 키를 가지고 있는지 검증합니다. 개인 키 자체는 네트워크로 전송되지 않습니다. 키는 계정 단위로 등록되므로 root와 일반 계정에 각각 사용하려면 각 계정의 홈 디렉터리에 따로 등록해야 합니다.
2. 클라이언트에서 키 생성 (ssh-keygen)
접속에 사용할 PC(또는 다른 서버를 접속하는 서버)에서 키를 생성합니다. Linux, macOS의 터미널과 Windows 10/11의 PowerShell에서 같은 명령을 사용할 수 있습니다.
ssh-keygen -t ed25519 -C "admin@my-pc"
-C 뒤의 값은 키를 구분하기 위한 설명(주석)이며 자유롭게 지정할 수 있습니다. 실행하면 다음 순서로 질문이 표시됩니다.
- 저장 위치: Enter를 누르면 기본 경로(
~/.ssh/id_ed25519)에 저장됩니다. 이미 같은 이름의 키가 있다면 덮어쓰지 않도록 주의합니다. - 암호(passphrase): 개인 키 파일을 보호하는 암호입니다. 설정해 두면 개인 키 파일이 유출되더라도 암호 없이는 사용할 수 없으므로, 사람이 직접 접속하는 용도라면 설정을 권장합니다. 무인 자동화 작업용 키는 용도를 제한해 별도로 만듭니다.
생성된 파일을 확인합니다.
ls -l ~/.ssh/
cat ~/.ssh/id_ed25519.pub
id_ed25519는 개인 키, id_ed25519.pub는 공개 키입니다. 공개 키는 ssh-ed25519 AAAA... admin@my-pc 형식의 한 줄로 되어 있습니다.
3. ssh-copy-id로 공개 키 등록
현재 서버에 비밀번호로 로그인할 수 있다면 ssh-copy-id로 공개 키를 가장 간단하고 안전하게 등록할 수 있습니다. 서버의 ~/.ssh 디렉터리와 authorized_keys 파일이 없으면 만들고, 공개 키를 추가합니다.
ssh-copy-id -i ~/.ssh/id_ed25519.pub 사용자명@서버IP
SSH 포트를 변경한 서버라면 포트를 지정합니다.
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 사용자명@서버IP
서버 계정의 비밀번호를 한 번 입력하면 등록이 완료되고, 등록된 키 개수와 함께 접속 테스트 방법이 안내됩니다.
4. 공개 키를 수동으로 등록하는 방법
ssh-copy-id를 사용할 수 없다면 공개 키 내용을 복사해 서버에 직접 추가합니다. 먼저 클라이언트에서 공개 키 한 줄을 복사합니다.
cat ~/.ssh/id_ed25519.pub
서버에 키를 등록할 계정으로 로그인한 뒤 다음 명령을 실행합니다. 따옴표 안의 내용은 실제 공개 키 전체 한 줄로 바꿔 입력합니다.
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo 'ssh-ed25519 AAAA...공개키_전체... admin@my-pc' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
root 권한으로 다른 계정에 키를 등록하는 경우
root로 작업하면서 다른 계정(예: deploy)에 키를 등록한다면 파일 소유자를 해당 계정으로 바꿔야 합니다. 소유자가 root로 남아 있으면 키 인증이 거부됩니다.
mkdir -p /home/deploy/.ssh
vi /home/deploy/.ssh/authorized_keys
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
권한 요구 사항 정리
sshd는 기본적으로 StrictModes가 활성화되어 있어, 다른 사용자가 수정할 수 있는 권한이면 키 파일을 신뢰하지 않고 키 인증을 거부합니다.
| 대상 | 권장 권한 | 소유자 |
|---|---|---|
홈 디렉터리 (~) |
그룹·기타 사용자 쓰기 권한 없음 (예: 700 또는 755) | 해당 계정 |
~/.ssh |
700 | 해당 계정 |
~/.ssh/authorized_keys |
600 | 해당 계정 |
클라이언트의 개인 키 (~/.ssh/id_ed25519) |
600 | 사용자 본인 |
CentOS에서 SELinux 컨텍스트 복원
SELinux가 활성화된 CentOS·Rocky·AlmaLinux에서 .ssh 디렉터리를 수동으로 만들었거나 다른 위치에서 복사해 왔다면 보안 컨텍스트가 맞지 않아 키 인증이 거부될 수 있습니다. 다음 명령으로 기본 컨텍스트를 복원합니다.
restorecon -Rv ~/.ssh
5. 키 로그인 테스트
기존 SSH 세션은 닫지 말고 새 터미널에서 접속을 시도합니다.
ssh -i ~/.ssh/id_ed25519 사용자명@서버IP
키에 암호를 설정했다면 키 암호를 묻는 메시지(Enter passphrase for key)가 표시됩니다. 서버 계정 비밀번호를 묻지 않고 로그인되면 키 인증이 정상적으로 동작하는 것입니다.
인증 과정을 자세히 확인하려면 -v 옵션을 사용합니다.
ssh -v -i ~/.ssh/id_ed25519 사용자명@서버IP
출력에서 Offering public key 다음에 Server accepts key가 표시되고 Authenticated ... using "publickey"로 끝나면 키로 인증된 것입니다.
접속 설정을 간단하게 저장하기 (선택)
클라이언트의 ~/.ssh/config에 접속 정보를 저장하면 짧은 이름으로 접속할 수 있습니다. 값은 예시이므로 실제 환경에 맞게 수정합니다.
Host web01
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519
chmod 600 ~/.ssh/config
ssh web01
6. 비밀번호 로그인 비활성화
모든 관리 계정에서 키 로그인이 정상 동작하는 것을 확인했다면, 비밀번호 로그인을 막아 무차별 대입 공격을 원천적으로 차단할 수 있습니다. 이 단계 역시 콘솔 접속 수단(VPS의 VNC·웹 콘솔, 단독서버의 KVM/IPMI)을 확인한 상태에서 진행합니다.
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
sudo vi /etc/ssh/sshd_config
다음 항목을 찾아 값을 설정합니다. 주석(#) 처리되어 있다면 주석을 해제합니다.
PubkeyAuthentication yes
PasswordAuthentication no
root 계정은 키로만 로그인하도록 제한하려면 다음 설정을 함께 사용할 수 있습니다. root 직접 로그인을 완전히 막으려면 no로 설정합니다.
PermitRootLogin prohibit-password
Ubuntu의 추가 설정 파일 확인
Ubuntu 20.04 이후 버전의 기본 sshd_config는 파일 앞부분의 Include 지시어로 /etc/ssh/sshd_config.d/ 디렉터리의 .conf 파일을 먼저 읽어 들입니다. sshd는 같은 항목이 여러 번 나오면 처음 읽은 값을 사용하므로, 이 디렉터리의 파일(예: 클라우드 이미지가 만든 설정)에 PasswordAuthentication yes가 있으면 본 파일의 설정이 적용되지 않습니다.
sudo grep -ri passwordauthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ 2>/dev/null
충돌하는 값이 있다면 해당 파일의 값도 no로 수정합니다.
문법 검사와 적용
변경 후 문법을 검사하고 실제로 적용될 값을 확인합니다.
sudo sshd -t
sudo sshd -T | grep -Ei '^(passwordauthentication|pubkeyauthentication|permitrootlogin)'
검사를 통과했다면 SSH 서비스를 재시작합니다. 서비스 이름은 배포판에 따라 다릅니다.
# CentOS 7, Rocky Linux, AlmaLinux
sudo systemctl restart sshd
# Ubuntu
sudo systemctl restart ssh
마지막으로 새 터미널에서 키 로그인이 되는지, 그리고 키 없이 접속하면 비밀번호를 묻지 않고 거부되는지 확인합니다.
ssh -o PubkeyAuthentication=no 사용자명@서버IP
Permission denied (publickey)가 표시되면 비밀번호 로그인이 정상적으로 차단된 것입니다.
7. 자주 발생하는 문제와 확인 방법
| 증상 | 가능한 원인 | 확인 및 해결 방향 |
|---|---|---|
| 키를 등록했는데 계속 비밀번호를 물어봄 | 권한·소유자 오류, 다른 계정에 등록, 공개 키 줄 깨짐 | ls -ld ~ ~/.ssh ~/.ssh/authorized_keys로 권한을 확인하고, 접속 계정과 키를 등록한 계정이 같은지 확인합니다. |
| CentOS에서 권한은 맞는데 키 인증 실패 | SELinux 보안 컨텍스트 불일치 | restorecon -Rv ~/.ssh를 실행합니다. |
Permission denied (publickey) |
비밀번호 인증이 꺼진 상태에서 올바른 키를 사용하지 않음 | ssh -v로 어떤 키를 제시하는지 확인하고 -i로 올바른 개인 키를 지정합니다. |
UNPROTECTED PRIVATE KEY FILE! 경고 |
클라이언트 개인 키 권한이 너무 넓음 | chmod 600 ~/.ssh/id_ed25519로 권한을 줄입니다. |
| 비밀번호 비활성화 후에도 비밀번호 로그인이 됨 | sshd_config.d의 설정이 우선 적용되거나 재시작 누락 |
sshd -T 결과에서 실제 적용 값을 확인하고 서비스를 재시작합니다. |
Host key verification failed |
서버 재설치 등으로 호스트 키 변경 | 원인을 확인한 뒤 클라이언트의 known_hosts에서 해당 항목을 정리합니다. |
서버 쪽 인증 로그에서 거부 사유를 확인할 수 있습니다.
# CentOS 7, Rocky Linux, AlmaLinux
sudo tail -n 50 /var/log/secure
# Ubuntu
sudo journalctl -u ssh -n 50 --no-pager
Authentication refused: bad ownership or modes 같은 메시지가 있다면 권한 문제입니다. 해결되지 않으면 비전 IDC 1:1 문의(https://visionidc.com/submitticket.php) 또는 텔레그램 VISIONIDC24로 문의해 주시기 바랍니다.
8. 관련 기술자료와 공식 참고자료
관련 비전 IDC 기술자료
- Windows PC에서 PuTTY로 SSH 접속하는 방법 — PuTTYgen 키 생성, .ppk 변환, PuTTY에서 개인 키 지정
- CentOS 7 SSH 포트 변경 방법
- Ubuntu SSH 접속 포트 변경하는 방법
- Ubuntu 무차별 대입 공격에 대한 보안 설정
- CentOS 7에서 SSH 접속 시 Host key verification failed 오류를 해결하는 방법
공식 참고자료
- OpenSSH ssh-keygen 매뉴얼
- OpenSSH sshd_config 매뉴얼 —
PubkeyAuthentication,PasswordAuthentication,AuthorizedKeysFile,StrictModes
9. 자주 묻는 질문
개인 키를 여러 PC에서 복사해 사용해도 되나요?
가능은 하지만 권장하지 않습니다. PC마다 별도의 키를 만들어 각각 등록하면, 한 PC를 분실했을 때 authorized_keys에서 해당 키 한 줄만 삭제해 접근을 차단할 수 있습니다.
등록한 키를 삭제하려면 어떻게 하나요?
서버 계정의 ~/.ssh/authorized_keys를 열어 해당 공개 키 줄을 삭제하면 됩니다. 키 끝의 주석(-C로 지정한 값)으로 어떤 키인지 구분할 수 있으므로 키를 만들 때 알아보기 쉬운 주석을 붙이는 것이 좋습니다.
키 암호(passphrase)를 매번 입력하기 번거롭습니다.
ssh-agent에 키를 등록하면 세션 동안 한 번만 암호를 입력하면 됩니다. Linux·macOS에서는 ssh-add ~/.ssh/id_ed25519를 사용하고, PuTTY 사용자는 Pageant를 사용할 수 있습니다.
개인 키를 잃어버렸는데 비밀번호 로그인도 막아 두었습니다.
SSH로는 접속할 수 없으므로 VPS의 VNC·웹 콘솔 또는 단독서버의 KVM/IPMI로 로그인해 새 공개 키를 등록하거나 임시로 비밀번호 인증을 허용해야 합니다. 콘솔 사용이 어렵다면 비전 IDC 기술지원에 문의해 주십시오.
마무리
이번 문서에서는 ssh-keygen으로 Ed25519 키를 만들고, ssh-copy-id 또는 수동 방식으로 authorized_keys에 공개 키를 등록한 뒤, 키 로그인을 확인하고 비밀번호 로그인을 비활성화하는 과정을 살펴봤습니다.
키 인증 문제의 대부분은 ~/.ssh 700, authorized_keys 600 권한과 소유자 설정에서 발생합니다. 설정 변경은 항상 기존 세션을 유지한 채 새 세션으로 확인하는 순서를 지키시기 바랍니다.
