OpenSSH キーの管理

適用対象: Windows Server 2019、Windows 10: Windows Server 2022、

Windows 環境でのほとんどの認証は、ユーザー名とパスワードのペアを使用して行われます。これは、一般的なドメインを共有するシステムではうまく機能します。 オンプレミスとクラウドホスト システムの間など、ドメインにまたがって作業する場合、それはブルートフォース攻撃に対して脆弱になります。

これに対し、Linux 環境では一般に、認証を促進するために公開キー/秘密キーのペアが使用されるため、推測可能なパスワードを使用する必要がありません。 OpenSSH には、これをサポートするためのツールが含まれています。具体的には次のとおりです。

  • セキュリティ キーを生成するための ssh-keygen
  • 秘密キーを安全に格納するための ssh-agentssh-add
  • サーバーの初回使用時に公開キー ファイルを安全にコピーするための scpsftp

このドキュメントでは、Windows 上でこれらのツールを使用して、SSH によるキーベースの認証の使用を開始する方法の概要を示します。 SSH キーの管理に慣れていない場合は、『Security of Interactive and Automated Access Management Using Secure Shell (SSH)』(Secure Shell (SSH) を使用した対話型および自動化されたアクセス管理のセキュリティ) というタイトルの NIST ドキュメント IR 7966 を確認することを強くお勧めします。

キー ペアについて

キー ペアは、特定の認証プロトコルで使用される公開および秘密キー ファイルを意味します。

SSH 公開キー認証では、非対称暗号アルゴリズムを使用して 2 つのキー ファイルが生成されます。1 つは "秘密"、もう 1 つは "公開" です。 秘密キー ファイルはパスワードと同等であり、すべての状況下で保護される必要があります。 ユーザーの秘密キーを入手した人は、ユーザーがアクセス権を持つ SSH サーバーにそのユーザーとしてログインできます。 公開キーは SSH サーバー上に配置されるものであり、秘密キーを侵害することなく共有できます。

SSH サーバーでキー認証を使用する場合、SSH サーバーとクライアントで、指定されたユーザー名の公開キーが秘密キーと比較されます。 クライアント側の秘密キーに対してサーバー側の公開キーを検証できない場合、認証は失敗します。

キー ペアが生成されるときにパスフレーズを入力することで、キー ペアを使用した多要素認証を実装できます (下記の「ユーザー キーの生成」を参照してください)。 認証中に、ユーザーは、ユーザーを認証するために SSH クライアント上の秘密キーの存在と共に使用されるパスフレーズの入力を求められます。

ホスト キーの生成

公開キーには、Windows 上で管理者とシステムへのアクセスのみを許可することと同等の特定の ACL 要件があります。 sshd を初めて使用するときに、ホストのキー ペアが自動的に生成されます。

重要

OpenSSH Server を先にインストールする必要があります。 「OpenSSH の概要」を参照してください。

既定では、sshd サービスは手動で開始するように設定されています。 サーバーの再起動時に毎回開始するようにするには、サーバーの管理者特権での PowerShell プロンプトから次のコマンドを実行します。

# Set the sshd service to be started automatically
Get-Service -Name sshd | Set-Service -StartupType Automatic

# Now start the sshd service
Start-Service sshd

sshd サービスには関連付けられているユーザーがないため、ホスト キーは C:\ProgramData\ssh に格納されます。

ユーザー キーの生成

キーベースの認証を使用するには、最初にクライアント用の公開/秘密キーのペアを生成する必要があります。 ssh-keygen.exe を使用してキー ファイルを生成し、アルゴリズムとして DSA、RSA、ECDSA、または Ed25519 を指定できます。 アルゴリズムが指定されていない場合は、RSA が使用されます。 この例に示す Ed25519 のような、強力なアルゴリズムとキーの長さを使用する必要があります。

Ed25519 アルゴリズムを使用してキー ファイルを生成するには、クライアントで PowerShell または cmd プロンプトから以下を実行します。

ssh-keygen -t ed25519

これにより、以下が表示されます ("username" はご自身のユーザー名に置き換えられます)。

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\username\.ssh\id_ed25519):

Enter キーを押して既定値をそのまま使用することも、キーを生成するパスまたはファイル名 (あるいはその両方) を指定することもできます。 この時点で、秘密キー ファイルを暗号化するためにパスフレーズを使用するように求められます。 これは空にすることができますが、推奨されません。 パスフレーズとキー ファイルが連携して、2 要素認証が提供されます。 この例では、パスフレーズを空のままにしています。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username\.ssh\id_ed25519.
Your public key has been saved in C:\Users\username\.ssh\id_ed25519.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@server@LOCAL-HOSTNAME

