Amazon Web Services ブログ

Amazon Kinesis Agent for Windows を使用して、集中化された Microsoft Exchange サーバーのログ管理

Microsoft Exchange サーバーは様々な種類のログを保管しています。これらのログには、メッセージ追跡、Exchange ウェブサービス(EWS)、Information Services(IIS)、およびアプリケーション/システムイベントログの種類が含まれます。グローバルにデプロイされた Exchange サーバーでは、これらのサーバーのローカルで複数のディレクトリにログが散在している場合があります。この場合、Exchange 管理者が各サーバーにログインして、ステータス、ヘルス、およびイベントをモニタリングする必要があります。Exchange 管理者は、これらのログを集中化し、有用なメトリクスに変換することで、各サーバーにログインすることなく、高負荷やサービス/アプリケーションエラーなどの多くの問題を特定できます。

このブログ記事では、Microsoft Exchange サーバーのログをストリーミング、分析、および保存するための効率的なアーキテクチャについて説明します。頻繁なクエリと運用分析用に、Amazon Elasticsearch Service(Amazon ES)と Kibana を使用してリアルタイムで可視化を行います。例えば、さまざまな種類のレポートを提供します。これらのレポートは、上位のメール送信者と受信者、IIS ログの上位 HTTP ステータスコード、EWS ログの上位エラーコード、負荷/エラーのスパイク絞り込みに関するものです。監査、法的要件、コンプライアンス要件などの低頻度クエリについては、Amazon S3 を最終宛先として使用しています。標準SQL を使用した簡単なクエリ向けに、低コストのストレージオプションと高い耐久性、Amazon Athena を提供します。

Amazon Kinesis Agent for Microsoft Windows(Kinesis Agent for Windows)は、構成可能で拡張可能な高度なエージェントです。Kinesis Agent for Windows は、Amazon Kinesis Data StreamsAmazon Kinesis Data FirehoseAmazon CloudWatch など、さまざまな AWS のサービスに、ログ、イベント、およびメトリクスを、収集、解析、変換、ストリーム配信します。Windows ベースのサービスからログを集中化するために、より効率的で信頼性の高い方法を提供します。これにより、問題の及ぶ範囲を確認したり、問題をモニタリングしたり、エラーや負荷が特定のしきい値を超えた場合にアラームを生成したりすることができます。Kinesis Agent for Windows について詳しくは、Amazon Kinesis Agent for Microsoft Windowsとはを参照してください。

ログの解析

Amazon ES には JSON 形式のデータが必要です。Kinesis Agent for Windows は、CSV 形式の Exchange ログ行を効率的に解析し、JSON に変換します。Kinesis Agent for Windows を使用すると、ホスト名、EC2 インスタンス ID、およびカスタム日付と時刻形式などの詳細を追加して、ログに記録された正確な問題を特定するのに役立ちます。Kinesis Agent for Windows は動的にログヘッダーを計算します。ヘッダー名が変更された場合、またはサービスを再起動するために単一のログファイルに複数のヘッダー行がある場合でも実行されます。 ログをローテーションしても、正しいデータをストリーミングします。

ログのフロー

この使用例では、同じログを、リアルタイム分析するために Amazon ES へ、 Amazon Athena をオフライン分析するために Amazon S3 へと両方に送信します。ホストから各宛先にデータを 2 回ストリーミングする代わりに、Kinesis Agent for Windows を構成して、Kinesis データストリームに一度ストリーミングすることができます。ストリームから Amazon Kinesis Data Firehose がログを収集し、Amazon ES に配信します。別の Kinesis Data Firehose は、同じログを収集し、Amazon Athena の Amazon S3 バケットに配信します。ログを別の宛先に送信する必要がある場合は、別の Kinesis Data Firehose インスタンスを使用できます。

AWS Lambda は Amazon ES のログを定期的に分析し、統計を CloudWatch メトリクスに投稿します。CloudWatch アラームは、投稿されたメトリクスで検出された異常をトリガーするために使用されます。

Kibana はログデータを可視化します。グラフのスパイクや異常を探して、特定のログデータをドリルダウンすることができます。Exchange サービスの特定の問題を診断するのに役立ちます。また、いくつかの認証機能によって、 Kibana へのアクセスが保護されます。Amazon Cognito を ID プロバイダで使用する方法については、Amazon Cognito Authentication for Kibana を参照してください。

Agent の設定

Kinesis Agent for Windows の設定は、%PROGRAMFILES%\Amazon\AWSKinesisTap\ の appsettings.json にて説明されています。ここでは、ソース(ログの位置)、シンク(Kinesis Data Stream information)、およびソースとシンクを接続するパイプを定義します。

