SSHで初めてのサーバに接続しようとすると、「ホストキー」の指紋(フィンガープリント)の確認が求められる。Azureの仮想マシン(VM)上のLinuxを対象として、安全にホストキーを確認する一連の手順を説明する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象:Azure Virtual Machine(仮想マシン)、Linux、Bicep
SSHでいままで接続したことのないホスト(サーバ)に接続しようとすると、以下のようなメッセージが表示される。
これは、「ホストキー(ホスト鍵)」と呼ばれるSSHサーバ(sshd)の公開鍵から算出された指紋(フィンガープリント、fingerprint)をユーザーに確認するための問い合わせメッセージだ。意図したサーバに正しく接続しようとしているかどうかをユーザーが確認させるための仕組みである。
言うまでもなく、表示された指紋と実際のsshdの指紋が一致することを確認すべきだ。しかし、SSH接続後ならともかく、接続前に指紋を確認するのは何かと面倒だ。そのため、ここで確認せずに「yes」と答えてしまい、以後も確認しないことが意外と多いのではないだろうか?
そこで本Tech TIPSでは、Azureの仮想マシン(VM)にインストールしたLinuxで、安全にsshdの(指紋の元である)ホストキーを取得してSSHクライアントに登録し、SSHも安全に接続できるようにする一連の手順を説明する。SSHクライアントの対象は、Windows 10/11標準のOpenSSHクライアントとする。またsshdの対象は、主な最新LinuxディストリビューションでパッケージからインストールできるOpenSSHサーバとする。
Linux上のsshdの場合、そのホストキーは通常、「/etc/ssh」ディレクトリに「ssh_host_<署名アルゴリズム略称>_key.pub」に格納されている。全ホストキーを一括出力するには、bashで以下のコマンドラインを実行すればよい(以下ではこれを「ホストキー読み出しコマンド」とする)。
find /etc/ssh -type f -name 'ssh_host_*_key.pub' -exec cat '{}' \;
この時点では、まだSSHで安全に接続できない状態なので、このコマンドをSSH以外の方法でリモートから安全に実行し、その出力を得る必要がある。ここでは、Azureが提供する機能を利用した2種類のリモートコマンド実行方法を紹介する(どちらか一方を実施すればよい)。
すでにデプロイ済みのVMが対象なら、「Azure CLI」と「マネージド実行コマンド」を利用して、ホストキー読み出しコマンドを実行するとよいだろう。
az vm run-command create -g <VMのリソースグループ名> --vm-name <VM名> --run-command-name GetSshdHostPubKeys --script "find /etc/ssh -type f -name 'ssh_host_*_key.pub' -exec cat '{}' \;"
ただし、上記のコマンドを実行しただけではホストキーは得られない。このコマンドの実行結果を取得するためのコマンドを別途実行する必要がある(手順2で説明する)。
VMをこれからデプロイするなら、同時にホストキー読み出しコマンドを実行することも可能だ。それには、以下のように「Microsoft.Compute virtualMachines/runCommands」というコマンド実行のためのリソースをVMのリソーステンプレートに追記する。
param location string = resourceGroup().location
<……中略……>
// リソース生成: 仮想マシン
resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = {
<VMリソースの記述>
}
// sshdのホストキーを出力するためのコマンドライン
var cmdLineGetSshdHostPubKeys = 'find /etc/ssh -type f -name \'ssh_host_*_key.pub\' -exec cat \'{}\' \\;'
// 末尾の「\」は2つ並べる
// リソース生成: sshdのホストキーを出力するためのコマンド実行
resource runCmdGetSshdHostPubKeys 'Microsoft.Compute/virtualMachines/runCommands@2022-11-01' = {
parent: vm // コマンドを実行する仮想マシンのリソース
name: 'GetSshdHostPubKeys' // このコマンドに付ける名前
location: location
properties: {
source: {
script: cmdLineGetSshdHostPubKeys
}
}
}
ここまでの手順でホストキー読み出しコマンドを実行したら、以下のAzure CLIのコマンドラインでその実行結果を取得する。
Copyright© Digital Advantage Corp. All Rights Reserved.