連載
» 2015年03月23日 05時00分 UPDATE

Tech TIPS:WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する

PowerShellのスクリプトは、デフォルトでは「このシステムではスクリプトの実行が無効になっているため……」というエラーが表示され、実行されないようになっている。スクリプトを利用するのに必要な「実行ポリシー」の変更手順やその種類について説明する。

[打越浩幸, 島田広道,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象ソフトウェア:PowerShell 2.0 / PowerShell 3.0 / PowerShell 4.0



解説

 PowerShellのスクリプトは「.ps1」という拡張子のファイルに保存することになっている。だが、セキュリティのため、デフォルトでは.ps1のスクリプトファイルの実行は禁止されている。ユーザーや管理者が知らないうちにPowerShellを悪用したウイルスなどがインストールされ、実行されないようにするためだ。

 .ps1ファイルを実行するかどうかは、PowerShellの「実行ポリシー(Execution Policy)」で制御されている。ポリシーには次の5種類がある。Windows Server 2012 R2以外のWindows OSでは、デフォルトで「Restricted」のポリシーが設定されているので、スクリプトは実行できない(関連記事「PowerShellスクリプティングの第一歩」も参照)。

実行ポリシー 署名付き 署名無し/ローカル 署名無し/ローカル 概要
Restricted × × × 全てのスクリプトが実行禁止。PowerShellまたはWindows OSインストール直後のデフォルト設定(Windows Server 2012 R2を除く)
AllSigned × × 署名されているスクリプトのみが実行可能。署名されていないスクリプトは実行禁止
RemoteSigned × ローカルに保存されているスクリプトは実行可能。インターネットからダウンロードしたスクリプト(非ローカルのスクリプト)は、署名されているもののみが実行可能。Windows Server 2012 R2では、この設定がデフォルト
Unrestricted 全てのスクリプトが実行可能。ただしインターネットからダウンロードしたスクリプトは、実行するかどうかが確認されるので、ユーザーが明示的に許可した場合のみ実行される
Bypass 警告やユーザーへの確認なしに、全てのスクリプトが実行可能
PowerShellスクリプトの実行ポリシー
スクリプトには署名付きと署名無し、ローカルスクリプトと非ローカルスクリプトという違いがあり、ポリシーによってそれぞれ実行できるかどうかが決まる。デフォルトでは全てのスクリプトが実行不可能になっており、他のポリシーに変更するまで、実行できない。
:実行可能、:実行時にユーザーの確認が必要、×:実行不可

 この表から分かるように、スクリプトには署名付きと署名無し、ローカルスクリプトと非ローカルスクリプトという種類がある。

●署名付きスクリプトと署名なしスクリプト

 スクリプトには、その正当性を証明/アピールするために、電子署名を付けることができる。この署名には、公的な証明書機関が発行した証明書に基づくデジタル証明書や、(テスト用の)自己発行の証明書が利用できる。証明書が付けられたスクリプトだけに実行を限定することにより、不正なスクリプトによってシステムが破壊されるなどのセキュリティ上のリスクを抑えることができる(必ずしも「署名が付いている=悪意のないスクリプト」が当てはまらないことに注意してほしい)。

●ローカルスクリプトと非ローカルスクリプト

 スクリプトファイルが保存されている場所(もしくはスクリプトファイルを入手した経路)によって、ローカルスクリプトと非ローカルスクリプト(インターネット経由で入手したスクリプト)という2種類に分類できる。

 ローカルのスクリプトとは、ローカルの(物理的な)ディスク上に保存されているスクリプトを指す。例えばC:ドライブ(すなわちローカルなディスク)に保存されている「C:\MyScript\testps.ps1」というファイルはローカルのスクリプトと見なされる。

 ただしネットワークドライブをローカルにマップしている場合、そのドライブもローカルと見なされる。また「\\server1\user1\MyScript\testps.ps1」のように、単一ラベルのコンピュータ名(ドメイン名を持たない、単一のコンピュータ名)から始まるUNCパスのファイルも、ローカルとして扱われる。

 これに対し、インターネットからダウンロードした.ps1ファイルや、FQDNIPアドレスから始まるUNC名を持つファイルは、非ローカルのファイルとして扱われる。例えば「http://www.example.com/MyScript/testps.ps1(から取得したファイル。次の「ZoneIDについて」参照)」や「\\server1.example.com\user1\MyScript\testps.ps1」のようなファイルは、非ローカルと見なされる。

 FQDNやIPアドレス、サーバ名の表記の違いによるローカルと非ローカルの判断は、Internet Explorer(IE)における「インターネットゾーン」と「イントラネットゾーン」の違いと同じである。ゾーンの種類や確認方法については、関連記事「IEのセキュリティ設定を変更してセキュリティ機能を強化する」「IE9でゾーン情報を確認する」を参照していただきたい。

●インターネットから入手されたスクリプトは「ZoneID」で識別される

 インターネットからダウンロードしたスクリプトファイルをローカルのディスク上に保存しても、それは非ローカルのスクリプトと見なされる。これは「ZoneID」という入手元のゾーンを表す情報がスクリプトファイルに付けられているからだ。ZoneIdの詳細は、関連記事「XP SP2のZoneIdとは?」を参照していただきたい。

 このZoneIdが付いているファイルは、ローカルのディスク上にあってもインターネット経由で取得したものとされ、非ローカルスクリプトとしてのセキュリティの制限を受ける。ただし、FATファイルシステムへコピーしたり、ZoneIDを無視するアプリケーションを使ったり、代替ストリーム情報を明示的に削除したりするとZoneIDがファイルから欠落してしまうので、注意が必要である。

操作方法

●スクリプトの実行ポリシーを選択する

 PowerShellでは、スクリプトの署名や種類に応じて、先に挙げた5種類の実行ポリシーを選択できるようになっている。とはいえ、「AllSigned」にすると常に署名が要求されるようになるので、使い勝手はよくないだろう。テスト用のスクリプトや、Webページ上で解説されているようなスクリプトを利用するだけでも、いちいち署名しないと実行できないからだ。

 「Unrestricted」や「Bypass」だとほとんど制限なく実行できるため、セキュリティ上はあまり好ましくない。そのため、「RemoteSigned」(ローカルスクリプトはそのまま実行、非ローカルは署名を要求)を使うのが現実的と思われる。

 現在の実行ポリシーを確認するには、Get-ExecutionPolicyコマンドレットを利用する。

PS C:\MyScript> Get-ExecutionPolicy ……現在のポリシーの取得
Restricted ……結果



 実行ポリシーを設定するには、管理者権限で起動したPowerShellでSet-ExecutionPolicyコマンドレットを実行する。

PS C:\MyScript> Set-ExecutionPolicy RemoteSigned ……ポリシーの設定

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):  ……[Enter]キーだけを押すと設定が変更される
PS C:\MyScript> Get-ExecutionPolicy ……結果の確認
RemoteSigned ……結果



 PowerShellを管理者権限で起動するには、以下のいずれかの手順を実行すればよい。

  • スタートメニューで[Windows PowerShell]アイコンを右クリックして[管理者として実行]を選ぶ
  • タスクバー上のPowerShellアイコンを右クリックして[管理者として実行する]を選ぶ
  • [Shift]+[Ctrl]キーを押しながらタスクバー上のPowerShellアイコンをクリックする

