Oracle Cloud Infrastructure Audit ログを収集する

以下でサポートされています。

このドキュメントでは、Google Cloud Storage を使用して Oracle Cloud Infrastructure Audit ログを Google Security Operations に取り込む方法について説明します。

Oracle Cloud Infrastructure Audit サービスは、サポートされているすべての Oracle Cloud Infrastructure パブリック アプリケーション プログラミング インターフェース(API)エンドポイントへの呼び出しをログイベントとして自動的に記録します。現在、すべてのサービスが Oracle Cloud Infrastructure Audit によるロギングをサポートしています。Oracle Cloud Infrastructure Audit によって記録されるログイベントには、Oracle Cloud Infrastructure コンソール、コマンドライン インターフェース(CLI)、ソフトウェア開発キット(SDK)、独自のカスタム クライアント、またはその他の Oracle Cloud Infrastructure サービスによって行われた API 呼び出しが含まれます。

始める前に

次の前提条件を満たしていることを確認します。

  • Google SecOps インスタンス
  • Cloud Storage API が有効になっている GCP プロジェクト
  • GCS バケットを作成および管理する権限
  • GCS バケットの IAM ポリシーを管理する権限
  • Cloud Run サービス、Pub/Sub トピック、Cloud Scheduler ジョブを作成する権限
  • 次の権限を持つ Oracle Cloud Infrastructure アカウント:
    • Service Connector Hub
    • 関数
    • オブジェクト ストレージ バケット
    • IAM ポリシー
  • Oracle Cloud Infrastructure コンソールへの特権アクセス

Google Cloud Storage バケットを作成する

  1. Google Cloud Console に移動します。
  2. プロジェクトを選択するか、新しいプロジェクトを作成します。
  3. ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
  4. [バケットを作成] をクリックします。
  5. 次の構成情報を提供してください。

    設定
    バケットに名前を付ける グローバルに一意の名前(oci-audit-logs-gcs など)を入力します。
    ロケーション タイプ ニーズに基づいて選択します(リージョン、デュアルリージョン、マルチリージョン)。
    ロケーション ロケーションを選択します(例: us-central1)。
    ストレージ クラス Standard(頻繁にアクセスされるログにおすすめ)
    アクセス制御 均一(推奨)
    保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする
  6. [作成] をクリックします。

監査ログを GCS にエクスポートするように Oracle Cloud Infrastructure を構成する

Oracle Cloud Infrastructure は、Google Cloud Storage へのネイティブ エクスポートをサポートしていません。Oracle Cloud Infrastructure Service Connector Hub と関数を使用して、監査ログを GCS に転送します。

