SSH Permission denied (publickey) 원인 찾기
ssh -v 로 어느 키를 내밀었는지 보고, 서버 로그의 Authentication refused 문구로 권한·사용자·키 줄 문제를 가려 chmod 로 고칩니다.
alice@server1: Permission denied (publickey).클라이언트에는 이 한 줄뿐이라 원인은 서버 로그에서 찾습니다. 아래 서버 출력은 별도 sshd 를 -e 로 띄워 받은 실제 로그이고, 사용자·경로만 alice · /home/alice/.ssh 로 바꿨습니다.
[1] 클라이언트에서 -v 로 접속해 어느 키를 내밀었는지 봅니다. Offering public key 가 내민 키이고, 서버가 받으면 바로 아래에 Server accepts key 가 붙습니다. 그 줄이 없으면 서버가 그 키를 거절한 것입니다.
$ ssh -v alice@server1debug1: Will attempt key: /home/bob/.ssh/id_ed25519 ED25519 SHA256:tlR0lx+Gl7RrUcp9VHU+p+/qMk325ndyJO7Diu4hVi0 explicitdebug1: Offering public key: /home/bob/.ssh/id_ed25519 ED25519 SHA256:tlR0lx+Gl7RrUcp9VHU+p+/qMk325ndyJO7Diu4hVi0 explicitalice@server1: Permission denied (publickey).[2] 서버에서 sshd 로그를 봅니다. Ubuntu 24.04 의 유닛 이름은 ssh 입니다.
# journalctl -u ssh -e --no-pager[3] 로그에 Authentication refused: bad ownership or modes 가 있으면 권한 문제입니다. StrictModes(기본 yes)가 홈 디렉터리 · ~/.ssh · authorized_keys 를 검사해, 다른 사용자가 쓸 수 있으면 그 파일을 쓰지 않습니다(man sshd). 문구 끝의 directory 와 file 이 고칠 곳을 가르고, 뒤의 경로가 문제의 위치입니다.
Authentication refused: bad ownership or modes for directory /home/alice/.sshAuthentication refused: bad ownership or modes for file /home/alice/.ssh/authorized_keysAuthentication refused: bad ownership or modes for directory /home/alice차례로 ~/.ssh 를 777, authorized_keys 를 666, 홈을 777 로 만들었을 때 나온 줄입니다. 파일 소유자를 다른 계정으로 바꿔도 for file 이 나왔습니다. namei -l 로 소유자와 권한을 한눈에 봅니다.
$ cd ~ && namei -l .ssh/authorized_keysf: .ssh/authorized_keysdrwxrwxrwx alice alice .ssh-rw------- alice alice authorized_keys[4] 권한을 고칩니다. 홈은 그룹·기타에 쓰기만 없으면 되고, ~/.ssh 는 700, 파일은 600 입니다. 소유자가 다르면 chown 으로 맞춥니다.
$ chmod go-w ~$ chmod 700 ~/.ssh$ chmod 600 ~/.ssh/authorized_keys다시 접속하면 클라이언트에 Server accepts key 와 Authenticated 가 나오고 서버 로그에 Accepted publickey 가 남습니다.
Authenticated to server1 ([203.0.113.5]:22) using "publickey".Accepted publickey for alice from 203.0.113.5 port 35016 ssh2: ED25519 SHA256:tlR0lx+Gl7RrUcp9VHU+p+/qMk325ndyJO7Diu4hVi0[5] Authentication refused 가 없는데 거부되면 LogLevel VERBOSE 로 올려 Failed publickey 줄의 지문을 봅니다. 그 지문이 서버 파일에 있는 키의 지문과 같은지 ssh-keygen -lf 로 맞춰 봅니다.
$ ssh-keygen -lf ~/.ssh/authorized_keys256 SHA256:tlR0lx+Gl7RrUcp9VHU+p+/qMk325ndyJO7Diu4hVi0 alice@laptop (ED25519)Failed publickey for alice from 203.0.113.5 port 33644 ssh2: ED25519 SHA256:qQpllHwKs2mollfgNesirV7N0A1zzwYbngi4lpa+Qms지문이 다르면 클라이언트가 엉뚱한 키를 내민 것입니다. ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes 로 키를 고정하고, 서버 파일에 그 키의 .pub 한 줄이 있는지 봅니다. 지문이 같은데 거부되면 다음 표로 갑니다.
[6] 그 밖의 원인입니다.
| 증상 | 서버에서 보이는 것 | 확인 · 고침 |
|---|---|---|
| 없는 사용자 이름으로 접속 | Invalid user alice from … (INFO) | 접속 계정 이름 확인 |
| 키 한 줄이 두 줄로 깨짐 | Failed publickey 만 남음 (DEBUG1 에서도 matching key found 가 없음) | .pub 한 줄을 통째로 다시 붙여 넣음. 파일은 한 줄에 키 하나 |
authorized_keys 가 없음 | Could not open user 'alice' authorized keys '…': No such file or directory (DEBUG1) | 경로 · 파일 이름 확인 |
| 파일 경로가 다르게 설정됨 | 위와 같음 | sshd -T 로 authorizedkeysfile 값 확인 |
서버가 실제로 쓰는 경로는 이렇게 봅니다.
# sshd -T | grep -i authorizedkeysfileauthorizedkeysfile .ssh/authorized_keys .ssh/authorized_keys2authorized_keys 는 줄마다 키 하나이고, 빈 줄과 # 로 시작하는 줄은 주석입니다(man sshd).
auth.log (SSH) 로그를 브라우저에서 바로 분석 ↗ — 아무것도 올라가지 않습니다.