Mengintegrasikan Apigee dengan Google SecOps

Halaman ini berlaku untuk Apigee dan Apigee Hybrid.

Dokumen ini menjelaskan cara mengintegrasikan Apigee dengan Google Security Operations (Google SecOps). Jika Anda menggunakan Google SecOps sebagai solusi SIEM, ikuti langkah-langkah dalam dokumen ini untuk mengonfigurasi Apigee agar mengirim data log ke SecOps.

Untuk memfasilitasi integrasi ini, Google SecOps mendukung parser Apigee untuk menyerap data log Apigee. Lihat juga Menyerap data Google Cloud ke Google Security Operations. Setelah Anda menyelesaikan langkah-langkah konfigurasi dalam dokumen ini, data log Apigee Anda akan mengalir ke Google SecOps.

Untuk mengetahui informasi tentang cara mengintegrasikan SecOps dengan solusi SIEM lainnya, lihat Mengintegrasikan Apigee dengan solusi SIEM Anda.

Audiens

Audiens untuk dokumen ini meliputi:

  • Administrator API bertanggung jawab untuk memastikan keamanan API, mengelola konfigurasi platform, mendukung efisiensi operasional, dan mematuhi persyaratan kepatuhan keamanan.
  • Analis keamanan berfokus pada pendeteksian dan penyelidikan insiden keamanan terkait API secara proaktif untuk meminimalkan risiko dan mengamankan data sensitif.

Ringkasan konfigurasi

Konfigurasi yang dibahas dalam dokumen ini menggunakan kebijakan MessageLogging Apigee untuk mengirim berbagai data log Apigee, termasuk variabel alur tertentu, ke SecOps.

Google SecOps menyediakan filter Cloud Logging khusus yang dapat mengirim jenis log tertentu, termasuk log Apigee, ke Google SecOps secara real time. Google SecOps mendukung parser Apigee untuk menyerap data log Apigee ke Google SecOps. Lihat juga Menyerap data Google Cloud ke Google Security Operations.

Prasyarat

Setelah prasyarat ini dipenuhi, ikuti petunjuk dalam dokumen ini untuk mengintegrasikan Apigee dengan instance SecOps Anda. Sebelum memulai integrasi, pastikan Anda memiliki hal berikut:

  • Akun Apigee atau Apigee Hybrid dengan hak istimewa administratif untuk mengembangkan dan men-deploy proxy API
  • Akun Google SecOps
  • Cloud Logging diaktifkan dan memiliki pengalaman mengonfigurasi dan menggunakan Cloud Logging
  • Pemahaman tentang variabel alur Apigee
  • Pemahaman tentang kebijakan MessageLogging Apigee dan penggunaan serta konfigurasi kebijakan secara umum
  • (Opsional) Pemahaman tentang cara parser Google SecOps digunakan untuk menafsirkan log yang di-ingest. Parser SecOps secara default dibuat untuk mem-parsing dan memahami log Apigee yang diserap oleh kebijakan MessageLogging.
  • Izin IAM Google Cloud untuk menggunakan Cloud Logging API dan memberikan peran IAM ke akun layanan SecOps

Mengintegrasikan Apigee dengan SecOps

Jika Anda menggunakan Google SecOps sebagai solusi SIEM, ikuti langkah-langkah berikut untuk mengirim data log Apigee ke SecOps. Ada dua langkah dasar:

  • Mengonfigurasi kebijakan MessageLogging untuk mengirim data log Apigee ke Cloud Logging
  • Melampirkan kebijakan MessageLogging ke proxy Apigee

Setelah konfigurasi kebijakan MessageLogging yang dijelaskan di bagian ini selesai, data log Apigee yang dikirim ke Cloud Logging akan diuraikan oleh SecOps. Untuk mengetahui informasi mendetail tentang parser dan cara data variabel alur Apigee dipetakan ke kolom data SecOps, lihat Mengintegrasikan Apigee dengan Google SecOps SIEM. Lihat juga Mengumpulkan log Apigee.