The key's randomart image is:
+--[ED25519 256]--+
|        .        |
|         o       |
|    . + + .      |
|   o B * = .     |
|   o= B S .      |
|   .=B O o       |
|  + =+% o        |
| *oo.O.E         |
|+.o+=o. .        |
+----[SHA256]-----+

これで、指定した場所に Ed25519 の公開/秘密キー ペアが作成されました。 .pub ファイルが公開キーであり、拡張子のないファイルが秘密キーです。

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2021   2:55 PM            464 ed25519
-a----         6/3/2021   2:55 PM            103 ed25519.pub

秘密キー ファイルはパスワードと同等のもので、パスワードを保護するのと同じ方法で保護する必要があることに注意してください。 そのために、ssh-agent を使用して、Windows ログインに関連付けられている Windows セキュリティ コンテキスト内に秘密キーを安全に格納します。 これを行うには、管理者として ssh-agent サービスを開始し、ssh-add を使用して秘密キーを格納します。

# By default the ssh-agent service is disabled. Allow it to be manually started for the next step to work.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Manual

# Start the service
Start-Service ssh-agent

# This should return a status of Running
Get-Service ssh-agent

# Now load your key files into ssh-agent
ssh-add ~\.ssh\id_ed25519

これらの手順を完了すると、このクライアントからの認証に秘密キーが必要になるたびに、ssh-agent によってローカルの秘密キーが自動的に取得されて、SSH クライアントに渡されます。

重要

秘密キーを ssh-agent に追加した ""、セキュリティで保護された場所にバックアップしてから、ローカル システムから削除することを強くお勧めします。 この例の Ed25519 のように、強力なアルゴリズムが使用されているエージェントから秘密キーを取得することはできません。 秘密キーにアクセスできなくなった場合は、新しいキー ペアを作成し、操作するすべてのシステム上で公開キーを更新する必要があります。

公開キーのデプロイ

上記で作成したユーザー キーを使用するには、公開キー (~\.ssh\id_ed25519.pub) の内容をサーバー上のテキスト ファイルに配置する必要があります。その名前と場所は、ユーザー アカウントがローカル管理者グループのメンバーであるか、標準ユーザー アカウントであるかによって異なります。

標準ユーザー

公開キー (~\.ssh\id_ed25519.pub) の内容は、サーバーの C:\Users\username\.ssh\ に、authorized_keys という名前のテキスト ファイルで配置する必要があります。 OpenSSH クライアントには、これを支援するために、セキュリティで保護されたファイル転送ユーティリティである scp が含まれています。

次の例では、公開キーをサーバーにコピーします ("username" をご自身のユーザー名に置き換えます)。 最初に、サーバーのユーザー アカウント用のパスワードを使用する必要があります。

# Make sure that the .ssh directory exists in your server's user account home folder
ssh username@domain1@contoso.com mkdir C:\Users\username\.ssh\

# Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
scp C:\Users\username\.ssh\id_ed25519.pub user1@domain1@contoso.com:C:\Users\username\.ssh\authorized_keys

管理ユーザー

公開キー (~\.ssh\id_ed25519.pub) の内容は、サーバーの C:\ProgramData\ssh\ に、administrators_authorized_keys という名前のテキスト ファイルで配置する必要があります。 OpenSSH クライアントには、これを支援するために、セキュリティで保護されたファイル転送ユーティリティである scp が含まれています。 このファイルの ACL は、管理者とシステムへのアクセスのみを許可するように構成する必要があります。

次の例では、公開キーをサーバーにコピーし、ACL を構成します ("username" をご自身のユーザー名に置き換えます)。 最初に、サーバーのユーザー アカウント用のパスワードを使用する必要があります。

注意

この例では、administrators_authorized_keys file を作成するための手順を示します。 複数回実行した場合、このファイルが毎回上書きされます。 複数の管理ユーザー用の公開キーを追加するには、このファイルを各公開キーに追加する必要があります。

# Make sure that the .ssh directory exists in your server's user account home folder
ssh user1@domain1@contoso.com mkdir C:\ProgramData\ssh\

# Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
scp C:\Users\username\.ssh\id_ed25519.pub user1@domain1@contoso.com:C:\ProgramData\ssh\administrators_authorized_keys

# Appropriately ACL the authorized_keys file on your server
ssh --% user1@domain1@contoso.com icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

これらの手順で、Windows 上の OpenSSH でキーベース認証を使用するために必要な構成が完了します。 その後、ユーザーは、秘密キーを持つ任意のクライアントから sshd ホストに接続できます。