TIPS & TRICKS

AWS CloudWatch LogsからSplunkにストリーミング

Splunk は、AWS re:Invent 2016 で、複数の AWS Lambda 設計図を発表しました。これらの設計図を使えば、15 以上の AWS サービスから Splunk にログ、イベント、アラートをストリーミングして、AWS インフラストラクチャや AWS アプリケーションのセキュリティと運用に関する重要なインサイトを獲得できます。

このブログ記事では、そのうちの 1 つ、CloudWatch Logs 用 Lambda 設計図を使って、AWS CloudWatch Logs から AWS Lambda 経由で Splunk にログデータをストリーミングする手順についてご説明します。この仕組みを実現すれば、下の図に示すように、ほぼリアルタイムの分析と可視化が可能になります。

以下では、CloudWatch Logs に保存される VPC フローログのストリーミングを例に説明しています。VPC フローログでは、ネットワークインターフェイスで送受信されるすべての IP トラフィックに関する情報が取得されるため、セキュリティ分析やトラブルシューティングに役立てることができます。ただし、以下の図の手順は、CloudWatch Logs に保存されるどのログにも適用できます。
CloudWatch Logs に保存される VPC フローログのストリーミング

この記事の目次:

  1. 「プル」と「プッシュ」のどちらの方式でデータを取り込むか
  2. AWS CloudWatch Logs からストリーミングするための手順
  3. トラフィック/セキュリティダッシュボードを使ってみる
  4. トラブルシューティング
  5. まとめ

「プル」と「プッシュ」のどちらの方式でデータを取り込むか

Splunk では、ローカルファイルの監視から、ワイヤーデータのストリーミング、他社製リモート API からのデータのプル、syslog、TCP/UDP、http 経由のデータ受信まで、さまざまな方法でデータを取り込むことができます。

リモートソースからのプル方式を使う代表例が、Splunk Add-on for AWS です。さまざまな AWS サービスからデータを収集できる、信頼性の高いアドオンとして人気があります。
プッシュ方式を使う代表例が、AWS Lambda 関数を使用する方法です。この方法では、Splunk HTTP イベントコレクター (HEC) に HTTPS 経由でイベントをストリーミングできます。

プルプッシュの 2 つの方式は、適用する用途も考慮事項も異なります。この記事では、プッシュ方式を取り上げます。この方式は特に、マイクロサービスアーキテクチャや、AWS Lambda のようなイベント駆動型コンピューティングに適しています。プッシュ方式は、管理や調整のための専用のポーリングプロセスが不要なため、一般的に以下のメリットがあります。

  • 管理が比較的簡単で低コスト
  • 拡張が容易
  • 衝突が少ない
  • 遅延が短い

AWS CloudWatch Logs からストリーミングするための手順

  • ステップ 1:CloudWatch Logs ストリームを有効にする
  • ステップ 2:Splunk HEC 入力を設定する
  • ステップ 3:Lambda 関数を設定する

1. CloudWatch Logs ストリームを有効にする

以下の手順では、CloudWatch Logs ログストリームの例として VPC フローログを使用します。VPC フローログやその他のソースからの CloudWatch Logs ログストリームをすでに設定済みの場合は、ステップ 2 に進み、以降は VPC フローログを既存のデータタイプに置き換えて作業を進めてください。

1a. フローログのロールを作成して、CloudWatch Logs にログを発行するための VPC フローログサービスへのアクセス権を付与します。次の IAM ポリシーをアタッチした新しい IAM ロールを作成します。


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

作成したロール名をメモしておいてください (例:vpcFlowLogsRole)。後の手順で必要になります。また、フローログサービスがこのロールを引き受けられるように、ロールに信頼関係を設定する必要もあります。新しく作成したロールの [信頼関係] タブで、[信頼関係の編集] をクリックし、既存のポリシーを削除して、次のポリシーをコピーします。


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

1b. AWS VPC ガイドの説明に従って、AWS VPC コンソールで VPC のフローログを有効にします。このガイドでは、送信先 CloudWatch Logs ロググループを「vpcFlowLogs」と指定したと仮定します。以降の手順では、この名前を使用します。数分後に、CloudWatch Logs コンソールで、このロググループの下にフローログレコードが表示され始めます。

2. Splunk HEC 入力を設定する

フローログの記録が開始されたので、次に Splunk 側からデータパイプラインを設定します。

