SSL経由でWinRMにタップしてPSRemotingを設定する方法

PowerShell Remoting を使用して既にリモートコマンドを実行している場合、その機能がどれだけ便利かわかっているでしょう。1台以上のリモートコンピュータに接続し、それらをローカルのように管理できます。PSRemotingは、Windowsリモート管理(WinRM)に依存しており、WinRMをSSL経由で使用していない場合、セキュリティ上の問題が発生する可能性があります。

このハンズオンチュートリアルでは、クライアントとサーバーのWindowsを設定して、WinRMをHTTPS(SSL)経由で使用し、WinRMを使用する際に証明書を使用して認証する方法を学びます。

前提条件

このチュートリアルを進めるためには、以下の条件を満たしていることを確認してください。

  • A Windows 7+ or Server 2008 R2 machine to serve as the client machine. This tutorial will use Windows 10.
  • A Windows 7+ or Server 2008 R2+ machine to serve as the server machine. This tutorial will use Windows Server 2019.
  • クライアントとサーバーマシンのいずれかに、ローカル管理者アカウントまたはローカル管理権限を持つアカウントへのアクセス権限。
  • Active Directory証明書サービス(ADCS)パブリックキーインフラ(PKI)が設定されていること。本番環境ではADCSを実装することが望ましいですが、このチュートリアルとテストにはオプションです。チュートリアルでは、PKIがエンタープライズまたはスタンドアロンCAとして設定されているものとします。

なぜWinRMをSSL経由で使用するのですか?

PSRemotingは、そのままではWinRMを使用してクライアントマシンをリモートで管理することができます。PSRemotingがWinRMを介してセッションを確立すると、クライアントからサーバーへのすべての通信が暗号化されます。また、HTTPSを使用せずにPSRemotingを実装するための設定手順は比較的簡単です。

PSRemotingはすでにセッション通信を暗号化しているので、なぜADCSのようなものを設定して証明書を管理する手間をかける必要があるのでしょうか?

なぜなら、認証プロセス中に、使用される認証タイプに応じて、クレデンシャルが安全でない形式で送信されることがあるからです。

PSRemotingをより安全にする最も簡単な方法の1つは、HTTPの代わりにHTTPSを介してWinRMを使用することです。HTTPSは、WinRMがすでに使用している暗号化レイヤー内に認証を含めた接続ストリーム全体を包み込みます。HTTPSはまた、接続先のサーバーが思っているものであることを検証する手段も提供します。

自己署名証明書を使用してWinRMを構成する

さあ、デモに入りましょう。最初のトリックでは、自己署名証明書を使用してWinRm経由でSSLでPSRemoting通信を暗号化する設定方法を学びます。

自己署名証明書を使用すると、ADCSのようなPKIを心配することなく、テスト環境を設定する素晴らしい方法です。自己署名証明書を使用すると、サーバー自体が署名する証明書を生成し、基本的には自己を保証します。

通常、証明書は2つのタスクを実行するために存在します。接続の認証と暗号化です。自己署名証明書を使用すると、後者のみが実装されます。サーバーの正当性を検証するには、常にPKIが提供する証明書を使用する必要があります。PKIが提供する証明書は、個々の自己署名証明書を手動で個別に信頼する必要がないため、信頼の唯一のソースを提供します。

自己署名証明書を使用してSSL経由でWinRMを設定するには、4つの主要なステップが必要です。

  1. 宛先マシンで自己署名証明書を作成する。
  2. サーバーのWinRMウェブサーバー(リスナー)を設定して、自己署名証明書を認証に使用する。
  3. 宛先マシンのWindowsファイアウォールで適切なポートを開く。
  4. PowerShellのEnter-PSSessionなどのコマンドを使用して、クライアントでリモート接続を開始するためのコマンドを実行する。

それでは、各ステップを詳しく説明しましょう。

自己署名証明書の作成

