~/.ssh 디렉토리에서 공개 키를 삭제했습니다. 비밀번호 없이 호스트에 계속 액세스할 수 있는 이유는 무엇입니까?

~/.ssh 디렉토리에서 공개 키를 삭제했습니다. 비밀번호 없이 호스트에 계속 액세스할 수 있는 이유는 무엇입니까?

클라이언트 컴퓨터에서 공개/개인 키 쌍을 생성했습니다. 호스트 파일에 공개 키를 추가하면 이제 비밀번호를 입력하지 않고도 SSH를 성공적으로 수행할 수 있습니다 ~/.ssh.id_rsaid_rsa.pubauthorized_keys

이제 공개 키를 해당 폴더 밖으로 이동 mv ~/.ssh/id_rsa.pub ~/하고 호스트에 다시 SSH를 시도했습니다. 실패할 것으로 예상했지만(공개 키가 누락되었기 때문에) 여전히 작동합니다! 어떻게요? 디렉토리에 없는 경우 공개 키를 어떻게 찾나요 ~/.ssh? 홈 폴더 외부의 다른 위치로 이동해 보았지만 비밀번호 확인이 성공하지 못한 채 계속 연결됩니다.

답변1

ssh-agent에 의해 키가 캐시되지 않았는지 확인하세요.

캐시된 키 목록을 가져옵니다.

ssh-add -l

캐시된 키를 모두 삭제합니다.

ssh-add -D

답변2

공개 키 암호화를 사용하면 공개 키를 제공하고 개인 키는 비공개로 유지합니다. 누군가 당신에게 무언가를 보내려고 할 때, 그들은 자신의 공개 키를 사용하여 그것을 암호화하고 당신은 개인 키를 사용하여 그것을 해독합니다. 공개 키를 제공하면 메시지를 해독하는 데 공개 키가 필요하지 않습니다.

ssh가 이러한 키를 사용하는 방법에 대한 자세한 내용은 모르지만 해당 -v옵션을 사용하면 다음과 같은 내용이 표시됩니다.

$ ssh -vvv vm
...
debug1: identity file /Users/username/.ssh/id_rsa type 0
...
debug1: Offering public key: /Users/username/.ssh/id_rsa RSA SHA256:...
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: /Users/username/.ssh/id_rsa RSA SHA256:/...

이를 고려하면 개인 키를 사용하여 공개 키를 얻은 다음 공개 키를 원격 호스트로 보내는 것 같습니다.

이 구성이 더 이상 유효하지 않게 하려면 개인 키( ~/.ssh/id_rsa)를 [제거]해야 합니다.

답변3

리모컨에 아직 공개 키( ~/.ssh/authorized_keys)가 있다고 말씀하셨습니다. 그리고 로컬에도 개인키( ~/.ssh/id_rsa)가 있습니다.

그게 다야.


예(다른 답변에 대한 설명) 프로토콜은 들어갈 때까지 사용 가능한 모든 키를 시도합니다.

해시를 보내는 것은 키를 더 빨리 찾는 방법일 뿐입니다. 리모컨은 모든 공개 키를 해시하고 해시를 비교한 후 일치하는 키를 사용합니다. 공개 키는 개인 키(파일)에서 파생될 수 있습니다.

debug1: Offering public key: /Users/username/.ssh/id_rsa RSA SHA256클라이언트가 개인 키 파일에서 공개 키 해시를 파생하고 있음을 나타냅니다. 따라서 공개 키가 있거나 공개 키가 개인 키에서 파생될 수 있습니다(키 유형에 따라 다름).

답변4

(공개 키가 분실되었기 때문에) 실패할 것으로 예상하고 다시 SSH를 통해 호스트에 연결을 시도했지만 여전히 작동했습니다! 어떻게요?

공개 키를 원격 서버에 보내고 나면(그리고 원격 서버가 해당 authorized_keys파일에 공개 키를 저장한 경우) 더 이상 공개 키 파일이 필요하지 않습니다. 인증에 필요한 것은 개인 키뿐입니다.

물론 공개 키 파일을 보관하는 것이 좋습니다. 하지만RSA 개인 키에는 공개 키가 포함되어 있기 때문에을 사용하면 언제든지 개인 키 파일에서 공개 키 파일을 추출할 수 있습니다.

특히 RSA 개인 키의 내용은 다음과 같습니다.

-----BEGIN RSA PRIVATE KEY-----
RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
-----END RSA PRIVATE KEY-----

RSA 공개 키의 내용은 다음과 같습니다.

-----BEGIN RSA PUBLIC KEY-----
RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}
-----END RSA PUBLIC KEY-----   

(출처: RFC 3447.)

관련 정보