ログを GCS に転送する Oracle Cloud Infrastructure 関数を作成する

  1. Oracle Cloud Console にログインします。
  2. [Developer Services] > [Functions] > [Applications] に移動します。
  3. 関数アプリケーションを作成するコンパートメントを選択します。
  4. [アプリケーションを作成] をクリックします。
  5. 次の構成の詳細を指定します。
    • 名前: 「audit-logs-to-gcs-app」と入力します。
    • VCN: Virtual Cloud Network を選択します。
    • サブネット: インターネット アクセスが可能なサブネットを選択します。
  6. [作成] をクリックします。
  7. アプリケーションを作成したら、[Getting Started] をクリックし、手順に沿って Fn CLI を使用してローカル開発環境を設定します。
  8. ローカルマシンに新しい関数ディレクトリを作成します。

    mkdir oci-audit-to-gcs
    cd oci-audit-to-gcs
    
  9. Python 関数を初期化します。

    fn init --runtime python oci-audit-to-gcs
    cd oci-audit-to-gcs
    
  10. func.py の内容を次のコードに置き換えます。

    import io
    import json
    import logging
    import os
    from fdk import response
    from google.cloud import storage
    from google.oauth2 import service_account
    from datetime import datetime
    
    # Configure logging
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger()
    
    # Environment variables
    GCS_BUCKET = os.environ.get('GCS_BUCKET')
    GCS_PREFIX = os.environ.get('GCS_PREFIX', 'oci-audit-logs')
    GCS_CREDENTIALS_JSON = os.environ.get('GCS_CREDENTIALS_JSON')
    
    def handler(ctx, data: io.BytesIO = None):
        """
        Oracle Cloud Infrastructure Function to forward Audit logs to GCS.
    
        Args:
            ctx: Function context
            data: Input data containing Audit log events
        """
    
        if not all([GCS_BUCKET, GCS_CREDENTIALS_JSON]):
            logger.error('Missing required environment variables: GCS_BUCKET or GCS_CREDENTIALS_JSON')
            return response.Response(
                ctx, response_data=json.dumps({"error": "Missing configuration"}),
                headers={"Content-Type": "application/json"}
            )
    
        try:
            # Parse input data
            body = json.loads(data.getvalue())
            logger.info(f"Received event: {json.dumps(body)}")
    
            # Extract log entries
            log_entries = []
            if isinstance(body, list):
                log_entries = body
            elif isinstance(body, dict):
                # Service Connector Hub sends data in specific format
                if 'data' in body:
                    log_entries = [body['data']] if isinstance(body['data'], dict) else body['data']
                else:
                    log_entries = [body]
    
            if not log_entries:
                logger.info("No log entries to process")
                return response.Response(
                    ctx, response_data=json.dumps({"status": "no_logs"}),
                    headers={"Content-Type": "application/json"}
                )
    
            # Initialize GCS client with service account credentials
            credentials_dict = json.loads(GCS_CREDENTIALS_JSON)
            credentials = service_account.Credentials.from_service_account_info(credentials_dict)
            storage_client = storage.Client(credentials=credentials, project=credentials_dict.get('project_id'))
            bucket = storage_client.bucket(GCS_BUCKET)
    
            # Write logs to GCS as NDJSON
            timestamp = datetime.utcnow().strftime('%Y%m%d_%H%M%S_%f')
            object_key = f"{GCS_PREFIX}/logs_{timestamp}.ndjson"
            blob = bucket.blob(object_key)
    
            ndjson = '\n'.join([json.dumps(entry, ensure_ascii=False) for entry in log_entries]) + '\n'
            blob.upload_from_string(ndjson, content_type='application/x-ndjson')
    
            logger.info(f"Wrote {len(log_entries)} records to gs://{GCS_BUCKET}/{object_key}")
    
            return response.Response(
                ctx, response_data=json.dumps({"status": "success", "records": len(log_entries)}),
                headers={"Content-Type": "application/json"}
            )
    
        except Exception as e:
            logger.error(f'Error processing logs: {str(e)}')
            return response.Response(
                ctx, response_data=json.dumps({"error": str(e)}),
                headers={"Content-Type": "application/json"},
                status_code=500
            )
    
  11. requirements.txt を次の依存関係で更新します。

    fdk>=0.1.0
    google-cloud-storage>=2.0.0
    google-auth>=2.0.0
    
  12. 関数を Oracle Cloud Infrastructure にデプロイします。

    fn -v deploy --app audit-logs-to-gcs-app
    
  13. デプロイが完了したら、ファンクションの OCID をメモします。次のステップでこれを使用します。

