known_hosts에 새 호스트를 자동으로 추가 할 수 있습니까?


249

내 상황은 다음과 같습니다. 중앙 클라이언트에서 여러 가상 머신 인스턴스를 시작한 다음을 통해 명령을 실행할 테스트 하니스를 설정하고 있습니다 ssh. 가상 머신에는 이전에 사용하지 않은 호스트 이름과 IP 주소가 있으므로 ~/.ssh/known_hosts중앙 클라이언트 의 파일에 없습니다 .

내가 겪고있는 문제 ssh는 새로운 가상 인스턴스에 대해 첫 번째 명령을 실행하면 항상 대화 형 프롬프트가 나타납니다.

The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?

가상 머신 이미지에 이미 구운 퍼블릭 키를 사용하여 이것을 우회하고 클라이언트 컴퓨터에 이미 새로운 호스트를 알리는 방법이 있습니까? 가능한 경우 대화식 프롬프트에 응답하기 위해 Expect 또는 무엇이든 사용하지 않는 것이 좋습니다.


5
독립적이고 물리적으로 안전한 테스트 환경의 경우 자동화 된 키 승인이 제대로 작동 할 수 있습니다. 그러나 프로덕션 환경 또는 신뢰할 수없는 네트워크 (예 : 인터넷)에서 공개 키를 자동으로 수락하면 SSH가 감당할 수있는 중간자 (man-in-the-middle) 공격에 대한 보호 기능이 완전히 무시됩니다. MITM 공격으로부터 보안을 유지 하는 유일한 유효한 방법은 대역 외의 신뢰할 수있는 채널을 통해 호스트의 공개 키를 확인하는 것입니다. 약간 복잡한 키 서명 인프라를 설정하지 않고 자동화 할 수있는 안전한 방법은 없습니다.
Eil

답변:


141

구성 파일에서 또는 다음을 통해 StrictHostKeyChecking옵션을로 설정하십시오 .no-o

ssh -o StrictHostKeyChecking=no username@hostname.com


62
이것은 당신이 중간 공격에서 사람에게 열려있게 할 것입니다. 아마 좋은 생각은 아닙니다.
JasperWallace

9
@JasperWallace는 일반적으로 좋은 조언이지만 특정 사용 사례 (테스트 VM 배포 및 명령 보내기)는 충분히 안전해야합니다.
Massimo

8
이것은 Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts.경고를 피하고 known_hosts 파일에 항목이 추가되는 것을 피하기 위해 다음과 같이합니다.ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com
Peter V. Mørch

11
이로 인해 다운 보팅은 질문에 대한 답변이 아니며 심각한 보안 취약점에 노출됩니다.
marcv81

12
@Mnebuerquo : 보안이 걱정된다면이 질문과는 전혀 관련이 없습니다. 연결하려는 시스템의 콘솔에서 수집 한 올바른 호스트 키가 앞에 있으며 처음 연결할 때 수동으로 확인해야합니다. 당신은 확실히 "자동적으로"아무것도하지 않을 것입니다.
Ignacio Vazquez-Abrams

230

이를 수행하는 가장 좋은 방법은 다음과 같습니다.

ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts

이렇게하면 중복 된 항목이없고 호스트 이름과 IP 주소가 모두 보장되고 추가 보안 조치 인 출력이 해시됩니다.


4
ssh-keyscan 3 개가 모두 필요한 이유는 무엇입니까? 호스트 이름과 IP 모두에서 작동하기 때문에 첫 번째 항목만으로는 얻을 수 없습니까?
Robert

6
ssh-keyscan 요청에 응답하는 시스템이 실제로 대화하려는 시스템인지 확신 할 수 있습니까? 그렇지 않다면 당신은 중간 공격에서 남자에게 자신을 열었습니다.
JasperWallace

2
@JasperWallace 예, 최소한 지문이 필요하거나 공개 키가 더 좋기 때문에 known_hosts에 직접 추가 하여이 질문을 무시할 수 있습니다. 지문 만있는 경우 다운로드 한 공개 키를 지문으로 확인하는 추가 단계를 작성해야합니다.

1
ssh-keyscan대상 호스트가 기본 버전 1 키 유형을 지원하지 않기 때문에 호출 이 실패했습니다. -t rsa,dsa명령에 추가하면 이 문제가 해결되었습니다.
phasetwenty

