티스토리 뷰
반응형
Ssh 연결 수립 과정
- AWS에 접속하는 시나리오를 예로 들어, Client는 Local PC / Server는 EC2 인스턴스로 가정한다.
- 더욱 자세한 내용은 아래의 링크를 통해서 확인하실 수 있습니다.
- 참고 URL : leo-history.tistory.com/19
Publickey permission denied
test@10.0.10.191: Permission denied (publickey). ssh 접근을 시도할 때 위와 같은 에러를 마주할 때가 있다. 위 에러의 경우 서버의 각 유저(위 경우 10.0.10.191 서버의 test 유저)는 스스로에게 접근을 허용..
leo-history.tistory.com
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).
'Linux.' 카테고리의 다른 글
[yq] yq 사용법 및 특정 yaml 파일의 값 변경하기 (1) | 2021.04.19 |
---|---|
[Linux] Nohup이란? (0) | 2021.02.15 |
[Linux] 디렉토리에 포함된 파일 개수 세기 (0) | 2021.01.05 |
[Shell script] sed로 특정 문자열이 포함된 라인 치환 (0) | 2020.12.17 |
[Shell script] sed로 첫글자, 마지막 글자 제거하기 (0) | 2020.11.13 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코딩테스트
- Puppeteer
- javascript
- terraform
- RancherDesktop
- Java
- IntelliJ
- AWS IoT
- JPA
- Database
- jQuery
- Linux
- Git
- Gradle
- postgresql
- mysql
- JEST
- eureka
- kotlin
- Docker
- pgloader
- AWS
- etc
- spring boot
- shell
- Node.js
- react
- Spring Cloud Config
- hashicorp
- Vault
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함