詳細な手順: Azure の Linux VM に対する認証用に SSH キーを作成して管理する

適用対象: ✔️ Linux VM ✔️ フレキシブルなスケール セット

Secure Shell (SSH) キーの組を使用すると、認証に SSH キーを使う Linux 仮想マシンを作成できます。 この記事では、SSH クライアント接続用の SSH RSA 公開/秘密キー ファイル ペアを作成して使用する方法について説明します。

SSH キーの詳細な説明ではなく、迅速なコマンドが必要な場合は、Azure に Linux VM 用の SSH 公開キーと秘密キーのペアを作成する方法に関するページを参照してください。

SSH キーを作成し、それを使って Windows コンピューターから Linux VM に接続する方法については、「Azure 上の Windows で SSH キーを使用する方法」を参照してください。 また、Azure portal を使用して、VM を作成するための SSH キーをポータルで作成して管理することもできます。

SSH とキーの概要

SSH は、セキュリティで保護されていない接続において安全なサインインを可能にする、暗号化された接続プロトコルです。 SSH は暗号化された接続を提供しますが、SSH 接続でパスワードを使用すると、VM はブルートフォース攻撃に対して脆弱になります。 SSH を介して VM に接続する場合は、公開キーと秘密キーのペアを使用することをお勧めします。これは "SSH キー" とも呼ばれています。

  • 公開キーは、VM 上に配置されます。

  • 秘密キーは、ローカル システム上に残ります。 このキーは安全に保管してください。 このキーは共有しないようにしてください。

SSH クライアントを使用して自分の VM (公開キーがある) に接続するときに、リモート VM によってクライアントがテストされ、正しい秘密キーの存在が確認されます。 クライアントに秘密キーがある場合、VM へのアクセス権が付与されます。

組織のセキュリティ ポリシーに応じて、単一の公開キーと秘密キーのペアを再利用して複数の Azure VM とサービスにアクセスできます。 アクセスする VM またはサービスごとに異なるキーのペアを用意する必要はありません。

ご自分の公開キーはだれとでも共有できますが、ご自分の秘密キーへのアクセス権を所有するのは自分 (またはローカル セキュリティ インフラストラクチャ) のみとする必要があります。

サポートされる SSH キーの形式

Azure は、現在、SSH プロトコル 2 (SSH-2) の RSA 公開キー/秘密キーのペア (最小長: 2048 ビット) をサポートしています。 その他のキーの形式 (ED25519 や ECDSA など) はサポートされていません。

SSH キーの使用方法と利点

公開キーを指定して Azure VM を作成すると、Azure は公開キーを (.pub の形式で) VM の ~/.ssh/authorized_keys フォルダーにコピーします。 ~/.ssh/authorized_keys の SSH キーによって、SSH 接続中に接続クライアントが対応する秘密キーを確実に提示するようにします。 認証に SSH キーを使用する Azure Linux VM では、Azure が SSH サーバーのパスワード認証システムを無効にし、SSH キー認証のみを許可します。 SSH キーで Azure Linux VM を作成すると、VM のデプロイをセキュリティで保護し、一般的なデプロイ後の構成手順である sshd_config ファイル内のパスワードの無効化を省略できます。

SSH キーを使用したくない場合は、パスワード認証を使うように Linux VM を設定できます。 VM がインターネットに公開されない場合は、パスワードを使用するだけで十分なことがあります。 ただし、Linux VM ごとにパスワードを管理し、パスワードの最小の長さ、定期的なシステム更新など、優良なパスワードのポリシーと運用を維持する必要があります。

ssh-keygen でキーを生成する

キーを作成するための推奨されるコマンドは ssh-keygen です。このコマンドは、Azure Cloud Shell、macOS、Linux ホスト上の OpenSSH ユーティリティや、Windows (10 および 11) で利用できます。 ssh-keygen では、一連の質問に答えることによって、秘密キーと対応する公開キーが出力されます。

SSH キーは既定で ~/.ssh ディレクトリに保持されます。 ~/.ssh ディレクトリがない場合、ssh-keygen コマンドによって、適切なアクセス許可で作成されます。 SSH キーはリソースとして作成され、後で使用するために Azure に格納されます。

Note

SSH キーを生成して格納する方法の説明に従って、az sshkey create コマンドを使用して Azure CLI でキーを作成することもできます。

基本的な例

次の ssh-keygen コマンドは、既定で、4096 ビットの SSH RSA 公開および秘密キー ファイルを ~/.ssh ディレクトリに生成します。 既存の SSH キー ペアが現在の場所で見つかった場合、それらのファイルは上書きされます。

ssh-keygen -m PEM -t rsa -b 4096

詳細な例

次の例では、SSH RSA キー ペアを作成するためのその他のコマンド オプションを示します。 SSH キー ペアが現在の場所にある場合、それらのファイルは上書きされます。

ssh-keygen \
    -m PEM \
    -t rsa \
    -b 4096 \
    -C "azureuser@myserver" \
    -f ~/.ssh/mykeys/myprivatekey \
    -N mypassphrase

コマンドの説明

