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

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 メールソリューションを開発することに熱心です。彼は、新しい技術を学ぶために読書を楽しみ、家族や友人と時間を過ごすのが大好きです。










コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)