指定されたディレクトリの下に .log 拡張子を持つすべてのファイルをクエリするソース設定の例を次に示します。ExchangeLogSource がタイプに設定されている場合、ヘッダーのログ行が動的に解析されます。次に、「タイムスタンプ」に必要な列が自動的に選択されます。

    "Sources": [
        {
            "Id": "MessageTracking-LogsSource",
            "SourceType": "ExchangeLogSource",
            "Directory": "C:\\Program Files\\Microsoft\\Exchange Server\\V15\\TransportRoles\\Logs\\MessageTracking",
            "FileNameFilter": "*.log",
            "TimeZoneKind": "UTC",
            "TimeStampField": "date-time" //Optional.ExchangeLogSource can automatically detect if the TimestampField name is "date-time" or "DateTime".For other names, please specify
        }
    ]

メッセージ追跡ログは、次のサンプルと同様になります。


2018-10-22T10:53:13.404Z, 10.00.00.00, ExchangeServer01,10.00.00.00,ExchangeServer01,;250 2.0.0 OK;ClientSubmitTime:2018-10-22T10:53:10.680Z,Intra-Organization SMTP Send Connector,SMTP,SEND,157882997807893,<6d606502441648f993b7b6d1b8fbb5fb@ExchangeServer01>,9b3f4489-a158-4126-0d41-08d6380c8f0f,recipient@Somedomain.com,250 2.1.5 Recipient OK,sender@Somedomain.com, return-path@Somedomain.com,…


// Sinks (Destinations) は、ログの行き先を定義します

次に、ログが保存されるシンクまたは宛先を定義します。また、ロールがストリームにアクセスできる場合を想定して、別の AWS アカウントの Kinesis データストリームにログをストリーミングすることもできます。アクセスを設定する方法については、シンクセキュリティの構成を参照してください。形式 が指定されると、ログは JSON に変換されます。

"Sinks": [
        {
            "Id": "MessageTracking-Kinesis-Sink",
            "SinkType": "KinesisStream",
            "Region": "us-west-2",
            "RoleARN": "arn:aws:iam::<another aws account>::role/exch-kinesis-log", // only if logs are sent to Kinesis Data Stream in another account.
            "StreamName": "ex-messagetracking",
            "Format": "json"
        }
    ]

// Pipesは 、ソースとシンクを接続します。

パイプは、ソースと宛先を接続します。宛先に複数のソースを取り込む必要がある場合、またはその逆の場合に役立ちます。

   "Pipes": [
        {
            "Id": "MessageTracking-Kinesis-Pipe",
            "SourceRef": "MessageTracking-LogsSource",
            "SinkRef": "MessageTracking-Kinesis-Sink"
        }
    ]

Kinesis Agent for Windows は、Kinesis Data Streams にログを送信する前に、各ログラインを JSON BLOB に変換します。以下のサンプルをご覧ください。

{
      "date-time": "2018-10-22T10:53:13.404Z",
      "client-ip": "10.00.00.00",
      "client-hostname": "ExchangeServer01",
      "server-ip": "10.00.00.00",
      "server-hostname": "ExchangeServer01",
      "source-context": ";250 2.0.0 OK;ClientSubmitTime:2018-10-22T10:53:10.680Z",
      "connector-id": "Intra-Organization SMTP Send Connector",
      "source": "SMTP",
      "event-id": "SEND",
      "internal-message-id": "157882997807893",
      "message-id": "<6d606502441648f993b7b6d1b8fbb5fb@ExchangeServer01>",
      "network-message-id": "9b3f4489-a158-4126-0d41-08d6380c8f0f",
      "recipient-address": "recipient@Somedomain.com",
      "recipient-status": "250 2.1.5 Recipient OK",
      "sender-address": "sender@Somedomain.com",
      "return-path": "return-path@Somedomain.com",
      ….
    }

視覚化による操作分析停電や深刻な問題に取り組んでいるとき、ログをすぐに利用できるようになります。

以下に例を示します。スパムがの可能性があるため、上位の送信者と受信者を知る必要があります。問題が発生したときにこれらの結果が得られれば、Exchange 管理者がスパムメッセージを削除するルールを作成して、リスクを緩和できます。

例えば、次の Kibana グラフは、Amazon ES のデータを視覚化します。時間ウィンドウに上位のメール送信者を示します。グラフには、上位の送信者 spam@somedomain.com が表示されます。これについてはさらに調査する必要があります。Amazon ES API コールを使用すると、集約された結果を取得し、プログラムでアクションを実行できます。このデータにアラートを配置することで、早期検出が可能になり、スパム削除アクションに繋がり、より多くのスパムを防くことができます。Kibana で視覚化を作成する方法について詳しくは、視覚化作成を参照してください。

