[toc]
Windowsイベントログを収集する目的
監査ポリシーを設定することでWindows内で何が起こっているのかを詳細にイベントログに残すことができます。セキュリティの要件としてこのログを監査ログとして収集し、誰にも改ざんされないように保全する仕組みを構築する必要がありました。 監査ポリシーの設定方法は次回の記事で紹介しますが、今回は「ログオン/ログオフ」「誰がどのファイル・フォルダをどういう操作をしているのか」という情報を収集する必要がありました。
WindowsのIISログやアプリケーションログの管理ツールとして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のメリット
前節で述べているかもしれませんが、改めて整理すると下記の通りです。
- インストールが簡単
- 単体の実行ファイルをダウンロードして、(Windowsの場合)サービス登録するだけで動かせる
- 設定がシンプル
- 設定ファイルが1つしかなく、Yaml形式なので設定が簡単
- マルチプラットフォーム
- Multiline(複数行)対応 (Filebeatの場合)
- 収集したいアプリケーションログがバックトレースなど複数行にわたる場合があり、ツールが限定されていたがBeats(Filebeat)では問題ない
今回、Windowsで動作するデータ収集ツールをいくつか調べてみましたが、以下の点でBeatsが勝る点があったため採用を見送りました。
- NXLog ・・・ インストールが簡単だが、設定しづらい。送信先を複数にした場合、同時に同じログを送ってしまう(Active-Standbyかロードバランスしてほしい)、なぜかたまにMultilineのログが欠損する
- Fluentd ・・・ v0.14 からWindowsが公式サポートされたが、WindowsにRubyを入れたくない(インストールが面倒なだけだが・・・)
- Logstash ・・・ Javaを入れたくない(脆弱性が報告される度にアップデートしなければならない)
- fluent-agent-hydra ・・・ Multilineに対応しているか不明
実行環境
- Windows Server
- OS: Windows Server 2012 R2
- Powershell 5.0.10586.117
- Winlogbeat 5.0.0
- Fluentdサーバ(集約用)
- OS: CentOS 7.2
- Fluentd v0.12.56
- fluent-plugin-beats v0.1.1
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
WindowsのFirewallの設定変更
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の監査ログを有効にする方法を紹介したいと思います。