2017/01/14

PowerShell のスクリプトに署名を付与する方法


はじめに

 

PowerShell のスクリプトを作成するのはいいのですが、実際に作成したスクリプトを配布する際に問題になるのが実行環境のスクリプトの実行ポリシーではないかと思います。

例えば、配布先の実行ポリシーが AllSigned の場合はスクリプトに署名がされていないとスクリプトを実行することができません。

逆に、認証局から証明書を取得し署名したならば、スクリプトが信頼に足るもので改ざんされていないことを示すこともできます。

この記事では、以下の内容をご紹介します。

       
  • ローカル認証局を作成
  • 証明書を作成
  • PowerShell スクリプトに署名
  • 実効ポリシーが AllSigned の環境で署名済みスクリプトを実行
  • 配布について注意事項
 

 

ローカル認証局を作成

まずは、ローカル認証局を作成します。なぜローカル認証局を作成するのかというと、自己証明書で署名されたスクリプトを実行ポリシーが AllSigned の環境で実行できないためです。

まず、ローカル認証局を作成するのに必要な Windows SDK を入手します。無料でダウンロードできますが、Visual Studio がインストールされている場合はすでにインストールが済んでいます。

ここでは、Visual Studio 2015 がインストールされている環境をもとに解説いたします。要は、makecert.exe があれば問題ありません。 

まず、スタートメニューから、Visual Studio 2015 >> 開発者コマンドプロンプト for V2015 を管理者モードで起動します。

そうしたら、以下のコマンドで「PowerShell Local Root」というローカル認証局を作成します。なお、makecert.exe の詳細については こちら を参照してください。

> makecert -n "CN=PowerShell Local Root" -a sha256 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine

このコマンドを実行するとパスワードを要求されるので、なにも入力せず「OK」をクリックします。

pic01

 

確認メッセージが表示されるので「はい」をクリックします。

pic02

処理結果は以下のようになります。

Succeeded

処理をやり直す場合は、root.pvk と root.cer の2つのファイルを削除します。コマンドを実行したディレクトリにこのファイルが作成されるそうですが、Windows 10 64 ビットでは C:\Windows\SysWOW64 に作成されました。

 

証明書を作成

以下のコマンドを実行して証明書を作成します。

> makecert -pe -n "CN=PowerShell User" -ss MY -a sha256 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

処理結果は以下のようになります。

Succeeded

 

PowerShell スクリプトに署名

以下のような単純な単純なスクリプトを、test.ps1 として作成します。

Write-Host "Hello!"
pause

そして PowerShell のコマンドプロンプトを起動して、以下のコマンドを実行することで署名を行いいます。

$FilePath = "c:\temp\test.ps1"
$Cn = "PowerShell User"
$Cert = Get-ChildItem Cert:\CurrentUser\My | ? {$_.Subject -eq "CN=$Cn"}
Set-AuthenticodeSignature -Cert $Cert -Filepath $FilePath

実行結果は以下のようになり、Status が Valid なので正しく署名されたことが分かります。なお、最初のローカル認証局作成を行わなければ Status は UnknownError となります。

SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
EC642065C9CD9293286520142829F779C992F0C2  Valid                                  test.ps1

 

なお、署名をした test.ps1 は以下のようになります。一部書き換えているのでこのままでは動作しませんが。

Write-Host "Hello!"
pause

# SIG # Begin signature block # MIIFnQYJKoZIhvcNAQcCoIIFjjCCBYoCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU+NAsRyIgJzXSFp/d9RevE1Oq # mCegggMyMIIDLjCCAhagAwIBAgIQ4GYu0Pa+x6BIFhxRQnrW0TANBgkqhkiG9w0B # AQsFADAgMR4wHAYDVQQDExVQb3dlclNoZWxsIExvY2FsIFJvb3QwHhcNMTcwMTE0 # MDgxNDA3WhcNMzkxMjMxMjM1OTU5WjAaMRgwFgYDVQQDEw9Qb3dlclNoZWxsIFVz # ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvenURTF4cVxHXaZN8 # qskodn0fhs9uJ1IVFMMWD+DlkUAZHhFFYtV8wR/9/HWCVYWWCrVj5dMhnLV0JWZd # QHFSPaTQyyssKAW41OLcdfyTAHhSAVSWSBxAQVGd01S82U4Le2B/F0au2zDP7W0W # M9ivBc+w3UAKaCQZVulChDkNQ308Nc20g0ivsq1otEheYbJZ7GjjXGSiXZyQOlYY # QMaS5ltest9RH7wQMbkCkExbpEEDfuMJqUJVtCjxK9FtaFyt3YMVgBlAVtKyYAnw # ScKVYHbAtTzvLZm01deUF2pJwwTpV2SZ64wApITQPceb8Noxkc+SwwG14CSt0bXZ # GHxBAgMBAAGjajBoMBMGA1UdJQQMMAoGCCsGAQUFBwMDMFEGA1UdAQRKMEiAENr4 # QlRBcsPFeisyQNSXA4GhIjAgMR4wHAYDVQQDExVQb3dlclNoZWxsIExvY2FsIFJv # b3SCEFbsPvyHgsm4QU6MfF1+fYowDQYJKoZIhvcNAQELBQADggEBAIgGVBvpwW3z # lGyJbeoSKYsmEnuPLQIyitx+6JOgUZpc694//canHhyBopePlaEeJeQzyChCA89O # Gso8GM0a7AnyV4P/LMg+GQfZkvsicNTiNhBqSD1J7EAjNyoXrCKFxNAOapBZwzci # v1pEgNicxpAe+yHTk2oXhKcIt6CIZR2+a+M6f3TJIyTbFAzQMVMUwNKMcKj4+IZ/ # jgszm6Au/sKWpDoTGIYjfmOIgtReVsYWcU7TReC/NbTnMEV5/Qoa+JI1nFlPyC+d # M7eHIaesraAW61IB5i+j7sgvW3qyIB1P6/V8xNBvMqTNWpTwRmFsFhJjVfGLj+PK # xeaT/5xpwjQxggHVMIIB0QIBATA0MCAxHjAcBgNVBAMTFVBvd2VyU2hlbGwgTG9j # YWwgUm9vdAIQ4GYu0Pa+x6BIFhxRQnrW0TAJBgUrDgMCGgUAoHgwGAYKKwYBBAGC # NwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUW//dIKxH # rtTS14Q/cHZuuaMC6LEwDQYJKoZIhvcNAQEBBQAEggEAGIleBw5xL0A1VMoxxABf # QpTeQWYo62Jc81oX+uOpnNOW3fulPODVyU2NsELCDZzSK55CYi1lLi93aEim7mB/ # b+VAk9nKBlBthj9CVshlRdgqRW9RyJo//uv9AI7q/MkVZDGChmxdn2OmTjOKZogM # PmuqwV2uuzXZ8Qr7PIckluqRz7x9ujwRvFoPU/+SywG2NDVfxBen//8WbMKdKQfh # ycgPO8uVkveIVj8H1UwkkXqskcbKoQmeMgYSZiCjz5x0g+bUIKTsraHxR0YVJOyS # DaHofZC2m1SzTd7HKaMKXXMQmFI9ncTkFqbj/6OmV0u17cv+GB7f/jgPyo2Vs4i0 # 6Q==
# SIG # End signature block

 