以下は、Amazon CloudWatch の線グラフで、Amazon ES からの AWS Lambda クエリーログによって投稿された統計を示しています。

しきい値およびアラームは、CloudWatch アラームでアラートを設定できます。

Amazon ES エンドポイントをクエリする Python のAWS Lambda コードの例を示します。最新 15 分間の Microsoft Exchange メッセージ追跡ログから上位 5 つの送信者が返されます。次に、最上位の送信者が送信したメッセージの数を CloudWatch メトリクスに送信します。

import datetime
import logging
import boto3
import os
from aws_requests_auth.aws_auth import AWSRequestsAuth
from elasticsearch import Elasticsearch, RequestsHttpConnection

#Constants Declarations
epoch = datetime.datetime.utcfromtimestamp(0)
session = boto3.Session()
credentials = session.get_credentials().get_frozen_credentials()
es_host = 'search-ex-messagetracking-xxxxxxxxxxxxxxxxxxxxxxxxxx.us-west-2.es.amazonaws.com'

#Main function
def lambda_handler(event, context):
    now_time = datetime.datetime.now()
    query_end_time = unix_time_millis(now_time)
    query_start_time = unix_time_millis(now_time - datetime.timedelta(minutes=15))
          
    awsauth = AWSRequestsAuth(
        aws_access_key=credentials.access_key,
        aws_secret_access_key=credentials.secret_key,
        aws_token=credentials.token,
        aws_host=es_host,
        aws_region=session.region_name,
        aws_service='es'
    )

    es = Elasticsearch(
        hosts=[{'host': es_host, 'port': 443}],
        http_auth=awsauth,
        use_ssl=True,
        verify_certs=True,
        connection_class=RequestsHttpConnection
    )
    
    querybody = construct_agg_query("sender-address.keyword", query_start_time, query_end_time)
    log2CW("TopSenders","NoOfMsgsByTopSender",query_es(es,querybody))

# Function Declarations 

def query_es(es_param,querybody_param):
    es_results = es_param.search(index="timestamp-*", body=querybody_param)
    parsed_value = es_results['aggregations']['3']['buckets']
    print(parsed_value)
    print(parsed_value[0]['doc_count'])
    return parsed_value[0]['doc_count']

def unix_time_millis(dt):
    return int((dt - epoch).total_seconds() * 1000.0) 
    
def construct_agg_query(query_keyword, start_time, end_time):
    return_query_body = {
                            "query": {
                                "bool": {
                                "must": [
                                    {
                                    "match_all": {}
                                    },
                                    {
                                    "range": {
                                        "date-time": {
                                        "gte": start_time,
                                        "lte": end_time,
                                        "format": "epoch_millis"
                                        }
                                    }
                                    }
                                ],
                                "must_not": []
                                }
                            },
                            "size": 0,
                            "_source": {
                                "excludes": []
                            },
                            "aggs": {
                                "3": {
                                "terms": {
                                    "field": query_keyword,
                                    "size": 5,
                                    "order": {
                                    "_count": "desc"
                                    }
                                }
                                }
                            }
                        }
    return return_query_body
    
def log2CW (dimension_value, error_code, error_value):
    cloudwatch = boto3.client('cloudwatch')
    response = cloudwatch.put_metric_data(
        MetricData = [
            {
                'MetricName': error_code,
                'Dimensions': [
                    {
                        'Name': 'TransportService',
                        'Value': dimension_value
                    }
                ],
                'Unit': 'None',
                'Value': error_value
            }
        ],
        Namespace = 'Exchange/TransportService'
    )

まとめ

Amazon Kinesis Agent for Microsoft Windows は解析し、ログラインを JSON に変換し、データを Amazon Kinesis Data Streams にストリームします。このブログ記事のユースケースでは、数百の Microsoft Exchange Server ログを Amazon Kinesis Data Streams に 1 分以内にストリーミングしました。Kinesis Agent for Windows は、AWS のサービスとのネイティブ統合により、集中化された AWS ストレージおよび AWS 分析サービスに効率的にログを反映します。お客様のユースケースと楽しいログもお知らせください!

その他のリソース

 


著者について

Vijay Amirtharaj は アマゾン ウェブ サービスのシステム開発エンジニアです。Vijay は、Well-Architected メールソリューションを開発することに熱心です。彼は、新しい技術を学ぶために読書を楽しみ、家族や友人と時間を過ごすのが大好きです。