Windows 環境のほとんどの認証は、ユーザー名とパスワードのペアで行われます。これは、共通ドメインを共有するシステムに適しています。 オンプレミスとクラウドでホストされるシステムの間など、ドメイン間で作業する場合、この種類の認証はブルート フォース侵入に対して脆弱になります。
これに対し、Linux 環境では、一般的に公開キーと秘密キーのペアを使用して、推測可能なパスワードを使用する必要のない認証を推進します。 OpenSSH には、キーベースの認証をサポートするのに役立つツールが含まれています。具体的には次のとおりです。
- ssh-keygen をセキュリティで保護されたキーを生成するために使用します。
- 秘密キーを安全に格納するための ssh-agent と ssh-add。
- サーバーの初回使用時に公開キー ファイルを安全にコピーするための scp と sftp。
このドキュメントでは、Windows でこれらのツールを使用して、Secure Shell (SSH) でキーベースの認証の使用を開始する方法の概要について説明します。 SSH キー管理に慣れていない場合は、「Secure Shell (SSH) を使用した対話型および自動アクセス管理のセキュリティ」というタイトルの NIST ドキュメント IR 7966 を確認することを強くお勧めします。
注記
Windows OpenSSH では、 AuthorizedKeysCommand ディレクティブと AuthorizedKeysCommandUser ディレクティブはサポートされていません。 つまり、Linux システムの場合と同様に、これらのディレクティブを使用して Active Directory から SSH キーを動的にフェッチすることはできません。 サポートされている構成オプションの詳細については、「 Windows Server と Windows の OpenSSH Server の構成」を参照してください。
キー ペア
キー ペアは、特定の認証プロトコルで使用される公開および秘密キー ファイルを意味します。
SSH 公開キー認証では、非対称暗号化アルゴリズムを使用して 2 つのキー ファイルが生成されます。1 つはプライベート 、もう 1 つはパブリック です。 各秘密キー ファイルはパスワードに相当し、あらゆる状況で保護を維持する必要があります。 ユーザーの秘密キーを入手した人は、ユーザーがアクセス権を持つ SSH サーバーにそのユーザーとしてサインインできます。 公開キーは SSH サーバーに配置され、秘密キーを損なうことなく共有できます。
SSH サーバーとクライアントは、キーベースの認証を使用して、指定されたユーザー名の公開キーを秘密キーと比較できます。 クライアント側の秘密キーに対してサーバー側の公開キーを検証できない場合、認証は失敗します。
キー ペアを生成するときにパスフレーズを入力することで、キー ペアを使用して多要素認証を実装できます。 詳細については、「ユーザー キー生成」を参照してください。 ユーザーは認証時にパスフレーズの入力を求められます。 パスフレーズと秘密キーの存在を組み合わせて SSH クライアントで使用し、ユーザーを認証します。
重要
キーベースの認証によって開かれたリモート セッションには、関連付けられたユーザー資格情報がありません。 その結果、セッションはユーザーとして送信認証を実行できません。 この動作は仕様によるものです。
ホスト キーの生成
公開キーには特定のアクセス制御リスト (ACL) 要件があります。Windows では、管理者とシステム ユーザーへのアクセスのみを許可する必要があります。
sshd サービスを初めて使用すると、ホストのキー ペアが自動的に生成されます。
重要
この記事のコマンドを実行するには、OpenSSH Server をインストールする必要があります。 詳細については、「Windows 用 OpenSSH の始め方」を参照してください。
既定では、sshd を手動で開始する必要があります。 サーバーが再起動されるたびに自動的に起動するように構成するには、サーバーの管理者特権の PowerShell プロンプトから次のコマンドを実行します。
# Set the sshd service to be started automatically.
Get-Service -Name sshd | Set-Service -StartupType Automatic
# Start the sshd service.
Start-Service sshd
sshd サービスに関連付けられているユーザーがないため、ホスト キーは C:\ProgramData\sshに格納されます。
ユーザー キーの生成
キーベースの認証を使用するには、最初にクライアント用の公開/秘密キーのペアを生成する必要があります。
ssh-keygen.exeを使用してキー ファイルを生成できます。 次のキー生成アルゴリズムを指定できます。
- デジタル署名アルゴリズム (DSA)
- Rivest-Shamir-Adleman (RSA)
- 楕円曲線デジタル署名アルゴリズム (ECDSA)
- Ed25519
アルゴリズムを指定しない場合は、Ed25519 が使用されます。 この例に示す ECDSA のような、強力なアルゴリズムとキーの長さを使用する必要があります。
ECDSA アルゴリズムを使用してキー ファイルを生成するには、クライアントの PowerShell またはコマンド プロンプト ウィンドウで次のコマンドを実行します。
ssh-keygen -t ecdsa
コマンドからの出力は、 username がユーザー名に置き換えられる点を除いて、次の行のようになります。
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):
プロンプトで Enter を選択して既定のファイル パスを受け入れるか、生成されたキーのパスまたはファイル名を指定できます。
次に、パスフレーズを使用して秘密キー ファイルを暗号化するように求められます。 一般に、パスフレーズはキー ファイルと連携して 2 要素認証を提供するため、空のパスフレーズを使用することはお勧めしません。 ただし、この例では、パスフレーズを空のままにすることができます。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ecdsa.
Your public key has been saved in C:\Users\username/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME
The key's randomart image is:
+--[ECDSA 256]--+
| . |
| o |
| . + + . |
| o B * = . |
| o= B S . |
| .=B O o |
| + =+% o |
| *oo.O.E |
|+.o+=o. . |
+----[SHA256]-----+
これで、指定した場所に公開/プライベート ECDSA キー ペアが作成されました。 .pub ファイルは公開キーであり、拡張子のないファイルは秘密キーです。
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/3/2021 2:55 PM 464 id_ecdsa
-a---- 6/3/2021 2:55 PM 103 id_ecdsa.pub
秘密キー ファイルはパスワードに相当し、パスワードを保護するのと同じ方法で保護する必要があります。
ssh-agent を使用して、Windows アカウントに関連付けられている Windows セキュリティ コンテキスト内に秘密キーを安全に格納できます。 コンピューターが再起動されるたびに自動的に開始されるように ssh-agent サービスを構成し、ssh-add を使用して秘密キーを格納するには、サーバーの管理者特権の PowerShell プロンプトで次のコマンドを実行します。
# By default, the ssh-agent service is disabled. Configure it to start automatically.
# Run the following command as an administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic
# Start the service.
Start-Service ssh-agent
# The following command should return a status of Running.
Get-Service ssh-agent
# Load your key files into ssh-agent.
ssh-add $env:USERPROFILE\.ssh\id_ecdsa
クライアント上の ssh-agent サービスにキーを追加すると、ssh-agent サービスによってローカル秘密キーが自動的に取得され、SSH クライアントに渡されます。
重要
秘密キーをセキュリティで保護された場所にバックアップし、 サービスに追加した後 ssh-agent から削除することをお勧めします。 この例の ECDSA などの強力なアルゴリズムが使用されている場合、秘密キーはエージェントから取得できません。 秘密キーへのアクセスが失われる場合は、新しいキー ペアを作成し、操作するすべてのシステムで公開キーを更新する必要があります。
公開キーをデプロイする
前に作成したユーザー キーを使用するには、サーバー上の公開キー (\.ssh\id_ecdsa.pub) の内容をテキスト ファイルに配置する必要があります。 ファイルの名前と場所は、ユーザー アカウントがローカル管理者グループのメンバーであるか、標準ユーザー アカウントであるかによって異なります。 次のセクションでは、標準ユーザーと管理ユーザーの両方について説明します。
標準ユーザー
サーバー上の公開キー (\.ssh\id_ecdsa.pub) の内容を、authorized_keysの というテキスト ファイルに配置する必要があります。 公開キーをコピーするには、OpenSSH scp セキュリティで保護されたファイル転送ユーティリティを使用するか、PowerShell を使用してファイルにキーを書き込みます。
次のコードを使用して、公開キーをサーバーにコピーできます。 最後の行で、username をユーザー名に置き換えます。 最初に、サーバーのユーザー アカウントのパスワードを入力するように求められます。
# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell
管理ユーザー
サーバー上の公開キー (\.ssh\id_ecdsa.pub) の内容を、administrators_authorized_keysの というテキスト ファイルに配置する必要があります。 公開キーをコピーするには、OpenSSH scp セキュリティで保護されたファイル転送ユーティリティを使用するか、PowerShell を使用してファイルにキーを書き込みます。 このファイルの ACL は、管理者とシステム ユーザーへのアクセスのみを許可するように構成する必要があります。
次のコードを使用して、公開キーをサーバーにコピーし、ACL を構成できます。 最後の行で、username をユーザー名に置き換えます。 最初に、サーバーのユーザー アカウントのパスワードを入力するように求められます。
注記
この例では、administrators_authorized_keys ファイルを作成するための手順を示します。 このファイルは管理者アカウントにのみ適用されます。 ユーザーのプロファイルの場所内のユーザー固有のファイルの代わりに使用する必要があります。
# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell command to run remotely that copies 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 command by 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 ホストに接続できます。