telnet이 아니고 ssh를 통해서 어플리케이션과의 명령어를 전달하기 위해서 ssh에 대해서 자세히 알아야하는 상황이 생겼다.
그래서 ssh에 대해서 자세하게 정리하고자 한다.
SSH는 Secure Shell의 줄임말로, 단어의 뜻 그대로 보안 쉘을 의미한다.
telnet 같은 경우는 평문(plain text)를 그대로 보내기 때문에 중간에 스니핑을 당한다고 한다.
하지만 ssh는 서버와의 통신이 모두 암호화 해서 전달하기 때문에 그런 문제점은 없는 것같다.
이 ssh가 어떻게 암호화해서 전달하는지 그 원리를 자세히 적어보려고 한다.ssh는 두가지 인증 방식이 있다.
첫번째는 비밀번호를 이용해서 인증하는 방식
두번째는 공개키와 개인키를 이용해서 인증하는 방식이 있다.
그중 첫번째를 먼저 설명하기 전에
나는 윈도우에 기본적으로 내장된 sshd 서버와 윈도우에서 기본적으로 내장된 ssh client 를 이용했다.
첫번째, 당연히 sshd 서버가 켜져 있어야한다.
Start-Service sshd
를 이용해서 running 상태로 만든 다음에
새롭게 윈도우 로컬계정을 만들었다.
그리고
ssh 만든계정@localhost
# SSH 비밀번호 인증 방식 #
1. TCP 3-way 연결 2. SSH 버전 교환 3. Key Exchange Init (암호 알고리즘 협상) 4. 서버 → 호스트 공개키 + DH 파라미터 전송 5. 클라이언트 → 만일 공개기카 저장되어있지 않다면, 저장하고 DH 파라미터 전송 6. 양쪽 → 동일한 세션 키 생성 (대칭키) 7. SSH_MSG_NEWKEYS → 암호화 시작 8. 사용자 인증 단계 (비밀번호 or 공개키) 9. 인증 성공 → 암호화된 세션 유지하며 명령 수행 |
153 ~ 155 까지 위에서 tcp 3way 연결을 한다.
156 ~ 159 에서 서로의 버전을 확인한다. 옆에 보전 openssh_for_windows 9.5 버전을 서로 에게 알려준다.
그다음 부턴 좀 헷갈리는데, 무슨 협상을 하는것 같다.
협상이 완료되면, dh 파라미터라는 걸 서로가 서로에게 보낸다.
그리고 양쪽에서 공개키와 dh파라미터라는걸 보낸다.
이 공개키와 dh 파라미터를 통해 이번세션에서만 유효한 세션키를 생성한다.
이 세션키는 클라이언트와 서버에 모두 대칭적으로 가지고 있기 때문에 대칭키라고도 한다.
이 대칭키를 이용해서 모든 것을 암호화해서 전달한다.
이제 클라이언트는 대칭키를 이용해서 비밀번호를 암호화해서 보낸다.
이때 암호화해서 보낸 비밀번호가 서버에서 인증이 된다면,
이때부터 세션이 유지되고 ssh의 연결이 계속 유지되는 원리이다.
여기서 알아야할 것은
클라이언트는 key-gen을 이용해서 키를 생성할 필요없다.
그냥 서버의 공개키를 이용해서
이번 세션에서 유효한 세션키(대칭키)를 가지고 비밀번호 인증 후 커넥션을 하는 것이다.
세션키와 대칭키는 같은것이고 논리적으로 구분하기 위해서 구분한다.
이번세션에서만 유지되는 의미의 세션키
클라이언트와 서버 모두 대칭적으로 가지고 있기 때문에 대칭키라고도 한다.
'dev > 프로그래밍' 카테고리의 다른 글
파이썬 리스트 컴프리헨션 과 곱하기 연산 (0) | 2021.12.22 |
---|---|
서버별 ElapsedTime 그래프로 그리기(feat : ggplot2) (0) | 2019.12.31 |
C# UGrid Header checkBox 제거 (0) | 2019.11.29 |
java Debuging 시 xml 보는 코드 (1) | 2019.11.11 |
encodeURIComponent (0) | 2018.01.16 |