Adam The Automator

PowerShell Remoting(PSRemoting)でリモートコマンドを実行している場合は、この機能がどれほど便利かを知っています。 あなたは、一つ以上のリモートコンピュータに接続し、彼らはローカルだったようにそれらを管理することができますしています。 PSRemotingはそれを実現するためにWindowsリモート管理(WinRm)に依存しており、SSL経由でWinRMを使用していない場合は、セキュリティ上の問題に直面している可能性があこの実践的なチュートリアルでは、WinRM over HTTPS(SSL)を使用するようにクライアントとサーバー上でWindowsを設定する方法と、WinRM over HTTPSを使用するときに証明書を使用して認証する方法を学習します。

目次

前提条件

このチュートリアルのチュートリアルを実行する場合は、次のことを確認してください:

  • クライアントマシンとして機能するWindows7+またはServer2008r2マシン。 このチュートリアルでは、Windows10を使用します。サーバーマシンとして機能するWindows7+またはServer2008R2+マシン。 このチュートリアルでは、Windows Server2019を使用します。
  • クライアントマシンとサーバーマシンの両方でローカル管理者アカウントまたはローカル管理者権限を持つアカウントへのアクセス。
  • Active Directory証明書サービス(ADC)公開キー基盤(PKI)がセットアップされています。 本番実装用にADCを実装した場合に役立ちますが、このチュートリアルとテストではオプションです。 このチュートリアルでは、pkiがエンタープライズCAまたはスタンドアロンCAとして設定されていることを前提とします。

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

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

PSRemotingが既にセッション通信を暗号化している場合、なぜADCのようなものを設定し、すでに暗号化されているときに証明書を管理する手間を経るのですか?

認証プロセス中に、使用される認証タイプに応じて、資格情報が安全でない形式で送信される可能性があるためです。

PSRemotingをより安全にする最も簡単な方法の1つは、HttpではなくHTTPS経由でWinRMを使用することです。 HTTPSは、WinRMがすでに使用している暗号化の層内の認証を含む、接続ストリーム全体を包み込みます。 HTTPSは、接続しているサーバーがあなたが考えているものであることを検証する方法も同時に提供します。

自己署名証明書を使用したWinRMの設定

それでは、デモに飛び込みましょう。 最初のトリックでは、自己署名証明書を介してSsl経由でWinRmとの暗号化PSRemoting通信を設定する方法を学びます。

自己署名証明書を使用することは、ADCのようなPKIを気にせずにテスト環境を設定するのに最適な方法です。 自己署名証明書を使用すると、サーバー自体が署名し、基本的にそれ自体を保証する証明書が生成されます。

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

自己署名証明書を使用してWINRM over SSLを構成するには、四つの高レベルの手順が必要です:

  1. 宛先マシン上で自己署名証明書を作成する。
  2. 認証に自己署名証明書を使用するようにサーバーのWinRM webサーバー(リスナー)を構成します。
  3. 移行先マシンのWindowsファイアウォール上の適切なポートを開きます。
  4. Enter-PSSessionのようなPowerShellコマンドレットを使用して、クライアント上でリモート接続を開始するコマンドを実行します。

それぞれのステップを見てみましょう。

自己署名証明書の作成

最初のステップは、サーバー上で自己署名証明書を生成することです。 接続時に、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'
自己署名証明書の作成。
自己署名証明書を作成します。

Subjectパラメーターは、サーバーの完全修飾ドメイン名である必要があります。 WinRmは、サブジェクトを使用してサーバーのidを検証します。

サーバーがワークグループ内にある場合でも、常にドメイン名を指定します。domain.com または実験室。ローカル。 接続先のマシンに接続する場合、接続先のDNS名はこのサブジェクト名と正確に一致する必要があり、接続は失敗します。

TextExtensionを使用すると、証明書のキーの使用法(2.5.29.37)を定義できます。 サーバー認証({text}1.3.6.1.5.5.7.3.1)のキー使用法を定義して、証明書をサーバーのidの認証にのみ使用できるようにします。

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>"}'
自己署名証明書を使用したWinRMリスナーの作成。
自己署名証明書を使用してWinRMリスナーを作成します。

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

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

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

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

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