最初のステップは、サーバーで自己署名証明書を生成することです。接続時に、PSRemotingはこの証明書を使用してすべての通信を暗号化します。

ServerBでWindows PowerShellコンソールを管理者として開き、以下に示すようにNew-SelfSignedCertificateコマンドレットを実行します。以下のコマンドを実行すると、ServerB.domain.comの証明書がローカルマシンのパーソナル証明書ストアに生成されます。

New-SelfSignedCertificate -Subject 'CN=ServerB.domain.com' -TextExtension '2.5.29.37={text}1.3.6.1.5.5.7.3.1'
Creating self-signed certificate.

Subjectパラメータにはサーバーの完全修飾ドメイン名を指定する必要があります。WinRmは、サーバーの正体を確認するためにこのサブジェクトを使用します。

サーバーがワークグループにある場合でも、常にドメイン名(例:domain.comまたはlab.local)を指定してください。宛先マシンに接続する際、接続するDNS名はこのサブジェクト名と完全に一致している必要があります。一致しない場合、接続に失敗します。

TextExtensionを使用すると、証明書のキーの使用方法2.5.29.37)を定義できます。サーバーの正体を認証するために証明書を使用できるようにするため、サーバー認証のキー使用方法({text}1.3.6.1.5.5.7.3.1)を定義してください。

New-SelfSignedCertificatesが実行されると、生成された証明書のサムプリントが返されます。次のコマンドで必要になるため、この値を保存してください。

WinRMリスナーの設定

サーバー上で自己署名証明書を作成した後、WinRmリスナをその証明書を使用して認証するように設定します。以下に示すように、winrm createコマンドを使用します。

以下のコマンドのAddress=*は、リスナがサーバーで設定されている任意のIPアドレスでリッスンすることを示します。サーバーに複数のIPアドレスが設定されている場合は、ここで特定のIPアドレスを定義することができます。

最後のステップで返されたサムプリントで<cert thumbprint here>のプレースホルダを置き換えてください。

winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="ServerB.domain.com"; CertificateThumbprint="<cert thumbprint here>"}'
Creating WinRM listener with self-signed certificate.

WinRM SSLファイアウォールポートを開く

次に、Windowsファイアウォールを使用している場合、サーバーにデフォルトのHTTPSポート5986を介してサーバーに入るHTTPSトラフィックを許可する必要があります。

以下のコマンドを実行して、PowerShellを使用してWinRMのHTTPSポートをファイアウォールで開きます。

$FirewallParam = @{
    DisplayName = 'Windows Remote Management (HTTPS-In)'
    Direction = 'Inbound'
    LocalPort = 5986
    Protocol = 'TCP'
    Action = 'Allow'
    Program = 'System'
}
New-NetFirewallRule @FirewallParam

SSL経由でサーバーに接続する

これで、リモートのWindows ServerをSSL経由でWinRM接続を受け入れるように設定しました。この時点で、クライアントに戻り、テストしたいPSRemotingコマンドを実行できます。例えば、Enter-PSSessionまたは Invoke-Command cmdletを試すことができます。ただし、デフォルトのHTTP接続とは異なる方法で接続する必要があります。

HTTPS経由での接続には通常、単一のパラメータUseSSLが必要です。このパラメータは、デフォルトではHTTPリスナーではなくHTTPS WinRMリスナーを探すようにコマンドに指示します。 UseSSLパラメータは、より多くのPSRemotingコマンドで利用できます。

テストのために、自己署名証明書のサブジェクトによって定義されたサーバーのFQDN、ユーザー名とパスワードを定義するPSCredentialオブジェクト、そして最後にUseSSLスイッチパラメータを指定して、Enter-PSSessionを実行してください。

Enter-PSSession -ComputerName ServerB.domain.com -Credential (Get-Credential) -UseSSL

