소개
SSH 또는 안전한 셸은 안전한 프로토콜로, 원격 서버를 안전하게 관리하는 가장 일반적인 방법입니다. SSH는 여러 암호화 기술을 사용하여 두 당사자 간에 암호화된 연결을 설정하고 서로를 인증하며 명령을 전달하고 결과를 주고받는 메커니즘을 제공합니다.
이 안내서에서는 SSH가 사용하는 기본 암호화 기술과 안전한 연결을 설정하는 방법을 살펴보겠습니다. 이 정보는 암호화의 다양한 계층과 연결을 형성하고 양측을 인증하는 데 필요한 다양한 단계를 이해하는 데 유용할 수 있습니다.
대칭 암호화, 비대칭 암호화 및 해시 이해
정보 전송을 안전하게 하기 위해 SSH는 트랜잭션의 여러 지점에서 다양한 유형의 데이터 조작 기술을 사용합니다. 이러한 기술에는 대칭 암호화, 비대칭 암호화 및 해싱이 포함됩니다.
대칭 암호화
데이터를 암호화하고 해독하는 구성 요소 간의 관계가 암호화 체계가 대칭적인지 비대칭적인지를 결정합니다.
대칭 암호화는 하나의 키로 메시지를 상대방에게 암호화하고, 상대방으로부터 수신한 메시지를 해독하는 유형의 암호화입니다. 이는 해당 키를 소유한 사람은 해당 키를 가진 다른 사람에게 메시지를 암호화하고 해독할 수 있다는 것을 의미합니다.
이 유형의 암호화 체계는 종종 “공유 비밀” 암호화 또는 “비밀 키” 암호화라고 불립니다. 일반적으로 모든 작업에 사용되는 단일 키 또는 관계가 발견 가능하고 상대 키를 파생시키는 것이 쉬운 키 쌍이 있습니다.
대칭 키는 SSH에서 전체 연결을 암호화하는 데 사용됩니다. 일부 사용자가 가정하는 것과는 달리 생성할 수 있는 공개/비공개 비대칭 키 쌍은 인증에만 사용되며 연결을 암호화하는 데 사용되지 않습니다. 대칭 암호화를 사용하면 비밀번호 인증조차도 감시에 대한 보호를 받을 수 있습니다.
클라이언트와 서버는 모두이 키를 설정하는 데 기여하며 결과적으로 생성된 비밀은 외부 당사자에게는 알려지지 않습니다. 비밀 키는 키 교환 알고리즘이라고하는 프로세스를 통해 생성됩니다. 이 교환은 일부 공개 데이터를 공유하고 이를 일부 비밀 데이터와 함께 조작함으로써 서버 및 클라이언트가 독립적으로 동일한 키에 도달하도록합니다. 이 프로세스는 나중에 자세히 설명됩니다.
이 절차에 의해 생성 된 대칭 암호화 키는 세션 기반입니다. 이것은 서버와 클라이언트 간에 전송되는 데이터의 실제 암호화를 구성합니다. 이것이 설정되면 나머지 데이터는이 공유된 비밀로 암호화되어야합니다. 이것은 클라이언트를 인증하기 전에 수행됩니다.
SSH는 고급 암호화 표준(AES), Blowfish, 3DES, CAST128 및 Arcfour를 포함한 다양한 대칭 암호화 시스템을 사용하도록 구성 할 수 있습니다. 서버 및 클라이언트는 선호도별로 정렬 된 지원되는 암호 목록을 결정할 수 있습니다. 서버에서 사용 가능한 클라이언트 목록의 첫 번째 옵션은 양방향으로 암호 알고리즘으로 사용됩니다.
Ubuntu 20.04에서 클라이언트와 서버는 다음과 같이 기본값으로 설정됩니다:
[email protected]
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
이는 두 개의 Ubuntu 20.04 머신이 서로 연결되는 경우(기본 암호화 알고리즘을 구성 옵션을 덮어쓰지 않는 경우) 항상 연결을 암호화하기 위해 [email protected]
암호를 사용한다는 것을 의미합니다.
비대칭 암호화
비대칭 암호화는 단방향으로 데이터를 보내기 위해 두 개의 관련된 키가 필요하기 때문에 대칭 암호화와 다릅니다. 이 키 중 하나는 개인 키로, 다른 하나는 공개 키라고합니다.
공개 키는 어떤 당사자와도 자유롭게 공유할 수 있습니다. 이것은 그와 짝을 이룬 키와 연관되어 있지만, 비공개 키 는 공개 키에서 파생될 수 없습니다. 공개 키와 비공개 키 사이의 수학적 관계는 공개 키가 비공개 키로만 해독할 수 있는 메시지를 암호화할 수 있게 합니다. 이것은 일방향 기능으로, 공개 키는 쓴 메시지를 해독할 수 있는 능력이 없으며, 비공개 키가 보낸 것을 해독할 수도 없습니다.
비공개 키는 완전히 비밀로 유지되어야하며 다른 당사자와 공유해서는 안됩니다. 이는 공개 키 패러다임이 작동하려면 필수적인 요구 사항입니다. 비공개 키는 연관된 공개 키를 사용하여 암호화된 메시지를 해독할 수 있는 유일한 구성 요소입니다. 이 사실에 의해 이러한 메시지를 해독할 수 있는 모든 개체는 비공개 키를 제어하고 있음을 입증했습니다.
SSH는 여러 곳에서 비대칭 암호화를 사용합니다. 세션을 암호화하는 데 사용되는 대칭 암호화를 설정하는 초기 키 교환 프로세스에서 비대칭 암호화가 사용됩니다. 이 단계에서 양측은 임시 키 쌍을 생성하고 공개 키를 교환하여 대칭 암호화에 사용될 공유 비밀을 생성합니다.
SSH에서 비대칭 암호화의 더 잘 알려진 사용 사례는 SSH 키 기반 인증에서 나옵니다. SSH 키 쌍을 사용하여 클라이언트를 서버에 인증할 수 있습니다. 클라이언트는 키 쌍을 생성한 다음 공개 키를 액세스하려는 원격 서버로 업로드합니다. 이는 원격 서버의 사용자 계정 홈 디렉터리의 ~/.ssh
디렉터리에있는 authorized_keys
파일에 배치됩니다.
서버와 클라이언트 간의 통신을 보호하기 위해 대칭 암호화가 설정된 후에 클라이언트는 액세스를 허용받기 위해 인증해야합니다. 서버는 이 파일의 공개 키를 사용하여 클라이언트에게 도전 메시지를 암호화 할 수 있습니다. 클라이언트가 이 메시지를 복호화 할 수 있었음을 증명하면 연관된 개인 키를 소유하고 있음을 증명합니다. 그런 다음 서버는 클라이언트의 환경을 설정할 수 있습니다.
해싱
SSH가 활용하는 데이터 조작의 다른 형태는 암호 해싱입니다. 암호 해시 함수는 정보 집합의 간결한 “서명” 또는 요약을 생성하는 방법입니다. 그들의 주요한 구별 속성은 결코 반대로 되돌릴 수 없으며, 예측 가능하게 영향을 미치기가 거의 불가능하며, 실제로 고유하다는 것입니다.
동일한 해시 함수와 메시지를 사용하면 동일한 해시가 생성되어야 합니다. 데이터의 어떤 부분이든 수정하면 완전히 다른 해시가 생성되어야 합니다. 사용자는 주어진 해시로부터 원래 메시지를 생성할 수 없어야 하지만, 그들은 주어진 메시지가 주어진 해시를 생성했는지 확인할 수 있어야 합니다.
이러한 속성을 고려할 때, 해시는 주로 데이터 무결성 목적과 통신의 진정성을 확인하기 위해 사용됩니다. SSH에서의 주요 사용은 HMAC 또는 해시 기반 메시지 인증 코드입니다. 이들은 받은 메시지 텍스트가 손상되지 않았는지 확인하는 데 사용됩니다.
이전에 개요된 대칭 암호화 협상의 일부로 메시지 인증 코드 (MAC) 알고리즘이 선택됩니다. 알고리즘은 클라이언트의 허용 가능한 MAC 선택 목록을 통해 선택됩니다. 서버가 지원하는 이 목록 중 첫 번째가 사용됩니다.
암호화가 협상된 후에 전송된 각 메시지는 다른 당사자가 패킷 무결성을 확인할 수 있도록 MAC를 포함해야 합니다. MAC는 대칭 공유 비밀, 메시지의 패킷 순서 번호 및 실제 메시지 내용에서 계산됩니다.
MAC 자체는 대칭 암호화된 영역 외부로 패킷의 마지막 부분으로 전송됩니다. 연구자들은 일반적으로 데이터를 먼저 암호화한 다음 MAC을 계산하는 이 방법을 권장합니다.
SSH 작동 방식 이해하기
아마도 이미 SSH가 어떻게 작동하는지에 대해 기본적인 이해를 가지고 있을 것입니다. SSH 프로토콜은 두 당사자를 인증하고 그들 사이의 데이터를 암호화하기 위해 클라이언트-서버 모델을 사용합니다.
서버 구성 요소는 연결을 위해 지정된 포트에서 대기합니다. 이는 안전한 연결을 협상하고 연결하는 당사자를 인증하며 자격 증명이 수락되면 올바른 환경을 생성하는 책임이 있습니다.
클라이언트는 서버와의 초기 전송 제어 프로토콜 (TCP) 핸드셰이크를 시작하고 안전한 연결을 협상하며 서버의 신원이 이전에 기록된 정보와 일치하는지 확인하고 인증을 제공하는 책임이 있습니다.
SSH 세션은 두 개의 별도 단계로 설정됩니다. 첫 번째는 향후 통신을 보호하기 위해 암호화에 동의하고 설정하는 것입니다. 두 번째 단계는 사용자를 인증하고 서버에 대한 액세스 권한이 부여되어야 하는지 확인하는 것입니다.
세션 암호화 협상
클라이언트가 TCP 연결을 생성하면, 서버는 지원하는 프로토콜 버전을 응답합니다. 클라이언트가 허용 가능한 프로토콜 버전 중 하나와 일치할 경우, 연결이 계속됩니다. 서버는 또한 클라이언트가 이것이 의도된 호스트인지 확인할 수 있도록 공용 호스트 키를 제공합니다.
이 시점에서 양쪽 모두가 ‘Diffie-Hellman 알고리즘’이라는 것의 버전을 사용하여 세션 키를 협상합니다. 이 알고리즘(및 그 변형)은 각 당사자가 상대 시스템의 공용 데이터와 자체 비공개 데이터를 결합하여 동일한 비밀 세션 키에 도달할 수 있도록 합니다.
세션 키는 전체 세션을 암호화하는 데 사용됩니다. 이 프로시저의 이 부분에 사용되는 공개 및 비공개 키 쌍은 서버에 대한 클라이언트의 인증에 사용되는 SSH 키와 완전히 별개입니다.
클래식 Diffie-Hellman에 대한 이 프로시저의 기초는 다음과 같습니다:
- 양측이 모두 씨앗 값으로 사용될 대형 소수에 동의합니다.
- 양측이 모두 암호화 생성기(일반적으로 AES)에 동의하며, 미리 정의된 방식으로 값을 조작하는 데 사용될 것입니다.
- 독립적으로 각 당사자가 상대 당사자에게 비밀로 유지되는 다른 소수를 생각해냅니다. 이 숫자는 이 상호 작용을 위한 개인 키로 사용됩니다(인증에 사용되는 개인 SSH 키와 다릅니다).
- 생성된 개인 키, 암호화 생성기 및 공유 소수는 개인 키에서 파생되지만 다른 당사자와 공유할 수 있는 공개 키를 생성하는 데 사용됩니다.
- 그런 다음 양측 참가자가 생성된 공개 키를 교환합니다.
- 수신 엔터티는 자체 개인 키, 다른 당사자의 공개 키 및 원래 공유된 소수를 사용하여 공유 비밀 키를 계산합니다. 각 당사자가 독립적으로 계산하지만 반대의 개인 및 공개 키를 사용하면 동일한 공유 비밀 키가 생성됩니다.
- 그런 다음 공유된 비밀은 이어지는 모든 통신을 암호화하는 데 사용됩니다.
이 과정은 각 당사자가 공유 비밀을 생성하는 데 동등하게 참여할 수 있도록 하며 한쪽 끝이 비밀을 제어하지 못하도록 합니다. 또한 보안되지 않은 채널을 통해 해당 정보를 전송하지 않고도 동일한 공유 비밀을 생성하는 작업을 달성합니다. 연결의 나머지에 사용되는 공유 비밀 암호화를 바이너리 패킷 프로토콜이라고합니다.
생성된 비밀은 대칭 키이며 메시지를 암호화하는 데 사용된 동일한 키를 반대쪽에서 해독하는 데 사용할 수 있습니다. 이것의 목적은 암호화된 터널에 모든 추가 통신을 감싸서 외부에서 해독할 수 없도록하는 것입니다.
세션 암호화가 설정된 후 사용자 인증 단계가 시작됩니다.
서버에 대한 사용자 액세스 인증
다음 단계는 사용자를 인증하고 액세스 권한을 결정하는 것입니다. 서버가 수락하는 내용에 따라 여러 가지 인증 방법을 사용할 수 있습니다.
일반적인 방법은 비밀번호 인증입니다. 이 방법은 서버가 클라이언트에게 로그인하려는 계정의 비밀번호를 요청하는 것입니다. 비밀번호는 협상된 암호화를 통해 전송되므로 외부 당사자로부터 안전합니다.
비밀번호가 암호화되어 있더라도, 이 방법은 일반적으로 비밀번호의 복잡성에 제한이 있기 때문에 권장되지 않습니다. 자동화된 스크립트는 다른 인증 방법에 비해 일반적인 길이의 비밀번호를 매우 쉽게 해독할 수 있습니다.
가장 인기 있고 권장되는 대안은 SSH 키 쌍을 사용하는 것입니다. SSH 키 쌍은 비대칭 키이며, 연관된 두 키가 서로 다른 기능을 제공합니다.
공개 키는 개인 키로만 복호화할 수 있는 데이터를 암호화하는 데 사용됩니다. 공개 키는 자유롭게 공유할 수 있습니다. 공개 키는 개인 키를 유도할 수 있는 방법이 없기 때문에 개인 키를 얻을 수 없습니다.
SSH 키 쌍을 사용한 인증은 이전 섹션에서 설명한 대칭 암호화가 설정된 후에 시작됩니다. 절차는 다음과 같이 진행됩니다:
- 클라이언트는 서버에게 인증하려는 키페어의 ID를 보내면서 시작합니다.
- 서버는 클라이언트가 로그인하려는 계정의
authorized_keys
파일을 확인하여 해당 키페어 ID를 찾습니다. - 파일에서 일치하는 ID의 공개 키를 찾으면, 서버는 무작위 숫자를 생성하고 해당 공개 키를 사용하여 숫자를 암호화합니다.
- 서버는 이 암호화된 메시지를 클라이언트에게 전송합니다.
- 만약 클라이언트가 관련된 개인 키를 실제로 가지고 있다면, 해당 키를 사용하여 메시지를 복호화하여 원래의 숫자를 확인할 수 있습니다.
- 클라이언트는 복호화된 숫자를 통신을 암호화하는 데 사용되는 공유 세션 키와 결합하고, 이 값을 MD5 해시로 계산합니다. MD5는 해시 함수를 사용하여 128비트 해시 값을 생성하는 메시지 다이제스트 알고리즘입니다.
- 그런 다음 클라이언트는 이 MD5 해시를 암호화된 숫자 메시지에 대한 답변으로 서버에게 다시 보냅니다.
- 서버는 클라이언트가 보낸 값과 비교하기 위해 동일한 공유 세션 키와 클라이언트에게 보낸 원래 숫자를 사용하여 자체적으로 MD5 값을 계산합니다. 이 두 값이 일치하면, 클라이언트가 개인 키를 소유하고 있음을 증명하며 클라이언트가 인증됩니다.
요약하면, 키의 비대칭성은 서버가 공개 키를 사용하여 클라이언트에게 메시지를 암호화할 수 있게 합니다. 그런 다음 클라이언트는 메시지를 올바르게 복호화하여 개인 키를 보유하고 있음을 증명할 수 있습니다. 사용되는 두 가지 유형의 암호화(대칭 공유 비밀 및 비대칭 공개/개인 키)는 각각이 이 모델에서 고유한 강점을 활용할 수 있습니다.
결론
SSH에서 작동하는 연결 협상 단계와 암호화 계층을 학습하면 원격 서버에 로그인할 때 무엇이 발생하는지 더 잘 이해할 수 있습니다. 이제 다양한 구성 요소 및 알고리즘 간의 관계를 인식하고 이러한 모든 조각이 어떻게 조화롭게 맞아 떨어지는지 이해할 수 있습니다. SSH에 대해 더 알아보려면 다음 가이드를 참조하십시오:
- 리눅스 서버에서 SSH 키 기반 인증 구성 방법
- 원격 서버에 연결하기 위한 SSH 사용 방법
- 다양한 운영 체제용 SSH 키 설정 방법
- SSH 핵심: SSH 서버, 클라이언트 및 키 사용 방법