本日も乙

ただの自己満足な備忘録。

WinlogbeatでWindowsのイベントログをFluentdサーバに転送する

[toc]

Windowsイベントログを収集する目的

監査ポリシーを設定することでWindows内で何が起こっているのかを詳細にイベントログに残すことができます。セキュリティの要件としてこのログを監査ログとして収集し、誰にも改ざんされないように保全する仕組みを構築する必要がありました。 監査ポリシーの設定方法は次回の記事で紹介しますが、今回は「ログオン/ログオフ」「誰がどのファイル・フォルダをどういう操作をしているのか」という情報を収集する必要がありました。

WindowsIISログやアプリケーションログの管理ツールとしてNXLogを今まで使っていましたが、Elasticから出ているデータシッパーツールBeatsの1つである、Winlogbeatを使ってみてとても良かったので紹介したいと思います。

Beatsとは

ここでBeatsとは何かを簡単に説明します。BeatsとはElastic(Elasticsearch, Logstashなどを提供している企業)がリリースしたデータシッパー(収集・加工・転送する)ツールの総称です。Beatsには様々な仲間がいて用途別にツールを使い分けます。例えば、以下に挙げたように、ログファイルを扱うFilebeatや今回紹介するWindowsイベントログを扱うWinlogbeatのようにそれぞれ単機能なツールが揃っています。

  • Packetbeat ・・・ ネットワークデータ(トラフィック、パケット)を収集
  • Topbeat ・・・ OSのメトリクス情報(CPUやメモリなどのリソースなど)を収集
  • Filebeat ・・・ ログファイルを収集。Fluentdのin_tailのようなイメージ
  • Winlogbeat ・・・ Windowsイベントログを収集
  • その他サードパーティ製(nginxbeat, redisbeat, pingbeat, httpbeat etc)

Fluentdみたいにプラグインを組み込んで何でもできるわけではなく、物足りなく感じるかもしれません。しかしBeatsはGo言語で書かれており、1つのバイナリファイルと1つの設定ファイルがあれば動かすことができるためとても身軽です。また、Fluentdなどと比べてリソースをほとんど消費しないため *1 リソースが厳しいサーバでも実行することができます。 Elasticの中では、Beatsはログを収集することに専念させて、加工などの細かい処理はLogstashに任せるようになっているようです。そのため、Beatsは簡単な加工やフィルタリングしかできません。

Beatsのメリット

前節で述べているかもしれませんが、改めて整理すると下記の通りです。

  1. インストールが簡単
    • 単体の実行ファイルをダウンロードして、(Windowsの場合)サービス登録するだけで動かせる
  2. 設定がシンプル
    • 設定ファイルが1つしかなく、Yaml形式なので設定が簡単
  3. マルチプラットフォーム
    • Linuxはもちろん、Windowsも動く
    • Windowsでありがちな文字化けを考えなくてもよい(Winlogbeat)
  4. Multiline(複数行)対応 (Filebeatの場合)
    • 収集したいアプリケーションログがバックトレースなど複数行にわたる場合があり、ツールが限定されていたがBeats(Filebeat)では問題ない

今回、Windowsで動作するデータ収集ツールをいくつか調べてみましたが、以下の点でBeatsが勝る点があったため採用を見送りました。

  • NXLog ・・・ インストールが簡単だが、設定しづらい。送信先を複数にした場合、同時に同じログを送ってしまう(Active-Standbyかロードバランスしてほしい)、なぜかたまにMultilineのログが欠損する
  • Fluentd ・・・ v0.14 からWindowsが公式サポートされたが、WindowsRubyを入れたくない(インストールが面倒なだけだが・・・)
  • Logstash ・・・ Javaを入れたくない(脆弱性が報告される度にアップデートしなければならない)
  • fluent-agent-hydra ・・・ Multilineに対応しているか不明

実行環境

Elastic Stack(Elasticsearch、Logstash、Kibana、Beatsの総称)が最近5.0.0が正式リリースされたので、そちらを使います。

Winlogbeatのインストール・設定

Zipファイルをダウンロードし、解凍します。解凍したらフォルダを設置します。置く場所はどこでも良いのですが、今回はC:\Program Files\Winlogbeatに設置します。

PS> Invoke-WebRequest https://artifacts.elastic.co/downloads/beats/winlogbeat/winlogbeat-5.0.0-windows-x86_64.zip -OutFile C:\winlogbeat-5.0.0-windows-x86_64.zip
PS> Expand-Archive -Path C:\winlogbeat-5.0.0-windows-x86_64.zip -DestinationPath 'C:\Program Files\'
PS> Rename-Item 'C:\Program Files\winlogbeat-5.0.0-windows-x86_64' 'C:\Program Files\Winlogbeat'
PS> Remove-Item C:\winlogbeat-5.0.0-windows-x86_64.zip

次のPowerShellコマンドを実行することでWinlogbeatがサービスとして登録されます。実行完了時点はWinlogbeatは停止状態(Stopped)です。

PS> PowerShell.exe -ExecutionPolicy UnRestricted -File 'C:\Program Files\Winlogbeat\install-service-winlogbeat.ps1'