上記のコマンドを実行すると、自己署名証明書を使用してサーバー上のWinRMリスナーを構成しているため、エラーメッセージが表示されます。PSRemotingクライアントがサーバーに認証しようとする際に、証明書の検証を試みますが、検証できません。自己署名証明書には信頼チェーンがないため、コマンドは失敗します。

Failing certificate authority trust check with self-signed certificate.

自己署名証明書を使用してサーバーに接続するには、証明書の信頼チェックを無効にする必要があります。以下のように、New-PSSessionOptionコマンドレットを使用してSkipCACheckという名前のPSSessionOptionを作成し、コマンドに渡すことでこれを行うことができます。

$PSSessionOption = New-PSSessionOption -SkipCACheck
Enter-PSSession -ComputerName ServerB -Credential (Get-Credential) -SessionOption $PSSessionOption -UseSSL

Enter-PSSessionコマンドレットに直接含まれていないリモート接続のオプションを追加するために、さまざまなPSSessionOptionオブジェクトを定義することができます。

再度接続を試みると、PowerShellは資格情報の入力を求めます。提供されると、WinRM over SSLでサーバーに接続できるはずです!

CAで署名された証明書を使用したWinRMの設定

本番環境でWinRMを使用してPSRemotingする場合、できるだけ安全に保つために、証明書機関(CA)で署名された証明書を使用したWinRM over SSLに注力する必要があります。

CAで署名された証明書は信頼チェーンを維持し、証明書発行者の身元を検証するため、単純な自己署名証明書よりも安全です。

Active Directory環境であれば、ADCSを使用してCAを設定するのが最も一般的な方法の1つです。ADCSを使用すると、デバイスに証明書を展開し、WinRMをそれらの証明書を使用するように構成できます。

このチュートリアルでは、すでに環境でADCSが設定され、動作していることを前提としています。

クイックなセットアップには、Microsoftのドキュメントに従うことができますが、本番環境では、証明機関は組織の暗号化の中心に位置するため、設定に関して詳細な調査が必要です。

証明書リクエストの作成

CAによって発行された証明書を使用するための最初のステップは、証明書の作成です。証明書を作成するには、まず証明書署名リクエスト(CSR)を作成する必要があります。生成されたCSRは、CAに送信して証明書を発行することができます。

このセクションの手順は、エンタープライズCAまたはスタンドアロンCAでADCSデプロイメントで動作します。AD統合エンタープライズCAを使用している場合、証明書の自動登録や証明書テンプレートを使用して、このセクションの手順を省略することができます。

(ServerB このチュートリアルで) サーバー上で、CSR を作成します。

  1. Windows 証明書マネージャーを開くために certlm.msc を実行します。

2. 個人ストアを右クリックし、すべてのタスク —> 詳細操作 —> カスタム要求の作成 を選択します。

3. このチュートリアルでは、以下の画面に表示されるまで、デフォルトのまますべてのフィールドを残します。ここで、詳細ドロップダウンをクリックし、プロパティ を選択します。

Creating a custom certificate request.

4. Subject タブをクリックし、Type共通名 に変更します。

5. 現在のドメインに参加している場合は、サーバーの完全修飾ドメイン名を入力し、参加していない場合はホスト名を入力し、追加 をクリックします。

Specifying subject for certificate request.

WinRM SSL リスナーで使用する場合、共通名を使用する必要があります。リストの他のオプションは含めることができますが、この展開には必要ありません。

6. 拡張 タブをクリックします。

7. もし証明書ベースの認証を使用していない場合(後で説明します)、拡張キー使用ヘッダーを展開し、サーバー認証を追加してください。このキー使用タイプは、証明書がサーバーの認証に使用されるべきであることをWindowsに伝えます。他のオプションには、クライアント認証、コード署名、ドキュメントの暗号化があります。

8. 証明書ベースの認証を設定する場合は、以下のようにクライアント認証を選択してください。

Requesting a client authentication certificate.