関数の環境変数を構成する

  1. Oracle Cloud コンソールで、[Developer Services] > [Functions] > [Applications] に移動します。
  2. アプリケーション(audit-logs-to-gcs-app)をクリックします。
  3. 関数名(oci-audit-to-gcs)をクリックします。
  4. [構成] をクリックします。
  5. 次の構成変数を追加します。

    キー
    GCS_BUCKET GCS バケット名(例: oci-audit-logs-gcs
    GCS_PREFIX ログファイルの接頭辞(oci-audit-logs など)
    GCS_CREDENTIALS_JSON GCP サービス アカウント キーの JSON 文字列(下記を参照)
  6. [変更を保存] をクリックします。

Oracle Cloud Infrastructure Function 用の GCP サービス アカウントを作成する

Oracle Cloud Infrastructure 関数が GCS バケットに書き込むには、GCP サービス アカウントが必要です。

  1. GCP Console で、[IAM と管理>サービス アカウント] に移動します。
  2. [サービス アカウントを作成] をクリックします。
  3. 次の構成の詳細を指定します。
    • サービス アカウント名: 「oci-function-gcs-writer」と入力します。
    • サービス アカウントの説明: 「Service account for OCI Function to write Audit logs to GCS」と入力します。
  4. [作成して続行] をクリックします。
  5. [このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、次のロールを追加します。
    1. [ロールを選択] をクリックします。
    2. [ストレージ オブジェクト管理者] を検索して選択します。
  6. [続行] をクリックします。
  7. [完了] をクリックします。
  8. 新しく作成したサービス アカウントのメールアドレスをクリックします。
  9. [キー] タブに移動します。
  10. [鍵を追加] > [新しい鍵を作成] の順にクリックします。
  11. キーのタイプとして [JSON] を選択します。
  12. [作成] をクリックします。
  13. JSON キーファイルがパソコンにダウンロードされます。
  14. JSON キーファイルを開き、その内容全体をコピーします。
  15. Oracle Cloud コンソールの関数構成に戻ります。
  16. JSON の内容を GCS_CREDENTIALS_JSON 構成変数に貼り付けます。

GCS バケットに対する IAM 権限を付与する

GCS バケットに対する書き込み権限をサービス アカウントに付与します。

  1. [Cloud Storage] > [バケット] に移動します。
  2. バケット名(oci-audit-logs-gcs)をクリックします。
  3. [権限] タブに移動します。
  4. [アクセス権を付与] をクリックします。
  5. 次の構成の詳細を指定します。
    • プリンシパルを追加: サービス アカウントのメールアドレス(oci-function-gcs-writer@PROJECT_ID.iam.gserviceaccount.com)を入力します。
    • ロールを割り当てる: [Storage オブジェクト管理者] を選択します。
  6. [保存] をクリックします。

Oracle Cloud Infrastructure Service Connector Hub を作成する

  1. Oracle Cloud コンソールにログインします。
  2. [オブザーバビリティと管理] > [ロギング] > [Service Connector Hub] に移動します。
  3. サービス コネクタを作成するコンパートメントを選択します。
  4. [サービス コネクタを作成] をクリックします。
  5. 次の構成情報を提供してください。

    • サービス コネクタ情報:
    設定
    コネクタ名 audit-logs-to-gcs-connector」と入力します。
    説明 Forward OCI Audit logs to Google Cloud Storage」と入力します。
    リソース コンパートメント コンパートメントを選択する
    • ソースを構成する:
    設定
    ソース [Logging] を選択します。
    Compartment 監査ログを含むコンパートメントを選択する
    ロググループ [_Audit](監査ログのデフォルトのロググループ)を選択します。
  6. [+ 別のログ] をクリックします。

  7. コンパートメントの監査ログ(_Audit_Include_Subcompartment など)を選択します。

    • Configure Target:
    設定
    ターゲット [関数] を選択します。
    関数コンパートメント 関数を含むコンパートメントを選択する
    関数アプリケーション audit-logs-to-gcs-app を選択
    ファンクション oci-audit-to-gcs を選択
  8. [Configure task (optional)] までスクロールし、デフォルトの設定のままにします。

  9. [作成] をクリックします。

Service Connector Hub の IAM ポリシーを作成する

Service Connector Hub には、関数を呼び出す権限が必要です。

  1. Oracle Cloud コンソールで、[Identity & Security> Policies] に移動します。
  2. Service Connector Hub を作成したコンパートメントを選択します。
  3. [Create Policy] をクリックします。
  4. 次の構成の詳細を指定します。
    • 名前: 「service-connector-functions-policy」と入力します。
    • 説明: 「Allow Service Connector Hub to invoke Functions」と入力します。
    • コンパートメント: コンパートメントを選択します。
  5. [ポリシー ビルダー] セクションで、[手動エディタを表示] を切り替えます。
  6. 次のポリシー ステートメントを入力します。

    Allow any-user to use fn-function in compartment <compartment-name> where all {request.principal.type='serviceconnector'}
    Allow any-user to use fn-invocation in compartment <compartment-name> where all {request.principal.type='serviceconnector'}
    
    • <compartment-name> は、コンパートメント名に置き換えます。
  7. [作成] をクリックします。

統合をテストする

  1. Oracle Cloud コンソールにログインします。
  2. 監査ログを生成するアクション(リソースの作成や変更など)を実行します。
  3. ログが処理されるまで 2 ~ 5 分待ちます。
  4. GCP Console で、[Cloud Storage] > [バケット] に移動します。
  5. バケット名(oci-audit-logs-gcs)をクリックします。
  6. プレフィックス フォルダ(oci-audit-logs/)に移動します。
  7. 新しい .ndjson ファイルがバケットに表示されていることを確認します。

Google SecOps サービス アカウントを取得する

Google SecOps は、一意のサービス アカウントを使用して GCS バケットからデータを読み取ります。このサービス アカウントにバケットへのアクセス権を付与する必要があります。

サービス アカウントのメールアドレスを取得する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [Add New Feed] をクリックします。
  3. [単一フィードを設定] をクリックします。
  4. [フィード名] フィールドに、フィードの名前を入力します(例: Oracle Cloud Audit Logs)。
  5. [ソースタイプ] として [Google Cloud Storage V2] を選択します。
  6. [ログタイプ] として [Oracle Cloud Infrastructure] を選択します。
  7. [サービス アカウントを取得する] をクリックします。一意のサービス アカウント メールアドレスが表示されます(例:)。

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. このメールアドレスをコピーして、次のステップで使用します。

Google SecOps サービス アカウントに IAM 権限を付与する

Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者ロールが必要です。

  1. [Cloud Storage] > [バケット] に移動します。
  2. バケット名(oci-audit-logs-gcs)をクリックします。
  3. [権限] タブに移動します。
  4. [アクセス権を付与] をクリックします。
  5. 次の構成の詳細を指定します。
    • プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
    • ロールを割り当てる: [ストレージ オブジェクト閲覧者] を選択します。
  6. [保存] をクリックします。

Oracle Cloud Infrastructure Audit ログを取り込むように Google SecOps でフィードを構成する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [Add New Feed] をクリックします。
  3. [単一フィードを設定] をクリックします。
  4. [フィード名] フィールドに、フィードの名前を入力します(例: Oracle Cloud Audit Logs)。
  5. [ソースタイプ] として [Google Cloud Storage V2] を選択します。
  6. [ログタイプ] として [Oracle Cloud Infrastructure] を選択します。
  7. [次へ] をクリックします。
  8. 次の入力パラメータの値を指定します。

    • ストレージ バケットの URL: 接頭辞パスを含む GCS バケット URI を入力します。

       gs://oci-audit-logs-gcs/oci-audit-logs/
      
      • 次のように置き換えます。

        • oci-audit-logs-gcs: GCS バケット名。
        • oci-audit-logs: ログが保存されるオプションの接頭辞/フォルダパス(ルートの場合は空のままにします)。
      • 例:

        • ルートバケット: gs://company-logs/
        • 接頭辞あり: gs://company-logs/oci-audit-logs/
        • サブフォルダあり: gs://company-logs/oracle/audit/
    • Source deletion option: 必要に応じて削除オプションを選択します。

      • なし: 転送後にファイルを削除しません(テストにおすすめ)。
      • 転送されたファイルを削除する: 転送が完了した後にファイルを削除します。
      • 転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。

    • ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます。デフォルトは 180 日です。

    • アセットの名前空間: アセットの名前空間

    • Ingestion labels: このフィードのイベントに適用されるラベル。

  9. [次へ] をクリックします。

  10. [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。

ご不明な点がございましたら、コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。