SSH 용 authorized_keys와 known_hosts 파일의 차이점은 무엇입니까?

SSH 프로토콜의 기초를 배우고 있습니다. 다음 두 파일의 내용이 혼란 스럽습니다.

  1. ~/.ssh/authorized_keys : 서버에 대해 승인 된 공개 키 목록을 보유합니다. 클라이언트가 서버에 연결되면 서버는이 파일에 저장된 서명 된 공개 키를 확인하여 클라이언트를 인증합니다.

  2. ~/.ssh/known_hosts : 사용자가 액세스 한 SSH 서버의 DSA 호스트 키를 포함합니다. 이 파일은 SSH 클라이언트가 올바른 SSH 서버에 연결하고 있는지 확인하는 데 매우 중요합니다.

이게 무슨 뜻인지 잘 모르겠습니다. 도와주세요.

댓글

Answer

known_hosts 파일을 사용하면 클라이언트가 서버를 인증하여 가장에 연결되어 있지 않은지 확인할 수 있습니다. authorized_keys 파일을 사용하면 서버는 사용자를 인증합니다.

서버 인증

SSH 연결이 설정 될 때 발생하는 첫 번째 작업 중 하나는 서버가 공개 키를 클라이언트에 전송하고이를 증명하는 것입니다. ( 공개 키 암호화 덕분에) 클라이언트가 연결된 개인 키를 알고 있음을 알립니다. 이렇게하면 서버가 인증됩니다. 프로토콜의이 부분이 성공하면 클라이언트는 자신이 주장하는 서버가 누구인지 알고 있습니다.

클라이언트는 서버가 알려진 서버인지 일부 불량 서버가 아닌지 확인할 수 있습니다. 올바른 것으로 넘어 가려고합니다. SSH는 서버의 정당성을 확인하는 간단한 메커니즘 만 제공합니다. 클라이언트 시스템의 ~/.ssh/known_hosts 파일에 이미 연결 한 서버를 기억합니다 (시스템도 있습니다. -wide 파일 /etc/ssh/known_hosts). 서버에 처음 연결할 때 서버에서 제공하는 공개 키가 실제로 서버의 공개 키인지 다른 방법으로 확인해야합니다. 연결하려고했습니다. 연결하려는 서버의 공개 키가있는 경우 클라이언트의 ~/.ssh/known_hosts에 수동으로 추가 할 수 있습니다.

그런데 known_hosts에는 DSA (RSA 및 ECDSA도 포함)뿐만 아니라 SSH 구현에서 지원하는 모든 유형의 공개 키가 포함될 수 있습니다.

인증 기밀 데이터를 보내기 전에 서버를 수행해야합니다. 특히, 사용자 인증에 비밀번호가 포함 된 경우 비밀번호를 인증되지 않은 서버로 보내서는 안됩니다.

사용자 인증

서버는 해당 사용자가 원격 사용자의 로그인 만 허용합니다. 해당 계정에 액세스 할 수있는 권한이 있음을 증명할 수 있습니다. 서버의 구성과 사용자의 선택에 따라 사용자는 여러 형태의 자격 증명 중 하나를 제시 할 수 있습니다 (아래 목록은 전체가 아님).

  • 사용자는 암호를 제시 할 수 있습니다. 그가 로그인하려는 계정; 그런 다음 서버는 암호가 올바른지 확인합니다.
  • 사용자는 공개 키를 제시하고 공개 키와 관련된 개인 키를 소유하고 있음을 증명할 수 있습니다. 이것은 서버를 인증하는 데 사용되는 것과 똑같은 방법이지만 이제 사용자는 ID를 증명하려고 시도하고 서버가이를 확인합니다. 사용자가 개인 키를 알고 있고 공개 키가 계정의 인증 목록 (서버의 ~/.ssh/authorized_keys)에 있음을 증명하면 로그인 시도가 허용됩니다.
  • 또 다른 유형의 방법은 사용자 인증 작업의 일부를 클라이언트 시스템에 위임하는 것입니다. 이는 여러 시스템이 동일한 계정을 공유하는 기업과 같은 제어 된 환경에서 발생합니다. 서버는 다음과 같은 동일한 메커니즘으로 클라이언트 시스템을 인증합니다. 다른 방법으로 사용한 다음 클라이언트를 사용하여 사용자를 인증합니다.