これで、SSL経由でWinRM接続を受け入れるようにリモートWindowsサーバーを構成しました。 この時点で、クライアントに戻って、テストしたいPSRemotingコマンドを開始します。 たとえば、Enter-PSSessionまたはInvoke-Command コマンドレットを試すことができます。 今だけ、あなたはデフォルトのHTTP接続とは少し異なる接続します。

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

テストのために、自己署名証明書サブジェクトによって定義されたサーバーのFQDNを提供するEnter-PSSession、ユーザー名とパスワードを定義するPSCredentialオブジェクト、最後にUseSSLスイッ

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

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

自己署名証明書を使用した認証局の信頼チェックに失敗しました。
自己署名証明書を使用した認証局の信頼チェックに失敗しました。

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

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

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

もう一度接続しようとすると、PowerShellが資格情報の入力を求めるプロンプトが表示されます。 提供されたら、SSL経由でWinRMを使用してサーバーに接続する必要があります。

CA署名付き証明書を使用したWinRMの構成

実稼働環境でWinRMを使用してPSRemotingを使用し、できるだけ安全な状態を維持する場合は、認証局(CA)署名付き証明書を使用してWINRM over SSLに焦点を当てる必要があります。

CA署名証明書は信頼チェーンを維持し、証明書発行者のidを検証するため、単純な自己署名証明書よりも安全です。Active Directory環境を使用している場合、CAを設定する最も一般的な方法の1つはADCを使用することです。 ADCを使用すると、証明書をデバイスに展開し、それらの証明書を使用するようにWinRMを構成できます。

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

クイックセットアップについては、Microsoftのドキュメントに従うことができますが、本番展開の場合は、認証局が組織の暗号化作業の中心にあるため、構

証明書要求の作成

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

このセクションの手順は、エンタープライズCAまたはスタンドアロンCAの場合、ADC展開で機能します。 AD統合エンタープライズCAを使用している場合は、証明書の自動登録または証明書テンプレートを使用して、このセクションの手順を実行せずに証明書

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

  1. certlmを実行します。mscは、Windows証明書マネージャを開きます。

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

3. このチュートリアルでは、以下に示す証明書情報ページに到達するまで、すべてのフィールドをデフォルトのままにしておきます。 ここに来たら、詳細ドロップダウンをクリックし、プロパティを選択します。

カスタム証明書要求の作成。
カスタム証明書要求を作成します。

4. [件名]タブをクリックし、タイプを[共通名]に変更します。

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

証明書要求の件名を指定します。
証明書要求の件名を指定します。

WinRM SSLリスナーで使用するには、共通名を使用する必要があることに注意してください。 リスト内の他のオプションを含めることができますが、この展開には必須ではありません。

6. [拡張機能]タブをクリックします。

7. 後で説明する証明書ベースの認証を使用していない場合は、拡張キー使用法ヘッダーを展開し、サーバー認証を追加します。 このキー使用法の種類は、サーバーの認証に証明書を使用する必要があることをWindowsに指示します。 その他のオプションには、クライアント認証、コード署名、および文書の暗号化が含まれます。

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

クライアント認証証明書の要求。
クライアント認証証明書を要求します。

9. 次に、[秘密鍵]タブをクリックして、キーのオプションを確認します。 キーペアのセキュリティを強化するには、デフォルトのキーサイズを1024から少なくとも2048に変更します。

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

10. [証明書のプロパティ]ウィンドウを閉じ、[OK]をクリックして設定を保存し、[次へ]をクリックしてプロンプトを続行します。

11. ここで、後で取得できる証明書要求を出力するパスを指定し、[完了]をクリックします。

完了したら、証明書要求ファイルが必要です。

証明書を要求する

要求を作成したら、その要求をCAに送信する必要があります。 それを行うには:

  1. http://<servername FQDN>/certsrv/certrqxtでADCサーバーに移動します。asp.
