Windows 用 OpenSSH でのキーベースの認証

Windows Server 2022、Windows Server 2019、Windows 10 (ビルド 1809 以降) に適用されます

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 クライアント上の秘密キーの存在と共に使用されます。

重要

キーベースの認証を介して開かれたリモート セッションには、関連付けられたユーザー資格情報がないため、ユーザーとして送信の認証を実行できません。これは仕様です。

ホスト キーの生成

公開キーには、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@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 id_ed25519
-a----         6/3/2021   2:55 PM            103 id_ed25519.pub

秘密キー ファイルはパスワードと同等のもので、パスワードを保護するのと同じ方法で保護する必要があることに注意してください。 ssh-agent を使用して、Windows アカウントに関連付けられている Windows セキュリティ コンテキスト内に秘密キーを安全に格納します。 コンピューターが再起動されるたびに ssh-agent サービスを開始し、ssh-add を使用して秘密キーを格納するには、サーバー上の管理者特権の PowerShell プロンプトから次のコマンドを実行します。

# By default the ssh-agent service is disabled. Configure it to start automatically.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# 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 $env:USERPROFILE\.ssh\id_ed25519

キーをクライアントの ssh-agent に追加すると、ssh-agent によってローカル秘密キーが自動的に取得され、SSH クライアントに渡されます。

重要

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

公開キーのデプロイ

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

標準ユーザー

公開キー (\.ssh\id_ed25519.pub) の内容は、サーバーの C:\Users\username\.ssh\ に、authorized_keys という名前のテキスト ファイルで配置する必要があります。 公開キーは、OpenSSH scp のセキュリティで保護されたファイル転送ユーティリティを使用するか、PowerShell を使用してファイルにキーを書き込む方法を使用してコピーできます。

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

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

管理ユーザー

公開キー (\.ssh\id_ed25519.pub) の内容は、サーバーの C:\ProgramData\ssh\ に、administrators_authorized_keys という名前のテキスト ファイルで配置する必要があります。 公開キーは、OpenSSH scp のセキュリティで保護されたファイル転送ユーティリティを使用するか、PowerShell を使用してファイルにキーを書き込む方法を使用してコピーできます。 このファイルの ACL は、管理者とシステムへのアクセスのみを許可するように構成する必要があります。

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

Note

この例では、administrators_authorized_keys ファイルを作成するための手順を示します。 これは管理者アカウントにのみ適用され、ユーザー プロファイルの場所内のユーザーごとのファイルの代わりに使用する必要があります。

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

英語以外のローカライズ版オペレーティング システムでは、適切にグループ名が反映されるようにスクリプトを変更する必要があります。 グループ名にアクセス許可を付与する際のエラーを回避するには、セキュリティ識別子 (SID) を代わりに使用できます。 SID は、Get-LocalGroup | Select-Object Name, SID を実行することによって取得できます。 グループ名の代わりに SID を使用する場合は、先頭にアスタリスク (*) を付ける必要があります。 次の例では、管理者グループに SID S-1-5-32-544 が使用されています。

$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""*S-1-5-32-544:F"" /grant ""SYSTEM:F"""

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