Mengumpulkan log Oracle Cloud Infrastructure

Didukung di:

Dokumen ini menjelaskan cara menyerap log Oracle Cloud Infrastructure ke Google Security Operations menggunakan Google Cloud Storage.

Layanan Audit Oracle Cloud Infrastructure (OCI) secara otomatis mencatat panggilan ke semua endpoint application programming interface (API) publik OCI yang didukung sebagai peristiwa log. Peristiwa log yang dicatat oleh layanan Audit mencakup panggilan API yang dilakukan oleh Konsol OCI, Command Line Interface (CLI), Software Development Kit (SDK), klien kustom Anda sendiri, atau layanan OCI lainnya. Informasi dalam log mencakup waktu terjadinya aktivitas API, sumber dan target aktivitas, jenis tindakan, dan jenis respons.

Sebelum memulai

Pastikan Anda memiliki prasyarat berikut:

  • Instance Google SecOps
  • Project GCP dengan Cloud Storage API diaktifkan
  • Izin untuk membuat dan mengelola bucket GCS
  • Izin untuk mengelola kebijakan IAM di bucket GCS
  • Izin untuk membuat layanan Cloud Run, topik Pub/Sub, dan tugas Cloud Scheduler
  • Akun Oracle Cloud Infrastructure dengan izin untuk membuat dan mengelola:
    • Konektor Service Connector Hub
    • Aplikasi dan fungsi
    • Bucket Penyimpanan Objek
    • Kebijakan IAM
  • Akses istimewa ke Konsol Oracle Cloud

Buat bucket Google Cloud Storage

  1. Buka Konsol Google Cloud.
  2. Pilih project Anda atau buat project baru.
  3. Di menu navigasi, buka Cloud Storage > Buckets.
  4. Klik Create bucket.
  5. Berikan detail konfigurasi berikut:

    Setelan Nilai
    Beri nama bucket Anda Masukkan nama yang unik secara global (misalnya, oci-audit-logs-gcs)
    Location type Pilih berdasarkan kebutuhan Anda (Region, Dual-region, Multi-region)
    Location Pilih lokasi (misalnya, us-central1)
    Kelas penyimpanan Standar (direkomendasikan untuk log yang sering diakses)
    Kontrol akses Seragam (direkomendasikan)
    Alat perlindungan Opsional: Aktifkan pembuatan versi objek atau kebijakan retensi
  6. Klik Create.

Mengonfigurasi Oracle Cloud Infrastructure untuk mengekspor log Audit ke GCS

Oracle Cloud Infrastructure tidak mendukung ekspor bawaan ke Google Cloud Storage. Anda akan menggunakan OCI Service Connector Hub dengan OCI Function untuk meneruskan log Audit ke GCS.

Membuat OCI Function untuk meneruskan log ke GCS

  1. Login ke Oracle Cloud Console.
  2. Buka menu navigasi, lalu pilih Developer Services > Functions > Applications.
  3. Pilih kompartemen tempat Anda ingin membuat aplikasi fungsi.
  4. Klik Create Application.
  5. Berikan detail konfigurasi berikut:
    • Nama: Masukkan audit-logs-to-gcs-app.
    • VCN: Pilih Virtual Cloud Network.
    • Subnets: Pilih subnet dengan akses internet.
  6. Klik Create.
  7. Setelah aplikasi dibuat, klik Mulai dan ikuti petunjuk untuk menyiapkan lingkungan pengembangan lokal dengan Fn CLI.
  8. Buat direktori fungsi baru di komputer lokal Anda:

    mkdir oci-audit-to-gcs
    cd oci-audit-to-gcs
    
  9. Lakukan inisialisasi fungsi Python:

    fn init --runtime python oci-audit-to-gcs
    cd oci-audit-to-gcs
    
  10. Ganti konten func.py dengan kode berikut:

    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. Perbarui requirements.txt dengan dependensi berikut:

    fdk>=0.1.0
    google-cloud-storage>=2.0.0
    google-auth>=2.0.0
    
  12. Deploy fungsi ke OCI:

    fn -v deploy --app audit-logs-to-gcs-app
    
  13. Setelah deployment selesai, catat OCID fungsi. Anda akan menggunakannya saat mengonfigurasi Service Connector Hub.

Mengonfigurasi variabel lingkungan fungsi

  1. Di Konsol Oracle Cloud, buka Developer Services > Functions > Applications.
  2. Klik aplikasi (audit-logs-to-gcs-app).
  3. Klik nama fungsi (oci-audit-to-gcs).
  4. Klik Konfigurasi.
  5. Tambahkan variabel konfigurasi berikut:

    Kunci Nilai
    GCS_BUCKET Nama bucket GCS Anda (misalnya, oci-audit-logs-gcs)
    GCS_PREFIX Awalan untuk file log (misalnya, oci-audit-logs)
    GCS_CREDENTIALS_JSON String JSON kunci akun layanan GCP
  6. Klik Simpan perubahan.

Buat akun layanan GCP untuk OCI Function

