Apigee を Google SecOps と統合する

このページは ApigeeApigee ハイブリッドに適用されます。

このドキュメントでは、Apigee を Google Security Operations(Google SecOps)と統合する方法について説明します。Google SecOps を SIEM ソリューションとして使用している場合は、このドキュメントの手順に沿って、ログデータを SecOps に送信するように Apigee を構成します。

この統合が容易にできるよう、Google SecOps は Apigee ログデータを取り込む Apigee パーサーをサポートしています。Google Cloud データを Google Security Operations に取り込むもご覧ください。このドキュメントの構成手順を完了すると、Apigee のログデータが Google SecOps に転送されます。

SecOps を他の SIEM ソリューションと統合する方法については、Apigee を SIEM ソリューションと統合するをご覧ください。

対象

このドキュメントは、以下に示す読者などを対象としています。

  • API 管理者: API のセキュリティの確保、プラットフォーム構成の管理、運用効率の向上、セキュリティ コンプライアンス要件の遵守を担当します。
  • セキュリティ アナリスト: API 関連のセキュリティ インシデントを事前に検出して調査し、リスクを最小限に抑えて機密データを保護することに重点を置いています。

構成の概要

このドキュメントで説明する構成では、Apigee の MessageLogging ポリシーを使用して、特定のフロー変数を含む幅広い Apigee ログデータを SecOps に送信します。

Google SecOps には、Apigee ログなど特定のログタイプを Google SecOps にリアルタイムで送信できる特殊な Cloud Logging フィルタが用意されています。Google SecOps は、Apigee ログデータを Google SecOps に取り込むための Apigee パーサーをサポートしています。Google Cloud データを Google Security Operations に取り込むもご覧ください。

前提条件

これらの前提条件が満たされたら、このドキュメントの手順に沿って Apigee を SecOps インスタンスと統合します。統合を開始する前に、次のものが揃っていることを確認してください。

  • API プロキシの開発とデプロイを行うための管理者権限がある Apigee アカウントまたは Apigee ハイブリッド アカウント
  • Google SecOps アカウント
  • Cloud Logging が有効で、Cloud Logging の構成と使用の経験がある
  • Apigee のフロー変数の理解
  • Apigee の MessageLogging ポリシーと一般的なポリシーの使用と構成を理解していること
  • (省略可)取り込まれたログの解釈に Google SecOps パーサーがどのように使用されるかの理解。SecOps パーサーはデフォルトで組み込まれており、MessageLogging ポリシーによって取り込まれた Apigee ログを解析して理解します。
  • Cloud Logging API の使用と SecOps サービス アカウントへの IAM ロールの付与が可能な Google Cloud IAM 権限

Apigee と SecOps の統合

Google SecOps を SIEM ソリューションとして使用している場合は、次の手順で Apigee ログデータを SecOps に送信します。基本的な手順は次の 2 つです。

  • Apigee のログデータを Cloud Logging に送信するように MessageLogging ポリシーを構成する
  • MessageLogging ポリシーを Apigee プロキシに接続する

このセクションで説明する MessageLogging ポリシーの構成が完了すると、Cloud Logging に送信された Apigee ログデータを SecOps が解析します。パーサーと、Apigee フロー変数データが SecOps データフィールドにマッピングされる方法の詳細については、Apigee を Google SecOps SIEM と統合するをご覧ください。Apigee のログを収集するもご覧ください。