9. 次に、プライベートキータブをクリックし、キーオプションに注目してください。キーペアのセキュリティを強化するため、デフォルトのキーサイズを1024から少なくとも2048に変更してください。

Windowsにはより強力な暗号プロバイダもありますが、古いソフトウェアとの互換性の問題が生じる可能性があります。

10. 証明書のプロパティウィンドウを閉じ、設定を保存するためにOKをクリックし、プロンプトの次へをクリックして続行してください。

11. 今、後で取得できるように、証明書リクエストの出力パスを指定し、完了をクリックしてください。

完了すると、証明書リクエストファイルが作成されます。

証明書のリクエスト

リクエストが作成されたら、そのリクエストをCAに提出し、証明書を生成する必要があります。以下の手順で行ってください:

  1. http://<サーバー名FQDN>/certsrv/certrqxt.aspにあるADCSサーバーに移動します。
Certificate request submission web page.

2. メモ帳で作成した証明書要求ファイルを開き、証明書要求ファイルのテキストをリクエストボックスにコピーします。この証明書には追加属性は必要ありません。

3. 送信をクリックします。これにより、リクエストが認証局に送信されます。その後、リクエストIDが表示されるはずです。これは後で必要になりますので、保存してください。

4. 今度は、ローカルコンピューターのWindows証明書マネージャーを使用するか、またはRDP経由でADCS環境の一部であるCAサーバーに接続します。これは、certsrv.mscを実行することで行います。

5. 保留中のリクエストをクリックします。

Winrm over SSL : Issuing certificate from pending request.

6. 保留中のリクエストを右クリックし、すべてのタスクをクリックし、発行をクリックします。これにより、前の手順で送信したリクエストが承認されます。

証明書の登録

CAで証明書を発行したので、WinRMを設定しているサーバーに証明書を登録する時が来ました。次の手順で行います。

  1. WinRM over SSLを設定しているサーバーから、http://<サーバー名のFQDN>/certckpn.aspに移動します。1つの保留中の証明書リクエストが表示されるはずです。
Viewing status of pending certificate request.

必要な場合は、別のマシンから公開証明書を取得することもできますが、WinRM over HTTPSを設定するサーバーから始めるとプロセスが簡素化されます。

2. リストから送信したリクエストを選択し、証明書チェーンをダウンロードします。WinRM over HTTPSを設定しているサーバーがCAとしてルートサーバーを持っている場合は、証明書チェーン全体をダウンロードする必要があります。

Downloading certificate chain.

3. 証明書チェーンファイルを開きます。サーバー用の証明書と、チェーンの上位にある証明書機関の証明書が表示されるはずです。以下のwin2.lab.intは要求された証明書であり、WIN2-CAwin2.lab.intの証明書を発行したCAの証明書です。

Showing certificates inside of the certificate chain.

4. いずれかの証明書をダブルクリックし、開いたボックスで証明書のインストールボタンをクリックします。この証明書はサーバーで使用されるため、特定のユーザーではなくローカルマシンオプションに変更します。

Importing certificate into the local machine certificate store.

5. プロンプトをすべてデフォルトのまま続行します。デフォルトでは、証明書は信頼されたルート証明機関ストアに配置されます。

6. 他の証明書についても、リスト内の各証明書について手順3-5を繰り返します。複数の証明書がある場合は、すべての他の証明書を中間証明機関ストアに配置するようにしてください。

WinRM HTTPSリスナーの作成と設定

すべての証明書がインストールされたので、サーバー上のWinRMをその証明書をリスナーに使用するように設定する時がきました。

WinRMサーバーでPowerShellを開いてください。

  1. 以下のコマンドを実行して、WinRmリスナーを自動的に設定します。 winrmコマンドは、WinRMの要件に一致する証明書をローカルマシンの証明書ストアから検索してこれを行います。
winrm quickconfig -transport:https