ssh-keygen = キーの作成に使用するプログラム。

-m PEM = キー を PEM としてフォーマットする

-t rsa = 作成するキーの種類。この場合は RSA 形式。

-b 4096 = キーのビット数。この場合は 4096。

-C "azureuser@myserver" = 識別しやすいように公開キー ファイルの末尾に追記されたコメント。 通常はメール アドレスがコメントとして使用されますが、インフラストラクチャに最適な文字列を使用します。

-f ~/.ssh/mykeys/myprivatekey = 既定の名前を使用しない場合の、秘密キー ファイルのファイル名。 .pub を付加された対応する公開キー ファイルが、同じディレクトリに生成されます。 ディレクトリは存在している必要があります。

-N mypassphrase = 秘密キー ファイルへのアクセスに使用される追加のパスフレーズ。

ssh-keygen の例

ssh-keygen -t rsa -m PEM -b 4096 -C "azureuser@myserver"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/azureuser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/azureuser/.ssh/id_rsa.
Your public key has been saved in /home/azureuser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vFfHHrpSGQBd/oNdvNiX0sG9Vh+wROlZBktNZw9AUjA azureuser@myserver
The key's randomart image is:
+---[RSA 4096]----+
|        .oE=*B*+ |
|          o+o.*++|
|           .oo++*|
|       .    .B+.O|
|        S   o=BO.|
|         . .o++o |
|        . ... .  |
|         ..  .   |
|           ..    |
+----[SHA256]-----+

保存されるキー ファイル

Enter file in which to save the key (/home/azureuser/.ssh/id_rsa): ~/.ssh/id_rsa

この記事で使用するキー ペアの名前です。 既定では、キー ペアの名前に id_rsa が割り当てられます。秘密キーのファイル名として id_rsa を想定しているツールもあるため、そのようにすることをお勧めします。 ディレクトリ ~/.ssh/ は、SSH キー ペアと SSH 構成ファイルの既定の場所です。 完全パスで指定されていない場合、ssh-keygen は、既定の ~/.ssh ではなく、現在の作業ディレクトリにキーを作成します。

~/.ssh ディレクトリのリスト

~/.ssh ディレクトリ内の既存のファイルを表示するには、次のコマンドを実行します。 ディレクトリにファイルが見つからないか、またはディレクトリ自体が見つからない場合は、以前のすべてのコマンドが正常に実行されたことを確認してください。 特定の Linux ディストリビューションでは、このディレクトリ内のファイルを変更するために、ルート アクセスが必要な場合があります。

ls -al ~/.ssh
-rw------- 1 azureuser staff  1675 Aug 25 18:04 id_rsa
-rw-r--r-- 1 azureuser staff   410 Aug 25 18:04 id_rsa.pub

キーのパスフレーズ

Enter passphrase (empty for no passphrase):

秘密キーにはパスフレーズを追加することを "強く" お勧めします。 キー ファイルを保護するパスフレーズがないと、ファイルを持っている人はだれでも、そのファイルを使用して、対応する公開キーのあるサーバーにサインインすることができます。 パスフレーズを追加すれば、第三者に秘密キー ファイルへのアクセスを許してしまった場合でも、キーを変更する時間ができるので、保護のレベルが上がります。

展開の間にキーを自動生成する

Azure CLI を使用して VM を作成する場合は、必要に応じてaz vm create コマンドを --generate-ssh-keys オプション付きで実行することで、SSH 公開キーと SSH 秘密キーの両方のファイルを作成できます。 キーは、~/.ssh ディレクトリに格納されます。 このコマンド オプションは、事前に構成されたコンピューティング ギャラリー イメージなど、その場所にキーが既に存在する場合でもキーを上書きしないことに注意してください。

VM を展開するときに SSH 公開キーを提供する

認証するために SSH キーを使用する Linux VM を作成するには、Azure Portal、CLI、Resource Manager テンプレート、またはその他の方法を使用して VM を作成するときに SSH 公開キーを提供します。 ポータルを使用するときは、公開キー自体を入力します。 Azure CLI で既存の公開キーを使用する VM を作成する場合は、az vm create コマンドを --ssh-key-value オプション付きで実行することで、使用する公開キーの値または場所を指定します。

SSH 公開キーの書式がわからない場合は、次のように cat を実行して公開キーを表示できます。~/.ssh/id_rsa.pub の部分は実際の公開キー ファイルの場所に置き換えてください。

cat ~/.ssh/id_rsa.pub

出力は次のようになります (以下は編集された例)。

ssh-rsa XXXXXXXXXXc2EAAAADAXABAAABAXC5Am7+fGZ+5zXBGgXS6GUvmsXCLGc7tX7/rViXk3+eShZzaXnt75gUmT1I2f75zFn2hlAIDGKWf4g12KWcZxy81TniUOTjUsVlwPymXUXxESL/UfJKfbdstBhTOdy5EG9rYWA0K43SJmwPhH28BpoLfXXXXXG+/ilsXXXXXKgRLiJ2W19MzXHp8z3Lxw7r9wx3HaVlP4XiFv9U4hGcp8RMI1MP1nNesFlOBpG4pV2bJRBTXNXeY4l6F8WZ3C4kuf8XxOo08mXaTpvZ3T1841altmNTZCcPkXuMrBjYSJbA8npoXAXNwiivyoe3X2KMXXXXXdXXXXXXXXXXCXXXXX/ azureuser@myserver

