こんにちは。技術1課の高橋です。
先日ジョン・ブルックフィールドの「握力王」という本を買いました。握力を高めるには地道なトレーニングが不可欠のようです。
さて今回、CloudWatch Logs,Amazon Elaticsearch ServiceおよびKibanaで、 Windowsのイベントログを可視化する方法をご紹介します。
このシステムを利用することで、文字だけでは分かりにくいWindowsのイベントログを、特定のイベントがいつ何時、どれだけ発生したかを簡単にグラフに出力して確認することができます。
システム構成図
本システムの構成図は上記の通りです。
EC2インスタンス(Windows)内のCloudWatch Logs Agentから、イベントログをCloudWatchに送信します。
CloudWatchにアップロードされたログはLambdaによりAmazon Elasticsearch(以下、ES)にストリーミングで送られます。
ESに送られたログは内部で分析され、Kibanaによりグラフとして可視化することができます。
CloudWatch Logsとは?
CloudWatch Logs(以下、CW Logs)とは、EC2インスタンス内のログをリアルタイムにモニタリングすることができるサービスです。
EC2インスタンス内にAgent入れ有効化することで、ログデータをCloudWatch内にアップロードすることができ、ESやその他AWSのサービスと組み合わせることで、ログに特定の文字が含まれている場合にアラートの発令や、ジョブの実行を行うことが可能です。
またログのアーカイブも可能です。AWSではAutoScaleのスケール時や、ログの解析、アーカイブ、およびログを利用したアラート発行・ジョブ実行のため、ログをサーバ外部に保存することを推奨しています。CW Logsでは簡単にログをアップロードすることができ、最大無期限までログを保存することができるのです!
それでは今回、Windowsのセキュリティイベントログを可視化する手順をご紹介します。
OSは Windows Server 2012 R2を想定しています。
IAM Roleの割り当て
CloudWatch Logsでログを収集したいインスタンスに、IAMロールをアタッチします。
IAMロールの権限は、 公式ドキュメントに記載されているものと同じでいいでしょう。
{ "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/QuickStartEC2Instance.html
(IAMロールを付与していないインスタンスについては後述します)
CloudWatch Logs Agentの有効化
スタート画面よりEC2ConfigService Settings を選択します。
次に Ec2 Service Properties の CloudWatch Logs の項目にチェックを入れます。
設定ファイルの編集
%PROGRAMFILES%AmazonEc2ConfigServiceSettingsAWS.EC2.Windows.CloudWatch.json 内の
"Id": "SecurityEventLog"のParameters - Levels を7に、Flow対象に SecurityEventLog を追加します。
{ "Id": "SecurityEventLog", "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch", "Parameters": { "LogName": "Security", "Levels": "7" } },
"Flows": { "Flows": [ "SecurityEventLog,CloudWatchLogs" ] }
次にCloudWatch Logsの使用リージョン、LogGroup、LogStreamを入力します。
IAMロールのアタッチを忘れた場合は、IAMユーザのアクセスキーを入力してください。
(IAMロールがアタッチされている場合、アクセスキーの入力は不要です)
{ "Id": "CloudWatchLogs", "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch", "Parameters": { "AccessKey": "", "SecretKey": "", "Region": "ap-northeast-1", "LogGroup": "SYSTEM-WorkSpaces-Default-Log-Group", "LogStream": "{instance_id}" } },
サービスの起動
「サービス」- 「Ec2Config」にて、サービスの起動を行います。
結果
CloudWatchの画面の、LogGroup、LogStreamのメニューより、ログが表示されます。
CloudWatch LogsからElasticSearchへのストリーミング
ストリーミング対象の Log Groupsを選択し、[アクション]から[Stream to Amazon Elasticsearch Service]を選択します。
次にストリーミング先のAmazon ES clusterを選択します。
ストリーミングのためLambda functionの作成を促されます。一度作成すればそちらのfunctionを何度も再利用する形となります。
その後 [Configure Log Format and Filters]のメニューにて、
[Subscription Filter Pattern]に [type, id, auditing, hostname, object] を記入し、フィルタリングをかけます。
[Next]で進み、最後に [Start Streaming] をクリックしてストリーミングを開始します。
ESのクラスター作成方法は別の記事で紹介する予定ですので、今回は省略します。
余談ですが、改行コード含むログはカラムごとに分けられません。
例として下記は今回取り込んだセキュリティイベントログの1つなのですが、改行コードを含んでいるパートがごっちゃになっているのが分かるかと思います。
今回はイベントIDベースですのでカラムが作成でき、簡単にグラフにすることができますが、要件が難しい場合、複雑な対応が必要になるかと思います。
Kibana,ESクラスターへのアクセス制御(IAMポリシー)
Kibana,ESへのアクセス制御は、IAMポリシーで記述します。
テンプレートが用意されており、全世界からアクセス可能/不可能、また特定のIPからの通信を許可する設定が可能です。
なおKibana へのアクセスは IP アドレスでの制限のみ可能です。ユーザを分けるといったことはできません。
IAMユーザでのアクセス制限は、Elasticsearchのクラスターにのみ対応しています。
下記は、特定のIPからのみアクセスを許可するポリシーのサンプルです。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:AWSアカウントid:domain/ドメイン名/*", "Condition": { "IpAddress": { "aws:SourceIp": "(すきな IPを きにゅうしてね!)" } } } ] }
ESへのアクセス制御について同期が記事を書いていましたので、そちらもご覧ください。
Elasticsearch ServiceへのアクセスをIPで制限する
Kibanaでの可視化
ESの画面より、Kibanaのリンクをクリックします。
[Settings]-[Indices]のページにて、下記のパラメータを入力し、[Create]をクリックします。
index name or pattern | cwl-* |
Time fieldname | @timestamp |
グラフの表示(Discover)
試しに今回は、ファイルサーバへのアクセスログを見てみたいと思います。
[Discover]画面に移り、イベントIDを元にしたグラフを表示してみます。
[Popular fields]から[# id]を選択し、[add]をクリックします。
するとx軸が時刻、y軸がイベントID総数のグラフが表示されます。
時刻の範囲指定(x軸)
画面右上の時計のアイコンをクリックすることで、時刻の範囲指定ができます。
特定のIDのみ表示させる(y軸)
検索欄にて、 フィールド名:値 を入力することで、
y軸の値を絞ることが可能です。
イベントIDで絞る場合、 id:(数値) と入力してください。
イベントIDの一例を記載します。IDからの検索で、いつ何時どのイベントがどれだけ起きたかが分かると思います。
Event ID | 内容 |
5158 | 共有ファイル(AD)へのアクセス許可 |
4625 | アカウントがログオンに失敗した |
5145 | 共有ファイルへのアクセス確認 |
https://support.microsoft.com/ja-jp/kb/977519
ユーザの絞り込み
IDの絞り込みと同じく、ユーザの絞り込みが可能です。
検索欄にて、 @message:(ユーザ名) と入力してください。
イベントIDをカウントする
[Visualize]の欄より、期間中のイベントの"id"の総数を表示できます。
さいごに
いかがでしたでしょうか。意外と簡単にグラフが出せたかと思います。
Windowsのイベントログはそのままでは見にくいので、こういったシステムで可視化できるのは非常に便利ですね。
ではでは。