이 글을 쓰게 된 배경
선배님 블로그의 세 번째 글인 "유용한 SSH/SCP 명령어"라는 글을 읽어보려고 한다.
하지만, 명령어를 보기 전에 SSH와 SCP가 무엇인지부터 알아보려고 한다.
따라서 SSH에 대한 글을 작성하게 되었다.
SSH란?
SSH란 Secure Shell의 약자로, 공식 문서에 의한 정의는 다음과 같다.
컴퓨터에서 다른 컴퓨터에 안전하게 원격 접속할 수 있게 해주는 프로토콜이다.
보호되지 않는 로그인 프로토콜인 telnet, rlogin이나 안전하지 않은 파일 전송 프로토콜인 FTP의 대안이다.
"근데 왜 프로토콜인데 TDP, UDP, HTTP, FTP처럼 P가 안 붙지?"
생각해 보니 SSH는 로컬에서 AWS 서버에 접속할 때 써보았던 기억이 난다.
그러면 SSH가 최고인 건가? 어떻게 안전함을 보장하지?라는 생각이 들었는데
바로 How does the SSH protocol work 설명이 있어서 가져왔다.
SSH Protocol의 작동 방식
이 프로토콜은 client-server model에서 작동한다고 한다.
(여기서 Client는 명령을 보내는 쪽, Server는 명령을 받는 쪽이라고 이해하면 된다)
1. Client가 Server에 연결을 시도한다.(기본 포트 22, TCP 연결)
지원 가능한 알고리즘 목록을 함께 전달한다(ssh -vvv로 확인 가능)
---[이 시점에서 물리적 연결은 됨]---
2. Server가 public key를 Client로 보낸다.
이때, Diffie-Hellman 키 교환용 파라미터로 B(=g^b mod p)와 g, p 등 DH 파라미터 및 세션 식별자를 개인키로 서명한 서명을 함께 보낸다.
3. Client는 이 public key가 예전에 저장한 키와 일치하는지 확인 및 서명에 대해 public key로 검증을 통해 Server를 확인하고(공개키 기반 인증을 통한 MITM 공격 방지)
diffie-hellman 알고리즘을 사용하여 개인 키 a로 A(= g^a mod p)를 만들어 전달한다.
4. Server는 A를 가지고 K=(g^(ab) mod p)를 통해 K라는 키를 만든다.
Client는 B를 가지고 K(=g^(ab) mod p)를 통해 K라는 키를 만든다.
---[이 시점에서 암호화 채널 생성 됨]---
5. key.pem이나 비밀번호를 통해 사용자 인증을 한다.
---[인증 성공]---
6. 이후에 K로 암호화를 하여 통신한다.(대칭키 암호화)
이러한 설명을 보고 나니 public key는 어디에 저장이 되는 건지 문득 궁금해졌다.
그래서 찾아본 결과, ~/.ssh/known_host라는 곳에 저장이 되어있어서 확인할 수 있었다.
근데 또 궁금한 게 생겼다.
1) 왜 같은 서버 IP인데 3개나 있는 건지
2) 저걸 지우면 어떻게 되는 건지
1번의 경우에는 왜 3개가 있는지는 정확한 답변을 찾을 수는 없었다.
하지만 서버에서 /etc/ssh 내부에서 동일한 키 알고리즘을 확인할 수 있었다.
아마도 Server와 Client 사이에서 사용 가능한 알고리즘들을 저장했을 것으로 추측된다.
(알고리즘 간의 우선순위는 어떻게 되는지 모르겠지만)
2번의 경우에는 당연하게도 다시 등록하라는 문구가 나왔다.
이보다 더 깊게 파고들기에는 SSH에 대해 무엇인지만 알아보는 게 목적이었지,
자세하게 알아보는게 목적이 아니어서 여기까지만 작성하고자 한다.
하지만 이번 기회를 통해 당연하게 쓰던 SSH가 이러한 보안 방식으로 안전하게 통신할 수 있도록 해주었다고 생각하니
이 방식을 고안해 낸 사람이 대단하다고 느껴졌으며
회사에서도 서버를 접근하는 경우에 pem키를 사용한다면,
외부에 노출되면 안 되니까 어떻게 관리하는 건지 궁금해지기도 했다.
GPT가 말하기론, 직원마다 SSH 키를 생성하고 서버에 등록하는 방식이라는데 이것도 좋은 방식인듯하다.
아니면 서버의 접근가능한 IP를 회사 네트워크로 등록해서 처리하는 방식도 있을 것 같다는 생각이 든다.
마지막으로 known_host에서 public key가 변경된 경우 나오는 메시지를 보고 글을 마무리할 생각이다.
MITM 공격일 수도 있다고 경고창을 띄우며 서버에 접속하지 못한다.
(eavesdrop: 엿듣다)
참고 자료
[1] https://www.ssh.com/academy/ssh/protocol