セキュリティと信頼性を確保するために PowerShell スクリプト ファイル (PS1) に署名する方法

PowerShell スクリプトとその署名の扱いは、時に非常に面倒な場合があります。特に、スクリプトの安全性と信頼性を確保しようとしている場合はなおさらです。署名や信頼性に関するエラーに遭遇したことがある場合、それは Windows が適切に署名されていないスクリプトや信頼できないソースからのスクリプトの実行を非常に厳しく制限しているためです。正直なところ、環境によっては署名は簡単なように思えるかもしれません。証明書を取得してスクリプトに署名すれば、あとは何も問題ないのです。しかし、場合によっては、Windows が信頼エラーやポリシー制限などの障害を提示することがあります。これは少々面倒ですが、最初のハードルを乗り越えてしまえば、それほど難しくはありません。このガイドでは、PowerShell スクリプトに適切に署名する方法、証明書を管理する方法、そして Windows がうまく動作しない場合の対処法について解説します。このガイドを最後まで読めば、証明書が正しく設定されている限り、ハードウェアチェックスクリプト(またはその他の必要なスクリプト)を「信頼されていません」というエラーなしで実行できるようになります。もちろん、Windows は必要以上にスクリプトの実行を難しくする必要があるからです。

コード署名証明書を使用して PowerShell スクリプトに署名する方法

方法1: 購入したコード署名証明書または内部コード署名証明書を使用する

これは、外部のCAまたは社内のPKIシステムから証明書を取得している場合に有効です。これらの証明書はデフォルトで信頼されているため、スクリプトに署名することで、Windowsの負担を軽減できます。特にエンタープライズ環境やドメイン環境において、スクリプトが改ざんされていないことを確認するのに役立ちます。スクリプトに署名すると、Windowsは署名が信頼できるソースからのものであると認識します。そのため、保護されたスクリプトにとって署名は非常に重要です。

署名する前に、証明書をローカルストアにインポートする必要があります。これを行うには、管理者としてPowerShellを開き、次のコマンドを実行します。

$pfxPassword = ConvertTo-SecureString "YourPFXPassword" -AsPlainText -Force Import-PfxCertificate -FilePath "C:\Path\To\YourCert.pfx" -CertStoreLocation cert:\LocalMachine\My -Password $pfxPassword

これにより、証明書がWindows証明書ストアにインポートされ、署名できるようになります。この操作を実行すると、すぐに機能することもあれば、機能しないこともあるなど、少々扱いにくいと感じる方もいます。再起動すると改善される場合もありますが、表示されない場合は再インポートしてください。

方法2: テストまたは内部使用のための自己署名証明書を作成する

テスト目的の場合や、証明書を購入したくない場合は、自己署名コードサイニング証明書を簡単に生成できます。PowerShellのNew-SelfSignedCertificateコマンドをご利用ください。魔法のような操作ですが、大まかな手順は以下のとおりです。

$cert = New-SelfSignedCertificate -Subject "CN=MyCodeSigningCert" -Type CodeSigningCert -DnsName $env:COMPUTERNAME -CertStoreLocation "cert:\LocalMachine\My"

これにより、スクリプトに署名できる証明書が作成されますが、他のマシンではデフォルトで信頼されないため、ご注意ください。署名されたスクリプトを実行する各マシンの信頼されたルートストアに証明書を手動で追加する必要があります。これは面倒ですが、隔離されたネットワークやテスト環境では必要な場合があります。

スクリプトに署名する

証明書がストアに届いたら、その拇印で証明書を探し、スクリプトに署名します。

$cert = Get-ChildItem cert:\LocalMachine\My | ? Thumbprint -eq "PUT_THUMBPRINT_HERE" $scriptPath = "C:\Path\To\YourScript.ps1" Set-AuthenticodeSignature -FilePath $scriptPath -Certificate $cert -TimestampServer "http://timestamp.verisign.com/scripts/timstamp.dll"

このコマンドは、スクリプトファイルの末尾に署名を追加します。署名ブロックは、エンコードされたデータの束のように見えます。少し怖い見た目ですが、問題ありません。すべて問題なければ、ステータスは「有効」と表示されます。そうでない場合は、「証明書が適切ではありません」や「信頼されていないルート」などのエラーが表示されます。

ヒント:証明書チェーンが完全に信頼されていないために署名が失敗することがあります。特に自己署名証明書の場合、その傾向が顕著です。ルートCA証明書を信頼されたルート証明書ストアに、発行元CA証明書を信頼された発行元証明certlm.msc書ストアにインポートしてください。証明書を適切なストアにドラッグ&ドロップするだけでインポートできます。比較的簡単ですが、管理者権限が必要です。

PowerShell で署名を受け入れてスクリプトを実行する

実行ポリシーを調整する

PowerShell のデフォルトでは、スクリプトは完全にブロックされます(Restricted)。署名されたスクリプトを実行するには、この制限を少し緩和する必要があります。実行ポリシーをAllSignedに設定し、署名されたスクリプトのみを実行します。以下のコマンドを実行します。

Set-ExecutionPolicy AllSigned -Force

これにより、PowerShellは有効な署名を持つスクリプトのみを実行するようになり、セキュリティ面では非常に効果的です。現在の設定を確認するには、以下を実行してください。

Get-ExecutionPolicy

「Restricted」または「RemoteSigned」と表示されていて、署名済みスクリプトの実行を許可したい場合は、設定を変更することで改善される可能性があります。ただし、一部のセキュリティポリシー(企業グループなど)では、管理者権限またはグループポリシーの変更が必要になる場合があることにご注意ください。

証明書を信頼する

「チェーンは処理されましたが、信頼されていないルート証明書で終了しました」など、信頼されていない証明書に関するエラーが発生した場合は、署名証明書を信頼されたルート証明機関に追加する必要があるかもしれません。これは、特に自己署名証明書を使用している場合は、少し手間がかかりますが、必要な修正です。つまり、 を使用して、ローカルマシンまたはユーザーストアの信頼されたルート証明機関certlm.mscに証明書をインポートすることを意味します。

一元管理したい場合は、グループポリシーを使って証明書を展開するのが良いでしょう。ルートCA証明書をGPOの「信頼されたルート証明機関」に追加するだけです。

スクリプト署名の検証

スクリプトが正しく署名され信頼されているかどうかを再確認するには、次のコマンドを実行します。

Get-AuthenticodeSignature -FilePath "C:\Path\To\YourScript.ps1"

「ステータス」は「有効」と表示されているはずです。 「ハッシュミスマッチ」など、それ以外の値が表示されている場合は、署名後にスクリプトが変更されたか、署名が有効でなくなったことを意味します。その場合は、スクリプトに再署名する必要があります。

注意:スクリプトが署名されていても、ルートCAが信頼されていない場合や証明書チェーンが不完全な場合、Windowsによってブロックされる可能性があります。そのため、エンタープライズ環境では、証明書を手動またはGPO経由で信頼することがしばしば必要になります。

署名されたスクリプトを実行する

設定が完了したら、署名関連のエラーなしでスクリプトを実行できるはずです。ダブルクリックするか、PowerShellから を実行して実行してください>.\HardwareReadiness.ps1。より厳格な実行ポリシー(AllSignedやUnrestrictedなど)を設定している場合は、スクリプトをスムーズに実行するために、ポリシー設定と同期させる必要があることに注意してください。

  • 証明書が有効で信頼できることを確認してください
  • 実行ポリシーを適切に設定する
  • 署名がまだ受け入れられない場合は、証明書を再インポートするか信頼してください
  • 署名後にコードが変更された場合はスクリプトに再署名する

まとめ

  • コード署名証明書をインポートします(CAから、または自己署名)
  • PowerShellを使用してスクリプトに署名するSet-AuthenticodeSignature
  • 実行ポリシーを調整して署名付きスクリプトを許可する
  • 必要な証明書を信頼できるストアにインポートして証明書チェーンを信頼します
  • 署名を検証するGet-AuthenticodeSignature

まとめ

スクリプトに署名と信頼関係を取得するのは、必ずしも簡単ではありませんが、証明書を用意し、Windows が署名をチェックする方法を理解すれば、作業はスムーズになります。特に、セキュリティが重要な自動化スクリプトやエンタープライズ環境では便利です。なぜうまくいくのかは分かりませんが、証明書がすぐに認識されない場合は、PowerShell またはマシン全体を再起動すると改善することがあります。証明書の有効性と信頼チェーンに注意してください。これで、誰かの作業時間を数時間短縮できることを願っています。