Windows

PowerShellの実行ログを取得する方法について。最低限やっておいた方が良いこと。

はじめに

くどうです。

今回は、PowerShellで実行されたコマンドのロギングの方法を解説します。

昨今のマルウェアは、Windowsを対象にしたものがほとんどです。
更にはPowerShellを利用するマルウェアも増えてきています。

PowerShell マルウェアが急増。シマンテックの解析で、95.4% が悪質なスクリプトと判明。
http://d.hatena.ne.jp/ripjyr/20161210/1481338727

また、企業内でもWindowsサーバーを利用するケースが増えています。
これまではLinuxでsyslogを利用し実行されたコマンドをログ取得し、集中管理するなどロギングは当たり前のように行われてきました。
しかし現在、主流となっているPowerShell 4.0ではロギングできません。
そのため、マルウェアはログの残らないPowershellを標的にしているのかもしれません。

主なロギング出来ない旧バージョンPowerShellのOS

・Windows Server 2012 R2
・Windows Server 2012
・Windows 2008 R2 SP1
・Windows 8.1
・Windows 7 SP1
・Windows 10 Version 1511以前

詳しい各バージョンのマトリクスは下記を参照してください。
https://msdn.microsoft.com/ja-jp/powershell/wmf/readme

2016/2/24にリリースされたPowerShell 5.0よりロギングの機能が実装されています。
そこで、最新版 PowerShell 5.1を参考にロギングの方法を解説していきます。
古いバージョンの場合はアップデートが必要です。

追記:PowerShell4.0でも下記のパッチをあてることでログ機能を拡張できます(by @stknohg)
8.1/2012 R2 → KB3000850
2012 → KB3119938
7/2008 R2 SP1 → KB3109118

ログの種類

PowerShell 5.1では取得できるログのは3種類あります。

・モジュールログ
・PowerShellスクリプトブロックのログ記録
・PowerShellトランスクリプション

各ログの取得方法とログの内容を解説していきます。

モジュールログ

モジュールログの取得を設定する場合、グループポリシーの設定をする必要があります。
グループポリシー [ユーザーの構成>管理用テンプレート>Windows PowerShell]を開きます。

「モジュールログを有効にする」を開き「有効」に変更します。

ポリシーの解説にはLogPipelineExecutionDetailsが変更されることが記載されています。

左ペインのモジュール名[表示]をクリックし下記を入力します。

Microsoft.PowerShell.*
Microsoft.WSMan.Management

以上で設定は完了です。
コマンドプロンプトなどでgpupdateを実行しポリシーを反映させます。

確認としてGet-Commandを引数に-Module Azure実行しAzureのコマンドを表示します。

記録されたログを確認します。
イベントログを開きます。
ログは[アプリケーションとサービスログ > Microsoft > Windows > PowerShell >Operational]に記録されます。

ログの詳細には Get-Commandが実行され パラメーター Moduleに値 Azureが入力され実行されていることが記載されています。

また、[Get-ChildItem]を実行した場合などは、Out-Defaultの値としてログに記載されます。

以上のように実行されたコマンドと一部の出力などイベントログ形式で取得が可能となります。
最低限、このポリシーを有効にすることをオススメします。

PowerShellスクリプトブロックのログ記録

モジュールのロギングと同様にグループポリシー [ユーザーの構成>管理用テンプレート>Windows PowerShell]を開きます。
「PowerShell スクリプト ブロックのログ記録を有効にする」を開き「有効」変更します。

[Get-Command -Module Azure]を実行すると、実行したコマンドと、コマンドが実行されたときに利用されたスクリプトなどがすべて記載されます。
イベントログを確認します。

コマンド記録

更に、コマンドのモジュールが記載されます(一部)。

以上のようにログの取得ができます。
ただし、実行結果(標準出力など)を記録することができません。

PowerShellトランスクリプション

これまで、PowerShell4.0 ではTranscript の機能は利用できました。

上記のコマンドで実行ログの出力ができます。
ですが、ご丁寧にコマンドを実行するマルウェアは存在しません(きっと)。

そこで、PowerShell5.0以降ではグループポリシーで設定するころで解決します。
グループポリシー [ユーザーの構成>管理用テンプレート>Windows PowerShell]を開きます。
「PowerShell トランスクリプションを有効にする」を開き「有効」変更します。
また、出力先を入力します。

解説にも記載されているがイベントログではなく、テキストへの出力となります。

出力されるログは「PowerShell_transcript.マシン名.ランダム英数字.20170124132441」の形式で保存されます。

ログには実行された内容がそのまま記載されます。

以上のようにテキストで出力されます。
ただし、プロセス(?)ごとにファイルが分かれてしまいます。
テキストなので加工、一括管理し易いかと思います。

まとめ

PowerShellのロギングについて3つ解説しました。3つとも有効にしてログを取得するのがベストだと思います。
最低限でも「モジュールログの取得」を行うことで、監査ログを取得し、いざというときに備えましょう。皆さんLinuxではやってるので、Windowsでも行いましょう。

また、Operations Management Suiteなどでイベントログを一括収集することでログ運用が楽になるかと思います。 Linuxに対応できるのでOS関係なく一括管理できるので利用してみてはいかがでしょうか。

ではでは

Related post

  1. Azure

    WindowsコンテナでWebサーバー!IISだって動きます!

    はじめにくどうです。前回のコンテナの基本的な扱いの続きです。今回は…

  2. Windows

    SQLServerで必要なポートをあける。コピペでどーん。

    はじめにくどうです。メモです。コピペ…

  3. Azure

    クラウド間のファイル共有はSMBで暗号化しよう。

    はじめにくどうです。最近は、クラウド間でファイル共有を行う…

  4. Windows

    WindowsでPowershellだけでSyslogを受信してみる。

    はじめに検証とかするときSyslog受信するのに使うので。fl…

  5. Linux

    一定回数のログイン失敗でロックしちゃうぜ!

    メモくどうです一定回数ログイン失敗でロックさせたい場合…

  6. Azure

    リソースのLockは大事です。ポータルからも設定できます。

    はじめにくどうです。以前、リソースのロックの話を書きました…

Comment

  1. No comments yet.

  1. No trackbacks yet.

  1. 未分類

    テーマを変更
  2. Azure

    Application Gateway web application fire…
  3. 未分類

    ウェブ人間論 梅田望夫、平野啓一郎
  4. Azure

    Azureのリソースをもっとライトに管理運用しよう。
  5. Azure

    Azure上のActive Directoryをディレクトリサービス復元モード(…
PAGE TOP