Oracle Cloud Infrastructure Audit Logs を収集する
このドキュメントでは、Google Cloud Storage を使用して Oracle Cloud Infrastructure Audit Logs を 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 バケットを作成する
- Google Cloud コンソール に移動します。
- プロジェクトを選択するか、新しいプロジェクトを作成します。
- ナビゲーション メニューで、Cloud Storage > バケット に移動します。
- [バケットを作成] をクリックします。
次の構成情報を提供してください。
設定 値 バケットに名前を付ける グローバルに一意の名前を入力します(例: oci-audit-logs-gcs)ロケーション タイプ ニーズに応じて選択します(リージョン、デュアルリージョン、マルチリージョン) ロケーション ロケーションを選択します(例: us-central1)ストレージ クラス 標準(頻繁にアクセスされるログにおすすめ) アクセス制御 均一(推奨) 保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする [作成] をクリックします。
監査ログを GCS にエクスポートするように Oracle Cloud Infrastructure を構成する
Oracle Cloud Infrastructure は、Google Cloud Storage へのネイティブ エクスポートをサポートしていません。Oracle Cloud Infrastructure Service Connector Hub と関数を使用して、監査ログを GCS に転送します。
ログを GCS に転送する Oracle Cloud Infrastructure 関数を作成する
- Oracle Cloud コンソールにログインします。
- Developer Services > Functions > Applications に移動します。
- 関数アプリケーションを作成するコンパートメントを選択します。
- [アプリケーションを作成] をクリックします。
- 次の構成情報を提供してください。
- 名前:
audit-logs-to-gcs-appと入力します。 - VCN: 仮想クラウド ネットワークを選択します。
- サブネット: インターネット アクセスが可能なサブネットを選択します。
- 名前:
- [作成] をクリックします。
- アプリケーションが作成されたら、[Getting Started] をクリックし、手順に沿って Fn CLI でローカル開発環境を設定します。
ローカルマシンに新しい関数ディレクトリを作成します。
mkdir oci-audit-to-gcs cd oci-audit-to-gcsPython 関数を初期化します。
fn init --runtime python oci-audit-to-gcs cd oci-audit-to-gcsfunc.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 )次の依存関係で
requirements.txtを更新します。fdk>=0.1.0 google-cloud-storage>=2.0.0 google-auth>=2.0.0関数を Oracle Cloud Infrastructure にデプロイします。
fn -v deploy --app audit-logs-to-gcs-appデプロイが完了したら、関数の OCID をメモします。次のステップでこれを使用します。
関数の環境変数を構成する
- Oracle Cloud コンソールで、Developer Services > Functions > Applications に移動します。
- アプリケーション(
audit-logs-to-gcs-app)をクリックします。 - 関数名(
oci-audit-to-gcs)をクリックします。 - [構成] をクリックします。
次の構成変数を追加します。
キー 値 GCS_BUCKETGCS バケット名(例: oci-audit-logs-gcs)GCS_PREFIXログファイルの接頭辞(例: oci-audit-logs)GCS_CREDENTIALS_JSONGCP サービス アカウント キーの JSON 文字列(下記を参照) [変更を保存] をクリックします。
Oracle Cloud Infrastructure 関数の GCP サービス アカウントを作成する
Oracle Cloud Infrastructure 関数には、GCS バケットに書き込むための GCP サービス アカウントが必要です。
- GCP Console で、IAM と管理 > サービス アカウント に移動します。
- [サービス アカウントを作成] をクリックします。
- 次の構成情報を提供してください。
- サービス アカウント名:
oci-function-gcs-writerと入力します。 - サービス アカウントの説明:
Service account for OCI Function to write Audit logs to GCSと入力します。
- サービス アカウント名:
- [作成して続行] をクリックします。
- [このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、次のロールを追加します。
- [ロールを選択] をクリックします。
- [Storage オブジェクト管理者] を検索して選択します。
- [続行] をクリックします。
- [完了] をクリックします。
- 新しく作成したサービス アカウントのメールアドレスをクリックします。
- [鍵] タブに移動します。
- [鍵を追加] > [新しい鍵を作成] の順にクリックします。
- 鍵のタイプとして [JSON] を選択します。
- [作成] をクリックします。
- JSON キーファイルがパソコンにダウンロードされます。
- JSON キーファイルを開き、その内容全体をコピーします。
- Oracle Cloud コンソールの関数構成に戻ります。
JSON の内容を
GCS_CREDENTIALS_JSON構成変数に貼り付けます。
GCS バケットに対する IAM 権限を付与する
サービス アカウントに GCS バケットに対する書き込み権限を付与します。
- Cloud Storage > バケット に移動します。
- バケット名(
oci-audit-logs-gcs)をクリックします。 - [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成情報を提供してください。
- プリンシパルを追加: サービス アカウントのメールアドレス(
oci-function-gcs-writer@PROJECT_ID.iam.gserviceaccount.com)を入力します。 - ロールを割り当てる: [Storage オブジェクト管理者] を選択します。
- プリンシパルを追加: サービス アカウントのメールアドレス(
- [保存] をクリックします。
Oracle Cloud Infrastructure Service Connector Hub を作成する
- Oracle Cloud コンソールにログインします。
- Observability & Management > Logging > Service Connector Hub に移動します。
- サービス コネクタを作成するコンパートメントを選択します。
- [サービス コネクタを作成] をクリックします。
次の構成情報を提供してください。
- Service Connector の情報:
設定 値 コネクタ名 「 audit-logs-to-gcs-connector」と入力します。説明 「 Forward OCI Audit logs to Google Cloud Storage」と入力します。リソース コンパートメント コンパートメントを選択します - ソースを構成する:
設定 値 ソース [ロギング] を選択します コンパートメント 監査ログを含むコンパートメントを選択します ロググループ [_Audit] を選択します(監査ログのデフォルトのロググループ) [+ 別のログ] をクリックします。
コンパートメントの監査ログを選択します(例:
_Audit_Include_Subcompartment)。- ターゲットを構成する:
設定 値 ターゲット [関数] を選択します 関数のコンパートメント 関数を含むコンパートメントを選択します 関数アプリケーション audit-logs-to-gcs-appを選択します関数 oci-audit-to-gcsを選択します[タスクを構成する(省略可)] までスクロールして、デフォルト設定のままにします。
[作成] をクリックします。
Service Connector Hub の IAM ポリシーを作成する
Service Connector Hub には、関数を呼び出す権限が必要です。
- Oracle Cloud コンソールで、Identity & Security > Policies に移動します。
- Service Connector Hub を作成したコンパートメントを選択します。
- [Create Policy] をクリックします。
- 次の構成情報を提供してください。
- 名前:
service-connector-functions-policyと入力します。 - 説明:
Allow Service Connector Hub to invoke Functionsと入力します。 - コンパートメント: コンパートメントを選択します。
- 名前:
- [ポリシー ビルダー] セクションで、[手動エディタを表示] を切り替えます。
次のポリシー ステートメントを入力します。
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>は、コンパートメント名に置き換えます。
[作成] をクリックします。
統合をテストする
- Oracle Cloud コンソールにログインします。
- 監査ログを生成するアクションを実行します(リソースの作成や変更など)。
- ログが処理されるまで 2 ~ 5 分待ちます。
- GCP Console で、Cloud Storage > バケット に移動します。
- バケット名(
oci-audit-logs-gcs)をクリックします。 - 接頭辞フォルダ(
oci-audit-logs/)に移動します。 新しい
.ndjsonファイルがバケットに表示されていることを確認します。
Google SecOps サービス アカウントを取得する
Google SecOps は、一意のサービス アカウントを使用して GCS バケットからデータを読み取ります。このサービス アカウントにバケットへのアクセス権を付与する必要があります。
サービス アカウントのメールアドレスを取得する
- SIEM 設定 > フィード に移動します。
- [新しいフィードを追加] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Oracle Cloud Audit Logs)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
- [ログタイプ] として [Oracle Cloud Infrastructure Audit Logs] を選択します。
[サービス アカウントを取得する] をクリックします。一意のサービス アカウントのメールアドレスが表示されます。例:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com次のステップで使用するために、このメールアドレスをコピーします。
Google SecOps サービス アカウントに IAM 権限を付与する
Google SecOps サービス アカウントには、GCS バケットに対するStorage オブジェクト閲覧者 ロールが必要です。
- Cloud Storage > バケット に移動します。
- バケット名(
oci-audit-logs-gcs)をクリックします。 - [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成情報を提供してください。
- プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
- ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
[保存] をクリックします。
Oracle Cloud Infrastructure Audit Logs を取り込むように Google SecOps でフィードを構成する
- SIEM 設定 > フィード に移動します。
- [新しいフィードを追加] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Oracle Cloud Audit Logs)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
- [ログタイプ] として [Oracle Cloud Infrastructure Audit Logs] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
Storage バケットの 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: 必要に応じて削除オプションを選択します。
- なし: 転送後にファイルを削除しません(テストにおすすめ)。
- 転送されたファイルを削除する: 転送が成功した後にファイルを削除します。
- 転送されたファイルと空のディレクトリを削除する: 転送が成功した後にファイルと空のディレクトリを削除します。
- Maximum File Age: 過去の指定した日数内に変更されたファイルを含めます。デフォルトは 180 日です。
- アセットの名前空間: アセットの名前空間。
- 取り込みラベル: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
さらにサポートが必要な場合コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。