Status   Name               DisplayName
------   ----               -----------
Stopped  winlogbeat         winlogbeat

設定ファイル(winlogbeat.yml)は以下のようにします。設定内容の詳細はドキュメントを確認してください。 event_idで転送するイベントログIDをフィルタリングできるため、ログオン/ログオフやファイル操作に関するイベントのみフィルタするようにします。 転送先はLogstashではなく、Fluentdサーバになります。Fluentdサーバ側の設定は次節で行います。

winlogbeat:
  registry_file: C:/ProgramData/winlogbeat/.winlogbeat.yml

  event_logs:
    - name: Security
      ignore_older: 1h
      event_id: 4624, 4625, 4634, 4656, 4690, 4660 # logon, logon failure, logoff, file open, file copy, file delete
      level: critical, error, warning, information

output:
  logstash:
    hosts: ["fluent-server:5044"]

    worker: 1
    index: winlogbeat

logging:

  level: warning
  to_files: true

  files:
    path: C:/ProgramData/winlogbeat/Logs
    rotateeverybytes: 10485760 # = 10MB
    keepfiles: 3

WindowsFirewallの設定変更

5044ポートで通信するため、AWSのSecurityGroupでの許可設定はもちろん、Windows内のFirewallも5044ポートで通信できるように設定を変更します。 Firewallの設定はこちらが参考になります。

Windows10 - ファイアウォール - 特定のポート番号の通信を許可 - PC設定のカルマ

Fluentdサーバ側の設定

Beatsから送られてきたデータをFluentdで受け取れるようにします。FluentdのプラグインでBeatsのデータを受信できる fluent-plugin-beats を使います。 Fluentdの設定ファイルは今回は標準出力するだけの簡単なものですが、適宜環境に合わせて変更してください。

$ gem install fluent-plugin-beats --no-ri --no-doc
# /etc/fluent/conf.d/beat.conf
<source>
  type beats
  tag beats.event
</source>

<match beats.*>
  @type stdout
</match>

Winlogbeatの起動&確認

PS> Start-Service –Name winlogbeat

今までのログ(ignore_olderで指定した時間以降)が大量に流れてくるが、しばらくすると収まるかと思います。 成功すると以下のようなログが流れてくれば成功です。 ログがmessageフィールドにそのまま入っているのが確認できます。パースとかできると嬉しいです。

2016-06-22 16:22:50 +0900 beats.event: {"@metadata":{"type":"wineventlog","beat":"winlogbeat"},"@timestamp":"2016-06-22T07:22:50.777Z","computer_name":"ip-xxxxxxxx.LOCALHOST","event_id":8016,"message":"システムは次の設定のネットワーク アダプター用にホスト (A または AAAA) リソース レコード (RR) \nを登録できませんでした:\n\n           アダプター名: {BDEC34FA-9F60-4DBA-854D-6553716ACB70}\n           ホスト名: ip-xxxxxxxx\n           プライマリ ドメイン サフィックス: LOCALHOST\n           DNS サーバー一覧: \n             \t192.0.0.2\n           サーバーへの更新情報の送信: <?>\n           IP アドレス: \n             192.0.2.119\n\nDNS サーバーが更新要求に失敗したため、これらの RR を登録できませんでした。ゾーン転送が進行中であったため、この更新要求を処理するために必要な権限を持つ DNS サーバーがゾーンをロックしていることが原因である可能性があります。\n\nコマンド プロンプトで「ipconfig /registerdns」と入力して、手動でネットワーク アダプターおよびその設定の DNS 登録を再試行できます。問題が継続する場合、DNS サーバーかネットワーク システムの管理者に問い合わせてください。","user":{"domain":"NT AUTHORITY","identifier":"S-1-5-20","name":"NETWORK SERVICE","type":"Well Known Group"},"log_name":"System","source_name":"Microsoft-Windows-DNS-Client","record_number":"191306","level":"警告","type":"wineventlog","count":1,"beat":{"hostname":"ip-xxxxxxxx","name":"ip-xxxxxxxx"}}

2016-06-22 16:22:54 +0900 beats.event: {"@metadata":{"type":"wineventlog","beat":"winlogbeat"},"computer_name":"ip-xxxxxxxx.LOCALHOST","record_number":"191307","level":"情報","count":1,"message":"Application Experience サービスは 停止 状態に移行しました。","beat":{"hostname":"ip-xxxxxxxx","name":"ip-xxxxxxxx"},"source_name":"Service Control Manager","log_name":"System","event_id":7036,"type":"wineventlog","@timestamp":"2016-06-22T07:22:54.214Z"}

最後に

Elastic製のデータシッパーツールである、Beatsの1つWinlogbeatを使って監査ログをFluentdサーバに転送してみました。 実行ファイルをダウンロードし、サービス登録して設定ファイルを1つだけ置いて実行すれば良いのでとても簡単にできます。 次はWindowsの監査ログを有効にする方法を紹介したいと思います。

参考URL

*1:Windows Server2012 R2 c4.4xlargeの環境でWindlogbeatのメモリ使用量が約15MBぐらいでした