Windows 環境でのほとんどの認証は、ユーザー名とパスワードのペアを使用して行われます。これは、一般的なドメインを共有するシステムではうまく機能します。 オンプレミスとクラウドでホストされるシステムの間など、ドメイン間で作業する場合、この種類の認証はブルート フォース侵入に対して脆弱になります。
これに対し、Linux 環境では、一般的に公開キーと秘密キーのペアを使用して、推測可能なパスワードを使用する必要のない認証を推進します。 OpenSSH には、キーベースの認証をサポートするのに役立つツールが含まれています。具体的には次のとおりです。
- ssh-keygen for generating secure keys.
- ssh-agent and ssh-add for securely storing private keys.
- scp and sftp to securely copy public key files during initial use of a server.
このドキュメントでは、Windows でこれらのツールを使用して、Secure Shell (SSH) でキーベースの認証の使用を開始する方法の概要について説明します。 SSH キー管理に慣れていない場合は、「Secure Shell (SSH) を使用した対話型および自動アクセス管理のセキュリティ」というタイトルの NIST ドキュメント IR 7966 確認することを強くお勧めします。
Key pairs
キー ペアは、特定の認証プロトコルで使用される公開および秘密キー ファイルを意味します。
SSH public key authentication uses asymmetric cryptographic algorithms to generate two key files—one private and the other public. 各秘密キー ファイルはパスワードに相当し、あらゆる状況で保護を維持する必要があります。 ユーザーの秘密キーを入手した人は、ユーザーがアクセス権を持つ SSH サーバーにそのユーザーとしてサインインできます。 公開キーは SSH サーバーに配置されるものであり、秘密キーを損なうことなく共有できます。
SSH サーバーとクライアントは、キーベースの認証を使用して、指定されたユーザー名の公開キーを秘密キーと比較できます。 クライアント側の秘密キーに対してサーバー側の公開キーを検証できない場合、認証は失敗します。
キー ペアの生成時にパスフレーズを入力することで、キー ペアを使用して多要素認証を実装できます。 詳細については、「ユーザー キー生成」を参照してください。 ユーザーは認証時にパスフレーズの入力を求められます。 パスフレーズと秘密キーの存在を組み合わせて SSH クライアントで使用し、ユーザーを認証します。
Important
キーベースの認証によって開かれたリモート セッションには、関連付けられたユーザー資格情報がありません。 その結果、セッションはユーザーとして送信認証を実行できません。 この動作は仕様によるものです。
ホスト キーの生成
公開キーには特定のアクセス制御リスト (ACL) 要件があります。Windows では、管理者とシステム ユーザーへのアクセスのみを許可する必要があります。 sshd
サービスを初めて使用すると、ホストのキー ペアが自動的に生成されます。
Important
この記事のコマンドを実行するには、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
Because there's no user associated with the sshd
service, the host keys are stored under 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):
At the prompt, you can select Enter to accept the default file path, or you can specify a path or file name for your generated keys.
次に、パスフレーズを使用して秘密キー ファイルを暗号化するように求められます。 一般に、パスフレーズはキー ファイルと連携して 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 クライアントに渡されます。
Important
We recommend that you back up your private key to a secure location and then delete it from the local system after you add it to the ssh-agent
service. この例の ECDSA など、強力なアルゴリズムが使用されている場合、秘密キーをエージェントから取得することはできません。 秘密キーへのアクセスが失われる場合は、新しいキー ペアを作成し、操作するすべてのシステムで公開キーを更新する必要があります。
公開キーをデプロイする
To use the user key that you created previously, you need to place the contents of your public key (\.ssh\id_ecdsa.pub) on the server into a text file. ファイルの名前と場所は、ユーザー アカウントがローカル管理者グループのメンバーであるか、標準ユーザー アカウントであるかによって異なります。 次のセクションでは、標準ユーザーと管理ユーザーの両方について説明します。
Standard user
You need to place the contents of your public key (\.ssh\id_ecdsa.pub) on the server into a text file called authorized_keys
in C:\Users\username\.ssh\. 公開キーをコピーするには、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
Administrative user
You need to place the contents of your public key (\.ssh\id_ecdsa.pub) on the server into a text file called administrators_authorized_keys
in C:\ProgramData\ssh\. 公開キーをコピーするには、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_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 を使用する場合は、その前にアスタリスク (*) を付ける必要があります。 In the following example, the Administrators group uses the 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
ホストに接続できます。