고려사항

고려사항

다음 시나리오를 상상해 봅시다.

ABCDEF1234특정 호스트 이름에 대한 호스트 키가 있으므로 내 known_hosts파일은 다음과 같습니다(해시되지 않은 버전).

example.com ssh-rsa ABCDEF1234

이제 연결하면 호스트 이름이 10.11.12.13으로 확인됩니다. 다음과 같은 메시지가 나타납니다.

Warning: Permanently added the ECDSA host key for IP address '10.11.12.13' to the list of known hosts.

그리고 내 알려진 호스트는 다음과 같습니다

example.com ssh-rsa ABCDEF1234
192.0.2.1 ssh-rsa ABCDEF1234 

이제 몇 달 후 example.com관리자는 RSA 키가 제거되고 키에 맞게 변경되었다고 알려줍니다 1234ABCDEF. 따라서 를 사용하여 문제가 되는 키를 제거한 ssh-keygen -R example.com다음 처음으로 연결하고 키를 수락하면 known_host다음과 같은 모습을 알 수 있습니다.

192.0.2.1 ssh-rsa ABCDEF1234 
example.com  ssh-rsa 1234ABCDEF

그리고 연결할 때마다 다음과 같은 멋진 경고 메시지가 나타납니다.

Warning: the ECDSA host key for 'example.com' differs from the key for the IP address '192.0.2.1'
Offending key for IP in /home/jenkins/.ssh/known_hosts:162
Matching host key in /home/jenkins/.ssh/known_hosts:182

이제 특정 호스트 이름에 대해 수십 또는 수백 개의 IP가 있다고 상상해 보십시오. 이는 정리해야 할 줄이 상당히 많습니다. 한 가지 해결책은 일치하는 줄을 제거하는 데 사용하는 것이지만 , 혼란을 피하는 것이 sed목표가 아닙니까 ?ssh-keygen -Rsed

sed -i '/ABCDEF1234/d' known_hosts

known_host호스트 이름이나 IP 주소 대신 특정 키와 연결된 파일 의 모든 항목을 제거하는 다른 솔루션이 있습니까 ?

답변1

의 목적 ssh-keygen -R은 사용을 피하는 것이 아니라 찾을 수 없는 sed해시된 호스트를 제거하는 것입니다 sed. 에서ssh-keygen(1):

-R hostname

hostname파일 에 속한 모든 키를 제거합니다 known_hosts. 이 옵션은 해시된 호스트를 삭제하는 데 유용합니다( -H위 옵션 참조).

-H

파일 을 해시합니다 known_hosts. 이는 모든 호스트 이름과 주소를 지정된 파일 내의 해시된 표현으로 대체합니다. 원본 콘텐츠는 접미사가 붙은 파일로 이동됩니다 .old. 이러한 해시는 일반적으로 ssh및 에서 사용될 수 있지만 sshd파일 내용이 공개되는 경우 식별 정보를 공개하지 않습니다. 이 옵션은 기존 해시된 호스트 이름을 수정하지 않으므로 해시된 이름과 해시되지 않은 이름이 혼합된 파일에 사용하는 것이 안전합니다.

고려사항

충돌을 피하세요

다른 키를 제거하지 않으려면 Base64로 인코딩된 전체 공개 키를 사용하는 것이 가장 좋습니다. 예를 들어,머리글결국 동일한 유형의 모든 키가 제거됩니다.

 Base64 아스키 참조.
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTY
AAAAIbmlzdHAyNTYAAABBB
....ecdsa-sha2-nistp256
....nistp256...A
RFC 5656, 3.1
AAAAC3NzaC1lZDI1NTE5AAAAIFKy ....ssh-ed25519... R² RFC 8709, 4
AAAAB3NzaC1yc2EAAAADAQABAAABAQ ...ssh-rsa........... RFC 4253, 6.6

sedBase64에 맞게 조정

Base64로 인코딩된 공개 키에는 문자가 포함되어 있습니다 A-Za-z0-9+/=. /귀하의 예에서 사용된 을 포함할 수 있으므로 sed와 같은 다른 문자를 사용하고 싶습니다 :.

실제 사례

예에서:

  • AAAA+OLD/KEY=(는)가득한오래된 공개 키.
  • AAAA+NEW/KEY=(는)가득한새로운 공개 키.

동일한 키를 가진 모든 호스트 제거

전체 이전 키를 사용하여 해당 키가 포함된 모든 줄을 제거합니다.

sed -i ':AAAA+OLD/KEY=:d' ~/.ssh/known_hosts

기존 키를 새 키로 교체

전체 키(이전 키와 새 키)를 사용하여 이전 키가 포함된 모든 줄에서 교체합니다.

sed -i 's:AAAA+OLD/KEY=:AAAA+NEW/KEY=:g' ~/.ssh/known_hosts

키 유형도 변경되면 이를 포함해야 합니다. 예:

sed -i 's:ssh-rsa AAAA+OLD/KEY=:ecdsa-sha2-nistp256 AAAA+NEW/KEY=:g' ~/.ssh/known_hosts

호스트 이름 또는 IP에 대한 키 제거

이는 를 사용하는 유일한 사용 사례입니다 ssh-keygen.

ssh-keygen -R example.com

ssh-keygen -R 192.0.2.1

답변2

처음부터 문제를 피하는 것이 좋은 해결책입니다. Known_hosts가 주어진 호스트 이름에 대한 각각의 모든 IP에 대한 항목으로 채워지지 않은 경우 sed를 망칠 필요가 없습니다. ssh_keygen -R hostname키 순환을 수행하는 데 충분합니다.

그래서 이에 대한 나의 해결책은 ssh 구성에서 CheckHostIP설정 하는 것입니다.no

SSH 옵션 CheckHostIP=yes가 실제로 어떻게 도움이 되나요?

관련 정보