댓글

  • 이 작업이 매우 유용합니다. known_hosts 파일은 클라이언트에서 유지되고 authorized_key 파일은 서버에서 유지됩니다
  • @Ankit 예, 그렇습니다.
  • 서버에 두 파일이 모두 있습니다. ssh를 사용하여 테스트합니다.하지만 두 파일의 내용이 다릅니다. 따라서이 파일에서 키가 다른가요?
  • @Timo 키는 완전히 unr입니다. 의기 양양한. 하나는 시스템의 키이고 다른 하나는 사용자의 키입니다.
  • @Gilles 따라서 서버에 대한 항목이 ‘의 공개 키가 추가되면 클라이언트 ‘ 컴퓨터의 known_hosts 파일에 추가하면 둘 사이의 모든 후속 ssh 세션은 ‘ t 서버에 올바른 개인 키가 있음을 증명해야합니까?

답변

이 두 파일은 모두 에서 사용됩니다. SSH 이지만 완전히 다른 용도로 사용되므로 혼동을 쉽게 설명 할 수 있습니다.

인증 된 키

기본적으로 SSH는 호스트 OS에서 관리하는 사용자 계정과 비밀번호를 사용합니다. (실제로는 PAM 에서 관리하지만 여기서는 그 구분이별로 유용하지 않습니다.) 이것은 사용자 이름으로 SSH에 연결하려고 할 때 의미합니다. “bob”과 SSH 서버 프로그램이 OS에 물어볼 암호가 있습니다. “이 사람이 “bob”이라는 이름을 얻었습니다. “bob”은 자신의 암호가 “wonka”라고 말합니다. 그를 들여 보내도 되나요? ” 대답이 예인 경우 SSH를 통해 인증 할 수 있으며 즐거운 길을 갈 수 있습니다.

비밀번호 SSH 외에도 또한 공개 키 암호화 를 사용하여 사용자를 식별 할 수 있습니다. 특정 암호화 알고리즘은 다를 수 있지만 일반적으로 RSA 또는 DSA 또는 최근에 ECDSA . 키를 설정할 때 어떤 경우에도 ssh-keygen 프로그램에서 두 개의 파일을 만듭니다. 하나는 개인 키이고 다른 하나는 공개 키입니다. 이름은 상당히 자체적입니다. 설계 상 공개 키는 사용자를 손상시키지 않고 바람에 날리는 민들레 씨앗처럼 흩어져있을 수 있습니다. 개인 키는 항상 가장 엄격한 기밀로 유지해야합니다.

그러므로 공개 키는 공개하는 것입니다. authorized_keys 파일에 키를 입력 한 다음 사용자 이름 “bob”을 사용하여 SSH에 연결하려고 할 때 개인 키는 OS에 묻습니다. “이 사람 이름 “bob”을 받았습니다. 여기에있을 수 있습니까? ” 대답이 다음과 같으면 예, 그러면 SSH가 개인 키를 검사하고 authorized_keys 파일의 공개 키가 쌍인지 확인합니다. 두 답변이 모두 예이면 허용됩니다.

알려진 호스트

authorized_keys 파일이 사용자 인증에 사용되는 방식과 매우 유사합니다. known_hosts 파일은 서버를 인증하는 데 사용됩니다. SSH가 새 서버에 구성 될 때마다 사용자에 대해했던 것처럼 항상 서버에 대한 공개 및 개인 키를 생성합니다. SSH 서버에 연결할 때마다 해당 개인 키를 소유하고 있다는 증거와 함께 공개 키가 표시됩니다. 공개 키가없는 경우 컴퓨터에서이를 요청하고 known_hosts 파일에 추가합니다. 열쇠가 있고 일치하면 바로 연결됩니다. 키가 일치하지 않으면 큰 경고가 표시됩니다. 이것은 일이 흥미로워지는 곳입니다. 키 불일치가 일반적으로 발생하는 세 가지 상황은 다음과 같습니다.

  1. 서버에서 키가 변경되었습니다. OS 를 다시 설치하거나 일부 OS에서 SSH를 업데이트 할 때 키가 다시 생성 될 수 있습니다.
  2. 연결중인 호스트 이름 또는 IP 주소 다른 서버에 속해있었습니다. 주소 재 할당, DHCP 또는 이와 유사한 것일 수 있습니다.
  3. 악성 man- 중간 공격 이 발생하고 있습니다. 이것은 키 검사가 사용자를 보호하기 위해 시도하는 가장 큰 것입니다.