MessageLogging ポリシーを使用して Apigee を SecOps と統合する手順は次のとおりです。

  1. 新しい MessageLogging ポリシーを構成します。UI でのポリシーの接続と構成をご覧ください。

    次に、データを Cloud Logging に送信する MessageLogging ポリシーの例を示します。ポリシーには、Cloud Logging に送信される多数のフロー変数が指定されています。フロー変数は、SecOps 分析に重要と判断したフィールドに応じて、必要に応じて追加または削除できます。Apigee フロー変数データが SecOps データフィールドにマッピングされる方法については、Apigee を Google SecOps SIEM と統合するをご覧ください。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <MessageLogging continueOnError="false" enabled="true" name="ML-CloudLoggingSecOps">
       <DisplayName>ML-CloudLoggingSecOps</DisplayName>
       <CloudLogging>
         <LogName>projects/{organization.name}/logs/Apigee-SecOps-Integration-{environment.name}</LogName>
         <Message contentType="application/json">{
       "apiproduct.name": "{apiproduct.name}",
       "app.name": "{developer.app.name}",
       "cachehit":"{cachehit}",
       "client.country": "{client.country}",
       "client.cn": "{client.cn}",
       "client.ip": "{proxy.client.ip}",
       "client.locality": "{client.locality}",
       "client.port": "{client.port}",
       "client.scheme": "{client.scheme}",
       "client.state": "{client.state}",
       "developer.email": "{developer.email}",
       "environment.name": "{environment.name}",
       "error":"{is.error}",
       "error.state":"{error.state}",
       "error.message":"{escapeJSON(error.message)}",
       "fault.name":"{fault.name}",
       "messageid":"{messageid}",
       "organization.name": "{organization.name}",
       "proxy.name": "{apiproxy.name}",
       "proxy.basepath": "{proxy.basepath}",
       "proxy.pathsuffix": "{proxy.pathsuffix}",
       "proxy.proxyendpoint.name": "{proxy.name}",
       "proxy.revision":"{apiproxy.revision}",
       "request.content-length":"{request_msg.header.content-length}",
       "request.content-type":"{request_msg.header.content-type}",
       "request.host":"{request_msg.header.host}",
       "request.httpversion": "{request.version}",
       "request.url": "{client.scheme}://{request_msg.header.host}{request_msg.uri}",
       "request.user-agent":"{request.header.user-agent}",
       "request.verb": "{request.verb}",
       "request.x-b3-traceid": "{request.header.x-b3-traceid}",
       "request.x-cloud-trace-context": "{request.header.x-cloud-trace-context}",
       "response.content-length":"{response.header.content-length}",
       "response.content-type":"{response.header.content-type}",
       "response.status.code": "{message.status.code}",
       "system.region.name": "{system.region.name}",
       "system.timestamp": "{system.timestamp}",
       "system.uuid": "{system.uuid}",
       "target.cn": "{target.cn}",
       "target.country": "{target.country}",
       "target.host": "{target.host}",
       "target.ip": "{target.ip}",
       "target.locality": "{target.locality}",
       "target.organization": "{target.organization}",
       "target.port": "{target.port}",
       "target.scheme": "{target.scheme}",
       "target.state": "{target.state}",
       "target.url": "{request.url}"
      }
         </Message>
         <ResourceType>api</ResourceType>
       </CloudLogging>
      </MessageLogging>
  2. API プロキシでポリシーを条件付きステップとして接続する。1 つの方法は、PostFlow の FaultRule 内にポリシーを接続することです。通常、セキュリティ関連の障害は PostFlow で発生します。例:

    <PostFlow name="PostFlow">
      <Request>
        <Step>
          <Condition>flow.isError == true)</Condition>
          <Name>ML-CloudLoggingSecOps</Name>
        </Step>
      </Request>
    </PostFlow>

    このポリシーを使用する API プロキシが実行されると、Apigee ログデータが Google SecOps に転送されます。

    もうひとつの一般的な方法は、MessageLogging ポリシーを ProxyEndpoint レスポンスの PostClientFlow に配置することです。

    MessageLogging ポリシーを API プロキシに接続する場合は、次のアドバイスを考慮してください。

    • ポリシーを FaultRule に配置します。FaultRule は、セキュリティ例外とポリシー違反をログに記録するための推奨の場所です。
    • ポリシーを PostFlow に配置します。PostFlow もセキュリティの問題を記録するのに適した場所です。
    • 成功したリクエストのロギングは避けてください。脅威に重点を置いたセキュリティ モニタリングでは、通常、問題が発生したとき(障害とみなされたとき)に詳細をログに記録します。成功したすべてのリクエストをメッセージ コンテンツ全体を含めてロギングすると、過剰なログが生成され、費用が増加する可能性があります。
    • 特定のユースケースでは、カスタム変数を検討してください。たとえば、障害フローで元のリクエスト URI をキャプチャする必要がある場合は、リクエストの PreFlow で AssignMessage ポリシーを使用して元のリクエスト URI をカスタム変数(original.request.uri など)にコピーし、その変数を MessageLogging ポリシーでロギングできます。

ベスト プラクティス

Google SecOps で Apigee を構成する際は、次のベスト プラクティスを考慮してください。

  • セキュリティ コンテキストを重視する: セキュリティ モニタリングと脅威検出に有用なコンテキストを提供するフロー変数のみをログに記録します。セキュリティに関連しないデータの過度なロギングは避けてください。
  • 一貫したロギング形式を使用する: SecOps を使用する API プロキシ全体で一貫したロギング形式を維持します。
  • 安全なサービス アカウントを使用する: SecOps の取り込みに使用する Google Cloud サービス アカウントの管理と保護においては、セキュリティのベスト プラクティスに従ってください。可能であれば、権限をログ閲覧者に制限します。
  • SecOps フィードをモニタリングする: SecOps フィードの健全性とステータスを定期的にモニタリングして、ログがエラーなく正常に取り込まれていることを確認します。
  • SecOps のルールとダッシュボードを使用する: セキュリティに関連するログが SecOps に保存されたら、特定のルールとダッシュボードを開発し、記録している詳細情報に基づいてセキュリティ脅威を検出して可視化します。

トラブルシューティング

このセクションでは、SecOps で Apigee を構成する際に発生しうるいくつかの問題と、確認すべき点について説明します。

問題: セキュリティ イベントログが Cloud Logging に表示されない

確認事項

  • MessageLogging ポリシーが、セキュリティ イベントが発生したときにトリガーされる Condition で正しく構成されていることを再確認します。
  • MessageLogging ポリシーが、FaultRule や PostFlow などの適切なフロー コンテキストに接続されていることを確認します。
  • Google Cloud プロジェクトで Cloud Logging が有効になっていることを確認します。
  • MessageLogging ポリシーに関連する Apigee プロキシのログでエラー メッセージが出ていれば、それを確認します。

問題: セキュリティ イベント ログが SecOps に表示されない

  • SecOps フィードが、正しいプロジェクト ID、ログフィルタ(セキュリティ ロギング ポリシーによるログをキャプチャしていることを確認)、サービス アカウント認証情報で正しく構成されていることを確認します。
  • SecOps UI で SecOps フィードのステータスを確認し、エラー メッセージや取り込みの問題がないか確認します。
  • SecOps で使用されるサービス アカウントに、Google Cloud プロジェクトに対するログ閲覧者のロールがあることを確認します。
  • Cloud Logging でログの JSON 構造を確認し、形式が適切であり、想定されるフィールド名が含まれていることを確認します。
  • 適切な Google Cloud パーサーが有効になっていることを確認します。
  • 解析に問題があると思われる場合は、SecOps の元データのサンプル ログエントリを調べて、解析前の取り込まれた時点の状態を確認します。特定のフィールドが想定どおりに抽出されていない場合、SecOps パーサーのドキュメントを確認するか、カスタム パーサーが必要かどうかを検討する必要があります。

Apigee を Google SecOps SIEM と統合する

次の表に、Apigee フロー変数名と、同等の Google SecOps SIEM フィールド名との対応を示します。たとえば、Cloud Logging で Apigee ログデータを表示すると、client.id フロー変数は principle_ip という SecOps SIEM フィールドにマッピングされます。Apigee のログを収集するもご覧ください。

Apigee フロー変数 SecOps SIEM フィールド名 説明
client.country principal.hostname ProxyEndpoint で受信したリクエストに関連付けられている HTTP ホスト IP。
client.host principal.location.country_or_region クライアント アプリから提示された TLS / SSL 証明書に示されている国。プロキシ リクエスト principal.location.country_or_region
client.ip principle.ip ロードバランサにメッセージを送信しているクライアントまたはシステムの IP アドレス。たとえば、元のクライアントの IP であることも、ロードバランサの IP であることもあります。
client.locality principal.location.city クライアントから提示された TLS / SSL 証明書に示されている地域(市区町村)。
client.port principal.port ProxyEndpoint に送信されたクライアント リクエストに関連付けられている HTTP ポート。
client.state principal.location.state クライアントから提示された TLS / SSL 証明書に示されている状態。
organization.name intermediary.cloud.project.name Apigee 組織の名前。
proxy.client.ip src_ip インバウンド呼び出しの X-Forwarded-For アドレス。これは、最後の外部 TCP handshake で Apigee が受信した IP アドレスです。これは、呼び出し元のクライアントまたはロードバランサである可能性があります。
proxy.name intermediary.resource.name ProxyEndpoint に構成された名前属性。
proxy.pathsuffix intermediary.resource.attribute.labels[pathsuffix] 「クライアントから送信され、ProxyEndpoint で受信した URL のパス接尾辞の値。ベースパスは左端のパス コンポーネントで、API プロキシを環境グループ内で一意に識別します。ベースパスが /v2/weatherapi である API プロキシ エンドポイントが構成されているとします。その場合、https://myhost.example.net/v2/weatherapi/forecastrss?w=12797282 に送信されたリクエストでは、proxy.pathsuffix 変数に /forecastrss という文字列が保持されます。」
proxy.url intermediary.url 「存在するすべてのクエリ パラメータを含む、ProxyEndpoint で受信したプロキシ リクエストに関連付けられている完全な URL を取得します。(proxy.url で使用されているルーターホストではなく)元のリクエスト ホストを使用してリクエスト URL を作成する例については、アクセス リクエスト メッセージをご覧ください。」
request.uri target.resource.name API プロキシにレスポンスを返すターゲット サービスのドメイン名。
request.verb network.http.method リクエストに使用される HTTP 動詞。たとえば、GET、PUT、DELETE などです。
response.content security_result.description ターゲットから返されたレスポンス メッセージのペイロードの内容。
response.status.code network.http.response_code リクエストに対して返されるレスポンス コード。この変数を使用して、message.status.code に保存されているレスポンス ステータス コードをオーバーライドできます。詳しくは、メッセージをご覧ください。
system.region.name intermediary.location.name プロキシが稼働しているデータセンターのリージョンの名前。
system.timestamp additional.fields[jsonPayload_system_timestamp] この変数が読み取られた時刻を表す 64 ビット(long 型)の整数。値は、世界標準時 1970 年 1 月 1 日午前 0 時からの経過時間(ミリ秒数)です。たとえば、1534783015000。
system.uuid intermediary.process.pid または intermediary.process.product_specific_process_id プロキシを処理する Message Processor の UUID。
target.country target.location.country_or_region ターゲット サーバーから提示された TLS / SSL 証明書に示されている国。
target.host target.hostname API プロキシにレスポンスを返すターゲット サービスのドメイン名。
target.ip target.ip API プロキシにレスポンスを返すターゲット サービスの IP アドレス。
target.locality target.location.city ターゲット サーバーから提示された TLS / SSL 証明書に示されている地域(市区町村)。
target.organization target.resource_ancestors.name ターゲット サーバーから提示された TLS / SSL 証明書に示されている組織。
target.port target.port API プロキシにレスポンスを返すターゲット サービスのポート番号。
target.scheme target.network.application_protocol リクエスト メッセージに応じて、HTTP または HTTPS を返します。
target.state target.location.state ターゲット サーバーから提示された TLS / SSL 証明書に示されている状態。
target.url target.url TargetEndpoint XML ファイルで構成された URL または動的ターゲット URL(メッセージ フロー中に target.url が設定される場合)。この変数には、追加のパス要素やクエリ パラメータは含まれません。スコープ外で呼び出された場合、あるいは未設定の場合は null を返します。

注: この変数を設定するには、TargetEndpoint に関連付けられた JavaScript ポリシーを使用してください。