SSH 접속 방식에 대칭키 및 비대칭키 암호화가 사용됨.
1. 접속하려는 서버가 올바른 서버인지 검증
- SSH 서버가 설치될 때 내부적으로 서버의 공개키와 개인키가 생성됨.
- 클라이언트가 서버에 SSH 접속을 요청하면, 서버는 자신의 공개키를 클라이언트에게 전송함.
- 만약 클라이언트가 해당 서버에 최초로 접속한 것이라면, 해당 공개키가 클라이언트 known_host 파일에 추가됨.
- 이후 해당 서버에 접속 요청을 할 때마다 그 공개키를 가진 서버가 올바른 서버인지 확인하는 절차를 가진다.
- 클라이언트에서 난수 생성, 해싱 후 서버의 공개키로 암호화하여 서버에 전송.
- 서버에서 개인키로 복호화하여 난수 추출 후 해싱, 클라이언트에 전송.
- 클라이언트에서 난수 해시 값 비교해서 올바른 서버인지 확인.
- 해당 공개키에 대한 비밀키를 가진 서버라는 것이 입증되면, 올바른 서버임이 보장됨.
2. 암호화된 통신을 위한 세션키(대칭키) 생성
- 세션키는 모든 통신을 암호화하는데 사용되는 대칭키.
- 대칭키는 비대칭키에 비해 빠르고 컴퓨팅 파워가 적게 드는 장점이 있음.
- 하지만 대칭키가 유출되면 모든 통신을 복호화할 수 있게 됨.
- 클라이언트와 서버는 키 교환(디피-헬만) 알고리즘을 통해 안전하게 대칭키를 공유.
세션이란?
- 클라이언트와 서버 간의 연결 상태
- 서버와 접속이 종료하기 전의 상태
- 접속 시작부터 종료까지의 기간
디피-헬만 알고리즘
- 상대방의 공개키와 나의 개인키를 사용해 대칭키를 얻어가는 알고리즘.
- 이 때 사용하는 대칭키와 비대칭키는 ssh에서 사용하는 서버와 클라이언트의 키 쌍이 아님.
- 서버와 클라이언트에서 임시로 비대칭키 방식의 키 쌍을 생성하고, 공개키를 교환함.
- 매 세션마다 임시의 비대칭키를 사용하기 때문에, 세션마다 세션키는 다름.
- 클라이언트나 서버의 개인키가 유출되어도 이전 세션의 세션키를 모르기 때문에 복호화할 수 없음.
- 대칭키를 전송하는 것이 아니라, 서버와 클라이언트에서 같은 대칭키를 생성하는 알고리즘.
3. 클라이언트가 접근 권한을 가지고 있는지 검증
- 사용자는 본인의 공개키, 개인키를 가지고 있음.
- 인증된 사용자라면, 서버의 authorized_keys에 사용자의 공개키가 추가되어 있을 것임.
- 서버에서 난수 생성, 클라이언트의 공개키로 암호화하여 클라이언트로 전송.
- 클라이언트에서 개인키로 복호화하여 난수 추출.
- 난수와 세션키 결합 후 해싱, 서버로 전송.
- 서버에서 생성했었던 난수와 세션키 결합 후 해싱, 값 비교.
- 해당 공개키에 대한 비밀키를 가진 클라이언트라는 것 입증 + 해당 세션에 대한 세션키를 가지고 있다는 것 입증.
출처
https://velog.io/@mineru/Web-SSH-%EC%A0%91%EC%86%8D-%EC%9B%90%EB%A6%AC
https://limvo.tistory.com/21