두 경우 모두 known_hostsauthorized_keys, SSH 프로그램은 클라이언트 또는 서버를 식별하기 위해 공개 키 암호화를 사용합니다.

댓글

  • ” SSH 서버에 연결할 때마다 ID를 증명하기 위해 개인 키를 제공합니다. ” 확실히 그렇지 않기를 바랍니다. 당신이 공개 키 를 의미한다고 생각합니다. 서버가 나에게 개인 키와 함께 클라이언트를 제공하면 (A) 인증이 작동하지 않으며 (B) 서버가 인증을 받았다는 표시입니다. 즉시 거래를 중단해야한다고 잘못 구성했습니다. 개인 키는 지정된 사용자가 원래 컴퓨터에서만 액세스 할 수 있어야합니다. 그 ‘가 요점입니다. 😉
  • 이 답변은 허용 된 것보다 더 많은 도움이되었습니다. (:
  • 로컬 서버 (로컬 IP)로 ssh 한 다음 나중에 같은 컴퓨터에서 원격으로 동일한 서버 (공용 IP)에 연결하면 일치하지 않는 키가 트리거됩니까?이 문제를 어떻게 완화 할 수 있습니까?

답변

공개 키가 포함 된 보안 파일 정보

“known_hosts”와 “authorized_keys”가 어떻게 다른지 이해하는 데 도움이되도록 이러한 파일이 “ssh”에 어떻게 들어 맞는지 설명하는 몇 가지 컨텍스트가 있습니다. 이것은 지나치게 단순화 된 것입니다. 여기에 언급 된 것보다 “ssh”에 대한 더 많은 기능과 복잡성이 있습니다.

연관은 신뢰할 수있는 출처에 있습니다.

공개 키 값은 “바람의 씨앗처럼 안전하게 흩어져있을 수 있습니다.”라는 말이 있지만 어떤 씨앗이 정원에 설치 될지 결정하는 시드 포드가 아닌 가드너입니다. 공개 키는 비밀이 아니지만 키가 인증하는 것과 키의 신뢰할 수있는 연관성을 유지하려면 강력한 보호가 필요합니다. 이 연결을 위해 “known_hosts”, “authorized_keys”및 “Certificate Authority”목록이 포함됩니다.

“ssh”에서 사용하는 신뢰할 수있는 소스

공개 키가 “ssh”와 관련하여 키를 미리 등록하고 적절한 보안 파일에 저장해야합니다. (이 일반적인 사실에는 나중에 설명 할 중요한 예외가 하나 있습니다.) 서버와 클라이언트는 각각 고유하고 안전하게 저장됩니다. 공개 키 목록. 각 측이 서로 등록 된 경우에만 로그인이 성공합니다.

  • “known_hosts”가 클라이언트에 상주합니다. nt
  • “authorized_keys”는 서버에 있습니다.

클라이언트의 보안 파일은 “known_hosts”라고하고 서버의 보안 파일은 “authorized_keys”라고합니다. . 이러한 파일은 각각 한 줄에 하나의 공개 키가있는 텍스트가 있다는 점에서 비슷하지만 형식과 사용법에 미묘한 차이가 있습니다.

인증에 사용되는 키 쌍

공개 -개인 키 쌍은 “비대칭 암호화”를 수행하는 데 사용됩니다. “ssh”프로그램은 인증을 위해 비대칭 암호화를 사용할 수 있으며, 여기서 엔티티는 자신의 신원을 증명하기 위해 도전에 응답해야합니다. 문제는 하나의 키로 인코딩하여 생성되고 다른 키로 디코딩하여 응답합니다. (비대칭 cryptogrophy는 로그인 단계에서만 사용되며 “ssh”(TSL / SSL)는 데이터 스트림을 처리하기 위해 다른 형태의 암호화로 전환합니다.)

서버를위한 하나의 키 쌍, 다른 하나 for Client

“ssh”에서 양쪽 (클라이언트와 서버)은 서로를 의심합니다. 이것은 “telnet”이었던 “ssh”의 이전 버전에 비해 개선 된 것입니다. “telnet”을 사용하면 클라이언트는 암호를 제공해야했지만 서버는 검사되지 않았습니다. 검증의 부재로 인해 “중간자 (man-in-the-middle)”공격이 발생하고 보안에 치명적인 결과가 초래되었습니다. 반대로, “ssh”프로세스에서 클라이언트는 서버가 처음 질문에 응답 할 때까지 정보를 제공하지 않습니다.

“ssh”인증 단계

로그인 정보를 공유하기 전에 “ssh”클라이언트는 먼저 서버에 “당신이 정말로 당신이 누구라고 생각 하는가?”를 증명하도록 도전함으로써 중간자 공격의 기회를 제거합니다. 이 문제를 해결하려면 클라이언트는 대상 서버와 관련된 공개 키를 알아야합니다. 클라이언트는 “known_hosts”파일에서 서버의 이름을 찾아야합니다. 연결된 공개 키는 서버 이름 뒤에있는 같은 줄에 있습니다. 서버 이름과 공개 키 간의 연결은 위반 상태로 유지되어야합니다. 따라서 권한 “known_hosts”파일은 600이어야합니다. 아무도 쓰거나 읽을 수 없습니다.

서버가 인증되면 클라이언트에 도전 할 기회가 주어집니다. 인증에는 공개 된 호스트 중 하나가 포함됩니다. “authorized_keys”에서 키를 찾았습니다. (이러한 키가 작동하지 않으면 “sshd”프로세스는 암호 스타일 인증으로 대체됩니다.)

파일 형식

그래서 ” ssh “는 다른 로그인 프로세스와 마찬가지로”친구 “목록이 있으며 목록에있는 사람 만 챌린지를 통과 할 수 있습니다. 클라이언트의 경우”known_hosts “파일은 역할을 수행 할 수있는 친구 목록입니다. 서버 (호스트), 이름별로 나열됩니다. 서버의 경우 동등한 친구 목록은 “authorized_keys”파일이지만 해당 파일에는 이름이 없습니다. c 키 자체는 식별자처럼 작동합니다. (서버는 로그인이 어디에서 오는지 신경 쓰지 않고 어디로 가는지에만 신경을 씁니다. 클라이언트가 특정 계정에 액세스를 시도하고 있으며, “ssh”가 호출 될 때 계정 이름이 매개 변수로 지정되었습니다. “authorized_keys”파일은 해당 계정의 홈 디렉토리에 있으므로 해당 계정에 고유합니다.)

구성 항목에서 표현할 수있는 많은 기능이 있지만 기본적이고 가장 일반적인 사용법입니다. 에는 다음 매개 변수가 있습니다. 매개 변수는 공백 문자로 구분됩니다.

“known_hosts”의 경우 :

{server-id} ssh-rsa {public-key-string} {comment} 

“authorized_keys”의 경우 :

ssh-rsa {public-key-string} {comment} 

ssh-rsa 토큰은 인코딩에 사용되는 알고리즘이 “rsa”임을 나타냅니다. 기타 유효한 알고리즘 “dsa”및 “ecdsa”를 포함합니다. 따라서 여기에 표시된 ssh-rsa 대신 다른 토큰이 사용될 수 있습니다.

“ssh”를 사용하여 “known_hosts”항목

두 경우 모두 e 공개 키가 보안 파일 내에서 발견되지 않으면 비대칭 암호화가 발생하지 않습니다. 앞서 언급했듯이이 규칙에는 한 가지 예외가 있습니다.사용자는 사용자의 “known_hosts”파일에 나열되지 않은 서버에 로그인하여 메시지 가로 채기 (man-in-the-middle) 공격 가능성을 고의로 선택할 수 있습니다. “ssh”프로그램은 사용자에게 경고하지만 사용자가 계속 진행하기로 선택하면 “ssh”클라이언트는 “한 번만”허용합니다. 한 번만 발생하도록하기 위해 “ssh”프로세스는 서버에 필요한 정보로 “known_hosts”파일을 자동으로 구성합니다. 공개 키를 사용하여 “known_hosts”파일에 기록합니다.이 예외는 공격자가 서버 이름과 공개 키의 연결을 제공 할 수 있도록 허용함으로써 보안을 완전히 파괴합니다.이 보안 위험은 일을 너무 많이 만들기 때문에 허용됩니다. 물론 정확하고 안전한 방법은 사용자가 서버에 로그인을 시도하기 전에 “known_hosts”파일에 서버 이름과 공개 키가있는 줄을 수동으로 삽입하는 것이었을 것입니다. 위험이 낮은 상황에서는 추가 작업이 무의미 할 수 있습니다.)