5
이것은 아마도 나쁜 생각입니다. 이 키를 업데이트하여 중간자 공격을 시작했습니다. 중복 항목을 피하려면 ssh-keygen -F [address]대신 반환 상태를 확인하십시오 . medium.com/@wblankenship/…
retrohacker

93

게으른 사람들을 위해 :

ssh-keyscan -H <host> >> ~/.ssh/known_hosts

-H는 호스트 이름 / IP 주소를 해시합니다


2
"ssh-keyscan -H <host> >> ~ / .ssh / known_hosts"는 ssh가 사용자 상호 작용을 수행하는 것과 유사한 항목을 생성합니다. (-H는 원격 호스트의 이름을 해시합니다.)
Sarah Messer

3
MITM 공격에 취약 키 지문을 확인하지 않았습니다.
Mnebuerquo

8
@Mnebuerquo 당신은 무엇을해야할지, 어떻게하지 말라고 말하면 도움이 될 것입니다.
Ray

4
@jameshfisher 예, MITM 공격에 취약하지만 수동으로이 작업을 수행 할 때 실제 서버 중 하나 인 RSA 지문을 비교 한 적이 있습니까? 아니? 따라서이 답변은 당신을 위해 그것을하는 방법입니다. 그렇다면이 답변을 사용하여 수동으로 수행하거나 다른 보안 조치를 구현해서는 안됩니다.
fivef

2
@Mnebuerquo 나는 배치 스크립트를 무인으로 사용하여 repo를 복제해야 하고이 프롬프트를 우회하고 싶을 때 이것을 처리하는 더 좋은 방법을 알려 주면 정말 기쁠 것입니다. 이것이 옳지 않다고 생각되면 실제 솔루션에 대해 알려주십시오!
Waqas Shah

42

언급했듯이 키 스캔을 사용하는 것이 옳고 눈에 거슬리지 않는 방법입니다.

ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts

위의 방법은 호스트가 추가되지 않은 경우에만 호스트를 추가하는 트릭을 수행합니다. 동시성 안전도 아닙니다. 당신은 tmp_hosts 파일이 궁극적으로 부풀어가되는에서 known_hosts 파일에 선도, 사방에서 공격받을 수있는, 여러 번 같은 시간에보다 같은 기원 시스템에서 미리보기를 실행 ...


키가에서 known_hosts에 있는지 여부를 확인하는 방법이 전에는 ssh-keyscan ? 시간과 추가 네트워크 연결이 필요하기 때문입니다.
utapyngo

1
이 파일의 원본 포스터 버전은 cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts이지만 후속 편집으로 변경되었습니다 >>. 사용 >>은 오류입니다. 첫 번째 행에서 고유성의 목적을 무시 known_hosts하고 실행될 때마다 새 항목을 덤프 합니다. (그냥 수정 내용을 다시 게시했습니다.)
paulmelnikow

1
이것은 다른 MITM 공격과 동일합니다.
Mnebuerquo

@utapyngo ssh-keygen -F는 현재 지문을 제공합니다. 리턴 코드가 1 인 상태로 공백으로 돌아 오면없는 것입니다. 무언가를 인쇄하고 리턴 코드가 0이면 이미 존재합니다.
Rich L

1
MITM에 대해 많은 관심이 있다면 DNSSEC 및 SSHFP 레코드를 배포하거나 키를 배포하는 다른 안전한 방법을 사용하십시오.이 kludge 솔루션은 관련이 없습니다.
Zart

19

ssh-keyscan명령을 사용 하여 공개 키를 가져 와서 known_hosts파일에 추가 할 수 있습니다.


3
지문이 올바른 키인지 확인하십시오. 그렇지 않으면 MITM 공격에 노출됩니다.
Mnebuerquo

3
@Mnebuerquo 일반적인 맥락에서 페어 포인트이지만 올바른 키가 무엇인지 이미 알고 있다면 누군가가 프로그래밍 방식으로 키를 수집하려고하는 이유는 무엇입니까?
Brian Cline

이것은 그것을하는 방법이 아닙니다. MITM.
jameshfisher

8

다음은 ssh-keyscan 을 게임에 통합하는 방법입니다 .

