웹사이트 검색

SSH 암호화 및 연결 프로세스 이해


소개

SSH 또는 보안 셸은 보안 프로토콜이며 원격 서버를 안전하게 관리하는 가장 일반적인 방법입니다. 여러 암호화 기술을 사용하여 SSH는 두 당사자 간에 암호로 보호된 연결을 설정하고, 서로를 인증하고, 명령과 출력을 앞뒤로 전달하는 메커니즘을 제공합니다.

이 가이드에서는 SSH가 사용하는 기본 암호화 기술과 보안 연결을 설정하는 데 사용하는 방법을 검토합니다. 이 정보는 다양한 암호화 계층과 연결을 형성하고 양 당사자를 인증하는 데 필요한 다양한 단계를 이해하는 데 유용할 수 있습니다.

대칭 암호화, 비대칭 암호화 및 해시 이해

정보 전송을 보호하기 위해 SSH는 트랜잭션의 다양한 지점에서 다양한 유형의 데이터 조작 기술을 사용합니다. 여기에는 대칭 암호화, 비대칭 암호화 및 해싱 형식이 포함됩니다.

대칭 암호화

데이터를 암호화하고 해독하는 구성 요소의 관계에 따라 암호화 체계가 대칭인지 비대칭인지가 결정됩니다.

대칭 암호화는 하나의 키를 사용하여 상대방에게 보내는 메시지를 암호화하고 다른 참여자로부터 받은 메시지를 해독하는 데 사용할 수 있는 암호화 유형입니다. 즉, 키를 보유한 사람은 누구나 키를 보유한 다른 사람에게 메시지를 암호화하고 해독할 수 있습니다.

이러한 유형의 암호화 방식을 "비밀 공유\ 암호화 또는 "비밀 키\ 암호화라고 합니다. 일반적으로 모든 작업에 사용되는 단일 키 또는 관계를 검색할 수 있고 반대 키를 파생하는 것이 간단한 키 쌍이 있습니다.

대칭 키는 전체 연결을 암호화하기 위해 SSH에서 사용됩니다. 일부 사용자가 가정하는 것과는 달리 생성할 수 있는 공개/개인 비대칭 키 쌍은 연결 암호화가 아닌 인증에만 사용됩니다. 대칭 암호화를 통해 암호 인증도 스누핑으로부터 보호할 수 있습니다.

클라이언트와 서버는 모두 이 키를 설정하는 데 기여하며 결과로 생성되는 비밀은 외부 당사자에게 절대 알려지지 않습니다. 비밀 키는 키 교환 알고리즘이라는 프로세스를 통해 생성됩니다. 이 교환으로 인해 서버와 클라이언트는 특정 공용 데이터를 공유하고 특정 비밀 데이터로 조작하여 동일한 키에 독립적으로 도달합니다. 이 프로세스는 나중에 자세히 설명합니다.

이 절차에 의해 생성된 대칭 암호화 키는 세션 기반이며 서버와 클라이언트 간에 전송되는 데이터에 대한 실제 암호화를 구성합니다. 이것이 설정되면 나머지 데이터는 이 공유 비밀로 암호화되어야 합니다. 이것은 클라이언트를 인증하기 전에 수행됩니다.

AES(Advanced Encryption Standard), Blowfish, 3DES, CAST128 및 Arcfour를 비롯한 다양한 대칭 암호 시스템을 사용하도록 SSH를 구성할 수 있습니다. 서버와 클라이언트는 둘 다 기본 설정에 따라 지원되는 암호 목록을 결정할 수 있습니다. 서버에서 사용 가능한 클라이언트 목록의 첫 번째 옵션은 양방향에서 암호 알고리즘으로 사용됩니다.

Ubuntu 20.04에서 클라이언트와 서버는 모두 다음과 같이 기본 설정됩니다.

  • chacha20-poly1305@openssh.com
  • aes128-ctr
  • aes192-ctr
  • aes256-ctr
  • aes128-gcm@openssh.com
  • aes256-gcm@openssh.com

즉, 두 개의 Ubuntu 20.04 시스템이 서로 연결되는 경우(구성 옵션을 통해 기본 암호를 재정의하지 않고) 항상 기본적으로 chacha20-poly1305@openssh.com 암호를 사용하여 연결을 암호화합니다. .

비대칭 암호화

비대칭 암호화는 데이터를 한 방향으로 보내려면 두 개의 연결된 키가 필요하기 때문에 대칭 암호화와 다릅니다. 이 키 중 하나는 개인 키라고 하고 다른 하나는 공개 키라고 합니다.