일대 다 관계

클라이언트의 “known_hosts”파일에있는 항목에는 서버 이름과 서버 시스템에 적용 할 수있는 공개 키가 있습니다. 서버에는 모든 문제에 응답하는 데 사용되는 단일 개인 키가 있으며 클라이언트의 “known_hosts”항목에는 일치하는 공개 키가 있어야합니다. 따라서 특정 서버에 액세스하는 모든 클라이언트는 동일한 공개 키를 갖게됩니다. 1 : N 관계는 서버의 공개 키가 많은 클라이언트의 “known_hosts”파일에 나타날 수 있다는 것입니다.

“authorized_keys”파일의 항목은 다음을 식별합니다. 친숙한 클라이언트가 계정에 액세스 할 수 있도록 허용합니다. 친구는 동일한 공개-개인 키 쌍을 사용하여 여러 개의 서로 다른 서버에 액세스 할 수 있습니다. 이렇게하면 단일 키 쌍이 지금까지 접속 한 모든 서버에 대해 인증 할 수 있습니다. 각 대상 서버 계정 “authorized_keys”파일에 동일한 공개 키 항목이있을 것입니다. 1 : N 관계는 하나의 클라이언트의 공개 키가 여러 서버의 여러 계정에 대한 “authorized_keys”파일에 나타날 수 있다는 것입니다.

