Linux.
[SSH] Permission denied(public key) 원인 및 해결
인쥭
2021. 1. 8. 10:56
반응형
Ssh 연결 수립 과정
- AWS에 접속하는 시나리오를 예로 들어, Client는 Local PC / Server는 EC2 인스턴스로 가정한다.
- 더욱 자세한 내용은 아래의 링크를 통해서 확인하실 수 있습니다.
- 참고 URL : leo-history.tistory.com/19
1. Local PC > EC2 접속 시도
i). 요약
- EC2 인스턴스 등, SSH 서버는 SSH 데몬이 설치되는 과정에서 내부적으로 공개키와 사설키 쌍이 생성된 상태이다.
- 클라이언트가 서버에 접속을 시도할 경우, 첫 접속에서는 서버로부터 공개키를 받아올 지 묻는 메시지가 나타난다.
- yes를 입력할 경우 서버로부터 공개키를 받아 클라이언트의 .ssh/known_hosts에 추가하게 된다.
[~] ssh -i ~/Test.pem ubuntu@3.36.105.134
The authenticity of host '3.36.105.134 (3.36.105.134)' can't be established.
ECDSA key fingerprint is SHA256:~~~(중략).
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '3.36.105.134' (ECDSA) to the list of known hosts.
Ctrl+C
[~] cat ~/.ssh/known_hosts
... 중략
3.36.105.134 ecdsa-sha2-nistp256 AA~~~(중략)
ii). 상세
- 서버 인증
- 클라이언트는 난수를 생성한 후, 해당 난수를 통해 다음의 두 독립된 과정을 진행한다.
- 클라이언트는 난수로부터 해시값을 생성하여 저장한다.
- 클라이언트는 난수를 서버로부터 받은 공개키로 암호화하여 전송한다.
- 서버는 전달받은 암호화된 난수를 자신의 사설키로 복호화하여 평문 난수값을 알아낸다.
- 서버는 암호화된 난수값을 다시 해싱하여 클라이언트로 전송한다.
- 클라이언트는 저장된 해시값과 서버로부터 받은 해시값을 비교하여 서버의 정상성을 확인한다.
- 클라이언트는 난수를 생성한 후, 해당 난수를 통해 다음의 두 독립된 과정을 진행한다.
- 클라이언트 인증
- 서버 인증과 송신자 / 수신자만 바뀌되, 클라이언트가 생성한 공개키는 서버의 .ssh/authorized_keys 파일에 사전에 복사해두어야만 한다.
- AWS의 Key-pair는 사설키를 사용자가 갖고, 공개키를 AWS가 관리하므로 EC2 인스턴스가 생성되는 시점에 이미 authorized_keys에 값이 복사되어 있다.
ubuntu@ip-10-0-46-54:~$ cd .ssh
ubuntu@ip-10-0-46-54:~/.ssh$ ls
authorized_keys
ubuntu@ip-10-0-46-54:~/.ssh$ cat authorized_keys
ssh-rsa AAA~~~(중략) Test
2. Error 정리
i). Permission Denied(Public Key)
[~] ssh -i ~/Test.pem ubuntu@3.36.105.134
ubuntu@3.36.105.134: Permission denied (publickey).
- 서버로 접근 권한이 없어 거부되었으며, 원인은 서버 측의 authorized_keys 파일에 공개키가 없거나 손상되었기 때문
- 클라이언트 단에서 해결할 수 있는 방법은 없다.
- 가능하다면 서버의 authorized_keys에 등록된 다른 키를 사용하여 접속할 수는 있을 것.
- 해결 :
- 서버의 .ssh/authorized_keys에 사용자가 접속하려는 키에 대응되는 공개키가 없거나 손상되었기 때문에 발생하는 문제이다.
- 따라서, 사용자가 사용한 키의 공개키값을 서버의 authorized_keys에 붙여넣기 한다.
- 당연히 위와 같은 문제로 서버에 접속할 수 없는 상황이라면 답이 없다!
- 문제 재현 방법 :
authorized_keys의 값을 변경
ubuntu@ip-10-0-46-54:~$ cd .ssh
ubuntu@ip-10-0-46-54:~/.ssh$ ls
authorized_keys
ubuntu@ip-10-0-46-54:~/.ssh$ cp authorized_keys authorized_keys-bk
ubuntu@ip-10-0-46-54:~/.ssh$ vi authorized_keys
> key 값을 임의로 삭제하는 등의 작업을 진행하여 손상시킴.
ubuntu@ip-10-0-46-54: exit
[~] ssh -i ~/Test.pem ubuntu@3.36.105.134
ubuntu@3.36.105.134: Permission denied (publickey).
또는 authorized_keys의 권한을 변경
ubuntu@ip-10-0-46-54:~$ cd .ssh
ubuntu@ip-10-0-46-54:~/.ssh$ ls -al
total 16
drwx------ 2 ubuntu ubuntu 4096 Jan 8 01:40 .
drwxr-xr-x 5 ubuntu ubuntu 4096 Jan 8 01:40 ..
-rw------- 1 ubuntu ubuntu 379 Jan 8 01:40 authorized_keys
-rw------- 1 ubuntu ubuntu 389 Jan 8 01:39 authorized_keys-bk
ubuntu@ip-10-0-46-54:~/.ssh$ chmod 044 authorized_keys
ubuntu@ip-10-0-46-54:~/.ssh$ ls -al
total 16
drwx------ 2 ubuntu ubuntu 4096 Jan 8 01:40 .
drwxr-xr-x 5 ubuntu ubuntu 4096 Jan 8 01:40 ..
----r--r-- 1 ubuntu ubuntu 379 Jan 8 01:40 authorized_keys
-rw------- 1 ubuntu ubuntu 389 Jan 8 01:39 authorized_keys-bk
ubuntu@ip-10-0-46-54: exit
[~] ssh -i ~/Test.pem ubuntu@3.36.105.134
ubuntu@3.36.105.134: Permission denied (publickey).
또는 authorized_keys 파일 자체를 누락시킴
ubuntu@ip-10-0-46-54:~$ cd .ssh
ubuntu@ip-10-0-46-54:~/.ssh$ rm authorized_keys
rm: remove write-protected regular file 'authorized_keys'? y
ubuntu@ip-10-0-46-54:~/.ssh$ ls
authorized_keys-bk
ubuntu@ip-10-0-46-54:~/.ssh$ exit
[~] ssh -i ~/Test.pem ubuntu@3.36.105.134
ubuntu@3.36.105.134: Permission denied (publickey).