AnsibleのSSH接続エラーの回避設定
概要
Managed NodeにSSHで一度も接続をしたことが無い時や、fingerprintが変わった時、OpenSSHのチェック機能により警告が表示され、ansibleの実行ができないことがあります。これを回避するための設定を記載します。
動作環境
CentOS 6
Ansible 2.1
警告メッセージが表示される状況
以下のような状況で警告メッセージが表示されます。
- Managed NodeにSSHで接続したことがなく、~/.ssh/known_hostsにfingerprintが無いとき。
-
sshでの接続時、以下のようなメッセージが表示されます。
-
The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)'
can't be established.
RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)?
```
-
ansibleやansible-playbookを実行時、以下のようなメッセージが表示されます。
Using a SSH password instead of a key is not possible
because Host Key checking is enabled and sshpass does not support this.
Please add this host's fingerprint to your known_hosts file to manage this host.
```
- Managed Nodeのサーバ更改後、初めてSSHで接続した時。
(=IPアドレスの変更はないが物理やOSが変更された)
(=fingerprintが変わり~/.ssh/known_hostsと値が一致しなくなった)-
sshでの接続時、以下のようなメッセージが表示されます。
-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```
-
ansibleやansible-playbookを実行時、以下のようなメッセージが表示されます。
SSH encountered an unknown error during the connection.
We recommend you re-run the command using -vvvv,
which will enable SSH debugging output to help diagnose the issue
```
回避方法
-
ansible.cfgのssh_argsの設定
/etc/ansible/ansible.cfgの[ssh_connection]のブロックに以下の設定を記載する。
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
```
-
設定の意味
- デフォルト設定
ControlMaster,ControlPersistはデフォルトの設定のままなので割愛。 - StrictHostKeyChecking=no
ホストのデータベースファイル(デフォルトでは~/.ssh/known_hosts)に存在しないときに確認なしに接続する。
fingerprintは確認なしにホストのデータベースファイルに記録されていく。 - UserKnownHostsFile=/dev/null
ホストのデータベースファイル。(デフォルトでは~/.ssh/known_hosts)
データベースファイルを常に空(/dev/null)にすることで、Managed Nodeのサーバ更改時など、fingerprintが変わった時に、データベースファイルを整合性が取れずエラーとなってしまうのを回避する。
- デフォルト設定
-
問題点
- インベントリファイルに記載されているサーバは、すべて信頼できることが前提となる。
他の回避方法
- 手動でSSHで接続
全ての対象サーバ・ユーザに対してSSHで接続を行う。- 問題点
対象が多いと手間である。
fingerprintが変わった時に対処(~/.ssh/known_hostsの修正)が必要になる。
- 問題点
- ansibleを実行するユーザのSSH設定
ansibleを実行するControl MachineのユーザのSSH設定で、fingerprintのチェックを行わないようにする。-
設定(例)
-
$ vi ~/.ssh/config
Host 192.168.0.*
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
```
- 問題点
Hostで記載した対象・範囲がすべて信頼できることが前提となる。
ansibleの実行時以外の通常のSSH接続時もこの設定が効いてくる。
- ansible.cfgのhost_key_checkingの設定
ansible.cfgに、host_key_checkingというStrictHostKeyCheckingに相当する設定項目がある。
Anible公式のドキュメント(Docs>>Getting Started>>Host Key Checking)にはこれが掲載されている。-
設定(例) [defaults]のブロックにhost_key_checking = Falseを設定
-
$ vi /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False
```
- 問題点
~/.ssh/known_hostsに登録されている値のチェックは有効なので、fingerprintが変わった時にエラーになるので、その対処(~/.ssh/known_hostsの修正)が必要になる。
おわりに
セキュリティ的には回避するのではなく、事前にSSHで接続してknown_hostsを作っていおいた方がよい。
ただ、fingerprintが変わるタイミングは、サーバ更改やハード交換といったときになるので、そこでknown_hostsの更新が必要と気づく人がどれだけいるだろか。かなりの割合でエラーになって調べて気づくのではないだろうか。
最終的には、セキュリティ・運用等の要件によって設定方法を選択する必要がある。
以上