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が提供できる中間者攻撃に対する保護が完全にバイパスされます。唯一のあなたはMITM攻撃に対して安全だことを確認するための有効な方法は、いくつかのアウト・オブ・バンド、高信頼チャネルを介してホストの公開鍵を検証することです。適度に複雑なキー署名インフラストラクチャをセットアップせずに安全に自動化する方法はありません。
エイル

回答:


142

設定ファイルで、または経由でStrictHostKeyCheckingオプションをnoに設定します-o

ssh -o StrictHostKeyChecking=no username@hostname.com


62
これにより、おそらく中間者攻撃に対して無防備になりますが、おそらく良い考えではありません。
ジャスパーウォーレス

9
@JasperWallace、これは通常良いアドバイスですが、特定のユースケース(テストVMのデプロイとコマンドの送信)は十分に安全でなければなりません。
マッシモ14年

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
ピーターV.Mørch

11
これは、質問に答えず、深刻なセキュリティ上の脆弱性にさらされるため、ダウン投票します。
marcv81

12
@Mnebuerquo:セキュリティについて心配しているのなら、この質問にはまったく関係ないでしょう。接続するシステムのコンソールから収集された正しいホストキーが目の前にあり、最初の接続時に手動で確認します。確かに「自動的に」何もしません。
イグナシオバスケス-エイブラムス

230

IMO、これを行う最良の方法は次のとおりです。

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
3つのssh-keyscanがすべて必要なのはなぜですか?ホスト名とIPの両方で機能するため、最初の1つだけでうまくいくことはできませんか?
ロバート

6
ssh-keyscanリクエストに応答するマシンが本当にあなたが話したいものであることを確信できますか?そうでない場合は、中間攻撃の男性に自分自身を開放しました。
ジャスパーウォーレス

2
@JasperWallaceはい、そのためには少なくともフィンガープリントまたはそれ以上の公開キーが必要です。その場合、known_hostsに直接追加して、この質問を無効にします。あなたが唯一の指紋を持っている場合、あなたは...あなたの指紋でダウンロードした公開鍵を検証し、余分なステップを記述する必要があります

1
ssh-keyscanターゲットホストがデフォルトのバージョン1キータイプをサポートしていないため、呼び出しが失敗しました。-t rsa,dsaコマンドに追加すると、これが修正されました。
phasetwenty 14

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は、リモート・ホストの名前をハッシュ。)
サラ・メッサー

3
MITM攻撃に対して脆弱です。キーの指紋を確認していません。
Mnebuerquo

8
@Mnebuerquoあなたは何をすべきかを言いますが、どのようにではなく、それは役に立ちます。
レイ

4
@jameshfisherはい、MITM攻撃に対して脆弱ですが、手動でこれを行っていたときに、RSAフィンガープリントを実際のサーバーと比較したことがありますか?番号?したがって、この答えはあなたのためにそれを行う方法です。はい、あなたはこの回答を使用して手動で行うか、他のセキュリティ対策を実装するべきではない場合...
fivef

2
@Mnebuerquoバッチスクリプトを無人で使用してレポを複製する必要があり、このプロンプトをバイパスしたい場合、これを処理するためのより良い方法を教えていただければ本当にうれしいです。これが適切でないと思われる場合は、実際のソリューションに光を当ててください。
ワカスシャー

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の場合、すでに存在しています。
リッチL

1
MITMを重視している場合は、DNSSECおよびSSHFPレコードを展開するか、キーを配布する他の安全な手段を使用してください。この賢明なソリューションは関係ありません。
-Zart

19

ssh-keyscanコマンドを使用して公開キーを取得し、それをknown_hostsファイルに追加できます。


3
指紋を確認して、正しいキーであることを確認してください。それ以外の場合は、MITM攻撃にさらされます。
Mnebuerquo

3
@Mnebuerquo一般的な文脈では公正なポイントですが、正しいキーが何であるかをすでに知っているのに、なぜ誰かがプログラムでキーを収集しようとするのでしょうか?
ブライアンクライン

これはそれを行う方法ではありません。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-キースキャン返す複数行にうまく動作しません
Zart

これはそれを行う方法ではありません。MITM。
-jameshfisher

3
@jameshfisherバッチスクリプトを使用してレポのクローンを作成する必要があり、このプロンプトをバイパスしたい場合、これを処理するためのより良い方法も教えていただければ本当にうれしいです。これが適切でないと思われる場合は、実際のソリューションに光を当ててください。これが正しい方法ではないと思われる場合は、「どのように」それを行うかをお知らせください。
ワカスシャー

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。
ジェームズフィッシャー

6

私は同様の問題を抱えていて、提供された回答の一部は自動化されたソリューションへの道のりを少しだけ譲ったことがわかりました。以下は私が最終的に使用したものです、それが役立つことを願っています:

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

キーを追加known_hostsし、パスワードの入力を求めません。


2
MITM攻撃に対して脆弱です。指紋をチェックしていません。
Mnebuerquo

6
誰も指紋をチェックしません。
ブレンダンバード

これはそれを行う方法ではありません。MITM。
ジェームズフィッシャー

5

そこで、以下に示すように、gitレポのクローンを作成する未知のホストの手動操作をバイパスするためのありふれた方法を探していました。

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のものであり、これはgit over SSHと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リポジトリとやり取りできるように、bitbucket 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 = no hostname [コマンド]