---
# ansible playbook that adds ssh fingerprints to known_hosts
- hosts: all
  connection: local
  gather_facts: no
  tasks:
  - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
    register: keyscan
  - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
    with_items: '{{ keyscan.stdout_lines }}'

1
알려진 유효한 known_hosts 파일을 업로드 중입니까, 아니면 지문을 확인하지 않고 ssh-keyscan을 수행하고 출력을 known_hosts에 덤프하고 있습니까?
Mnebuerquo

1
이것은 단순히 키 캔의 출력을 덤프합니다. 따라서 실제로 StrictHostKeyChecking = no와 동일하며 ssh 옵션을 사용하지 않고 자동 known_hosts가 업데이트됩니다. 이 작업은 ssh-keyscan이 여러 줄을 반환하여이 작업이 항상 '변경됨'으로 표시되어 잘 작동하지 않습니다.
Zart

이것은 그것을하는 방법이 아닙니다. MITM.
jameshfisher

3
@jameshfisher 무인 배치 스크립트를 사용하여 repo를 복제해야 하고이 프롬프트를 우회하고 싶을 때이를 처리하는 더 좋은 방법을 알려 주시면 정말 기쁩니다. 이것이 옳지 않다고 생각되면 실제 솔루션에 대해 알려주십시오! 이것이 올바른 방법이 아니라고 생각되면 "어떻게"하는지 알려주십시오.
Waqas Shah

known_hosts에 값을 추가하는 완벽하게 유효한 방법이지만 예, MITM에 영향을 받기 쉽습니다. 그러나 내부 용으로는 괜찮습니다.
카메론 로웰 팔머

7

이것은 처음으로 호스트 키를 수락하는 완벽한 솔루션입니다.

#!/usr/bin/env ansible-playbook
---
- name: accept ssh fingerprint automatically for the first time
  hosts: all
  connection: local
  gather_facts: False

  tasks:
    - name: "check if known_hosts contains server's fingerprint"
      command: ssh-keygen -F {{ inventory_hostname }}
      register: keygen
      failed_when: keygen.stderr != ''
      changed_when: False

    - name: fetch remote ssh key
      command: ssh-keyscan -T5 {{ inventory_hostname }}
      register: keyscan
      failed_when: keyscan.rc != 0 or keyscan.stdout == ''
      changed_when: False
      when: keygen.rc == 1

    - name: add ssh-key to local known_hosts
      lineinfile:
        name: ~/.ssh/known_hosts
        create: yes
        line: "{{ item }}"
      when: keygen.rc == 1
      with_items: '{{ keyscan.stdout_lines|default([]) }}'

1
이것은 그것을하는 방법이 아닙니다. MITM.
jameshfisher

6

나는 비슷한 문제를 겪었고 제공된 답변 중 일부가 자동 솔루션으로 나아갈 수 있음을 발견했습니다. 다음은 내가 사용한 결과입니다. 도움이되기를 바랍니다.

ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x

키를 추가하고 known_hosts암호를 묻지 않습니다.


2
MITM 공격에 취약 지문을 확인하지 않았습니다.
Mnebuerquo

6
아무도 지문을 확인하지 않습니다.
Brendan Byrd

이것은 그것을하는 방법이 아닙니다. MITM.
jameshfisher

5

그래서 아래 그림과 같이 git repo 복제의 알 수없는 호스트 수동 상호 작용을 우회하는 평범한 방법을 찾고있었습니다.

brad@computer:~$ git clone git@bitbucket.org:viperks/viperks-api.git
Cloning into 'viperks-api'...
The authenticity of host 'bitbucket.org (104.192.143.3)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)?

RSA 키 지문에 유의하십시오 ...

그래서 이것은 SSH 일입니다. 이것은 SSH를 통한 git 및 일반적으로 SSH 관련 일에 효과적입니다 ...

brad@computer:~$ nmap bitbucket.org --script ssh-hostkey