2a. Splunk Add-on for AWS をインストールします。Splunk HEC を使用するので、CloudWatch Logs ログストリームや VPC フローログの収集にアドオンのモジュラー入力を使用する必要はありません。ただし、VPC フローログレコードの解析やフィールドの抽出を自動化するために、アドオンに内蔵されているデータ解析ロジック (ソースタイプ) を利用します。

2b. Splunk Enterprise で HEC トークンを作成します。手順については、Splunk HEC マニュアルを参照してください。
入力の設定をするときは、ソースタイプを必ず「aws:cloudwatchlogs:vpcflow」に設定してください。これは、フィールドを自動的に抽出するために重要です。また、作成した HEC トークンの値をメモしておいてください。
注:Splunk Cloud を利用している場合は、HEC の有効化を Splunk サポートに依頼する必要があります。

データ入力設定は次のようになります。

データ入力設定

3. Lambda 関数を設定する

パイプラインでは、Splunk HEC の前に AWS Lambda を経由します。グループにログが発生すると、CloudWatch Logs によって AWS Lambda が実行され、レコードが Splunk にストリーミングされます。まさにこの目的に使用できる Lambda 設計図が Splunk によって公開されています。

3a. ここをクリックして、AWS コンソールで「CloudWatch Logs to Splunk」Lambda 設計図を使って Lambda 関数を作成します。または、AWS Lambda コンソールに移動し、[Create a Lambda function] (Lambda 関数を作成) をクリックして、[Select blueprint] (設計図を選択) で「splunk」を検索します。検索結果から、「splunk-cloudwatch-logs-processor」Lambda 設計図を選択します。

3b. Lambda 関数のトリガーを設定します。 [CloudWatch Logs] が選択されていない場合は、選択します。次に、ロググループとして [vpcFlowLogs] を指定します。[Filter Name] (名前のフィルター) に「vpcFlowLogsFilter」などのフィルター名を入力します。オプションとして、Lambda から送られるデータを制限したい場合は、[Filter Pattern] (フィルターパターン) にフィルターパターンを入力できます。[Next] (次へ) をクリックする前に、[Enable trigger] (トリガーを有効にする) が選択されていることを確認してください。設定画面は次のようになります。

Lambda関数のトリガーを追加する画面

これは CloudWatch Logs サブスクリプションフィルターとも呼ばれます。この方法を使うと、選択したロググループ (ここでは vpcFlowLogs) からのログイベントのリアルタイムフィードを簡単に作成できます。

AWS コンソールでこの Lambda トリガーを追加すると、Lambda によって、CloudWatch Logs サービスからこの Lambda 関数を呼び出すために必要なアクセス権が自動的に追加されます。