違う ssh-keyscan -t rsa -Hホスト名>>〜/ .ssh / known_hosts

上記のいずれもしないでください。中間者攻撃を介して誰かがあなたのデータ転送を盗聴するのを避ける機会を与えられます-その機会を利用してください。違いは文字通り、持っているRSAキーが真正なサーバーのものであることを確認することであり、接続を信頼できるように、それらの情報を取得して比較する方法を知っています。異なるコンピューターとネットワークからのより多くの比較は、通常、接続を信頼する能力を高めることを覚えておいてください。


これがこの問題の最善の解決策だと思います。ただし、Amazon EC2のようなものでNmapを使用するときは非常に注意してください。Nmapが行うポートスキャンについて警告が表示されました。ポートスキャンを行う前にフォームに入力してください!
ワカスシャー

...まあ、そうだろう。EC2からポートスキャンを行う理由がわかりません。アカウントにログインしている場合、実際のマシンからキーを取得できます。これは、制御できないマシンの場合に多くなります。使用するAWSポートスキャンの制限を受けないローカルマシンを使用すると想定します。しかし、AWSでnmapを実行しなければならないという状況の場合、この警告が役立つと思います。
BradChesney79

nmapを使用してワークステーションからSSHホストキーを読み取り、その値を信頼することは、StructHostKeyCheckingをオフにしてSSH経由で接続することと同じです。中間者攻撃に対しても同様に脆弱です。
ミカRレッドベター

... @ MicahRLedbetterは、「異なるコンピューターとネットワークからのより多くの比較により、通常、接続を信頼する能力が向上する」と提案した理由です。しかし、それが私のポイントです。1つの環境条件セットからターゲットホストのみをチェックする場合、矛盾をどのように知るでしょうか?もっと良い提案はありましたか?
BradChesney79

1
これはセキュリティシアターです。セキュリティを強化するために複雑なことを行う。ホストにキーを要求するために使用するさまざまな方法は関係ありません。同じ人に信頼できるかどうかを何度も尋ねるようなものです(電話、電子メール、テキスト、郵便など)。彼らは常に「はい」と言いますが、あなたが間違った人に尋ねているなら、それは問題ではありません。
非常にスーペリアマン

5

私は、倍数のIPを持つホストに対してこの作業をするために少し長いが、便利なワンライナースクリプトを、行う使用digし、bash

(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。
ジェームスフィッシャー

この答えが一番好きです。私以外の誰にとっても重要ではないランダム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件1 4d8589de6b1a48e148d8fc9fbb967f1b29f53ebc jersey.jacobdevans.com SSHFP 1 IN 2 6503272a11ba6d7fec2518c02dfed88f3d455ac7786ee5dbd72df63307209d55 jersey.jacobdevans.com SSHFP 3 IN 1 5a7a1e8ab8f25b86b63c377b303659289b895736> jersey.jacobdevans.com SSHFP IN 3 2 1f50f790117dfedd329dbcf622a7d47551e12ff5913902c66a7da28e47de4f4b

その後、公開VerifyHostKeyDNS yesしたら、ssh_configまたは〜/ .ssh / configに追加します

GoogleがDNSSECを有効にする場合、hostkeyプロンプトなしで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のホスト公開鍵を収集し、それをknown_hostsフォーマットでファイルにドロップすることです。その後-o GlobalKnownHostsFile=...、そのファイルを指すを使用して、接続する必要があると思われるホストに接続していることを確認できます。ただし、これを行う方法は仮想マシンの設定方法によって異なりますが、可能であれば仮想ファイルシステムから読み取るか、/etc/ssh/ssh_host_rsa_key.pub構成中にホストにコンテンツの印刷を行わせることでうまくいく場合があります。

とはいえ、これはあなたが働いている環境の種類や予想される敵が誰であるかに応じて、価値がないかもしれません。上記の他のいくつかの回答で説明したように、単純な「最初の接続時に保存」(スキャン経由または最初の「実際の」接続中)を行うと、かなり簡単になり、ある程度のセキュリティが確保されます。ただし、これを行う場合は、ユーザーの既知のホストファイル(-o UserKnownHostsFile=...)をこの特定のテストインストールに固有のファイルに変更することを強くお勧めします。これにより、個人の既知のホストファイルがテスト情報で汚染されるのを防ぎ、VMを削除するときに、今では役に立たない公開キーを簡単にクリーンアップできます。


4

この全体

  • ssh-key-scan
  • ssh-copy-id
  • ECSDAキー警告

ビジネスは私を悩ませ続けたので、私は

すべてを支配する1つのスクリプト

これは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

次に、既知のホストにキーを追加する2つのタスクを定義します。

- 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接続が中間者攻撃を受ける可能性があります。

指紋のチェックを無視したい場合、2番目に安全性の低いオプションはStrictHostKeyChecking=accept-newOpenSSHバージョン7.6(2017-10-03)で導入されたを使用することです。

最初の「accept-new」は、これまで見えなかったキーを自動的に受け入れますが、変更または無効なホストキーの接続を拒否します。

サーバーの信頼性StrictHostKeyChecking=noまったくチェックしない古い値を使用しないでください。(この=no設定の意味は、後のリリースで反転されますが。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.