사실 SSH 프로토콜은 여러 곳에서 접해 보았다.
이렇게 깃허브에서도 쓰고 있고,
AWS 인스턴스를 만들 때도 쓰고 있다.
암호화해주는 기술이라는 건 어렴풋이 알고 있었지만, 한번도 어떤 프로토콜인지 자세히 알아보지 않았다 ...
SSH 프로토콜에 대해 알아보자.
SSH 프로토콜의 쓰임
- 데이터 전송 (깃허브 push pull 등)
- 원격 제어 (AWS 가상머신에 명령 내리기)
SSH 프로토콜의 기능
- SSH 프로토콜은 안전한 네트워크 서비스를 제공하기 위해 암호화를 사용한다.
- 암호화를 통해 클라이언트와 서버간의 연결을 네트워크 공격으로부터 보호할 수 있다.
SSH 프로토콜이 사용하는 기술
- 대칭 암호화(Symmetric Encryption)
- 동일한 키로 암호화, 복호화 가능
- 클라이언트-서버 간 전체 연결을 암호화에 사용
- 비대칭 암호화(Asymmetric Encryption)
- 비밀키로는 암호화, 공개키로는 복호화
- 공개키로는 암호화, 비밀키로는 복호화
- 키 교환, 클라이언트 인증, 서버 인증에 사용
- 디퍼-헬먼 키 교환 알고리즘(Diffie-Hellman Key Exchange Algorithm)
- 상대방의 공개키와 나의 비밀키를 통해 대칭키를 얻음
- 해시 알고리즘(Hashing)
- 패킷의 무결성을 확인하기 위해 사용
SSH 프로토콜 통신 과정
1. 클라이언트 ↔️ 서버 연결 설정
1.1. 클라이언트 ⏩️ 서버 TCP 22번 포트로 SSH 접속 요청
1.2. 서버 ⏩️ 클라이언트 서버가 지원하는 프로토콜 버전 응답
1.3. 클라이언트는 서버가 지원하는 프로토콜 버전 중 자신과 일치하는 것이 있으면 연결 지속
2. 서버 ⏩️ 클라이언트 공개키 전송
3. 클라이언트 ↔️ 서버 인증
3.1. 클라이언트는 올바른 서버인지 확인(서버 인증) - 비대칭 암호화
- 3.1.1. 클라이언트에서 난수 생성, 난수 해시값 생성 및 저장, 서버의 공개키로 암호화
- 3.1.2. 클라이언트 ⏩️ 서버 암호화된 난수를 전송
- 3.1.3. 서버에서 서버의 비밀키로 데이터를 복호화, 난수 추출
- 3.1.4. 서버 ⏩️ 클라이언트 복호화된 난수 해시값 전송
- 3.1.5. 클라이언트는 클라이언트에 저장된 난수 해시값과 서버에서 받은 난수 해시값 비교
- 3.1.6. 일치 시 서버 인증 완료
3.2. 세션키(대칭키) 생성 - 대칭 암호화
- 세션키는 모든 통신을 암호화하는데 사용되는 대칭키
- 대칭키가 유출되었을 경우 공격자가 암호화된 모든 통신을 복호화할 수 있음
- 이를 해결하기 위해 디퍼-헬만 키 교환 알고리즘 사용
- 대칭키 전송 X, 서버와 클라이언트에서 각각 같은 대칭키 생성
- 정보 교환이 완료되면 사용한 세션키(대칭키)는 폐기
- 다시 접속할 때마다 새로운 세션키(대칭키) 생성해서 사용
3.3. 서버는 클라이언트가 자신에게 접근할 수 있는 권한이 있는지 확인(클라이언트 인증)
- password - brute-force attack에 취약
- RSA - 비대칭 암호화
- 3.3.1. 클라이언트 ⏩️ 서버 키 쌍의 ID 전송
- 3.3.2. 서버는 접속 계정의 .ssh/authorized_keys 파일 확인
- 3.3.3. 서버에서 난수 생성, 클라이언트의 공개키로 암호화
- 3.3.4. 서버 ⏩️ 클라이언트 암호화된 난수를 전송
- 3.3.5. 클라이언트에서 클라이언트의 비밀키로 데이터를 복호화, 난수 추출
- 3.3.6. 클라이언트 ⏩️ 서버 복호화된 난수 + 세션키 결합하여 해시값 계산 후 전송
- 3.3.7. 서버는 서버에 저장된 난수 + 세션키와, 클라이언트에서 받은 해시값 비교
- 3.3.8. 일치 시 클라이언트 인증 완료
'TIL > 네트워크' 카테고리의 다른 글
[240222] HTTP 헤더 (0) | 2024.02.22 |
---|---|
[240219] HTTP 상태코드 (1) | 2024.02.19 |
[240216] HTTP 메서드 (0) | 2024.02.16 |
[240213] HTTP 기초 (0) | 2024.02.13 |
[240210] 주소창에 www.google.com을 입력하면 발생하는 일 (0) | 2024.02.10 |