【Azure】Linux VMのSSHサーバ(sshd)のホストキー(公開鍵)を安全に確認するにはTech TIPS

SSHで初めてのサーバに接続しようとすると、「ホストキー」の指紋(フィンガープリント)の確認が求められる。Azureの仮想マシン(VM)上のLinuxを対象として、安全にホストキーを確認する一連の手順を説明する。

» 2023年07月26日 05時00分 公開
[島田広道デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Tech TIPS」のインデックス

連載目次

AzureのLinux VM(仮想マシン)にSSH接続する際 sshdのホストキーを安全に確認するには?

対象:Azure Virtual Machine(仮想マシン)、Linux、Bicep


 SSHでいままで接続したことのないホスト(サーバ)に接続しようとすると、以下のようなメッセージが表示される。

初めてのホスト(サーバ)に接続しようとしたときに表示される確認の問い合わせメッセージの例 初めてのホスト(サーバ)に接続しようとしたときに表示される確認の問い合わせメッセージの例
これはWindows 11標準のOpenSSHクライアントの例。

 これは、「ホストキー(ホスト鍵)」と呼ばれるSSHサーバ(sshd)の公開鍵から算出された指紋(フィンガープリント、fingerprint)をユーザーに確認するための問い合わせメッセージだ。意図したサーバに正しく接続しようとしているかどうかをユーザーが確認させるための仕組みである。

 言うまでもなく、表示された指紋と実際のsshdの指紋が一致することを確認すべきだ。しかし、SSH接続後ならともかく、接続前に指紋を確認するのは何かと面倒だ。そのため、ここで確認せずに「yes」と答えてしまい、以後も確認しないことが意外と多いのではないだろうか?

 そこで本Tech TIPSでは、Azureの仮想マシン(VM)にインストールしたLinuxで、安全にsshdの(指紋の元である)ホストキーを取得してSSHクライアントに登録し、SSHも安全に接続できるようにする一連の手順を説明する。SSHクライアントの対象は、Windows 10/11標準のOpenSSHクライアントとする。またsshdの対象は、主な最新LinuxディストリビューションでパッケージからインストールできるOpenSSHサーバとする。

■執筆時の各種ツール/APIのバージョン

  • Azure CLI: Ver. 2.50.0
  • Bicep CLI: Ver. 0.19.5
  • Bicepでのデプロイ時のAPIバージョン: 2022-11-01(仮想マシン生成)、2023-02-01(ネットワーク系リソース生成)

手順その1――Linux VMでホストキー読み出しコマンドを実行する

●Linuxでsshdの全ホストキーを出力(表示)するには

 Linux上のsshdの場合、そのホストキーは通常、「/etc/ssh」ディレクトリに「ssh_host_<署名アルゴリズム略称>_key.pub」に格納されている。全ホストキーを一括出力するには、bashで以下のコマンドラインを実行すればよい(以下ではこれを「ホストキー読み出しコマンド」とする)。

find /etc/ssh -type f -name 'ssh_host_*_key.pub' -exec cat '{}' \;

【bash】sshdの全ホストキーを出力する

 この時点では、まだSSHで安全に接続できない状態なので、このコマンドをSSH以外の方法でリモートから安全に実行し、その出力を得る必要がある。ここでは、Azureが提供する機能を利用した2種類のリモートコマンド実行方法を紹介する(どちらか一方を実施すればよい)。

●作成済みのVMに対してホストキー読み出しコマンドを実行する

 すでにデプロイ済みの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 '{}' \;"

【Azure CLI】作成済みのVMに対してホストキー読み出しコマンドを実行する
GetSshdHostPubKeys」は、このホストキー読み出しコマンドに付ける名前。
※Microsoftのレファレンス: az vm run-command create

【Azure CLI】作成済みのVMに対してホストキー読み出しコマンドを実行したところ 【Azure CLI】作成済みのVMに対してホストキー読み出しコマンドを実行したところ
JSONに色が付いているのは「-o jsonc」というオプションを付けているため。

 ただし、上記のコマンドを実行しただけではホストキーは得られない。このコマンドの実行結果を取得するためのコマンドを別途実行する必要がある(手順2で説明する)。

●VMのデプロイ時にホストキー読み出しコマンドを実行する

 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
    }
  }
}

【Bicep】VMのデプロイ時にホストキー読み出しコマンドを実行する
VMやネットワークなどの設定は省いているので、必要に応じて追加/変更してほしい。Tech TIPS「【Azure】Linux VMのSSHの公開鍵認証をデプロイ時に有効化する方法」が参考になるだろう。
※Microsoftのレファレンス: Microsoft.Compute virtualMachines/runCommands

手順その2――手順1の実行結果を表示する

 ここまでの手順でホストキー読み出しコマンドを実行したら、以下のAzure CLIのコマンドラインでその実行結果を取得する。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。