Ikuti langkah-langkah berikut untuk mengintegrasikan Apigee dengan SecOps menggunakan kebijakan MessageLogging:

  1. Konfigurasi kebijakan MessageLogging baru. Lihat Melampirkan dan mengonfigurasi kebijakan di UI.

    Berikut adalah contoh kebijakan MessageLogging yang mengirim data ke Cloud Logging. Kebijakan menentukan sejumlah besar variabel alur yang akan dikirim ke Cloud Logging. Anda dapat menambahkan atau menghapus variabel alur sesuai keinginan, bergantung pada kolom yang Anda tentukan penting untuk analisis SecOps. Untuk mengetahui informasi tentang cara data variabel alur Apigee dipetakan ke kolom data SecOps, lihat Mengintegrasikan Apigee dengan Google SecOps SIEM.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <MessageLogging continueOnError="false" enabled="true" name="ML-CloudLoggingSecOps">
       <DisplayName>ML-CloudLoggingSecOps</DisplayName>
       <CloudLogging>
         <LogName>projects/{organization.name}/logs/apigee-secops-integration-{environment.name}</LogName>
         <Message contentType="application/json">{
       "apiproduct.name": "{apiproduct.name}",
       "app.name": "{developer.app.name}",
       "cachehit":"{cachehit}",
       "client.country": "{client.country}",
       "client.cn": "{client.cn}",
       "client.ip": "{proxy.client.ip}",
       "client.locality": "{client.locality}",
       "client.port": "{client.port}",
       "client.scheme": "{client.scheme}",
       "client.state": "{client.state}",
       "developer.email": "{developer.email}",
       "environment.name": "{environment.name}",
       "error":"{is.error}",
       "error.state":"{error.state}",
       "error.message":"{escapeJSON(error.message)}",
       "fault.name":"{fault.name}",
       "messageid":"{messageid}",
       "organization.name": "{organization.name}",
       "proxy.name": "{apiproxy.name}",
       "proxy.basepath": "{proxy.basepath}",
       "proxy.pathsuffix": "{proxy.pathsuffix}",
       "proxy.proxyendpoint.name": "{proxy.name}",
       "proxy.revision":"{apiproxy.revision}",
       "request.content-length":"{request_msg.header.content-length}",
       "request.content-type":"{request_msg.header.content-type}",
       "request.host":"{request_msg.header.host}",
       "request.httpversion": "{request.version}",
       "request.url": "{client.scheme}://{request_msg.header.host}{request_msg.uri}",
       "request.user-agent":"{request.header.user-agent}",
       "request.verb": "{request.verb}",
       "request.x-b3-traceid": "{request.header.x-b3-traceid}",
       "request.x-cloud-trace-context": "{request.header.x-cloud-trace-context}",
       "response.content-length":"{response.header.content-length}",
       "response.content-type":"{response.header.content-type}",
       "response.status.code": "{message.status.code}",
       "system.region.name": "{system.region.name}",
       "system.timestamp": "{system.timestamp}",
       "system.uuid": "{system.uuid}",
       "target.cn": "{target.cn}",
       "target.country": "{target.country}",
       "target.host": "{target.host}",
       "target.ip": "{target.ip}",
       "target.locality": "{target.locality}",
       "target.organization": "{target.organization}",
       "target.port": "{target.port}",
       "target.scheme": "{target.scheme}",
       "target.state": "{target.state}",
       "target.url": "{request.url}"
      }
         </Message>
         <ResourceType>api</ResourceType>
       </CloudLogging>
      </MessageLogging>
  2. Lampirkan kebijakan sebagai langkah bersyarat di proxy API. Salah satu opsinya adalah melampirkan kebijakan dalam FaultRule di PostFlow, tempat kesalahan terkait keamanan biasanya terjadi. Contoh:

    <PostFlow name="PostFlow">
      <Request>
        <Step>
          <Condition>flow.isError == true)</Condition>
          <Name>ML-CloudLoggingSecOps</Name>
        </Step>
      </Request>
    </PostFlow>

    Sekarang, saat proxy API yang menggunakan kebijakan ini dijalankan, data log Apigee akan mengalir ke Google SecOps.

    Praktik umum lainnya adalah menempatkan kebijakan MessageLogging di PostClientFlow respons ProxyEndpoint.

    Pertimbangkan saran berikut saat melampirkan kebijakan MessageLogging ke proxy API Anda:

    • Tempatkan kebijakan di FaultRule. FaultRule adalah lokasi yang direkomendasikan untuk mencatat pengecualian keamanan dan pelanggaran kebijakan.
    • Tempatkan kebijakan di PostFlow. PostFlow adalah lokasi lain yang sesuai untuk mencatat masalah keamanan.
    • Hindari mencatat permintaan yang berhasil. Untuk pemantauan keamanan yang berfokus pada ancaman, Anda biasanya mencatat detail saat terjadi masalah (kesalahan muncul). Mencatat setiap permintaan yang berhasil dengan konten pesan lengkap dapat menghasilkan log yang berlebihan dan meningkatkan biaya.
    • Pertimbangkan variabel kustom untuk kasus penggunaan tertentu. Misalnya, jika Anda perlu mengambil URI permintaan asli dalam alur kesalahan, Anda dapat menggunakan kebijakan AssignMessage di PreFlow permintaan untuk menyalinnya ke variabel kustom (seperti original.request.uri), lalu mencatat variabel tersebut dalam kebijakan MessageLogging.