공개 키는 모든 당사자와 자유롭게 공유할 수 있습니다. 쌍을 이룬 키와 연결되어 있지만 개인 키는 공개 키에서 파생될 수 없습니다. 공개 키와 개인 키 간의 수학적 관계를 통해 공개 키는 개인 키로만 해독할 수 있는 메시지를 암호화할 수 있습니다. 이것은 단방향 기능입니다. 즉, 공개 키는 작성하는 메시지를 해독할 수 없으며 개인 키가 보낼 수 있는 어떤 것도 해독할 수 없습니다.

개인 키는 완전히 비밀로 유지되어야 하며 다른 당사자와 공유해서는 안 됩니다. 이것은 공개 키 패러다임이 작동하기 위한 핵심 요구 사항입니다. 개인 키는 연결된 공개 키를 사용하여 암호화된 메시지를 해독할 수 있는 유일한 구성 요소입니다. 이 사실로 인해 이러한 메시지를 해독할 수 있는 모든 엔터티는 개인 키를 제어할 수 있음을 입증했습니다.

SSH는 몇 가지 다른 위치에서 비대칭 암호화를 사용합니다. 대칭 암호화를 설정하는 데 사용되는 초기 키 교환 프로세스(세션 암호화에 사용) 중에 비대칭 암호화가 사용됩니다. 이 단계에서 양 당사자는 대칭 암호화에 사용할 공유 비밀을 생성하기 위해 임시 키 쌍을 생성하고 공개 키를 교환합니다.

SSH를 사용한 비대칭 암호화의 보다 잘 논의된 사용은 SSH 키 기반 인증에서 비롯됩니다. SSH 키 쌍을 사용하여 클라이언트를 서버에 인증할 수 있습니다. 클라이언트는 키 쌍을 만든 다음 액세스하려는 원격 서버에 공개 키를 업로드합니다. 이것은 원격 서버에 있는 사용자 계정의 홈 디렉토리에 있는 ~/.ssh 디렉토리 내의 authorized_keys라는 파일에 있습니다.

서버와 클라이언트 간의 통신을 보호하기 위해 대칭 암호화가 설정된 후 클라이언트는 액세스가 허용되도록 인증해야 합니다. 서버는 이 파일의 공개 키를 사용하여 클라이언트에 대한 챌린지 메시지를 암호화할 수 있습니다. 클라이언트가 이 메시지를 해독할 수 있음을 증명할 수 있으면 연결된 개인 키를 소유하고 있음을 입증한 것입니다. 그런 다음 서버는 클라이언트에 대한 환경을 설정할 수 있습니다.

해싱

SSH가 활용하는 또 다른 형태의 데이터 조작은 암호화 해싱입니다. 암호화 해시 함수는 간결한 "서명\ 또는 일련의 정보 요약을 생성하는 방법입니다. 이들의 주요 특징은 결코 되돌릴 수 없으며 예측 가능한 영향을 미치는 것이 사실상 불가능하다는 것입니다. 그리고 그들은 실질적으로 독특합니다.

동일한 해싱 함수와 메시지를 사용하면 동일한 해시가 생성됩니다. 데이터의 일부를 수정하면 완전히 다른 해시가 생성됩니다. 사용자는 주어진 해시에서 원본 메시지를 생성할 수 없어야 하지만 주어진 메시지가 주어진 해시를 생성했는지 알 수 있어야 합니다.

이러한 속성이 주어지면 해시는 주로 데이터 무결성 목적과 통신의 신뢰성을 확인하는 데 사용됩니다. SSH의 주요 용도는 HMAC 또는 해시 기반 메시지 인증 코드입니다. 수신된 메시지 텍스트가 손상되지 않고 수정되지 않았는지 확인하는 데 사용됩니다.

앞에서 설명한 대칭 암호화 협상의 일부로 메시지 인증 코드(MAC) 알고리즘이 선택됩니다. 알고리즘은 클라이언트의 허용 가능한 MAC 선택 목록을 통해 작업하여 선택됩니다. 이 목록에서 서버가 지원하는 첫 번째 항목이 사용됩니다.

암호화가 협상된 후 전송되는 각 메시지에는 상대방이 패킷 무결성을 확인할 수 있도록 MAC이 포함되어야 합니다. MAC은 대칭 공유 비밀, 메시지의 패킷 시퀀스 번호 및 실제 메시지 내용에서 계산됩니다.