OCI Function memerlukan akun layanan GCP untuk menulis ke bucket GCS.

  1. Di Konsol GCP, buka IAM & Admin > Service Accounts.
  2. Klik Create Service Account.
  3. Berikan detail konfigurasi berikut:
    • Nama akun layanan: Masukkan oci-function-gcs-writer.
    • Deskripsi akun layanan: Masukkan Service account for OCI Function to write Audit logs to GCS.
  4. Klik Create and Continue.
  5. Di bagian Grant this service account access to project, tambahkan peran berikut:
    1. Klik Pilih peran.
    2. Telusuri dan pilih Storage Object Admin.
  6. Klik Lanjutkan.
  7. Klik Done.
  8. Klik email akun layanan yang baru dibuat.
  9. Buka tab Kunci.
  10. Klik Add Key > Create new key.
  11. Pilih JSON sebagai jenis kunci.
  12. Klik Create.
  13. File kunci JSON akan didownload ke komputer Anda.
  14. Buka file kunci JSON dan salin seluruh isinya.
  15. Kembali ke konfigurasi fungsi Oracle Cloud Console.
  16. Tempelkan konten JSON ke variabel konfigurasi GCS_CREDENTIALS_JSON.

Memberikan izin IAM pada bucket GCS

Beri akun layanan izin tulis di bucket GCS:

  1. Buka Cloud Storage > Buckets.
  2. Klik nama bucket Anda (oci-audit-logs-gcs).
  3. Buka tab Izin.
  4. Klik Grant access.
  5. Berikan detail konfigurasi berikut:
    • Tambahkan prinsipal: Masukkan email akun layanan (oci-function-gcs-writer@PROJECT_ID.iam.gserviceaccount.com).
    • Tetapkan peran: Pilih Storage Object Admin.
  6. Klik Simpan.

Membuat konektor OCI Service Connector Hub

  1. Login ke Oracle Cloud Console.
  2. Buka menu navigasi, lalu pilih Analytics & AI. Di bagian Messaging, pilih Connector Hub.
  3. Pilih kompartemen tempat Anda ingin membuat konektor layanan.
  4. Klik Create connector.
  5. Berikan detail konfigurasi berikut:

    Informasi konektor:

    Setelan Nilai
    Nama Konektor Masukkan audit-logs-to-gcs-connector
    Deskripsi Masukkan Forward OCI Audit logs to Google Cloud Storage
    Kompartemen Resource Pilih kompartemen

    Konfigurasi sumber:

    Setelan Nilai
    Source Pilih Logging
    Compartment Pilih kompartemen yang berisi log audit
    Grup Log Pilih _Audit (grup log default untuk log audit)
  6. Klik + Another Log.

  7. Pilih log audit untuk kompartemen Anda (misalnya, _Audit_Include_Subcompartment).

    Konfigurasi target:

    Setelan Nilai
    Target Pilih Functions
    Kompartemen Fungsi Pilih kompartemen yang berisi fungsi
    Penerapan Fungsi Pilih audit-logs-to-gcs-app
    Fungsi Pilih oci-audit-to-gcs
  8. Di bagian Konfigurasi tugas (opsional), biarkan setelan default.

  9. Jika diminta untuk membuat kebijakan (diperlukan untuk akses guna membuat atau memperbarui konektor layanan), pilih Buat.

  10. Klik Create.

Buat kebijakan IAM untuk Service Connector Hub

Service Connector Hub memerlukan izin untuk memanggil fungsi.

  1. Di Konsol Oracle Cloud, buka Identity & Security > Policies.
  2. Pilih kompartemen tempat Anda membuat konektor Service Connector Hub.
  3. Klik Create Policy.
  4. Berikan detail konfigurasi berikut:
    • Nama: Masukkan service-connector-functions-policy.
    • Deskripsi: Masukkan Allow Service Connector Hub to invoke Functions.
    • Compartment: Pilih kompartemen.
  5. Di bagian Pembuat Kebijakan, alihkan Tampilkan editor manual.
  6. Masukkan pernyataan kebijakan berikut:

    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. Klik Create.

Menguji integrasi

  1. Login ke Konsol Oracle Cloud.
  2. Lakukan beberapa tindakan yang menghasilkan log audit (misalnya, buat atau ubah resource).
  3. Tunggu 2-5 menit hingga log diproses.
  4. Buka Cloud Storage > Buckets di GCP Console.
  5. Klik nama bucket Anda (oci-audit-logs-gcs).
  6. Buka folder awalan (oci-audit-logs/).
  7. Pastikan file .ndjson baru muncul di bucket.

Mengambil akun layanan Google SecOps

Google SecOps menggunakan akun layanan unik untuk membaca data dari bucket GCS Anda. Anda harus memberi akun layanan ini akses ke bucket Anda.

Dapatkan email akun layanan

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan Feed Baru.
  3. Klik Konfigurasi satu feed.
  4. Di kolom Nama feed, masukkan nama untuk feed (misalnya, Oracle Cloud Audit Logs).
  5. Pilih Google Cloud Storage V2 sebagai Source type.
  6. Pilih Oracle Cloud Infrastructure Audit Logs sebagai Log type.
  7. Klik Get Service Account. Email akun layanan yang unik akan ditampilkan, misalnya:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Salin alamat email ini untuk digunakan di langkah berikutnya.

Memberikan izin IAM ke akun layanan Google SecOps

Akun layanan Google SecOps memerlukan peran Storage Object Viewer di bucket GCS Anda.

  1. Buka Cloud Storage > Buckets.
  2. Klik nama bucket Anda (oci-audit-logs-gcs).
  3. Buka tab Izin.
  4. Klik Grant access.
  5. Berikan detail konfigurasi berikut:
    • Add principals: Tempel email akun layanan Google SecOps.
    • Tetapkan peran: Pilih Storage Object Viewer.
  6. Klik Simpan.

Mengonfigurasi feed di Google SecOps untuk menyerap log Audit Oracle Cloud Infrastructure

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan Feed Baru.
  3. Klik Konfigurasi satu feed.
  4. Di kolom Nama feed, masukkan nama untuk feed (misalnya, Oracle Cloud Audit Logs).
  5. Pilih Google Cloud Storage V2 sebagai Source type.
  6. Pilih Oracle Cloud Infrastructure Audit Logs sebagai Log type.
  7. Klik Berikutnya.
  8. Tentukan nilai untuk parameter input berikut:

    • URL bucket penyimpanan: Masukkan URI bucket GCS dengan jalur awalan:

      gs://oci-audit-logs-gcs/oci-audit-logs/
      
    • Ganti:

      • oci-audit-logs-gcs: Nama bucket GCS Anda.
      • oci-audit-logs: Awalan/jalur folder opsional tempat log disimpan (biarkan kosong untuk root).
    • Contoh:

      • Bucket root: gs://company-logs/
      • Dengan awalan: gs://company-logs/oci-audit-logs/
      • Dengan subfolder: gs://company-logs/oracle/audit/
    • Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda:
      • Jangan pernah menghapus file: Tidak pernah menghapus file apa pun setelah transfer (direkomendasikan untuk pengujian).
      • Hapus file yang ditransfer dan direktori kosong: Menghapus file dan direktori kosong setelah transfer berhasil.
    • Usia File Maksimum (Hari): Sertakan file yang diubah dalam jumlah hari terakhir. Defaultnya adalah 180 hari.
    • Namespace aset: Namespace aset.
    • Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini.
  9. Klik Berikutnya.

  10. Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.

Tabel pemetaan UDM

Kolom Log Pemetaan UDM Logika
authorization_field additional.fields Digabung
compartment_id_field additional.fields Digabung
compartment_name_field additional.fields Digabung
content_length_field additional.fields Digabung
content_type_field additional.fields Digabung
event_grouping_id_field additional.fields Digabung
tenant_id_label additional.fields Digabung
data.message metadata.description Dipetakan secara langsung
time metadata.event_timestamp Diuraikan sebagai ISO8601
has_principal_hostname metadata.event_type Dipetakan: true → STATUS_UPDATE
oracle.tenantid metadata.product_deployment_id Dipetakan secara langsung
type metadata.product_event_type Dipetakan secara langsung
oracle.logid metadata.product_log_id Dipetakan secara langsung
specversion metadata.product_version Dipetakan secara langsung
data.request.action network.http.method Dipetakan secara langsung
data.identity.userAgent network.http.parsed_user_agent Diganti nama/dipetakan
data.response.status network.http.response_code Diganti nama/dipetakan
ip_protocol_out network.ip_protocol Dipetakan secara langsung
data.bytesOut network.sent_bytes Diganti nama/dipetakan
data.packets network.sent_packets Diganti nama/dipetakan
data.identity.consoleSessionId network.session_id Diganti nama/dipetakan
id principal.asset.product_object_id Dipetakan secara langsung
source principal.hostname Dipetakan secara langsung
data.identity.ipAddress principal.ip Digabung
data.sourceAddress principal.ip Digabung
data.sourcePort principal.port Diganti nama/dipetakan
compartmentid_label principal.resource.attribute.labels Digabung
forward_label principal.resource.attribute.labels Digabung
loggroupid_label principal.resource.attribute.labels Digabung
vniccompartmentocid_label principal.resource.attribute.labels Digabung
vnicocid_label principal.resource.attribute.labels Digabung
vnicsubnetocid_label principal.resource.attribute.labels Digabung
data.flowid principal.resource.product_object_id Dipetakan secara langsung
credentials_label principal.user.attribute.labels Digabung
data.identity.principalName principal.user.user_display_name Dipetakan secara langsung
data.identity.principalId principal.user.userid Dipetakan secara langsung
action security_result.action Digabung
endTime_label security_result.detection_fields Digabung
startTime_label security_result.detection_fields Digabung
status_label security_result.detection_fields Digabung
version_label security_result.detection_fields Digabung
data.destinationAddress target.ip Digabung
data.destinationPort target.port Diganti nama/dipetakan
data.request.path target.url Dipetakan secara langsung
T/A metadata.event_type Konstanta: GENERIC_EVENT
T/A metadata.product_name Konstanta: ORACLE CLOUD AUDIT
T/A metadata.vendor_name Konstanta: ORACLE

Log Perubahan

Melihat Log Perubahan untuk parser ini

Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.