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

    Microsoft Azure でDockerはじめちゃいますか?

    じゅんくどうです。本投稿は「Azure Advent Calende…

  2. Azure

    「バルス!」 Vuls祭り#1に行ってきた。

    しゃべってきたくどうですVuls祭り#1に行ってきました。…

  3. Linux

    WindowsでSLを走らせる。その他も。

    はじめにくどうです。WindowsでBashがつかえるよう…

  4. Azure

    みんな大好き Kali Linux がAzure Marketplaceに追加されました。これで脆弱…

    はじめにくどうです。今回はちょっとセキュリティ方面の話です…

  5. AWS

    パソコン同士をVPNで接続する方法(お気に入りツールの紹介)

    はじめにくどうですパソコン同士をVPNで接続する場合が多く…

  6. Linux

    PowerShell on Bash on Ubuntu on Windows が簡単に出来るように…

    はじめにくどうです。どうやら、PowerShellがapt…

Comment

  1. No comments yet.

  1. No trackbacks yet.

  1. Windows

    Windows Server 2012のパスワードを初期化しよう。
  2. Azure

    Azure AppService (WebApps)で Sendmailを利用す…
  3. Azure

    Azureのシンボルをpngに変換してみた。I converted the sy…
  4. Azure

    同サブスクリプションでVNET間接続を行う。ポータルでも設定できます。
  5. その他

    FaceAPIで初老じゃないことを証明します。
PAGE TOP