MAC 자체는 패킷의 마지막 부분으로 대칭적으로 암호화된 영역 외부로 전송됩니다. 연구원들은 일반적으로 먼저 데이터를 암호화한 다음 MAC을 계산하는 이 방법을 권장합니다.

SSH 작동 방식 이해

SSH 작동 방식에 대한 기본적인 이해가 이미 있을 것입니다. SSH 프로토콜은 클라이언트-서버 모델을 사용하여 두 당사자를 인증하고 그들 사이의 데이터를 암호화합니다.

서버 구성 요소는 지정된 포트에서 연결을 수신 대기합니다. 보안 연결 협상, 연결 당사자 인증, 자격 증명이 수락된 경우 올바른 환경 생성을 담당합니다.

클라이언트는 서버와의 초기 전송 제어 프로토콜(TCP) 핸드셰이크 시작, 보안 연결 협상, 서버의 ID가 이전에 기록된 정보와 일치하는지 확인, 인증을 위한 자격 증명 제공을 담당합니다.

SSH 세션은 별도의 두 단계로 설정됩니다. 첫 번째는 향후 통신을 보호하기 위해 암호화에 동의하고 설정하는 것입니다. 두 번째 단계는 사용자를 인증하고 서버에 대한 액세스 권한을 부여해야 하는지 여부를 검색하는 것입니다.

세션 암호화 협상

클라이언트가 TCP 연결을 만들면 서버는 지원하는 프로토콜 버전으로 응답합니다. 클라이언트가 허용되는 프로토콜 버전 중 하나와 일치할 수 있으면 연결이 계속됩니다. 서버는 또한 클라이언트가 의도한 호스트인지 여부를 확인하는 데 사용할 수 있는 공개 호스트 키를 제공합니다.

이 시점에서 양 당사자는 Diffie-Hellman 알고리즘이라는 버전을 사용하여 세션 키를 협상합니다. 이 알고리즘(및 그 변형)을 통해 각 당사자는 자신의 개인 데이터를 다른 시스템의 공개 데이터와 결합하여 동일한 비밀 세션 키에 도달할 수 있습니다.

세션 키는 전체 세션을 암호화하는 데 사용됩니다. 절차의 이 부분에 사용되는 공개 및 개인 키 쌍은 클라이언트를 서버에 인증하는 데 사용되는 SSH 키와 완전히 별개입니다.

고전적인 Diffie-Hellman에 대한 이 절차의 기본은 다음과 같습니다.

  • 양 당사자는 시드 값으로 사용할 큰 소수에 동의합니다.
  • 양 당사자는 미리 정의된 방식으로 값을 조작하는 데 사용되는 암호화 생성기(일반적으로 AES)에 동의합니다.
  • 독립적으로 각 당사자는 상대방에게 비밀로 유지되는 또 다른 소수를 제시합니다. 이 번호는 이 상호 작용을 위한 개인 키로 사용됩니다(인증에 사용되는 개인 SSH 키와 다름).
  • 생성된 개인키, 암호화 생성기, 공유 소수는 개인키에서 파생되지만 상대방과 공유할 수 있는 공개키를 생성하는 데 사용됩니다.
  • 두 참가자는 생성된 공개 키를 교환합니다.
  • 수신 엔터티는 자신의 개인 키, 상대방의 공개 키 및 원래 공유 소수를 사용하여 공유 비밀 키를 계산합니다. 이것은 각 당사자가 독립적으로 계산하지만 반대 개인 키와 공개 키를 사용하여 동일한 공유 비밀 키가 됩니다.
  • 다음에 공유 비밀은 이후의 모든 통신을 암호화하는 데 사용됩니다.

이 프로세스를 통해 각 당사자는 공유 비밀 생성에 동등하게 참여할 수 있으므로 한쪽 끝이 비밀을 제어할 수 없습니다. 또한 안전하지 않은 채널을 통해 해당 정보를 보낼 필요 없이 동일한 공유 비밀을 생성하는 작업을 수행합니다. 나머지 연결에 사용되는 공유 비밀 암호화를 이진 패킷 프로토콜이라고 합니다.

생성된 비밀은 대칭 키입니다. 즉, 메시지를 암호화하는 데 사용된 것과 동일한 키를 사용하여 다른 쪽에서 메시지를 해독할 수 있습니다. 이것의 목적은 외부인이 해독할 수 없는 암호화된 터널에서 모든 추가 통신을 래핑하는 것입니다.