Praktik terbaik

Pertimbangkan praktik terbaik berikut saat mengonfigurasi Apigee dengan Google SecOps:

  • Fokus pada konteks keamanan: Hanya mencatat variabel alur yang memberikan konteks berharga untuk pemantauan keamanan dan deteksi ancaman. Hindari logging data yang tidak terkait dengan keamanan secara berlebihan.
  • Gunakan format logging yang konsisten: Pertahankan format logging yang konsisten di seluruh proxy API Anda yang menggunakan SecOps.
  • Gunakan akun layanan yang aman: Patuhi praktik terbaik keamanan untuk mengelola dan mengamankan akun layanan Google Cloud yang digunakan untuk penyerapan SecOps. Jika memungkinkan, batasi izin ke Pelihat Log.
  • Pantau feed SecOps: Pantau secara rutin kondisi dan status feed SecOps Anda untuk memastikan log berhasil di-ingest dan tanpa error.
  • Gunakan aturan dan dasbor SecOps: Setelah log yang relevan dengan keamanan berada di SecOps, kembangkan aturan dan dasbor tertentu untuk mendeteksi dan memvisualisasikan ancaman keamanan berdasarkan informasi mendetail yang Anda catat.

Pemecahan masalah

Bagian ini menjelaskan beberapa kemungkinan masalah yang mungkin Anda alami saat mengonfigurasi Apigee dengan SecOps dan hal-hal yang perlu diperiksa.

Masalah: Log peristiwa keamanan tidak muncul di Cloud Logging

Hal-hal yang perlu diperiksa:

  • Periksa kembali apakah Kebijakan MessageLogging Anda dikonfigurasi dengan benar dengan Condition untuk dipicu saat peristiwa keamanan terjadi.
  • Pastikan kebijakan MessageLogging dilampirkan ke konteks alur yang sesuai, seperti FaultRule atau PostFlow.
  • Pastikan Cloud Logging diaktifkan di project Google Cloud Anda.
  • Tinjau pesan error apa pun di log proxy Apigee yang terkait dengan Kebijakan MessageLogging.

Masalah: Log peristiwa keamanan tidak muncul di SecOps

  • Pastikan feed SecOps Anda dikonfigurasi dengan benar menggunakan project ID, filter log (pastikan filter log mengambil log dari kebijakan pencatatan aktivitas keamanan Anda), dan kredensial akun layanan yang benar.
  • Periksa status feed SecOps Anda di UI SecOps untuk melihat apakah ada pesan error atau masalah penyerapan.
  • Pastikan akun layanan yang digunakan oleh SecOps memiliki peran Pelihat Log di project Google Cloud Anda.
  • Tinjau struktur JSON log Anda di Cloud Logging untuk memastikan log tersebut disusun dengan baik dan berisi nama kolom yang diharapkan.
  • Pastikan parser Google Cloud yang sesuai diaktifkan.
  • Jika Anda mencurigai masalah parsing, periksa entri log sampel dalam data mentah SecOps untuk melihat cara penyerapan data sebelum parsing. Jika kolom tertentu tidak diekstrak seperti yang diharapkan, Anda mungkin perlu meninjau dokumentasi parser SecOps atau mempertimbangkan apakah parser kustom diperlukan.

Mengintegrasikan Apigee dengan SIEM Google SecOps

Tabel berikut memetakan nama variabel alur Apigee ke nama kolom SIEM Google SecOps yang setara. Misalnya, saat melihat data log Apigee di Cloud Logging, variabel alur client.id dipetakan ke kolom SIEM SecOps yang disebut principle_ip. Lihat juga Mengumpulkan log Apigee.

