複数のSSH(Secure Shell)サーバーが稼働している環境では、公開鍵を効率よく管理するための工夫が必要になります。SSHサーバーのホスト名やIPアドレスが変更されたとき、known_hostsファイルを一度の作業で生成/更新するには、「ssh-keyscan」コマンドが便利です。
本連載では、ネットワーク管理の基本コマンドを順を追って紹介していきます。基本書式と用法、主要なオプション、用例サンプルを示しますので、manやhelp代わりに通読し、各コマンドでできることを順次おさらいしてみてください。今回は、SSH(Secure Shell)サーバーの公開鍵管理に利用する「ssh-keyscan」コマンドを紹介します。
なお、本連載では、執筆時点の最新版Red Hat Enterprise Linux(RHEL)およびCentOS環境で動作を確認しています。また、用法例はIPv4(Internet Protocol version 4)ネットワークを前提にしています。コマンドのサンプルなどで一部環境に依存した出力例となる場合がありますので、その際には適宜ご自身の環境に合わせて読み替えてください。
ssh-keyscanは、SSHサーバー(sshd)が稼働するホストの公開鍵を収集するためのコマンドです。同時に複数のホストを指定できるため、sshdが公開鍵を記録しておく「known_hosts」ファイルを効率よく生成/更新する目的で利用されます。
SSHでは、セキュアな通信を行うために接続先サーバーの情報(公開鍵のフィンガープリント*)をクライアント側に保存します。SSHでリモートログインするときには、以前保存したその情報と、これから接続しようとしているサーバーの情報が照合され、一致していなければ接続が拒否されます。この仕組みにより、クライアントが意識しないまま別のSSHサーバーへ接続することを防止できるのです。このとき、接続可否を判定するフィンガープリント情報は、「~/.ssh/known_hosts」に蓄積されます。
* フィンガープリント 「拇印」「指紋」の意味。ここでは、証明書など文書データに改ざんが行われていないことを証明する値のことを指します。
しかし、SSHサーバーのIPアドレスやホスト名が変更された場合などでは、known_hostsに記録された内容と一致しないため、エラーとなり接続できません。
こうした場合には、ssh-keygenコマンドで個別にknown_hostsの情報を削除するか(ssh-keygen -R ホスト名)、テキストエディターなどで直接known_hostsを編集することでフィンガープリントを削除できます。しかし、この方法では一度に複数のホストを対象にすることはできません。
複数のホストでエラーが生じる場合や、ネットワーク環境を大幅に変更した場合にはknown_hostsの内容を一新する必要があるので、ssh-keyscanコマンドを使う方が効率よく作業できます。
ssh-keyscanコマンドの主なオプションは次の通りです。
オプション | 意味 |
---|---|
-4 | 強制的にIPv4アドレスのみを使用する |
-6 | 強制的にIPv6アドレスのみを使用する |
-H | ホスト名をハッシュ化して出力する |
-T | タイムアウトまでの時間を指定する |
-f | 指定したファイルからホスト情報を読み込む(ファイル名の代わりに「-」を指定すると標準入力から読み込む) |
-t | ホストから読み取る鍵のタイプを指定する(rsa、dsaなど) |
-v | 詳細な情報を表示する |
特定のホストのフィンガープリントを出力する場合は、引数にホスト名またはIPアドレスを指定します。
下のコマンド実行例では、「-H」オプションを指定することで出力内容をハッシュ化(固定長の疑似乱数を利用した簡易な暗号化)しています。ここで、オプションを省略するとホスト名/IPアドレスおよびフィンガープリントがそのまま出力されます。
$ ssh-keyscan -H myraspi # myraspi SSH-2.0-OpenSSH_6.0p1 Debian-4 |1|PwOx2wIK0oWq1GZTrSQbuWY6dIg=|vb3IVc/l......... :: (以下略) ::
サーバーのアドレス(IPアドレス/ホスト名)を列挙したテキストファイルを用意すると、複数のSSHサーバーに対するフィンガープリントをまとめてknown_hostsへ書き出すことができます。
下のコマンド実行例では、SSHサーバーのIPアドレスが記載されたテキストファイル「serv.txt」を用意し、そのSSHサーバーのフィンガープリントをシステム全体に適用されるknown_hostsファイル(/etc/ssh/ssh_known_hosts)へ追加しています(上書きする場合は「>>」ではなく「>」を利用します)。
なお、sshの設定ファイル(~/.ssh/configまたは/etc/ssh/ssh_config)に「StrictHostKeyChecking=no」の記述を加えておくと、ホスト鍵がknown_hostsに未登録だった場合、自動的に追加するよう動作します。
# ssh-keyscan -t rsa -f serv.txt >> /etc/ssh/ssh_known_hosts (sudoを使う場合は下記) $ sudo sh -c "ssh-keyscan -t rsa -f serv.txt >> /etc/ssh/ssh_known_hosts"
Copyright © ITmedia, Inc. All Rights Reserved.