Starting Nmap 7.01 ( https://nmap.org ) at 2016-10-05 10:21 EDT
Nmap scan report for bitbucket.org (104.192.143.3)
Host is up (0.032s latency).
Other addresses for bitbucket.org (not scanned): 104.192.143.2 104.192.143.1 2401:1d80:1010::150
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
| ssh-hostkey:
|   1024 35:ee:d7:b8:ef:d7:79:e2:c6:43:9e:ab:40:6f:50:74 (DSA)
|_  2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40 (RSA)
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 42.42 seconds

먼저 일일 드라이버에 nmap을 설치하십시오. nmap은 개방 포트 감지 및 수동으로 SSH 지문 확인과 같은 특정 사항에 매우 유용합니다. 그러나 우리가하고있는 일로 돌아갑니다.

좋은. 내가 확인한 여러 장소와 기계에서 타협을 당했거나 혹스런 도리가되는 모든 것에 대한 더 그럴듯한 설명이 일어나고 있습니다.

이 '지문'은 동일한 지문으로 해석되는 둘 이상의 문자열 위험에 대한 인간 편의를 위해 단방향 알고리즘으로 단축 된 문자열입니다. 이런 일을 충돌이라고합니다.

어쨌든 아래 컨텍스트에서 볼 수있는 원래 문자열로 돌아갑니다.

brad@computer:~$ ssh-keyscan bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
no hostkey alg
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-129
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-123
no hostkey alg

따라서 사전에 원래 호스트로부터 신원 확인 양식을 요청하는 방법이 있습니다.

이 시점에서 수동으로 문자열이 일치하고 문자열이 일치하고 지문을 생성하는 기본 데이터가 있으며 나중에 해당 기본 데이터 (충돌 방지)를 요청할 수 있습니다.

이제 호스트 진위성을 묻지 않는 방식으로 해당 문자열을 사용하려면 ...

이 경우 known_hosts 파일은 일반 텍스트 항목을 사용하지 않습니다. 해시 된 항목은 xyz.com 또는 123.45.67.89 대신 임의의 문자가있는 해시처럼 보입니다.

brad@computer:~$ ssh-keyscan -t rsa -H bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==

첫 번째 주석 행은 불분명하게 표시되지만 ">"또는 ">>"규칙을 통해 간단한 리디렉션으로 제거 할 수 있습니다.

"호스트"와 트러스트를 식별하는 데 사용될 오염되지 않은 데이터를 얻기 위해 최선을 다 했으므로이 식별 정보를 ~ / .ssh 디렉토리의 known_hosts 파일에 추가합니다. 이제 알려진 호스트로 식별되므로, 어릴 때 위에서 언급 한 프롬프트가 표시되지 않습니다.

나를 고집해 주셔서 감사합니다. CI 워크 플로의 일부로 비 대화식 방식으로 git 리포지토리와 상호 작용할 수 있도록 원하는 비트 버킷 RSA 키를 추가하고 있습니다.

#!/bin/bash
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.old && echo "|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==" >> ~/.ssh/known_hosts

그래서 오늘 당신이 처녀를 유지하는 방법입니다. 자신의 시간에 비슷한 지시를 수행하여 github로 동일한 작업을 수행 할 수 있습니다.

스택 오버플로 게시물이 너무 많아서 검사하지 않고 프로그래밍 방식으로 키를 맹목적으로 추가하도록 지시했습니다. 다른 네트워크의 다른 컴퓨터에서 키를 더 많이 확인할수록 호스트가 호스트라는 사실에 대해 더 많은 신뢰를 가질 수 있으며,이 보안 계층에서 기대할 수있는 최선의 방법입니다.

잘못된 ssh -oStrictHostKeyChecking = 호스트 이름 없음 [명령]

잘못된 ssh-keyscan -t rsa -H 호스트 이름 >> ~ / .ssh / known_hosts

위의 작업 중 하나를 수행하지 마십시오. 중간 공격에서 사람을 통해 데이터 전송을 도청하는 사람을 피할 수있는 기회가 주어집니다. 차이점은 문자 그대로 보유한 RSA 키가 실제 서버 중 하나임을 확인하는 것입니다. 이제는 해당 정보를 비교하여 연결을 신뢰할 수있는 방법을 알고 있습니다. 다른 컴퓨터 및 네트워크에서 더 많은 비교를하면 일반적으로 연결을 신뢰할 수있는 능력이 향상됩니다.


이것이 이것이이 문제에 대한 최선의 해결책이라고 생각합니다. 그러나 Amazon EC2와 같은 Nmap을 사용할 때 매우 조심하십시오. Nmap이 수행하는 포트 스캔에 대한 경고가 나타납니다! 포트 캐닝을하기 전에 양식을 작성하십시오!
Waqas Shah

글쎄요 EC2에서 포트 스캔을하는 이유를 모르겠습니다. 계정에 로그인 한 경우 실제 컴퓨터에서 키를 얻을 수 있습니다. 이것은 당신이 통제 할 수없는 기계에 대한 것입니다. AWS 포트 스캔 제한이 적용되지 않는 로컬 시스템이 있다고 가정합니다. 그러나 AWS로 nmap을 실행해야하는 경우에이 경고가 도움이 될 것입니다.
BradChesney79

nmap을 사용하여 워크 스테이션에서 SSH 호스트 키를 읽은 다음 해당 값을 신뢰하는 것은 StructHostKeyChecking이 해제 된 상태에서 SSH를 통해 연결하는 것과 다르지 않습니다. 그것은 중간자 공격에 취약합니다.
Micah R Ledbetter

... @ MicahRLedbetter 더 나은 이유는 "다른 컴퓨터와 네트워크를 더 많이 비교하면 일반적으로 연결을 신뢰할 수있는 능력이 향상됩니다"라고 제안한 이유입니다. 그러나 그것은 나의 요점입니다. 하나의 환경 조건에서만 대상 호스트를 확인한 경우 불일치를 어떻게 알 수 있습니까? 더 나은 제안이 있습니까?
BradChesney79

1
이것은 보안 극장입니다. 보안을 강화하기 위해 복잡한 작업을 수행합니다. 호스트에게 키를 요청하는 데 사용하는 여러 가지 방법은 중요하지 않습니다. 같은 사람에게 신뢰할 수 있는지 여러 번 묻는 것처럼 (전화, 이메일, 문자, 달팽이 메일 등). 그들은 항상 그렇다고 말할 것입니다. 그러나 당신이 잘못된 사람에게 묻는다면 그것은 중요하지 않습니다.
hugesupersuperman

5

나는 한 줄의 스크립트를 수행 조금 긴하지만 유용하게 사용, 배수의 IP를 가진 호스트에 대해이 작업을하려면 digbash

(host=github.com; ssh-keyscan -H $host; for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan -H $host,$ip; ssh-keyscan -H $ip; done) 2> /dev/null >> .ssh/known_hosts

5

~ / .ssh / known_hosts에서 중복 항목을 피하십시오.

if ! grep "$(ssh-keyscan github.com 2>/dev/null)" ~/.ssh/known_hosts > /dev/null; then
    ssh-keyscan github.com >> ~/.ssh/known_hosts
fi

1
이것은 그것을하는 방법이 아닙니다. MITM.
jameshfisher

이 답변이 가장 좋습니다. 나에게만 중요하지 않은 무작위 VPS의 초기 설정을 스크립팅 할 때 MITM 위험은 거의 없습니다. 무한한 떨림 ... 첫 줄은 다음과 같아야합니다mkdir -p ~/.ssh/known_hosts;
Martin Bramwell

5

이 기계들을 어떻게 만드십니까? DNS 업데이트 스크립트를 실행할 수 있습니까? IPA 도메인에 가입 할 수 있습니까?

FreeIPA는이를 자동으로 수행하지만 기본적으로 필요한 것은 영역에서 SSHFP dns 레코드 및 DNSSEC 입니다 (freeipa는 구성 가능한 옵션으로 제공됨 (기본적으로 dnssec 비활성화 됨)).

실행하여 호스트에서 기존 SSHFP 레코드를 얻을 수 있습니다.

ssh-keygen -r jersey.jacobdevans.com

jersey.jacobdevans.com SSHFP IN 1 4d8589de6b1a48e148d8fc9fbb967f1b29f53ebc jersey.jacobdevans.com SSHFP IN 1 2 6503272a11ba6d7fec2518c02dfed88f3d455ac7786ee5dbd72df63307209d55 jersey.jacobdevans.com SSHFP IN 3 1 5a7a1e8ab8f25b86b63c377b303659289b895736> jersey.jacobdevans.com SSHFP 3 IN 2 1f50f790117dfedd329dbcf622a7d47551e12ff5913902c66a7da28e47de4f4b

그런 다음 게시되면 VerifyHostKeyDNS yesssh_config 또는 ~ / .ssh / config에 추가 됩니다.

Google이 DNSSEC를 사용하기로 결정한 경우 호스트 키 프롬프트없이 ssh를 입력 할 수 있습니다.

ssh jersey.jacobdevans.com

그러나 내 도메인은 아직 서명되지 않았으므로 지금은 볼 수 있습니다 ....

debug1 : 서버 호스트 키 : ecdsa-sha2-nistp256 SHA256 : H1D3kBF9 / t0ynbz2IqfUdVHhL / WROQLGan2ijkfeT0s

debug1 : DNS에서 4 개의 안전하지 않은 지문이 발견되었습니다.

debug1 : 일치하는 호스트 키 지문

DNS에서 발견됨 'jersey.jacobdevans.com (2605 : 6400 : 10 : 434 :: 10)'호스트의 신뢰성을 설정할 수 없습니다. ECDSA 키 지문은 SHA256 : H1D3kBF9 / t0ynbz2IqfUdVHhL / WROQLGan2ijkfeT0s입니다. DNS에 일치하는 호스트 키 지문이 있습니다. 계속 연결 하시겠습니까 (예 / 아니요)? 아니


4

이 작업을 제대로 수행하려면 실제로 만들고 싶은 VM을 생성 할 때 VM의 호스트 공개 키를 수집하여 파일 known_hosts형식 으로 놓습니다 . 그런 다음 -o GlobalKnownHostsFile=...해당 파일을 가리키는을 사용하여 연결해야한다고 생각되는 호스트에 연결하고 있는지 확인할 수 있습니다. 이 작업을 수행하는 방법은 가상 머신을 설정하는 방법에 따라 다르지만 가능하면 가상 파일 시스템에서 가상 머신을 읽거나 /etc/ssh/ssh_host_rsa_key.pub구성 중에 호스트가 컨텐츠를 인쇄 하도록하는 방법도 있습니다.

즉, 어떤 종류의 환경에서 작업하고 있으며 예상되는 적의 상태에 따라 가치가 없을 수도 있습니다. 위의 몇 가지 다른 답변에 설명 된대로 간단한 "첫 번째 연결시 저장"(스캔을 통해 또는 단순히 첫 번째 "실제"연결 중)을 수행하는 것이 상당히 쉬울 수 있으며 여전히 약간의 보안을 제공 할 수 있습니다. 그러나 이렇게하면 사용자 알려진 호스트 파일 ( -o UserKnownHostsFile=...) 을이 특정 테스트 설치에 특정한 파일로 변경하는 것이 좋습니다 . 이렇게하면 테스트 정보로 알려진 개인 호스트 파일을 오염시키지 않으며 VM을 삭제할 때 쓸모없는 공개 키를 쉽게 정리할 수 있습니다.


4

이 전체

  • ssh 키 스캔
  • ssh-copy-id
  • ECSDA 키 경고

내가 선택했다 그래서 비즈니스는 계속 짜증나

그들 모두를 지배하는 하나의 스크립트

이것은 https://askubuntu.com/a/949731/129227 의 스크립트 변형이며 Amadu Bah의 답변 https://serverfault.com/a/858957/162693 과 함께 루프에 있습니다.

전화 예

./sshcheck somedomain site1 site2 site3

스크립트는 이름 사이트를 반복하고 .ssh / config 및 .ssh / known_hosts 파일을 수정하고 요청시 ssh-copy-id를 수행합니다. 마지막 기능의 경우 ssh 테스트 호출이 실패하도록하십시오. 비밀번호 요청

sshcheck 스크립트

#!/bin/bash
# WF 2017-08-25
# check ssh access to bitplan servers

#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'  
red='\033[0;31m'  
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'

#
# a colored message 
#   params:
#     1: l_color - the color of the message
#     2: l_msg - the message to display
#
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}

#
# error
#
#   show an error message and exit
#
#   params:
#     1: l_msg - the message to display
error() {
  local l_msg="$1"
  # use ansi red for error
  color_msg $red "Error: $l_msg" 1>&2
  exit 1
}

#
# show the usage
#
usage() {
  echo "usage: $0 domain sites"
  exit 1 
}

#
# check known_hosts entry for server
#
checkknown() {
  local l_server="$1"
  #echo $l_server
  local l_sid="$(ssh-keyscan $l_server 2>/dev/null)" 
  #echo $l_sid
  if (! grep "$l_sid" $sknown) > /dev/null 
  then
    color_msg $blue "adding $l_server to $sknown"
    ssh-keyscan $l_server >> $sknown 2>&1
  fi
}

#
# check the given server
#
checkserver() {
  local l_server="$1"
  grep $l_server $sconfig > /dev/null
  if [ $? -eq 1 ]
  then
    color_msg $blue "adding $l_server to $sconfig"
    today=$(date "+%Y-%m-%d")
    echo "# added $today by $0"  >> $sconfig
    echo "Host $l_server" >> $sconfig
    echo "   StrictHostKeyChecking no" >> $sconfig
    echo "   userKnownHostsFile=/dev/null" >> $sconfig
    echo "" >> $sconfig
    checkknown $l_server
  else
    color_msg $green "$l_server found in $sconfig"
  fi
  ssh -q $l_server id > /dev/null
  if [ $? -eq 0 ]
  then
    color_msg $green "$l_server accessible via ssh"
  else
    color_msg $red "ssh to $l_server failed" 
    color_msg $blue "shall I ssh-copy-id credentials to $l_server?"
    read answer
    case $answer in
      y|yes) ssh-copy-id $l_server
    esac
  fi
}