Variabel alur Apigee Nama kolom SecOps SIEM Deskripsi
client.country principal.hostname IP host HTTP yang terkait dengan permintaan yang diterima oleh ProxyEndpoint.
client.host principal.location.country_or_region Negara dalam sertifikat TLS/SSL yang diberikan oleh aplikasi klien. Permintaan proxy principal.location.country_or_region.
client.ip principle.ip Alamat IP klien atau sistem yang mengirim pesan ke load balancer. Misalnya, ini bisa berupa IP klien asli atau IP load balancer.
client.locality principal.location.city Lokalitas (Kota) dalam sertifikat TLS/SSL yang diberikan oleh klien.
client.port principal.port Port HTTP yang terkait dengan permintaan klien asal ke ProxyEndpoint.
client.state principal.location.state Status di sertifikat TLS/SSL yang ditampilkan oleh klien.
organization.name intermediary.cloud.project.name Nama organisasi Apigee.
proxy.client.ip src.ip Alamat X-Forwarded-For dari panggilan masuk, yang merupakan alamat IP yang diterima Apigee dari handshake TCP eksternal terakhir. Ini bisa berupa klien yang memanggil atau load balancer.
proxy.name intermediary.resource.name Atribut nama yang dikonfigurasi untuk ProxyEndpoint.
proxy.pathsuffix intermediary.resource.attribute.labels[pathsuffix] "Nilai akhiran jalur di URL yang dikirim dari klien dan diterima di ProxyEndpoint. Basepath adalah komponen jalur paling kiri yang secara unik mengidentifikasi proxy API dalam Grup Lingkungan. Misalkan Anda telah mengonfigurasi endpoint Proxy API dengan basepath /v2/weatherapi. Dalam hal ini, permintaan yang dikirim ke https://myhost.example.net/v2/weatherapi/forecastrss?w=12797282, variabel proxy.pathsuffix akan menyimpan string /forecastrss."
proxy.url intermediary.url "Mendapatkan URL lengkap yang terkait dengan permintaan proxy yang diterima oleh ProxyEndpoint, termasuk parameter kueri yang ada. Untuk contoh yang membuat URL permintaan menggunakan host permintaan asli (bukan host router yang digunakan di proxy.url), lihat Mengakses pesan permintaan."
request.uri target.resource.name Nama domain layanan target yang menampilkan respons ke proxy API.
request.verb network.http.method Kata kerja HTTP yang digunakan untuk permintaan. Misalnya, GET, PUT, dan DELETE.
response.content security_result.description Konten payload pesan respons yang ditampilkan oleh target.
response.status.code network.http.response_code Kode respons yang ditampilkan untuk permintaan. Anda dapat menggunakan variabel ini untuk mengganti kode status respons, yang disimpan dalam message.status.code. Untuk mengetahui informasi selengkapnya, lihat pesan.
system.region.name intermediary.location.name Nama region pusat data tempat proxy berjalan.
system.timestamp additional.fields[jsonPayload_system_timestamp] Bilangan bulat 64-bit (long) yang merepresentasikan waktu saat variabel ini dibaca. Nilainya adalah jumlah milidetik yang berlalu sejak tengah malam, pada 1 Januari 1970 UTC. Misalnya, 1534783015000.
system.uuid intermediary.process.pid atau intermediary.process.product_specific_process_id UUID pemroses pesan yang menangani proxy.
target.country target.location.country_or_region Negara sertifikat TLS/SSL yang diberikan oleh server target
target.host target.hostname Nama domain layanan target yang menampilkan respons ke proxy API.
target.ip target.ip Alamat IP layanan target yang menampilkan respons ke proxy API.
target.locality target.location.city Lokalitas (kota) sertifikat TLS/SSL yang diberikan oleh server target
target.organization target.resource_ancestors.name Organisasi sertifikat TLS/SSL yang diberikan oleh server target.
target.port target.port Nomor port layanan target yang menampilkan respons ke proxy API.
target.scheme target.network.application_protocol Menampilkan HTTP atau HTTPS, bergantung pada pesan permintaan.
target.state target.location.state Status sertifikat TLS/SSL yang diberikan oleh server target.
target.url target.url URL yang dikonfigurasi dalam file XML TargetEndpoint atau URL target dinamis (jika target.url ditetapkan selama alur pesan). Variabel tidak menyertakan elemen jalur tambahan atau parameter kueri. Menampilkan null jika dipanggil di luar cakupan atau tidak disetel.

Catatan: Gunakan kebijakan JavaScript yang dilampirkan ke TargetEndpoint untuk menetapkan variabel ini.