●実行できない場合のエラーメッセージ

 ポリシーによってPowerShellスクリプトの実行が禁止されている場合、次のようなメッセージが表示される。

PS C:\MyScript> .\testps.ps1
.\testps.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\MyScript\testps.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:12
+ .\testps.ps1
+ ~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS C:\MyScript>



 なおセキュリティのため、スクリプトを実行するには、フルパス名か「.\」で始まる相対パス名を指定する必要がある。単に「testsp.ps1」と指定するだけでは実行できないので、注意していただきたい。詳細については「Windows PowerShellコマンド&スクリプティング入門」を参照していただきたい。

 次はデジタル署名が要求されているのに、署名されていないスクリプトを実行しようとした場合の例である。署名がないと、このようにエラーとなり、実行されない。

PS C:\MyScript> .\testps.ps1
.\test.ps1 : ファイル C:\MyScript\testps.ps1 を読み込めません。ファイル C:\MyScript\testps.ps1 はデジタル署名されていません。このスクリプトは現在のシステムでは実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:12
+ .\testps.ps1
+ ~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS C:\MyScript>



 実行ポリシーでUnrestrictedを選択した場合は、インターネット(インターネットゾーン)から入手したファイルかどうかが判断され、そうならば、実行するかどうかを確認する問い合わせが表示される。単に[Enter]キーを押すか、[D]キーを押すと実行が中断され、[R]キーを押した場合にのみ実行される。

PS C:\MyScript> .\internetscript.ps1

セキュリティ警告
信頼するスクリプトのみを実行してください。インターネットから入手したスクリプトは便利ですが、コンピューターに危害を及ぼす可能性があります。このスクリプトを信頼する場合は、この警告メッセージが表示されないように、Unblock-File コマンドレットを使用して、スクリプトの実行を許可してください。C:\MyScript\internetscript.ps1 を実行しますか?
[D] 実行しない(D)  [R] 一度だけ実行する(R)  [S] 中断(S)  [?] ヘルプ (既定値は "D"): ……ここで[Enter]キーだけを押してみる
.\internetscript.ps1 : このソフトウェアを今回は実行しないことを選択したため、ファイル C:\MyScript\internetscript.ps1 を読み込めません。
発生場所 行:1 文字:14
+ .\internetscript.ps1
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS C:\MyScript>



 この例では[Enter]キーを押してみた。すると上記のようなメッセージが表示され、実行が中断された。

 上記のように確認が求められる非ローカルスクリプトは、Unblock-Fileコマンドレットを実行すると、以後はローカルスクリプトとして扱われるようになる。

Unblock-File <スクリプトファイル名>



 なお手元のPCで試したところ、ドライブにマップしたネットワークドライブや単一ラベルのサーバ名を使ったUNCパス上のインターネットゾーンのスクリプトファイルの場合、このような問い合わせ無しに、すぐに実行されることがあった(物理的なローカルHDD上のインターネットゾーンファイルや、FQDNによるUNCパスの場合は上の例のように動作する)。ゾーンの自動判定の機能をあまり信用してはいけないのかもしれない。

■関連記事(Windows Server Insider)

■関連リンク


■更新履歴

【2015/03/23】PowerShell 2.0〜4.0の情報を反映しました。

【2008/05/16】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2016 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

Touch Barという新UIを得た「MacBook Pro」、プレゼント!

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。