ノート:

Oracle Cloud InfrastructureからRapid7 InsightOpsへのログの転送

イントロダクション

Oracle Cloud Infrastructure (OCI)は、可用性の高いホスト環境で一連のアプリケーションおよびサービスを構築および実行できる補完型クラウド・サービスのセットです。OCIは、オンプレミス・ネットワークからセキュアにアクセスできる柔軟なオーバーレイ仮想ネットワークにおいて、高パフォーマンスなコンピュート機能(物理ハードウェア・インスタンスとして)とストレージ容量を提供します。

Oracle Cloud Observability and Manageabilityプラットフォームは、現在の顧客を満たすことを目的としています。オラクルは、一般的なサードパーティの可観測性ツールで運用状況を標準化していることを理解しており、お客様がOCIに投資したツールを引き続き使用できるように、これらのツールと相互運用できるようにしたいと考えています。

このチュートリアルでは、OCIからRapid7 InsightOpsにログを転送する方法について説明します。Rapid7 InsightOpsは、使いやすいログ管理および分析サービスです。世界クラスの検索機能、強化されたログ分析ツール、およびインフラストラクチャのリアルタイム状態を監視および問合せする機能を提供します。

次に、ソリューション・アーキテクチャの概要を示します。

アーキテクチャのダイアグラム

目的

前提条件

タスク1: Rapid7 InsightOpsにデータを送信するlog-Webhookの作成

HTTP POSTは、ログ・メッセージをRapid7 InsightOpsに転送する簡単な方法です。

  1. Rapid7 InsightOpsにログインし、上部のナビゲーションで「データの追加」をクリックします。

  2. 「Webhook」をクリックします。

    Rapid7 InsightOps- データ・ソースの追加

  3. ログの名前を入力し、既存のログ・セットを選択するか、新しいログ・セットを作成します。

    Rapid7 InsightOps-log-Webhookの追加

    ノート: ログ・データの送信に使用するURLが表示されます。URLの最後の部分は、データの送信先となるログを識別するログ・トークンです。

タスク2: 取得するログの構成

  1. OCIコンソールで、「監視および管理」「ロギング」および「ログ・グループ」に移動します。

  2. コンパートメントを選択して「ログ・グループの作成」をクリックすると、サイド・パネルが開きます。

  3. 名前に*Rapid7_log_group*と入力し、オプションで説明およびタグを指定します。

  4. 「作成」をクリックして、新しいログ・グループを設定します。

  5. 「リソース」で、「ログ」をクリックします。

  6. 必要に応じて、「カスタム・ログの作成」または「サービスの有効化」ログをクリックします。

    たとえば、次のステップに従って、オブジェクト・ストレージ・バケットの書込みログを有効化します:

    1. 「サービス・ログの有効化」をクリックします。サイドパネルが開きます。

    2. リソース・コンパートメントを選択し、「検索サービス」フィールドに「オブジェクト・ストレージ」と入力します。

    3. 「ログの有効化」をクリックし、リソース・フィールドでオブジェクト・ストレージ・バケット名を選択します。

    4. 以前に作成したログ・グループRapid7_log_groupを選択し、「ログ・カテゴリ」フィールドで「アクセス・イベントの書込み」を選択します。オプションで、Rapid7_bucket_writeなどのログ名を指定します。

    5. 「有効化」をクリックして、新しいOCIログを作成します。

タスク3: Rapid7 InsightOpsにログを取り込むためのOracleファンクションの作成

  1. OCIコンソールで、「開発者サービス」および「ファンクション」に移動します。

  2. 「アプリケーションの作成」をクリックします。それぞれのドロップダウン・リストからRapid7_App、VCN、サブネット、シェイプ(GENERIC_X86)などの名前をアプリケーションに指定し、「作成」をクリックします。

  3. 次のステップに従って、Cloud Shell環境を設定します:

    1. Cloud Shellを起動し、Cloud Shellでfn CLIを設定します。

    2. リージョンのコンテキストを使用します。

      fn list context
      fn use context <region-context>
      
    3. 関数のコンパートメントIDでコンテキストを更新します。

      fn update context oracle.compartment-id <compartment-id>
      
    4. ファンクション・イメージを区別する一意のリポジトリ名接頭辞を指定します。

      fn update context registry <region-key>.ocir.io/<tenancy_name>/[repo-name-prefix]
      
    5. Oracle Cloud Infrastructure Registryへのログインを有効にする認証トークンを生成します。

    6. Auth Tokenをパスワードとして使用してレジストリにログインします。

      docker login -u '<tenancyname>/<username>' <region-key>.ocir.io
      
    7. コンパートメント内のアプリケーションをリストして、設定を確認します。

      fn list apps
      

