known_hosts에서 키 제거


116

지난 몇 주 동안 여러 개의 가상 시스템을 구축했습니다. 문제는 .ssh/known_hosts 나에게 중간에있는 남성 경고. 이는 다른 지문이 가상 시스템 IP와 연결되어 있기 때문에 발생합니다.

에서 .ssh/known_hosts 하지만 IP와 관련된 기록은 발견하지 못했습니다. 단지 두 개의 기괴하고 열쇠 같은 문자열과 "ssh-rsa"만 있습니다.

누구든지 이전 키를 제거하는 방법에 대한 아이디어가 있습니까? known_hosts?


6
참조하는 "기괴하고 열쇠 같은 문자열"은 해시 된 호스트 / IP 주소입니다. 침입자가 액세스 할 수있는 시스템을 알 수 없게하는 보안 기능입니다. 이것을 보면 ssh_config에 HashKnownHosts yes 세트.
Deebster

1
파일 내용이 너무 혼란 스럽다고 생각되면 아마도 줄 바꿈이 활성화되었을 것입니다. 그것을 비활성화하십시오. 모든 행은 호스트 이름 또는 IP 주소로 시작합니다.
Daniel B

답변:


80
sed -i '6d' ~/.ssh/known_hosts

~ / .ssh / known_hosts : 6 파일을 수정하여 6 행을 제거합니다.

제 생각에는 ssh-keygen -R 는 openssh 고급 사용자를위한 더 나은 솔루션이지만, 일반 Linux 관리자는 위의 방법을 사용하여 자신의 sed 기술을 최신으로 유지하는 것이 좋습니다.


14
나는 공식적인 응용 프로그램을 가지고 있다면 수동으로 설정 파일을 편집하는 것이 좋은 조언이라고 생각하지 않는다. 위험을 무릅 쓰는 것은 당신을 프로로 만드는 것이 아니라 가장 빠르고 안전한 옵션을 찾는 것입니다. 사람들에게 계속해서 수정을 요청하는 것과 같습니다. /etc/sudoers 없이 visudo. 당신이 날카롭게하고 싶다면 sed 기술을 배우고, 시스템을 망치지 않고 진행하십시오.
kraxor

1
"공식 신청서가있는 경우"= & gt; 양자 모두 ssh-keygen -Rsed -i {line}d 꽤 "공식적인"것이며, ​​둘 다 가까운 미래에 일할 것입니다. Util ssh-keygen은 행 번호별로 제거 할 수 있습니다. 둘 다 완벽하게 수용 할 수 있습니다 (행 번호는 대개 다루기 쉽고 오류가 발생하기 쉽기 때문에 최신 데이터 센터 호스트 이름을 처리하기보다).
michael

2
A) 특별히 6 번째 줄을 지우는 것은 모두 "손을 봐주세요"입니다. 파일의 여섯 번째 줄에 대해 중요한 점에 대한 설명이 전혀 없습니다. B) 또한 man ssh-keygen 언급하다 ssh-keygen -R hostname 너는 방금 말했어. ssh-keygen -R 호스트 이름이 지정되지 않았으므로 그 의미가 무엇인지 설명하지 않았습니다.
barlop

98

가장 간단한 해결책은 다음과 같습니다.

rm -f .ssh/known_hosts

ssh가 파일을 다시 만들지 만 다른 호스트에 대한 핵심 검사를 잃어 버립니다!

또는 다음을 사용할 수 있습니다.

ssh-keygen -R "hostname"

또는 ssh "man-in-the-middle"메시지는 known_hosts 파일의 어떤 줄이 잘못된 지문을 가지고 있는지 나타내야합니다. 파일을 편집하고 해당 행으로 건너 뛰고 삭제하십시오.


49
ssh-keygen -R hostname 너무 일할 것이다.
grawity

4
해당 파일을 제거하면 다른 키도 제거됩니다.
shgnInc

11
파일을 제거하는 것은 나쁜 충고입니다. 예전 PC에 깨진 마우스가 있기 때문에 누군가에게 새 PC를 사라고 말하는 것과 같습니다. 공식 응용 프로그램에서 편집 할 수있는 파일을 수동으로 편집하는 것은 좋지 않습니다. 그만큼 ssh-keygen 옵션이 주석으로 인해 추가되었지만 설명이 없습니다. 나는이 답변이 너무 많은 상영을받을 가치가 있다고 생각하지 않는다.
kraxor

9
-1 때문에 전체 "known_hosts 파일을 삭제하십시오"첫 번째 줄. 이것은 끔찍하고 끔찍하고 끔찍한 제안이며 편집해야합니다.
Olivier Dulac

2
이 솔루션은 잔인합니다. 문제가되는 줄을 제거하십시오. 그게 전부 야.
Blake Frederick

62

이를 위해 ssh-keygen 스위치 (-R)가 있습니다.

man ssh-keygen 읽습니다.

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


8
이것은 가장 쉽고 안전한 방법입니다.
Leo

참고 : 이렇게하면 known_hosts 파일의 권한이 0600으로 변경됩니다. 어떤 이유로 든 known_hosts 파일을 공유하면 공유를 사용할 수 없게 될 수 있습니다.
Jiri Klouda