証明書要求の提出webページ。
証明書要求提出webページ。

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

3. [送信]をクリックします。 これにより、CAに要求が送信されます。 その後、要求IDが表示されますが、これは後で必要になります。 これを救え! 後で必要になります。

4. 次に、ローカルコンピュータ上のWindows証明書マネージャを使用するか、certsrvを実行してRDPを介して、ADC環境の一部であるCAサーバに接続します。msc…

5. [保留中の要求]をクリックします。

保留中の要求から証明書を発行します。
保留中の要求から証明書を発行します。

6. 保留中の要求を右クリックし、[すべてのタスク]をクリックし、[課題]をクリックします。 これにより、前の手順の要求IDに基づいて送信した要求が承認されます。

証明書の登録

CAで証明書を発行したので、WinRMを構成しているサーバーに証明書を登録します。 それを行うには:Ssl経由でWinRMを設定しているサーバーから、http://<server名前FQDN>/certckpnに移動します。asp. 単一の保留中の証明書要求が表示されるはずです。

保留中の証明書要求のステータスの表示。
保留中の証明書要求のステータスを表示します。

必要に応じて、別のマシンから公開証明書を取得できますが、HTTPS経由のWinRM用に設定しているサーバーから起動すると、プロセスが簡素化されます。

2. リストから送信した要求を選択し、証明書チェーンをダウンロードします。 HTTPS経由でWinRMを構成しているサーバーにCAがルートサーバーとしてある場合は、証明書チェーン全体をダウンロードする必要があります。

証明書チェーンのダウンロード。
証明書チェーンをダウンロードします。

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

証明書チェーン内の証明書を表示します。
証明書チェーン内の証明書を示します。

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

ローカルマシンの証明書ストアへの証明書のインポート。
ローカルマシンの証明書ストアに証明書をインポートします。

5. すべてをデフォルトのままにして、プロンプトを続行します。 既定では、信頼されたルート証明書ストアに証明書を配置する必要があります。

6. 次に、リスト内の他の証明書ごとに手順3-5を繰り返します。 複数の証明書がある場合は、他のすべての証明書が中間認証局ストアに配置されていることを確認します。

WinRM HTTPSリスナーを作成して設定します

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

:

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

2. Windowsファイアウォールは、デフォルトで5986のWinRM HTTPSポートをブロックします。 ファイアウォールで受信ポート5986が許可されていることを確認するには、次のPowerShellコマンドを実行します:

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

WinRM SSL接続のテスト

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

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

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

証明書ベースの認証の設定

これまでに、HTTPSを使用するようにWinRMリスナーを設定しておく必要があります。 その場合は、ユーザー認証証明書を使用して、リモートサーバー上のローカルユーザーとして認証することもできます。 ユーザー証明書の使用は最も安全な方法の1つですが、セットアップには時間がかかります。 各証明書は個々のクライアントマシンに固有のものであるため、多くの繰り返し作業が行われていることもわかります。

証明書ベースの認証は、ローカルユーザーアカウントでのみ機能し、ドメインユーザーでは機能しません。

“証明書要求の作成”セクションで説明されているように、クライアント認証の証明書を要求したと仮定して、以下を参照してください。

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

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

2. 次に、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

以下のようにPSRemotingコマンドのCertificateThumbprintパラメータに拇印を指定します。

Enter-PSSession -ComputerName ServerName -CertificateThumbprint <Thumbprint>

SSLを使用するように指定する必要がある他の認証方法とは異なり、証明書ベースの認証はHTTPSリスナー-UseSSLでのみ使用可能であることに注意してください。

SSL経由でWinRMをセットアップする方法を学んだので、PowerShell Remoting:The Ultimate Guide postでPSRemotingの詳細をご覧ください。

Psremotingについての多くを含む、一般的なPowerShellについての詳細を知りたいですか? システム管理者のためのPowerShellをチェックしてください,本!

Leave a Reply