SSH
SSH(Secure Shell)는 클라이언트-서버 모델을 사용하여 한 컴퓨터에서 다른 컴퓨터로 보안 원격 로그인을 위한 프로토콜입니다.
SSSH 클라이언트/서버 응용은 대부분의 운영체제에서 광범위하게 수용됩니다
SSH 프토토콜 스택
SSH 프로토콜 스택의 구성은 크게 3가지로 나뉜다
전송 계층 프로토콜(Transport Layer Protocol)
전방향 기밀(즉 한 세션에서 세션 키나 영구 개인키가 손상되더라도, 이전 세션의 기밀성에 영향을 미치지 않는다)을 만족하는 서버 인증, 데이터 기밀성과 데이터 무결성을 제공한다
전송 계층에서는 옵션으로 압축도 가능하다
사용자 인증 프로토콜(User Authentication Protocol)
서버에게 사용자를 인증한다
연결 프로토콜(Connection Protocol)
하나의 기본 SSH 연결을 사용하여 여러 개의 논리적 통신 채널을 다중화한다
전송 계층 프로토콜
호스트 키
서버 인증은 공개/개인 키 쌍을 소유한 서버 전송 계층에서 수행한다
서버는 여러 개의 서로 다른 비대칭 키 암호 알고리즘을 사용하는 여러 개의 호스트 키를 가질 수 있다.
여러 호스트가 동일한 호스트 키를 공유 할 수 있다.
모든 경우에 서버 호스트키는 호스트 신원을 인증하기 위한 키 교환 시 사용한다
클라이언트는 서버의 호스트 공개키를 사전에 알고 있어야 한다.
키 교환의 신뢰 모델
- 클라이언트는 각 호스트 이름과 대응 되는 호스트 공개키를 짝지어주는 로컬 데이터베이스를 가지고 있는 경우
- 호스트 이름-키 연관 관계가 신뢰된 인증 기관(CA)에 의해 검증 되는 경우
패킷 교환
먼저 클라이언트는 서버와 TCP 연결을 설정한다.
연결은 전송 계층 프로토콜이 아니라, TCP 연결을 통해 이루어진다.
일단 연결이 설정되면, 클라이언트와 서버는 패킷이라 불리는 TCP 세그먼트 데이터 필드를 통해 데이터를 교환한다.
암호화 알고리즘 협상이 완료되면, MAC 값을 계산하고, 그 뒤에 (MAC 필드를 제외한) 전체 패킷을 암호화
각 패킷의 형식은 다음과 같다
- 패킷의 길이
- 패딩 길이
- 페이로드
- 랜덤 패딩
- 메시지 인증 코드
전송 계층 패킷 교환 단계
1. 식별 문자열 교환(identification String exchange)
클라이언트가 패킷 교환을 시작하면서 다음 형식의 식별자를 보낸다
2.알고리즘 협상(algorithm negotiation)
양쪽은 각각 지원 가능한 알고리즘을 선호도 순으로 정렬한 목록을 SSH_MSG_KEXINIT에 포함시켜 상대방에게 전송
각 암호 알고리즘 유형마다 하나의 목록 존재한다.
알고리즘 목록은 아래와 같다
- 키 교환
- 암호
- MAC 알고리즘
- 압축 알고리즘
3.키교환(key exchange)
- 2가지 Diffe-hillman 알고리즘 키 교환 버전만 규정한다
SSH 키 교환 프로세스는 아래와 같다
1단계: 초기 매개변수 및 용어
- C는 클라이언트를 나타내고 S는 서버를 나타냅니다.
- 𝑝는 안전한 큰 소수, 𝑔는 하위 그룹 𝐺𝐹(𝑝)의 생성자, 𝑞는 하위 그룹 순서입니다.
- V_S는 S의 식별 문자열이고, V_C는 C의 식별 문자열입니다.
- K_S는 S의 호스트 공개 키입니다.
- I_C는 C의 SSH_MSG_KEXINIT 메시지이고 I_S는 키 교환 단계 이전에 S의 SSH_MSG_KEXINIT와 교환됩니다.
- 𝑝, 𝑔, 𝑞는 클라이언트/서버가 알고리즘 협상을 통해 결정
- 해시 함수 hash( )도 알고리즘 협상 과정에서 결정됩니다.
2단계: 고객의 조치 - C는 난수 𝑥(1 < 𝑥 < 𝑞)를 생성하고 Ф = 𝑔^𝑥 “mod” 𝑝를 계산합니다. C는 Ф를 S로 전송합니다.
3단계: 서버의 조치 - S는 난수 𝑦를 생성합니다(0 < 𝑦 < 𝑞).
- S 계산 𝑓 = 𝑔^𝑦 “mod” 𝑝
- 클라이언트로부터 Ф를 받은 후 S는 다음을 계산합니다.
- 𝐾 = Ф^𝑦 “모드” 𝑝
- H = 해시(V_C ‖ V_S ‖ I_C ‖ I_S ‖ K_S ‖ Ф ‖ 𝑓 ‖ 𝐾)
- S는 개인 키를 사용하여 H에 대한 서명 𝑠을 계산합니다.
- S는 (K_S ‖ 𝑓 ‖ 𝑠)를 C에게 보냅니다.
4단계: 고객 확인 - C는 인증서 또는 로컬 데이터베이스를 사용하여 K_S가 S의 실제 호스트 키인지 확인합니다.
- C는 다음을 계산하고 서명 𝑠을 확인합니다.
- 𝐾 = 𝑓^𝑥 “모드” 𝑝
- H =hash(V_C ‖ V_S ‖ I_C ‖ I_S ‖ K_S ‖ Ф ‖ 𝑓 ‖ 𝐾)를 계산하고 H에 대한 서명 s를 확인합니다.
5단계: 키 교환 종료
- SSH_MSG_NEWKEYS 패킷 교환으로 키 교환 완료
4.서비스 요청(service request)
클라이언트는 사용자 인증이나 연결 프로토콜 요청을 위해 SSH_MSG_SERVICE_REQUEST 패킷을 전송한다
이어서 모든 데이터는 SSH 전송 계층 패킷의 페이로드에 실어 교환, 암호화하고 MAC으로 보호한다
키 생성
암호화와 MAC 용 키 생성에 필요한 값
- 공유된 비밀 키 K
- 키 교환에서 계산된 해시 값 H
- 세션 식별자
사용자 인증 프로토콜
사용자 인증 프로토콜에서는 클라이언트가 서버에게 인증 받는 수단을 제공한다
사용자 인증 프로토콜에서는 항상 3가지 메시지 유형이 사용 된다
클라이언트가 보내는 인증 요청 형식
하나 이상의 인증 방법을 서버가 요구할 경우의 메시지 형식
서버가 인증을 수용하는 경우의 메시지 형식
메시지 교환
- 클라이언트는 방법 이름 문자열이 ‘none’인 SSH_MSG_USERAUTH_REQUEST를 전송
- 서버는 사용자 이름이 유효한지 검사하며, 유효하지 않으면 부분 성공 필드 값을 거짓(false)으로 설정하여 SSH_MSG_USERAUTH_FULLURE를 전송
- 서버는 SSH_MSG_USERAUTH_FULLURE를 반환
- 클라이언트는 인증 방법 중 하나를 선택하고, 선택한 방법 이름과 그 방법에 필요한 필드와 함께 SSH_MSG_USERAUTH_REQUEST를 전송
- 인증에 성공 후 추가 인증 방법을 요구하면, 서버는 부분 성공 필드 값을 참(true)으로 설정하여 단계 3을 수행
- 요구된 모든 인증이 성공하면, 서버는 SSH_MSG_USERAUTH_SUCCESS 메시지를 송신하고 인증 프로토콜을 종료
인증 방법
서버는 다음 중 한 가지 이상의 인증 방법을 요구한다
- 공개키(publickey)
- 패스워드(password)
- 호스트 기반(hostbased)
연결 프로토콜
연결 프로토콜에서는 SSH 전송 계층 프로토콜상에서 수행되며 안전한 인증 연결이 되어 있다는 것을 가정한다.
이와 같은 안전한 인증 연결을 터널(tunnel) 이라고 하는데 연결 프로토콜이 여러 논리적 채널을 다중화할 때 사용한다
채널 메커니즘
터미널 세션 같은 SSH를 사용하는 모든 유형의 통신은 별도의 채널을 사용하여 지원한다
양쪽에서 채널을 열 수 있으며, 각 채널 양측에서는 유일한 채널 번호를 연관 짓는다.(즉 양쪽의 채널 번호가 같을 필요가 없다)
채널 흐름은 윈도우 메커니즘을 이용하여 제어한다.
윈도우 공간에 여유가 있다는 메시지를 수신해야만 데이터를 채널로 송신한다
채널이 작동하는 3단계
- 채널 오픈
어느 한 쪽에서 신규 채널 개설을 원하면, 그 채널에 로컬 번호를 할당하고 다음과 같은 형식으로 메시지를 전달한다
바이트(byte) SSH_MSG_CHANNEL_OPEN
문자열(string) 채널 유형(channel type)
uint32 송신자 채널(sender channel)(로컬 채널)
uint32 초기 윈도우 크기(initial window size)
uint32 최대 패킷 크기(maximum packet size)
... 채널 유형에 따른 데이터
초기 윈도우 크기는 소싱자가 윈도우를 조정하지 않고, 얼마나 많은 바이트의 채널 데이터를 전송할 수 있는지 지정한다.
최대 패킷 크기는 송신자에게 전송 될 수 있는 각 데이터 패킷의 최대 크기이다.
만약 원격지에서 채널을 개시할 수 있으면 아래와 같이 진행 된다
원격지에서 SSH_MSG_CHANNEL_OPEN_CONFIRMATION
메시지를 반환한다
이 메시지에는 들어오는 트래픽의 송신 채널 번호, 수신자 채널 번호, 윈도우와 패킷 크기가 포함한다
채널 개시가 불가하면 원격에서는 실패 원인을 나타내는 원인 코드(reason code)와 함께 SSH_MSG_CHANNEL_OPEN_FAILURE
메시지를 반환한다
-
데이터 전송
채널이 개시되면,SSH_MSG_CHANNEL_DATA
메시지를 이용해서 데이터 전송을 시작한다
이 메시지에는 수신자 채널 번호와 데이터 블록이 포함된다
채널이 열려 있는 동안 이 메시지는 양 방향으로 전송한다 -
채널 종료
어느 한 쪽에서 채널 종료(close a channel)를 원하면, 수신자 채널 번호가 포함된SSH_MSG_CHANNEL_CLOSE
메시지를 전송한다
SSH 프로토콜 메시지 교환 예시
채널 유형(SSH 연결 프로토콜 규격에서 인식되는 4 가지 채널 유형)
- 세션(session): 프로그램 원격 수행
- x11: X 윈도우 시스템
- 포워드된-tcpip(forwarded-tcpip):
- 원격 포트 포워딩
- 직접-tcpip(direct-tcpip):
- 로컬 포트 포워딩
포트 포워딩(SSH의 포트포워딩)
- 임의의 안전하지 않은 TCP 연결을 안전한 SSH 연결로 변환
- SSH 터널링이라고도 함
- 포트(port)는 TCP 사용자의 식별자
- SSH는 두 가지 유형의 포트 포워딩을 지원
- 로컬 포워딩(local forwarding)
- 원격 포워딩(remote forwarding)
로컬 포워딩 - 클라이언트가 하이재킹(hijacking) 프로세스를 설정할 수 있도록 해준다
- 선택한 응용층의 트래픽을 가로채어, 안전하지 않은 TCP 연결을 안전한 SSH 터널로 방향 전환한다
- SSH는 선택된 포트로 들어오는 입력을 대기하도록 설정
- SSH는 선택된 포트를 사용하는 모든 트래픽을 받아서 SSH 터널을 통해 전송
- SSH 서버는 들어오는 트래픽을 클라이언트 응용이 지정한 수신 포트로 전송
원격 포워딩 - 사용자 SSH 클라이언트는 서버를 대신하는 역할
- 클라이언트는 주어진 목적지 포트 번호를 달고 들어오는 트래픽을 수신하여 올바른 포트에 위치하도록 한 뒤 사용자가 선택한 목적지 포트로 전송
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'Computer Science > 네트워크' 카테고리의 다른 글
SMTP (0) | 2023.06.03 |
---|---|
이메일 요소 (0) | 2023.06.03 |
HTTPS (0) | 2023.05.22 |
TLS (0) | 2023.05.17 |
핸드 쉐이크 프로토콜 (0) | 2023.05.17 |