実効ポリシーが AllSigned の環境で署名済みスクリプトを実行

まずは現在の環境の実行ポリシーを PowerShell のコマンドプロンプトをで確認します。なお、プロンプトは管理者として起動しておいてください。

> Get-ExecutionPolicy
Restricted

一番厳しい実行ポリシーになっていますね。外部スクリプトを実行できないようになっています。これを署名がついているスクリプトは実行できるように、以下のコマンドを実行します。

> Set-ExecutionPolicy AllSigned

 

さて準備が整ったので、test.ps1 のスクリプトを実行してみます。

> .\test.ps1

 

すると以下のようなメッセージが表示されるようになりました。

この信頼されていない発行元からのソフトウェアを実行しますか? ファイル C:\temp\test.ps1 の発行元は CN=PowerShell User であり、このシステムで信頼されていません。信頼された発行元からのスクリプトのみを実行してください。 [V] 常に実行しない(V) [D] 実行しない(D) [R] 一度だけ実行する(R) [A] 常に実行する(A) [?] ヘルプ (既定値は "D"):

ここではこの発行元を信頼して常に実行するので、A を選択してスクリプトを実行します。「常に実行する」で信頼すると二回目以降はこのメッセージは表示されなくなります。このスクリプトの実行結果は以下のようになります。

Hello!
続行するには、Enter キーを押してください...:

 

長かったですが、これでようやく PowerShell のスクリプトに署名を付与することができました。

 

配布について注意事項

実際に試してみると分かると思いますが、この署名付きのスクリプトを別のコンピューターで実行するとセキュリティエラーが表示され実行することができません。

これはローカル認証局(いわゆるオレオレ認証局)で証明書を作成しているため、信頼のない認証局の証明書だとセキュリティチェックではじかれているのですよね。

これを解決するには、ローカル認証局の証明書を Internet Explorer からエクスポートして、配布先の Internet Explorer で「信頼されたルート証明機関」にこの証明書をインポートする必要があります。

PowerShell のスクリプトの配布先は、おおよそ企業内に限定されると思われますので、この方法で運用上問題ないと思います。

 

おわりに

PowerShell のスクリプトに署名を行うだけと軽く考えていましたが、調査に意外と時間がかかってしまいました。セキュリティ事項だけあってやることが多いですね。

ですが、これから PowerShell を利用したウィルスが登場することを想定するなら、PowerShell のスクリプトの実行ポリシーはあまり下げたくないところがあります。PowerShell は .NET Framework でできることはなんでもできてしまいますからね。

PowerShell の普及はまだまだこれからでしょうが、セキュリティにも配慮されていますし、高機能なのでどんどん使っていきたいですね。

その時、セキュリティが問題になると思うので、この記事が役に立てば幸いです。

 

参考サイト


スポンサーリンク


このエントリーをはてなブックマークに追加




Twitter ではブログにはない、いろんな情報を発信しています。


コメント

コメントを書く



プロフィール

  • 名前:fnya
    経歴:
    SE としての経験は15年以上。様々な言語と環境で業務系システム開発を行い、セキュリティ対策などもしていました。現在は趣味SE。

    Twitter では、ブログでは取り上げない情報も公開しています。


    ブログについて

    このブログは、IT、スマートフォン、タブレット、システム開発などに関するさまざまな話題を取り上げたり、雑感などをつづっています。


    >>ブログ詳細
    >>自作ツール
    >>運営サイト
    >>Windows 10 まとめ

    Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから