收集 Oracle Cloud Infrastructure 稽核記錄
本文說明如何使用 Google Cloud Storage,將 Oracle Cloud Infrastructure 稽核記錄擷取至 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 值區的權限
- 管理 Google Cloud Storage 值區 IAM 政策的權限
- 建立 Cloud Run 服務、Pub/Sub 主題和 Cloud Scheduler 工作的權限
- 具備建立及管理下列項目的權限的 Oracle Cloud Infrastructure 帳戶:
- 服務連接器中樞
- 函式
- Object Storage bucket
- IAM 政策
- Oracle Cloud Infrastructure 控制台的特殊權限
建立 Google Cloud Storage 值區
- 前往 Google Cloud 控制台。
- 選取專案或建立新專案。
- 在導覽選單中,依序前往「Cloud Storage」>「Bucket」。
- 按一下「建立值區」。
請提供下列設定詳細資料:
設定 值 為 bucket 命名 輸入全域不重複的名稱 (例如 oci-audit-logs-gcs)位置類型 根據需求選擇 (區域、雙區域、多區域) 位置 選取地點 (例如 us-central1)儲存空間級別 標準 (建議用於經常存取的記錄) 存取控管 統一 (建議) 保護工具 選用:啟用物件版本管理或保留政策 點選「建立」。
設定 Oracle Cloud Infrastructure,將稽核記錄匯出至 GCS
Oracle Cloud Infrastructure 不支援原生匯出至 Google Cloud Storage。您將搭配使用 Oracle Cloud Infrastructure Service Connector Hub 和函式,將稽核記錄轉送至 GCS。
建立 Oracle Cloud Infrastructure Function,將記錄轉送至 GCS
- 登入 Oracle Cloud Console。
- 依序前往「開發人員服務」>「函式」>「應用程式」。
- 選取要建立函式應用程式的區間。
- 點選「Create Application」(建立應用程式)。
- 請提供下列設定詳細資料:
- 「Name」(名稱):輸入
audit-logs-to-gcs-app。 - VCN:選取虛擬雲端網路。
- 子網路:選取可存取網際網路的子網路。
- 「Name」(名稱):輸入
- 點選「建立」。
- 建立應用程式後,按一下「開始使用」,然後按照操作說明,使用 Fn CLI 設定本機開發環境。
在本機電腦上建立新的函式目錄:
mkdir oci-audit-to-gcs cd oci-audit-to-gcs初始化 Python 函式:
fn init --runtime python oci-audit-to-gcs cd oci-audit-to-gcs將
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 )使用下列依附元件更新
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_BUCKET您的 GCS bucket 名稱 (例如 oci-audit-logs-gcs)GCS_PREFIX記錄檔的前置字串 (例如 oci-audit-logs)GCS_CREDENTIALS_JSONGCP 服務帳戶金鑰的 JSON 字串 (請見下文) 按一下 [儲存變更]。
為 Oracle Cloud Infrastructure Function 建立 GCP 服務帳戶
Oracle Cloud Infrastructure Function 需要 GCP 服務帳戶,才能寫入 GCS bucket。
- 在 GCP 主控台中,依序前往「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。
- 按一下 [Create Service Account] (建立服務帳戶)。
- 請提供下列設定詳細資料:
- 服務帳戶名稱:輸入
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 bucket 的寫入權限:
- 依序前往「Cloud Storage」>「Buckets」。
- 按一下 bucket 名稱 (
oci-audit-logs-gcs)。 - 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 請提供下列設定詳細資料:
- 新增主體:輸入服務帳戶電子郵件地址 (
oci-function-gcs-writer@PROJECT_ID.iam.gserviceaccount.com)。 - 指派角色:選取「Storage 物件管理員」。
- 新增主體:輸入服務帳戶電子郵件地址 (
- 按一下 [儲存]。
建立 Oracle Cloud Infrastructure 服務連接器中樞
- 登入 Oracle Cloud 控制台。
- 依序前往「可觀測性與管理」>「記錄」>「服務連接器中樞」。
- 選取要建立服務連接器的區間。
- 按一下「建立服務連接器」。
請提供下列設定詳細資料:
- 服務連接器資訊:
設定 值 連接器名稱 進入 audit-logs-to-gcs-connector說明 進入 Forward OCI Audit logs to Google Cloud Storage資源區間 選取隔間 - 設定來源:
設定 值 資料來源 選取「記錄」 Compartment 選取包含稽核記錄的區間 記錄群組 選取「_Audit」 (稽核記錄的預設記錄檔群組) 按一下「+ 另一個記錄」。
選取區間的稽核記錄 (例如
_Audit_Include_Subcompartment)。- 設定目標:
設定 值 目標 選取「函式」 函式區間 選取包含函式的區間 函式應用程式 選取「 audit-logs-to-gcs-app」功能 選取「 oci-audit-to-gcs」捲動至「設定工作 (選用)」,保留預設設定。
點選「建立」。
為服務連接器 Hub 建立 IAM 政策
服務連接器中樞需要函式的叫用權限。
- 在 Oracle Cloud 控制台中,依序前往「Identity & Security」>「Policies」。
- 選取您建立 Service Connector Hub 的區間。
- 點選「建立政策」。
- 請提供下列設定詳細資料:
- 「Name」(名稱):輸入
service-connector-functions-policy。 - 說明:輸入
Allow Service Connector Hub to invoke Functions。 - 區間:選取區間。
- 「Name」(名稱):輸入
- 在「政策建立工具」部分,切換「顯示手動編輯器」。
輸入下列政策聲明:
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」>「Buckets」頁面。
- 按一下 bucket 名稱 (
oci-audit-logs-gcs)。 - 前往前置字元資料夾 (
oci-audit-logs/)。 確認值區中是否顯示新的
.ndjson檔案。
擷取 Google SecOps 服務帳戶
Google SecOps 會使用專屬服務帳戶,從 GCS bucket 讀取資料。您必須授予這個服務帳戶值區存取權。
取得服務帳戶電子郵件地址
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
Oracle Cloud Audit Logs)。 - 選取「Google Cloud Storage V2」做為「來源類型」。
- 選取「Oracle Cloud Infrastructure」做為「記錄類型」。
按一下「取得服務帳戶」。系統會顯示專屬的服務帳戶電子郵件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com複製這個電子郵件地址,以便在下一步中使用。
將 IAM 權限授予 Google SecOps 服務帳戶
Google SecOps 服務帳戶需要 GCS bucket 的「Storage 物件檢視者」角色。
- 依序前往「Cloud Storage」>「Buckets」。
- 按一下 bucket 名稱 (
oci-audit-logs-gcs)。 - 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 請提供下列設定詳細資料:
- 新增主體:貼上 Google SecOps 服務帳戶電子郵件地址。
- 指派角色:選取「Storage 物件檢視者」。
按一下 [儲存]。
在 Google SecOps 中設定資訊提供,擷取 Oracle Cloud Infrastructure 稽核記錄
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
Oracle Cloud Audit Logs)。 - 選取「Google Cloud Storage V2」做為「來源類型」。
- 選取「Oracle Cloud Infrastructure」做為「記錄類型」。
- 點選 [下一步]。
指定下列輸入參數的值:
儲存空間 bucket URL:輸入 GCS bucket URI,並加上前置路徑:
gs://oci-audit-logs-gcs/oci-audit-logs/取代:
oci-audit-logs-gcs:您的 GCS bucket 名稱。oci-audit-logs:儲存記錄的選用前置字元/資料夾路徑 (如為根目錄,請留空)。
範例:
- 根層級 bucket:
gs://company-logs/ - 前置字串:
gs://company-logs/oci-audit-logs/ - 有子資料夾:
gs://company-logs/oracle/audit/
- 根層級 bucket:
來源刪除選項:根據偏好設定選取刪除選項:
- 永不:移轉後一律不刪除任何檔案 (建議用於測試)。
- 刪除已轉移的檔案:成功轉移檔案後刪除檔案。
刪除已轉移的檔案和空白目錄:成功轉移後刪除檔案和空白目錄。
檔案存在時間上限:包含在過去天數內修改的檔案。預設值為 180 天。
資產命名空間:資產命名空間。
擷取標籤:要套用至這個動態饋給事件的標籤。
點選 [下一步]。
在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
需要其他協助嗎?向社群成員和 Google SecOps 專業人員尋求答案。