#
# check all servers
#
checkservers() {
me=$(hostname -f)
for server in $(echo $* | sort)
do
  os=`uname`
  case $os in
   # Mac OS X
   Darwin*)
     pingoption=" -t1";;
    *) ;;
  esac

  pingresult=$(ping $pingoption -i0.2 -c1 $server)
  echo $pingresult | grep 100 > /dev/null
  if [ $? -eq 1 ]
  then 
    checkserver $server
    checkserver $server.$domain
  else
    color_msg $red "ping to $server failed"
  fi
done
}

#
# check configuration
#
checkconfig() {
#https://askubuntu.com/questions/87449/how-to-disable-strict-host-key-checking-in-ssh
  if [ -f $sconfig ]
  then
    color_msg $green "$sconfig exists"
    ls -l $sconfig
  fi
}

sconfig=~/.ssh/config
sknown=~/.ssh/known_hosts

case  $# in
  0) usage ;;
  1) usage ;;
  *) 
    domain=$1 
    shift 
    color_msg $blue "checking ssh configuration for domain $domain sites $*"
    checkconfig
    checkservers $* 
    #for server in $(echo $* | sort)
    ##do
    #  checkknown $server 
    #done
    ;;
esac

2

다음은 호스트 모음을 수행하는 방법입니다

