Oracle Cloud Infrastructure のログを収集する

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

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

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

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

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

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

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

Oracle Cloud Infrastructure は、Google Cloud Storage への組み込みエクスポートをサポートしていません。OCI Service Connector Hub と OCI Function を使用して、監査ログを GCS に転送します。

ログを GCS に転送する OCI 関数を作成する

  1. Oracle Cloud Console にログインします。
  2. ナビゲーション メニューを開き、[デベロッパー サービス> 関数> アプリケーション] を選択します。
  3. 関数アプリケーションを作成するコンパートメントを選択します。
  4. [アプリケーションを作成] をクリックします。
  5. 次の構成の詳細を指定します。
    • 名前: 「audit-logs-to-gcs-app」と入力します。
    • VCN: Virtual Cloud Network を選択します。
    • サブネット: インターネット アクセスが可能なサブネットを選択します。
  6. [作成] をクリックします。
  7. アプリケーションを作成したら、[スタートガイド] をクリックし、手順に沿って 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):
        """
        OCI 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. 関数を OCI にデプロイします。

    fn -v deploy --app audit-logs-to-gcs-app
    
  13. デプロイが完了したら、関数 OCID をメモします。これは、Service Connector Hub の構成時に使用します。

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

  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. [変更を保存] をクリックします。

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

OCI 関数が 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)を入力します。
    • ロールを割り当てる: [ストレージ オブジェクト管理者] を選択します。
  6. [保存] をクリックします。

OCI Service Connector Hub コネクタを作成する

  1. Oracle Cloud Console にログインします。
  2. ナビゲーション メニューを開き、[分析と AI] を選択します。[メッセージング] で、[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 など)を選択します。

    ターゲットを構成する:

    設定
    ターゲット [関数] を選択します。
    関数コンパートメント 関数を含むコンパートメントを選択する
    関数アプリケーション audit-logs-to-gcs-app を選択
    ファンクション oci-audit-to-gcs を選択
  8. [タスクを構成する(省略可)] セクションはデフォルト設定のままにします。

  9. ポリシーの作成を求めるメッセージが表示されたら(サービス コネクタの作成または更新へのアクセスに必要)、[作成] を選択します。

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

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'}
    
  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. [Log type] として [Oracle Cloud Infrastructure Audit Logs] を選択します。
  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 サービス アカウントのメールアドレスを貼り付けます。
    • ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
  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. [Log type] として [Oracle Cloud Infrastructure Audit Logs] を選択します。
  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] 画面で新しいフィードの設定を確認し、[送信] をクリックします。

UDM マッピング テーブル

ログフィールド UDM マッピング ロジック
authorization_field additional.fields 統合済み
compartment_id_field additional.fields 統合済み
compartment_name_field additional.fields 統合済み
content_length_field additional.fields 統合済み
content_type_field additional.fields 統合済み
event_grouping_id_field additional.fields 統合済み
tenant_id_label additional.fields 統合済み
data.message metadata.description 直接マッピングされます。
time metadata.event_timestamp ISO8601 として解析
has_principal_hostname metadata.event_type マッピング: trueSTATUS_UPDATE
oracle.tenantid metadata.product_deployment_id 直接マッピングされます。
type metadata.product_event_type 直接マッピングされます。
oracle.logid metadata.product_log_id 直接マッピングされます。
specversion metadata.product_version 直接マッピングされます。
data.request.action network.http.method 直接マッピングされます。
data.identity.userAgent network.http.parsed_user_agent 名前変更済み/マッピング済み
data.response.status network.http.response_code 名前変更済み/マッピング済み
ip_protocol_out network.ip_protocol 直接マッピングされます。
data.bytesOut network.sent_bytes 名前変更済み/マッピング済み
data.packets network.sent_packets 名前変更済み/マッピング済み
data.identity.consoleSessionId network.session_id 名前変更済み/マッピング済み
id principal.asset.product_object_id 直接マッピングされます。
source principal.hostname 直接マッピングされます。
data.identity.ipAddress principal.ip 統合済み
data.sourceAddress principal.ip 統合済み
data.sourcePort principal.port 名前変更済み/マッピング済み
compartmentid_label principal.resource.attribute.labels 統合済み
forward_label principal.resource.attribute.labels 統合済み
loggroupid_label principal.resource.attribute.labels 統合済み
vniccompartmentocid_label principal.resource.attribute.labels 統合済み
vnicocid_label principal.resource.attribute.labels 統合済み
vnicsubnetocid_label principal.resource.attribute.labels 統合済み
data.flowid principal.resource.product_object_id 直接マッピングされます。
credentials_label principal.user.attribute.labels 統合済み
data.identity.principalName principal.user.user_display_name 直接マッピングされます。
data.identity.principalId principal.user.userid 直接マッピングされます。
action security_result.action 統合済み
endTime_label security_result.detection_fields 統合済み
startTime_label security_result.detection_fields 統合済み
status_label security_result.detection_fields 統合済み
version_label security_result.detection_fields 統合済み
data.destinationAddress target.ip 統合済み
data.destinationPort target.port 名前変更済み/マッピング済み
data.request.path target.url 直接マッピングされます。
なし metadata.event_type 定数: GENERIC_EVENT
なし metadata.product_name 定数: ORACLE CLOUD AUDIT
なし metadata.vendor_name 定数: ORACLE

変更履歴

このパーサーの変更ログを表示する

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。