利用 ssh-keyscan 獲取集群機器 SSH 公鑰指紋

前作提到為了防止中間人攻擊,SSH 會要求 client 用戶確認 server 的密鑰指紋。這個設計很有用,但是如果在可靠環境裡有大量機器組成的集群,而我們需要自動化地進行 SSH 訪問和相關部署,交叉地去確認密鑰指紋是很大的工作量。

前作提到了 <code>ssh-keygen/<code> 命令,用以在機器上生成密鑰。此處我們需要用到 <code>ssh-keyscan/<code> 命令,批量獲取集群上機器的密鑰指紋。

<code>ssh-keyscan/<code>

<code>ssh-keyscan/<code> 的語法是

ssh-keyscan [-46Hv] [-f file] [-p port] [-T timeout] [-t type] [host | addrlist namelist] ...

<code>-46/<code> 是限定以 IPv4 或者 IPv6 連接機器;<code>-H/<code> 則會對機器名進行散列,隱藏真實機器名,但仍能用於 SSH 相關連接;<code>-v/<code> 則打印大量調試信息。

<code>host | addrlist namelist/<code> 是需要掃描的機器列表;而 <code>-f/<code> 指定一個文件,包含若干需要掃描的機器列表。<code>-f -/<code> 表示從標準輸入讀取機器列表。

<code>-p/<code> 指定連接遠端 server 時的端口號;<code>-T/<code> 指定超時時間;<code>-t/<code> 則選擇需要獲取哪些類型的公鑰指紋。

獲取公鑰指紋

首先應準備好需要獲取公鑰指紋的 IP 或 HOSTNAME 列表,保存在文件中。例如演示用的文件是這樣的。

hostlist.txt

127.0.0.1
127.0.0.2

執行命令以後,

$ ssh-keyscan -f hostlist.txt

# 127.0.0.1 SSH-2.0-OpenSSH_6.6.1

127.0.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWBZ3XrIajPmnd6R+g/wcUuOPOiRBMOYjAl4Dv8SfcZtgHqKTK6Zb1EeG3u/uzRYxqXMctG/2A4iXRDG9mvg9H9bimCWbA3xtR79NImPYg4m7BNuH9C+OXRYYJwoOGpjVMs0rGLXkq3/WVkXvQreBuhVD8NI2pEPnQsT1J5abdVbCHlwFYG6wVCJQqFY6jdntJJlxQv5EJu6w4/+Fd4LvdjysH+ngqArac6HMJUxqSxLQjzMdCRWEQKp3ySwmnRp9rHYVaJnnsXeYPfnMN1iMjdIQJPzc89Mepg4ip1q2bCMbMcx2XFO3I7YjYRdcOameFNafMGY0q5RHzhvgnNnal

# 127.0.0.1 SSH-2.0-OpenSSH_6.6.1

127.0.0.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCPWoEQ7iCCYDrpyb5KeMmCaQ8aOnSfehqmrplZRkbqqnkS9++PdSX/eSLJ0tkFd5902/C+HTCqbDgso4mCKpMo=

# 127.0.0.2 SSH-2.0-OpenSSH_6.6.1

127.0.0.2 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWBZ3XrIajPmnd6R+g/wcUuOPOiRBMOYjAl4Dv8SfcZtgHqKTK6Zb1EeG3u/uzRYxqXMctG/2A4iXRDG9mvg9H9bimCWbA3xtR79NImPYg4m7BNuH9C+OXRYYJwoOGpjVMs0rGLXkq3/WVkXvQreBuhVD8NI2pEPnQsT1J5abdVbCHlwFYG6wVCJQqFY6jdntJJlxQv5EJu6w4/+Fd4LvdjysH+ngqArac6HMJUxqSxLQjzMdCRWEQKp3ySwmnRp9rHYVaJnnsXeYPfnMN1iMjdIQJPzc89Mepg4ip1q2bCMbMcx2XFO3I7YjYRdcOameFNafMGY0q5RHzhvgnNnal

# 127.0.0.2 SSH-2.0-OpenSSH_6.6.1

127.0.0.2 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCPWoEQ7iCCYDrpyb5KeMmCaQ8aOnSfehqmrplZRkbqqnkS9++PdSX/eSLJ0tkFd5902/C+HTCqbDgso4mCKpMo=

如此,將標準錯誤的輸出重定向到 <code>/dev/null/<code> 即可獲得機器列表的公鑰指紋了。

$ ssh-keyscan -f hostlist.txt 1>>~/.ssh/known_hosts 2>/dev/null

而後將 <code>~/.ssh/known_hosts/<code> 用 <code>scp/<code> 拷貝到 <code>hostlist.txt/<code> 中的所有機器上即可。


分享到:


相關文章: