【完全解説】PowerShellのSet-AuthenticodeSignatureとは?スクリプトに署名してセキュリティを強化しよう!

Windows

「このスクリプトは信頼できるものなのか?」
「企業環境でPowerShellスクリプトを安全に使いたいけど、セキュリティポリシーで実行できない…」

そんな場面で重要になるのが「スクリプト署名(コード署名)」です。

PowerShellでは Set-AuthenticodeSignature コマンドレットを使って、.ps1 スクリプトに電子署名を追加することが可能です。

この記事では、Set-AuthenticodeSignatureの基本的な使い方から、証明書の準備方法、企業環境での運用方法までを初心者にもわかりやすく解説します。

スポンサーリンク

Set-AuthenticodeSignatureとは?

Set-AuthenticodeSignatureは、PowerShellスクリプトにコード署名(デジタル署名)を付与するためのコマンドレットです。

署名されたスクリプトは「信頼できる発行者からのもの」として扱われ、厳しい実行ポリシー(例:AllSigned)でも実行可能になります。

なぜスクリプトに署名する必要があるのか?

署名の主な目的はセキュリティ強化と改ざん防止です。

スクリプト署名のメリット:

  • 組織ポリシーで AllSigned を有効にしてもスクリプトが実行可能
  • スクリプトの改ざん検出が可能(署名無効化)
  • エンドユーザーに「信頼されたスクリプト」として提示可能

特に企業ネットワークでは、署名なしスクリプトはブロックされる場合があるため、署名は実質必須です。

署名に使う証明書の準備方法

方法①:自己署名証明書を使う(開発・テスト向け)

New-SelfSignedCertificate `
  -DnsName "powershell.local" `
  -CertStoreLocation "Cert:\CurrentUser\My" `
  -Type CodeSigningCert `
  -Subject "PowerShell Code Signing"

上記で作成された証明書は、自分のマシン上で署名に使用可能です。

方法②:社内CAや商用CAで取得する(本番向け)

Active Directory Certificate Services(AD CS)や、DigiCert などの認証局からコード署名用証明書を発行してもらいましょう。

自己署名証明書を信頼ストアに追加する方法

作成した自己署名証明書を信頼されたルート証明機関に移動する例:

# 証明書を取得
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert | Where-Object {$_.Subject -like "*PowerShell Code Signing*"}

# 信頼されたルート証明機関ストアにコピー(開発環境のみ)
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("Root", "CurrentUser")
$store.Open("ReadWrite")
$store.Add($cert)
$store.Close()

基本的な使い方とサンプルコード

証明書を取得(最初の1つを使用):

$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1

スクリプトに署名を付ける:

Set-AuthenticodeSignature -FilePath "C:\Scripts\myscript.ps1" -Certificate $cert

タイムスタンプを付与する場合(推奨):

Set-AuthenticodeSignature -FilePath "C:\Scripts\myscript.ps1" -Certificate $cert -TimestampServer "http://timestamp.digicert.com"

実行後、スクリプトの末尾にデジタル署名が付与されます。

タイムスタンプを使用すると、証明書の有効期限が切れた後もスクリプトを実行できます。

署名後のスクリプト検証方法(Get-AuthenticodeSignature)

署名の有効性を確認するには以下を使用します:

Get-AuthenticodeSignature -FilePath "C:\Scripts\myscript.ps1"

myscript.ps1は自身のスクリプト。

出力例:

Status              : Valid
SignerCertificate   : [証明書情報]
TimeStamperCertificate : [タイムスタンプ情報]
IsOSBinary          : False

Status: Valid なら、スクリプトの改ざんはなく、署名が有効です。

署名ステータスには以下の種類があります:

  • Valid – 署名は有効
  • HashMismatch – ハッシュ不一致
  • NotSigned – 署名がない
  • UnknownError – 検証中にエラーが発生

よくあるエラーと対処法

エラー原因・対策
No signature certificate was foundコード署名用証明書がインストールされていないか、PowerShellから検出できていない。-CodeSigningCert付きで確認を。
The signature is not validスクリプトが署名後に変更された可能性。再署名が必要。
Set-AuthenticodeSignature : Access deniedスクリプトファイルの書き込み権限がない。管理者権限またはファイルのプロパティを確認。
Failed to open the target pathパスが間違っているか、ファイルにアクセスできない。パスの正確性とアクセス権を確認。

実行ポリシーの設定方法:

# 署名されたスクリプトのみ実行可能にする
Set-ExecutionPolicy AllSigned -Scope CurrentUser

# リモートスクリプトのみ署名が必要(ローカルは不要)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

まとめ:スクリプト署名でPowerShellの安全性を向上しよう

Set-AuthenticodeSignatureを使えば、PowerShellスクリプトに信頼性とセキュリティを追加することができます。

特に企業環境では、スクリプト署名が必須条件となるケースも多く、「実行できないスクリプト問題」への根本的な対策にもなります。

ポイントまとめ

  • Set-AuthenticodeSignatureはスクリプトにデジタル署名を付与するコマンド
  • 自己署名証明書や企業CA発行の証明書を使用
  • タイムスタンプを付与すると証明書期限後も有効
  • Get-AuthenticodeSignatureで検証可能
  • 改ざん検出・信頼性向上・企業対応に最適!

スクリプト署名は、PowerShellを企業環境で安全に使うための重要なステップです。
自動化スクリプトやツール配布の際にも、署名を付けることで信頼性と安全性が大幅に向上します。

コメント

タイトルとURLをコピーしました