タスク4: ファンクションの作成、デプロイおよび呼出し

  1. 最初にボイラープレートPython関数を作成し、自動生成されたファイルを次のコードで置き換えることをお薦めします。

    fn init --runtime python rapid7_func
    

    ノート: fn initコマンドは、func.pyfunc.yamlおよびrequirements.txtの3つのファイルを含むrapid7_funcというフォルダを生成します。

  2. 生成されたディレクトリに切り替えます。

    cd rapid7_func
    
    • func.pyの内容を次のサンプル・コードに置き換えます。コードは要件に応じて調整できます。

      import io
      import os
      import json
      import requests
      import logging
      from fdk import response
      
      def process(body):
          try:
              data = body.get("data", {})
              source = body.get("source")
              time = body.get("time")
              oracle = body.get("oracle",{})
              type = body.get("type")
              regionID = body.get("regionID")
              origin = "OCI-CLOUD"
      
              #Get json data, time, type and source information
              payload = {}
              payload.update({"origin":origin})
              payload.update({"time": time})
              payload.update({"type":type})
              payload.update({"regionID":regionID})
              payload.update({"source":source})
              payload.update({"data":data})
              payload.update({"oracle":oracle})
      
              #Rapid7 endpoint URL with token to call the REST interface.Refer for more info https://docs.rapid7.com/insightops/insightops-webhook
              #This is defined in the func.yaml file.
              rapid7host = os.environ['RAPID7_HOST']
      
              #Invoke Rapid7 API with the payload. If the payload contains more than one log this will be ingested as once.
              headers = {'Content-type': 'application/json'}
              x = requests.post(rapid7host, data = json.dumps(payload), headers=headers)
              logging.getLogger().info(x.text)
      
          except (Exception, ValueError) as ex:
              logging.getLogger().error(str(ex))
      
      

      このファンクションは、ロギングJSONを受け入れ、Rapid7 InsightOpsエンドポイントをトリガーしてログを取り込みます。最上位のロギング形式の詳細は、ロギング形式の概要を参照してください。

      複数のログで呼び出されると、ファンクションは各ログを反復処理し、Rapid7 InsightOpsエンドポイントをトリガーして個別に収集します。

      def handler(ctx, data: io.BytesIO=None):
          try:
              body = json.loads(data.getvalue())
              if isinstance(body, list):
                  # Batch of CloudEvents format
                  for log in body:
                      process(log)
              else:
                  # Single log
                  process(body)
          except (Exception, ValueError) as ex:
              logging.getLogger().error(str(ex))
      
    • func.yamlの内容を次のように置き換えます。RAPID7_HOSTは、前のステップで取得したURLに置き換える必要があります。

      schema_version: 20180708
      name: rapid7_func
      version: 0.0.1
      runtime: python
      entrypoint: /python/bin/fdk /function/func.py handler
      memory: 1024
      timeout: 120
      config:
          RAPID7_HOST: https://us2.webhook.logs.insight.rapid7.com/v1/noformat/1a2345b1-1234-1ab2-1a2b-abcd1ef2345g
      
    • requirements.txtの内容を次のように置き換えます。

      fdk
      datetime
      requests
      oci
      
  3. ファンクションをデプロイします。

    fn -v deploy --app Rapid7_App
    
  4. ファンクションを起動してテストできます。エラーが検出されない場合、関数は期待どおりに動作しています。

    fn invoke Rapid7_App rapid7_func
    

タスク5: OCIサービス・コネクタの設定

  1. OCIコンソールで、「監視および管理」「ロギング」および「サービス・コネクタ」に移動します。

  2. 「サービス・コネクタの作成」をクリックして、「サービス・コネクタの作成」ページに移動します。

  3. 名前に*Rapid7_SC*と入力し、オプションで説明を入力してコンパートメントを選択します。

  4. 「ロギング」として「ソース」を選択し、「ファンクション」として「ターゲット」を選択します。

  5. 「ソース接続の構成」で、コンパートメント名、ログ・グループおよびログを選択します(最初のステップで作成したログ・グループおよびログ)。

  6. 監査ログも送信する場合は、+Anotherログをクリックし、ログ・グループと同じ_Auditを置換しながら同じコンパートメントを選択します。

  7. 「ターゲットの構成」で、コンパートメント、ファンクション・アプリケーションおよびファンクションを選択します(前のステップで作成したファンクション・アプリケーションおよびファンクション)。

  8. ポリシーの作成を求められた場合は、プロンプトから「作成」をクリックします。

  9. 下部の「作成」をクリックして、サービス・コネクタの作成を終了します。

タスク6: Rapid7 InsightOpsプラットフォーム製品でのOracle Cloud Infrastructureログのビジュアル化

ログにアクセスするには、Rapid7 InsightOpsにログインし、「ログ検索」セクションに移動します。

Rapid7 InsightOps

ノート: HTTP postオプションを使用してRapid7 InsightOpsに収集されたログは、Rapid7 InsightIDRにも表示されます。

Rapid7 InsightIDR

次のステップ

このチュートリアルでは、サービス・コネクタ・ハブおよびファンクションを使用して、Oracle Cloud Infrastructure (OCI)ログをRapid7 InsightOpsプラットフォームに転送するプロセスをデモンストレーションしました。セキュリティ情報およびイベント管理(SIEM)側では、重要なメトリックを取得するためのダッシュボードを定義し、事前定義済のしきい値を超えた場合にトリガーするアラートを構成することが不可欠です。また、特定の問合せの定義は、悪意のあるアクティビティを検出し、OCIテナンシ内のパターンを識別するために重要です。これらのアクションにより、セキュリティ・ポスチャがさらに強化され、クラウド環境のプロアクティブな監視が可能になります。

承認

著者 - Chaitanya Chintala (クラウド・セキュリティ・アドバイザ)

その他の学習リソース

docs.oracle.com/learnの他のラボをご覧いただくか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。