PowerShellを使用して複数のサーバーにIISをセットアップする方法

PowerShellを使用して複数のサーバーにIISをセットアップする方法

PowerShellは、Windowsに関連するすべてを管理するための優れたツールです。ただし、インターネットインフォメーションサービス(IIS)を構成するときにかなりの作業を行うこともでき、IISサーバーを一括構成するために使用できるとさらに良くなります。

システムの設計/管理の経験が増えるにつれ、「PowerShellを使用するとこれが簡単になりますか?」と自問する傾向があります。ほとんどの場合、PowerShellをよりよく理解するのに役立つチュートリアルから始まります。複数のサーバー用にさまざまなIISコンポーネントを構成するタスクを考慮すると、手順は論理的な手順に分割できます。論理的な手順は、基本的に、単一のWindowsサーバー上のGUIで完了する必要がある手順です。開始するための簡単な手順のリストを見ていきましょう。オプションで追加して、さらに構成を行うことができます。

  • リモート共有からのPFX証明書のインポート
  • IISでhttpsの新しいバインディングを作成します
  • インポートした証明書をhttpsアンカーに添付します
  • IISマネージャーの[SSLが必要]チェックボックスをオンにします。
  • カスタムログを追加して、ロードバランサーからX-Forwarded-For値を取得します。

これらの手順のほとんどは単純なGUIクリックですが、いくつかのPowerShellコマンドですべてを実行できなかったのはなぜですか?または、さらに良いことに、同じタスクを実行するために複数のリモートサーバーのリストを実行しますか?この投稿で説明する手順のほとんどは、一般的なPowerShell構造に挿入できるコードスニペットです。PowerShellスクリプトのデバッグに固有のカスタムログとアイテムを作成できます。そうでない場合は、それらを簡単にリンクして、IIS構成に必要なことをすばやく実行できます。

事前に設定するいくつかのこと

開始するには、いくつかの変数が必要です。構成するサーバーの作業リストと、PFX証明書ファイルが配置されている使用可能なネットワークフォルダー:

$Servers = Get-Content -Path C:WebServers.txt

$CertFolder = '\FileServer01SharedCerts'

これにより、.txtファイルからサーバーのリストが取得され、インポート証明書が見つかる場所が設定されます。

これを複数のサーバーで実行する場合は、最終的にはオンラインのサーバーで実行していることを確認する必要があります。Test-Connectionコマンドレットの次の使用法は、次に進む前に、各サーバーに少なくとも1回pingを実行して、サーバーがアクティブであることを確認することです。サーバーがオンラインの場合、ロジックは証明書を含むネットワーク共有からリモートサーバーのC:WindowsTempフォルダーにフォルダーをコピーします。このように、証明書をインポートするためのInvoke-Commandコマンドレットは、ネットワーク上の場所からコピーするときにアクセス許可の問題が発生することはありません。

foreach ($Server in $Servers) {

if(Test-Connection -ComputerName $ Server -Quiet -Count 1){

Copy-Item -Path $ CertFolder`

-宛先\\$Server \ C $ \ Windows \ Temp \ CertAssets `

-Recurse -Force

Write-Host「アセットが正常にコピーされました!」

}

そうしないと {

Write-Host「$Serverはオフラインのようです!」

}

…以下に示すコード…

}

これを実行するときは、Write-Host行を使用してコンソールにフィードバックを提供すると便利であることに注意してください。スクリプトをログでラップする場合は、既存のログに追加することもできます。これで、どのサーバーがオンラインで、アセットがローカルにコピーされているかがわかりました。これで、前進する準備が整いました。

証明書をインポートして、新しいバインディングを作成します

このアクションは、各サーバーでローカルにこのアクションを実行するInvoke-Commandコマンドレットを使用して実行されます。実装するセキュリティのレベルに応じて、PFX証明書のインポートに必要なパスワードを使用していくつかのことを実行できます。Get-Credentialを使用してその場で保存することも、インポートに使用するコマンドに埋め込まれたプレーンテキストでパスワードを入力することもできます。ここにパスワードを安全に入力する方法は他にもたくさんありますが、少なくともGet-Credentialでパスワードを保護することをお勧めします。パスワードを収集するには、次を使用できます。

$MyPwd = Get-Credential -UserName 'Enter password below' -Message 'Enter password below'

これにより、スクリプト内にプレーンテキストのパスワードがなくても、証明書のパスワードが保存されます。$ Using:コンポーネントを使用して、このローカル変数をリモートコマンドに渡します。Invoke-Commandとそれに付随するスクリプトブロックは(リモートマシンに対してローカルの)異なるスコープで実行されるため、スクリプトブロックの外部で定義されたローカル変数を認識しません。これにより、ローカル変数をリモートセッションに渡し、それらを適切に使用できます。