公開キー ファイルの内容をコピーし、Azure portal または Resource Manager テンプレートに貼り付ける場合は、余分な空白文字をコピーしたり、改行を追加したりしないように注意してください。 たとえば、macOS を使用している場合は、公開キー ファイル (既定では ~/.ssh/id_rsa.pub) を pbcopy にパイプして、内容をコピーできます (xclip など、同じ目的を達成できる Linux プログラムが他にもあります)。

複数行形式の公開キーを使う方がよい場合は、前に作成した公開キーから pem コンテナーに RFC4716 形式のキーを生成できます。

既存の SSH 公開キーから RFC4716 形式のキーを作成するには、次のようにします。

ssh-keygen \
-f ~/.ssh/id_rsa.pub \
-e \
-m RFC4716 > ~/.ssh/id_ssh2.pem

SSH クライアントを使用して VM に SSH 接続する

公開キーを Azure VM に、秘密キーをローカル システム上に配置した状態で、VM の IP アドレスまたは DNS 名を使用して、VM に SSH 接続します。 次のコマンドの azureusermyvm.westus.cloudapp.azure.com を、管理者のユーザー名と完全修飾ドメイン名 (または IP アドレス) に置き換えてください。

ssh azureuser@myvm.westus.cloudapp.azure.com

キー ペアを作成する際にパスフレーズを指定した場合は、サインイン プロセス中に入力を求められたら、そのパスフレーズを入力します (サーバーは ~/.ssh/known_hosts フォルダーに追加されます。Azure VM にある公開キーが変更されるかサーバー名が ~/.ssh/known_hosts から削除されるまで、再度接続を求められることはありません)。

VM が Just-In-Time アクセス ポリシーを使用している場合、VM に接続するにはアクセス権を要求する必要があります。 Just-In-Time ポリシーの詳細については、Just in Time ポリシーを使用した仮想マシン アクセスの管理に関するページを参照してください。

ssh-agent を使用して秘密キーのパスフレーズを格納する

SSH サインインのたびに秘密キー ファイルのパスフレーズを入力しなくて済むように、ssh-agent を使用して秘密キー ファイルのパスフレーズをローカル システム上にキャッシュできます。 Mac を使用している場合、ssh-agent を呼び出すと、秘密キーのパスフレーズは macOS キーチェーンによって安全に保存されます。

パスフレーズを対話的に使用する必要がないように、ssh-agentssh-add を確認して使用し、キー ファイルに関する情報を SSH システムに伝えます。

eval "$(ssh-agent -s)"

ここで、ssh-add コマンドを使用して、ssh-agent に秘密キーを追加します。

ssh-add ~/.ssh/id_rsa

これで、秘密キーのパスフレーズが ssh-agent に格納されました。

ssh-copy-id を使用して既存の VM にキーをコピーする

既に VM を作成済みの場合は、ssh-copy-id を使用して、Linux VM に新しい SSH 公開キーを追加できます。

ssh-copy-id -i ~/.ssh/id_rsa.pub azureuser@myserver

SSH 構成ファイルの作成と構成

SSH 構成ファイル (~/.ssh/config) を作成して構成すると、ログインを高速化し、SSH クライアントの動作を最適化することができます。

次の例で示す簡単な構成を使うと、既定の SSH 秘密キーを使って、特定の VM にユーザーとしてすばやくサインインできます。

ファイルを作成します。

touch ~/.ssh/config

ファイルを編集して新しい SSH 構成を追加する

vim ~/.ssh/config

ホスト VM に適した構成設定を追加します。 この例では、VM 名 (Host) は myvm、アカウント名 (User) は azureuser、IP アドレスまたは FQDN (Hostname) は 192.168.0.255 です。

# Azure Keys
Host myvm
  Hostname 192.168.0.255
  User azureuser
# ./Azure Keys

追加のホストに構成を追加することで、それぞれが独自の専用キー ペアを使用するようにできます。 高度な構成オプションについて詳しくは、「SSH config file」(SSH 構成ファイル) をご覧ください。

SSH キー ペアを作成し、SSH 構成ファイルを構成したので、すばやく安全にリモートから Linux VM にアクセスできるようになりました。 次のコマンドを実行すると、SSH は SSH 構成ファイルを探して、その Host myvm ブロックからすべての設定を読み込みます。

ssh myvm

SSH キーを使用して初めてサーバーにサインインするとき、キー ファイルのパスフレーズを入力するように求められます。

次のステップ

次のステップでは、新しい SSH 公開キーを使用して Azure Linux VM を作成します。 Azure VM は、SSH 公開キーをサインインとして作成した方が、既定のサインイン方法であるパスワードを使って作成するよりも高いセキュリティが得られます。