때로는 여러 클라이언트 컴퓨터에서 작업하는 사용자가 동일한 키 쌍을 복제합니다. 일반적으로 이것은 사용자가 데스크 탑과 노트북에서 작업 할 때 수행됩니다. 클라이언트 시스템은 동일한 키로 인증하기 때문에 서버 “authorized_keys”의 동일한 항목과 일치합니다.

개인 키 위치

서버 측의 경우 시스템 프로세스 , 또는 daemon은 들어오는 모든 “ssh”로그인 요청을 처리합니다. 데몬의 이름은 “sshd”입니다. 개인 키의 위치는 SSL 설치에 따라 다릅니다. 예를 들어 Apple은 /System/Library/OpenSSL하지만 OpenSSL의 자체 버전을 설치하면 위치는 /opt/local/etc/openssl가됩니다.

클라이언트 측의 경우 “ssh”(또는 “scp”)를 호출합니다. ) 필요한 경우 명령 줄에 다양한 매개 변수가 포함되며이 중 하나는 선택적으로 사용할 개인 키를 지정할 수 있습니다. 기본적으로 클라이언트 측 키 쌍은 종종 $HOME/.ssh/id_rsa라고합니다. 및 $HOME/.ssh/id_rsa.pub.

요약

요점은 “known_hosts”와 “authorized_keys”모두 공개 키를 포함하지만 …

  • known_hosts-클라이언트가 호스트가 정품인지 확인합니다.
  • authorized_keys-호스트가 클라이언트 로그인 허용 여부를 확인합니다.

댓글

  • SSH 클라이언트는 일반적으로 허용합니다. ‘ 키가 없습니다. authorized_keys에 나열된 공개 키는 시스템이 아닌 사용자를 식별합니다.
  • 감사합니다. 이것은 파일과 키 간의 관계에 대한 매우 명확하고 이해하기 쉬운 설명입니다.

답변

전혀 사실이 아닙니다.

known_hosts 파일에는 호스트의 지문이 포함되어 있습니다. 원격 호스트의 공개 또는 비공개 키가 아닙니다.

키에서 생성되지만 키 자체가 아닙니다.

해당 주소로 SFTP하는 경우 여러 (다양한) 호스트 (부하 분산 등)로 해석 될 수 있으므로 가능한 모든 끝점에서 지문을 추가해야합니다. 그렇지 않으면 처음에 작동 한 다음 두 번째 (또는 후속) 호스트로 라우팅 될 때 실패합니다.

댓글

  • erm known_hosts 파일을보고 연결할 때 호스트 지문과 비교합니다 …. 이렇게하면 문제가 해결됩니다. 또한 known_hosts 파일의 지문 또는 공개 키에 관계없이 예제는 정확히 동일합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다