세션 암호화가 설정되면 사용자 인증 단계가 시작됩니다.

서버에 대한 사용자 액세스 인증

다음 단계는 사용자를 인증하고 액세스를 결정하는 것입니다. 서버가 수락하는 것에 따라 인증에 사용할 수 있는 몇 가지 방법이 있습니다.

일반적인 방법은 비밀번호 인증이며, 이는 서버가 로그인을 시도하는 계정의 비밀번호를 클라이언트에게 묻는 메시지를 표시하는 것입니다. 비밀번호는 협상된 암호화를 통해 전송되므로 외부로부터 안전합니다.

암호가 암호화되더라도 이 방법은 암호의 복잡성에 대한 제한 때문에 일반적으로 권장되지 않습니다. 자동화된 스크립트는 다른 인증 방법에 비해 매우 쉽게 일반 길이의 암호를 해독할 수 있습니다.

가장 인기 있고 권장되는 대안은 SSH 키 쌍을 사용하는 것입니다. SSH 키 쌍은 비대칭 키로, 두 개의 연결된 키가 서로 다른 기능을 수행함을 의미합니다.

공개 키는 개인 키로만 해독할 수 있는 데이터를 암호화하는 데 사용됩니다. 공개 키는 개인 키를 암호화할 수 있지만 공개 키에서 개인 키를 파생시키는 방법이 없기 때문에 자유롭게 공유할 수 있습니다.

SSH 키 쌍을 사용한 인증은 이전 섹션에서 설명한 대로 대칭 암호화가 설정된 후에 시작됩니다. 절차는 다음과 같이 진행됩니다.

  • 클라이언트는 인증하려는 키 쌍의 ID를 서버에 보내는 것으로 시작합니다.
  • 서버는 클라이언트가 로그인을 시도하는 계정의 authorized_keys 파일에서 키 ID를 확인합니다.
  • 파일에서 일치하는 ID를 가진 공개 키가 발견되면 서버는 임의의 숫자를 생성하고 공개 키를 사용하여 숫자를 암호화합니다.
  • 서버는 클라이언트에게 이 암호화된 메시지를 보냅니다.
  • 클라이언트가 실제로 연결된 개인 키를 가지고 있다면 해당 키를 사용하여 메시지를 해독하여 원래 번호를 밝힐 수 있습니다.
  • 클라이언트는 통신을 암호화하는 데 사용되는 공유 세션 키와 해독된 번호를 결합하고 이 값의 MD5 해시를 계산합니다. MD5는 해시 함수를 사용하여 128비트 해시 값을 생성하는 메시지 다이제스트 알고리즘입니다.
  • 그런 다음 클라이언트는 이 MD5 해시를 암호화된 숫자 메시지에 대한 응답으로 서버에 다시 보냅니다.
  • 서버는 동일한 공유 세션 키와 클라이언트에 보낸 원래 번호를 사용하여 자체적으로 MD5 값을 계산합니다. 자체 계산을 클라이언트가 다시 보낸 계산과 비교합니다. 이 두 값이 일치하면 클라이언트가 개인 키를 소유하고 있으며 클라이언트가 인증되었음을 증명합니다.

요컨대 키의 비대칭성으로 인해 서버는 공개 키를 사용하여 클라이언트에 대한 메시지를 암호화할 수 있습니다. 그런 다음 클라이언트는 메시지를 올바르게 해독하여 개인 키를 보유하고 있음을 증명할 수 있습니다. 사용되는 두 가지 유형의 암호화(대칭 공유 비밀 및 비대칭 공개/개인 키)는 각각 이 모델에서 특정 강점을 활용할 수 있습니다.

결론

연결 협상 단계와 SSH에서 작동하는 암호화 계층에 대해 배우면 원격 서버에 로그인할 때 발생하는 상황을 더 잘 이해할 수 있습니다. 이제 다양한 구성 요소와 알고리즘 사이의 관계를 인식하고 이러한 모든 조각이 어떻게 함께 맞춰지는지 이해할 수 있습니다. SSH에 대해 자세히 알아보려면 다음 가이드를 확인하세요.

  • Linux 서버에서 SSH 키 기반 인증을 구성하는 방법
  • SSH를 사용하여 원격 서버에 연결하는 방법
  • 다양한 운영 체제에 대한 SSH 키 설정 방법
  • SSH 기초: SSH 서버, 클라이언트 및 키 작업