2. デフォルトでWindowsファイアウォールはWinRMのHTTPSポート 5986 をブロックします。ファイアウォールが入力ポート 5986 を許可するようにするには、次のPowerShellコマンドを実行してください:

$FirewallParam = @{
     DisplayName = 'Windows Remote Management (HTTPS-In)'
     Direction = 'Inbound'
     LocalPort = 5986
     Protocol = 'TCP'
     Action = 'Allow'
     Program = 'System'
 }
 New-NetFirewallRule @FirewallParam

WinRM SSL接続のテスト

この時点で、接続の準備が整いました。お気に入りのPSRemotingコマンドレット(Invoke-CommandEnter-PSSessionなど)を使用してサーバーに接続し、UseSSLパラメータを使用します。

Enter-PSSession -ComputerName ServerB.domain.com -UseSSL -Credential (Get-Credential)

ComputerNameパラメータの値が証明書作成時に指定した共通名と正確に一致することを常に確認してください。異なるホスト名またはホストのIPアドレスに接続しようとすると、証明書の不一致エラーが発生して接続に失敗します。

Certificate-Based Authenticationの設定

すでにHTTPSを使用するWinRMリスナーが設定されているはずです。その場合、ユーザー認証証明書を使用してリモートサーバー上のローカルユーザーとして認証することもできます。ユーザー証明書を使用すると、非常に安全ですが、設定には時間がかかります。また、各証明書は個々のクライアントマシンに固有ですので、繰り返し作業も多くなります。

Certificate-Based authenticationはローカルユーザーアカウントのみで動作し、ドメインユーザーアカウントでは動作しません。

証明書リクエストの作成セクションでカバーされているように、クライアント認証のための証明書を要求したと仮定して、次の手順を実行します:

証明書認証の有効化とユーザーのサーバーへのマッピング

  1. サーバー上で、Set-Itemコマンドを実行して、証明書ベースの認証を許可します。
Set-Item WSMan:\localhost\Service\Auth\Certificate -Value $true

次に、Get-ChildItemを実行して、信頼されたルート認証機関ストアを参照し、クライアント認証証明書を発行したCAのサムプリントを見つけます。これには、CAの名前が含まれるサブジェクトによって証明書をフィルタリングします。

Get-ChildItem Cert:\LocalMachine\Root | Where-Object {$_.Subject -like 'CA-Name'}

3.次のコマンドを実行します。ここで、SubjectNameは証明書作成時に提供したユーザー証明書のサブジェクトです。

CAThumbprintは前のコマンドで取得したCAのサムプリントです。入力を求められる資格情報は、証明書ベースの認証に使用されるローカルユーザーのユーザー名とパスワードです。

New-Item WSMan:\localhost\ClientCertificate -Subject SubjectName -URI * -Issuer CAThumbprint -Credential (Get-Credential)

証明書ベースの認証のテスト

証明書とユーザーのマッピングが設定されたので、資格情報を提供せずにクライアントマシン上の証明書を使用して認証を行います。

PowerShellで、クライアント証明書のサムプリントを個人証明書ストアから取得します。

Get-ChildItem Cert:\CurrentUser\My

次に、以下のようにCertificateThumbprintパラメータにサムプリントを指定して、PSRemotingコマンドを実行します。

Enter-PSSession -ComputerName ServerName -CertificateThumbprint <Thumbprint>

証明書ベースの認証はHTTPSリスナーでのみ使用可能なため、-UseSSLは暗黙的に適用されます。他の認証方法ではSSLを使用する必要がある場合は、明示的に指定する必要があります。

次の手順

WinRM over SSLの設定方法を学んだので、当社のPowerShell Remoting: The Ultimate Guideの記事でPSRemotingについてさらに詳しく学びましょう!

一般的なPowerShellについて、特にPSRemotingについてさらに学びたい場合は、PowerShell for Sysadmins, the bookをチェックしてください!

Source:
https://adamtheautomator.com/winrm-ssl/