호스트 모음을 정의

ssh_hosts:
  - server1.domain.com
  - server2.domain.com
  - server3.domain.com
  - server4.domain.com
  - server5.domain.com
  - server6.domain.com
  - server7.domain.com
  - server8.domain.com
  - server9.domain.com

그런 다음 알려진 호스트에 키를 추가하는 두 가지 작업을 정의하십시오.

- command: "ssh-keyscan {{item}}"
   register: known_host_keys
   with_items: "{{ssh_hosts}}"
   tags:
     - "ssh"

 - name: Add ssh keys to know hosts
   known_hosts:
     name: "{{item.item}}"
     key: "{{item.stdout}}"
     path: ~/.ssh/known_hosts
   with_items: "{{known_host_keys.results}}"

0

새 서버 / 호스트의 지문을 확인하는 것이 가장 좋습니다. 이것이 서버를 인증하는 유일한 방법입니다. 이것이 없으면 SSH 연결 이 중간자 공격을 받을 수 있습니다 .

지문 검사를 무시하고 싶을 경우 OpenSSH 버전 7.6 (2017-10-03)StrictHostKeyChecking=accept-new 에 도입 된 가장 안전한 두 번째 보안 옵션을 사용 하는 것이 좋습니다 .

첫 번째 "accept-new"는 지금까지 보이지 않는 키를 자동으로 수락하지만 변경되거나 유효하지 않은 호스트 키에 대한 연결은 거부합니다.

서버의 진위 여부 StrictHostKeyChecking=no전혀 확인 하지 않는 이전 값 을 사용 하지 마십시오 . (이 =no설정 의 의미는 나중에 일부 릴리스로 뒤집어 질 것 입니다.)

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