証明書を個人(マイ)コンピューターアカウントの証明書ストアにインポートします。

次のコードは、これらの手順を実行します。

  1. リモートサーバーでプロセスを開始する
  2. Get-Credentialステップから提供されたパスワードを使用してアクションをインポートします
  3. ポート443でhttpsバインディングを作成します。
  4. インポートされた証明書をhttpsアンカーに追加する

*これはまだ上記で定義されたforeachループ内にあります:

Invoke-Command -ComputerName $ Server -ScriptBlock {

$ SiteName=”私のWebサイト”

Import-PfxCertificate -Password $ Using:MyPwd.Password`

-CertStoreLocation Cert:\ LocalMachine \ My `

-FilePath C:\ Windows \ Temp \ CertAssets \ MyCert.pfx

インポートモジュールWebAdministration

New-WebBinding -Name $ SiteName -IP “*” -Port 443 -Protocol https

$ SSLCert = Get-ChildItem -Path Cert:\ LocalMachine \ My `

| Where-Object {$ _。Subject.Contains( “CertFriendlyName”)}

$ Binding = Get-WebBinding -Name $ SiteName -Protocol “https”

$ Binding.AddSslCertificate($ SSLCert.GetCertHashString()、 “My”)

Write-Host “セットアップが成功しました:$ env:COMPUTERNAME”

}

独自の設定の一部としてコンソールに強制的に出力する出力に加えて、正常にインポートされた後の証明書のインポートアクションの出力もあります。

混乱を解消するのも良いので、数行追加してファイルフォルダを削除します。マシンにコピーされたpfx。これはforeachループの内側、できれば終わり近くにあります。

Remove-Item -Path "\\$Server\C$\Windows\temp\CertAssets"-Recurse -Force

Write-Host "Cleanup on $Server completed!"

サイトにSSLが必要

この次のコマンドスニペットは、デプロイメントをデプロイするときに使用されます。すぐに必要な場合は、上記のコードの残りの部分に追加するだけで、準備は完了です。特定のサーバーでこれを有効にすることができる段階的なロールアウトがある場合があります。いずれにせよ、あなたはそれを作成します、仕事の本質はこれらの数行にあります:

Import-Module WebAdministration

Set-WebConfiguration -Location “My Web Site” `

-Filter 'system.webserver/security/access' -Value "Ssl"

-Locationパラメーターは、SSLを必要とするIISサイトの名前であることに注意してください。これにより、適切な証明書を使用して、新しいアンカーへのすべての安全な接続が強制されます。GUIでは、これは特定のサイトのIISマネージャーで[SSL設定]アイコンをクリックし、[SSLが必要]チェックボックスをオンにするのと同じです。

IISログオプションの構成

ロードバランサーの背後にあるIISサーバーのフリートを管理している場合は、ロードバランサーが着信接続から収集する情報を利用できます。特定のロードバランサーがX-Forwarded-For値をキャプチャするように構成されているとすると、IISサーバーへのすべての着信接続の着信IPアドレスを取得し、既知のIISログで表示できます。これは、特定のサーバーでエラーを引き起こした可能性のある特定のリソースからの接続追跡の問題をトラブルシューティングする場合に特に役立ちます。

したがって、IISはX-Forwarded-For値を収集しません。IISがそれをキャプチャして登録できるように、カスタム値として構成する必要があります。GUIでこれを設定する方法もありますが、このコマンドを現在のプロビジョニングスクリプトに追加して、最初から適切な場所に配置することができます。

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `

-フィルター”system.applicationHost/ sites / siteDefaults / logFile / customFields” `

-名前”。”`

-Value @{logFieldName='X-Forwarded-For';sourceName='X-Forwarded-For';sourceType='RequestHeader'}

完了したら、IISマネージャーを開き、[マイサーバー]>[ログ]>[ログファイル:フィールドの選択…]をクリックして、このカスタムフィールドがサーバーレベルでIISに追加されたことを確認できます。

これが完了すると、従来のIISログでIISサーバーへの着信接続のIPアドレスを確認できるようになります。

これらは、IISサーバーで構成できる設定のほんの一例です。同じ方法で管理および設定するサーバーが多いほど、クリック数も節約できます。これは常に良いことです。同じサーバーで目的の設定に対してさまざまなコマンドをテストすることをお勧めします。その1つのサーバーのプロセスを作成したら、この投稿で示した構造を使用して、必要な数のサーバーでプロセスを繰り返すことができます。

これは、時間を節約し、環境でより標準化されたIISを展開するのに十分すぎるはずです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です