그리고 올바른 것. 또한, 나는해야만했다. [localhost]:port, 괄호를 사용하여 내가 사용자 지정 포트를 사용했기 때문에 = /. 다른 사람들과 마찬가지로, 일시적인 / 테스트 시스템 개발에는 SSH 키 확인 방식을 사용하지 않을 것이라고합니다.
Pysis

16

경고는 known_hosts 파일의 정확한 행을 알려줍니다.

다음은 그 예입니다.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

자세한 내용은 /home/user/.ssh/known_hosts:6 부품? 파일과 행 번호를 지정합니다.


9

UserKnownHostsFile 및 StrictHostKeyChecking 플래그를 사용하여 known_hosts 파일을 확인하지 않도록 ssh에 지시 할 수도 있습니다.

예를 들면 :

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

사용의 편의를 위해 다음과 같이 별칭을 지정할 수 있습니다.

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

이제 서버 인증서를 신뢰할 수있을 때마다 간단히 볼 수 있습니다.


7
이 얼마나 끔찍한 생각. 너무 게으 르기 때문에 보안 계층을 영구적으로 비활성화하십시오. ~/.ssh/known_hosts 최신 정보? 왜 그냥 가서 사용하지 않는가? telnet? "확신 할 때마다"- 확실하다면 MITM 공격이 무엇인지 전혀 알지 못하기 때문에 좋은 문학을 읽는 데 시간을 할애해야 할 것입니다.
kraxor

2
OP의 질문에 따라 나는 이것이 유효한 대답이라고 생각합니다. 때로는 많은 VM을 만들고 / 파괴하고있는 테스트 시스템이 있습니다. (저는 RHCE 시험 준비를하면서 지금 당장이 일을하고 있습니다.) 보안과 관련이 없을 수도 있습니다. 보안 함의가 중요 함을 지적하면서, 나는 이것이 "끔찍한 생각"이라고 분류되어서는 안된다고 생각합니다.
Rick Chatham


5

이 문제를 해결하려면 다음 명령을 실행해야합니다. 터미널을 열고 다음 명령을 입력하십시오.

아래의 모든 예제에서 -R 다음의 값을 바꿉니다.

ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com

이 방법은 이미 이전 답변에서 제안되었습니다. 답안에서 다른 점을 확대 할 수 있었습니까?
Burgi

@Burgi -이 답변은 구문에 대한 자세한 내용을 제공합니다. ssh-keygen -R 지금까지는 다른 답변보다. 예제를 통해 정확히 무엇을 쓸 수 있는지 보여줍니다. -R. 따라서 완전히 새로운 대답은 아니지만이 대답은 가치가 있습니다.
Yitz

@Yitz 내 의견은 검토의 일부로 작성되었습니다. 당시 (18 개월 전) 나는 더 나은 결과를 얻기 위해 약간의 도움이 필요하다고 생각했습니다.
Burgi

2

예를 들어 다음과 같이 알려진 호스트에서 단일 행을 제거 할 수도 있습니다. rmknownhost 111 (111은 제거 할 줄) :

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}

이 이름으로 저장 rmknownhost 너의 폴더에서 PATH.


텍스트 편집기에서이 작업을 수행하는 것의 이점은 무엇입니까? 그런 식으로하지 않는 이유가 있습니까? sudoers를 visudo로 어떻게 편집해야합니까?
Andy Lester

이 배포판에는 어떤 배포자가 있습니까? 우분투에는없는 것 같습니다.
flickerfly

이점은 자동 및 빠른 / 그것은 당신이 자신을 추가하는 별도의 바이너리의
grosser

이 답변을 게시 한 날에 작성한 자신의 블로그 항목을 연결하는 대신 스크립트를 방금 게시 할 수 있습니다. 이것은 IMHO 스팸으로 분류됩니다. 말할 필요도없이 동일한 결과를 얻기 위해 간단한 별칭을 만들 수 있습니다. 7 줄 길이의 루비 스크립트가 필요 없습니다.
kraxor

0

호스트 이름 또는 ip 항목은 첫 번째 열에 있어야합니다. 경고에는 위반 키가있는 행 번호도 나열되어야합니다.


0

이것은 텍스트 파일입니다. vi (m)로 쉽게 편집하고 문제의 행 (dd)을 삭제하고 파일 (wq)을 저장할 수 있습니다. 그러나 호스트를 제거하는 특정 명령이 있다면 아마도 가장 안전한 방법 일 것입니다.


나는 VIM에서 직접 파일을 편집하는 것이 "안전하지 않은"방법이라고 생각하지 않는다. 그것은 VIM의 편안함을 기준으로합니다. 특히이 파일을 사용할 때 가장 큰 위험은 너무 많은 키를 삭제하는 것입니다.이 경우 키를 다시 누르면됩니다.
Rick Chatham

내가 언급 한 "안전"은 1) 다른 파일 (존재하는 경우)의 종속 정보를 제거하는 것을 잊어 버리거나 2) 우발적으로 삭제해야하는 것보다 실수로 파일을 삭제하는 것과 관련됩니다.
Ryan Griggs

0

모든 대답은 좋지만 실제 SSH 전문가에게는 포트 번호로 ssh 서명을 제거하는 방법에 대한 정보가 빠져 있습니다.

예 : 당신이에 연결

ssh some.host.name -p 222

경고를 받으면 이것을 제거하려면 대괄호 콜론 포트 번호를 사용해야합니다.

ssh-keygen -R [some.host.name]:222

희망이 비표준 구성 사용자를위한 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.