3c. Lambda 関数を設定します。この関数にはすでに CloudWatch Logs データを処理するために必要なロジックが実装されています (データの復号、圧縮ファイルの解凍、Splunk HEC への送信前のイベントのブレークなど) 。設定が必要なパラメーターは以下のとおりです。

  • 画面上部で、Lambda 関数の名前を指定します (例:vpcFlowLogsProcessor)。
  • • 関数コードの下の [環境変数] セクションで、下の図のように Splunk 設定を入力します。
    • SPLUNK_HEC_URL に、HEC エンドポイントの Splunk URL を指定します (例:https://:8088/services/collector)。ホストには、Splunk の完全修飾ドメイン名または IP アドレスを指定します。HEC のデフォルトポートは 8088 です。
    • SPLUNK_HEC_TOKEN に、前の手順で作成した HEC 入力のトークン値を指定します。
  • ハンドラおよびロールセクションの [ロール] で、[既存のロールを選択] を選択し、[既存のロール] で、[lambda_basic_execution] を選択します。このロールでは、CloudWatch Logs に自身のログを書き込むために必要な最小限のアクセス権のみが Lambda 関数に与えられます。

Lambdaのenv varsとroleの設定

AWS Lambda では、デフォルトで、環境変数が保管時に Lambda サービスキーを使って暗号化されます。関数が呼び出されると、AWS Lambda によって自動的に復号されます。この設定の目的では必須ではありませんが、Lambda 関数のデプロイ前に環境変数を暗号化するオプションを選択できます。詳しくは、「機密情報を保存するために、環境変数を使用して Lambda 関数を作成する」を参照してください。

この時点で、Lambda の設定を確認したら、[次へ] をクリックします。画面は次のようになります。

Lambda関数の設定画面

数分後、Splunk Enterprise でイベントが表示され始めます。


sourcetype="aws:cloudwatchlogs:vpcflow"

または、Lambda によってデフォルト値の「lambda:」に設定されたソースで検索することもできます。


source="lambda:vpcFlowLogsProcessor"

Splunk Searchのフローログ画面

トラフィック/セキュリティダッシュボードを使ってみる

Lambda を使ってデータを取り込むメリットには、設定が簡単なだけでなく、Splunk App for AWS に内蔵の便利なダッシュボードと高度な VPC フローログ トラフィック/セキュリティ分析機能を利用できることもあります。適切なソースタイプを設定すれば (上記の VPC フローログの場合は「aws:cloudwatchlogs:vpcflow」)、関連するダッシュボードにデータが自動的に表示されます。 Splunk App for AWS のインストール後、このアプリで [Traffic & Access] ドロップダウンメニューから [VPC Flow Logs: Traffic Analysis] ダッシュボード、[Security] ドロップダウンメニューから [VPC Flow Logs: Security Analysis] ダッシュボードを表示できます。

VPC トラフィックアナリシスダッシュボード

VPC セキュリティアナリシスダッシュボード

トラブルシューティング

Splunk でイベントが表示されない場合は、データフローに沿ってパイプラインを 1 段ずつ確認して問題を解決できます。

  1. 指定した CloudWatch Logs ロググループで VPC フローログが取得されていることを確認します。それでもログが表示されない場合は、以下の解決策を試してください。
    • フローログの収集と CloudWatch Logs への発行には、フローログが初めて作成された後数分かかるので、しばらく待ちます。
    • CloudWatch Logs ロググループは、トラフィックが記録された時点で初めて作成されます。選択した VPC のネットワークインターフェイスでトラフィックが送受信されていることを確認します。
    • VPC フローログサービスに適切なアクセス権が割り当てられていない可能性があります。ステップ 1 で設定した IAM ロールと IAM ポリシーを確認します。
  2. CloudWatch Logs イベントによって Lambda 関数が呼び出されていることを確認します。まずは、AWS Lambda コンソールで [関数]、目的の関数名、[トリガー] タブの順に選択して、トリガーが有効になっていることを確認します。有効になっているときは、[無効化] ボタンが表示されます。有効になっている場合は、CloudWatch Logs で取得された Lambda 関数のログを確認します。[モニタリング] タブを選択して、[CloudWatch のログを表示] をクリックします。Lambda 関数の設計図のログには、デフォルトで、CloudWatch Logs による復号済みのデータバッチに続いて、Splunk からの応答が、処理されたログイベントの数とともに表示されます。要求エラーが発生している場合は、以下の原因が考えられます。
    • Splunk HEC ポートがファイアウォールの内側にある
    • Splunk HEC トークンが無効になっている (この場合は、Unauthorized のステータスコードが返されます)

まとめ

以上、AWS Lambda と Splunk HEC を組み合わせて、負荷が低く拡張性に優れたデータパイプラインを設定し、重要な CloudWatch Logs ログデータを既存の Splunk Enterprise にストリーミングする方法をご説明しました。このデータパイプラインを使用すれば、Splunk Enterprise でデータをほぼリアルタイムで処理、分析できます。

今回の例では、CloudWatch Logs に保存される VPC フローログを使用しました。このデータは、VPC トラフィックやセキュリティ状況を把握するために非常に役立ちます。ただし、VPC フローログ自体は数分おきにキャプチャされるため、VPC フローログの分析はある程度まとめて行われる点に注意してください。

こちらをクリックすると、AWS コンソールから直接、Splunk の Lambda 設計図を使い始めることができます。ぜひ AWS Lambda と Splunk HEC を活用して、独自のサーバーレスアーキテクチャとデータパイプラインを構築してみてください。ご意見・ご感想を下のディスカッションで受け付けています。不明な点がある場合は、Splunk Answers から投稿することもできます。

Splunk
Posted by

Splunk

世界の様々な企業が、デジタルシステムの安全性と信頼性を維持するためにSplunkを信頼しご利用いただいています。Splunkのソフトウェアソリューションとサービスは、ビジネスの継続に関わる重大な問題を未然に防ぎ、回復力を高め、イノベーションを加速します。Splunkの機能Splunkが選ばれる理由をご覧ください。

TAGS
Show All Tags
Show Less Tags