Analisis log keamanan di Google Cloud

Last reviewed 2024-05-21 UTC

Panduan ini menunjukkan kepada praktisi keamanan cara mengaktivasi log Google Cloud untuk digunakan dalam analisis keamanan. Dengan menjalankan analisis keamanan, Anda membantu organisasi Anda mencegah, mendeteksi, dan merespons ancaman seperti malware, phishing, ransomware, dan aset yang tidak dikonfigurasi dengan baik.

Panduan ini menunjukkan cara melakukan hal berikut:

  • Aktifkan log untuk dianalisis.
  • Rutekan log tersebut ke satu tujuan bergantung pada pilihan alat analisis keamanan Anda, seperti Log Analytics, BigQuery, Google Security Operations, atau teknologi informasi keamanan dan manajemen peristiwa (SIEM) pihak ketiga.
  • Analisis log tersebut untuk mengaudit penggunaan cloud Anda dan mendeteksi potensi ancaman terhadap data dan workload Anda, menggunakan contoh kueri dari project Analisis Keamanan Komunitas (CSA).

Informasi dalam panduan ini adalah bagian dari Operasi Keamanan Otonom, Google Cloud, yang mencakup transformasi yang dipimpin oleh engineer untuk praktik deteksi dan respons serta analisis keamanan untuk meningkatkan kemampuan deteksi ancaman Anda.

Dalam panduan ini, log menyediakan sumber data untuk dianalisis. Namun, Anda dapat menerapkan konsep dari panduan ini untuk analisis data pelengkap terkait keamanan lainnya dari Google Cloud, seperti temuan keamanan dari Security Command Center. Yang disediakan di Security Command Center Premium adalah daftar detektor terkelola yang diupdate secara berkala, yang dirancang untuk mengidentifikasi ancaman, kerentanan, dan kesalahan konfigurasi dalam sistem Anda hampir secara real-time. Dengan menganalisis sinyal-sinyal ini dari Security Command Center dan menghubungkannya dengan log yang ditransfer dalam alat analisis keamanan Anda seperti yang dijelaskan dalam panduan ini, Anda dapat mencapai perspektif yang lebih luas terhadap potensi ancaman keamanan.

Diagram berikut menunjukkan cara sumber data keamanan, alat analisis keamanan, dan kueri CSA berfungsi bersama.

Alat dan konten analisis keamanan.

Diagram ini dimulai dengan sumber data keamanan berikut: log dari Cloud Logging, perubahan aset dari Inventaris Aset Cloud, dan temuan keamanan dari Security Command Center. Diagram kemudian menunjukkan sumber data keamanan ini yang diarahkan ke alat analisis keamanan pilihan Anda: Log Analytics di Cloud Logging, BigQuery, Google Security Operations, atau SIEM pihak ketiga. Terakhir, diagram menunjukkan penggunaan kueri CSA dengan alat analisis untuk menganalisis data keamanan yang tersusun.

Alur kerja analisis log keamanan

Bagian ini menjelaskan langkah-langkah untuk menyiapkan analisis log keamanan di Google Cloud. Alur kerja terdiri dari tiga langkah yang ditampilkan dalam diagram berikut dan dijelaskan dalam paragraf berikut:

Tiga langkah untuk menyiapkan analisis log keamanan: (1) mengaktifkan log, (2) merutekan log, dan (3) menganalisis log.

  • Aktifkan log: Ada banyak log keamanan yang tersedia di Google Cloud. Setiap log memiliki informasi berbeda yang dapat berguna untuk menjawab pertanyaan keamanan tertentu. Beberapa log seperti log audit Aktivitas Admin diaktifkan secara default; yang lain perlu diaktifkan secara manual karena akan menimbulkan biaya transfer tambahan di Cloud Logging. Oleh karena itu, langkah pertama dalam alur kerja ini adalah memprioritaskan log keamanan yang paling relevan untuk kebutuhan analisis keamanan Anda dan mengaktifkan log spesifik tersebut satu per satu.

    Untuk membantu Anda mengevaluasi log dalam hal cakupan visibilitas dan deteksi ancaman yang diberikan, panduan ini menyertakan lalat pencakupan log. Alat ini memetakan setiap log ke taktik dan teknik ancaman yang relevan dalam Matriks MITRE ATT&CK® untuk Perusahaan. Alat ini juga memetakan aturan Event Threat Detection di Security Command Center ke log yang diandalkan. Anda dapat menggunakan alat pencakupan log untuk mengevaluasi log, terlepas dari alat analisis yang Anda gunakan.

  • Rute log: Setelah mengidentifikasi dan mengaktifkan log untuk dianalisis, langkah selanjutnya adalah merutekan dan menggabungkan log dari organisasi Anda, termasuk folder, project, dan akun penagihan yang ada di dalamnya. Cara Anda merutekan log bergantung pada alat analisis yang Anda gunakan.

    Panduan ini menjelaskan tujuan pemilihan rute log yang umum, dan menunjukkan cara menggunakan Cloud Logging sink gabungan untuk mengarahkan log seluruh organisasi ke Cloud Logging bucket log atau set data BigQuery, bergantung pada apakah Anda memilih menggunakan Log Analytics atau BigQuery untuk analisis.

  • Analisis log: Setelah mengarahkan log ke alat analisis, langkah selanjutnya adalah melakukan analisis log ini untuk mengidentifikasi potensi ancaman keamanan. Cara menganalisis log bergantung pada alat analisis yang Anda gunakan. Jika Anda menggunakan Log Analytics atau BigQuery, Anda dapat menganalisis log dengan menggunakan kueri SQL. Jika Anda menggunakan Google Security Operations, Anda menganalisis log menggunakan aturan YARA-L. Jika Anda menggunakan alat SIEM pihak ketiga, Anda menggunakan bahasa kueri yang ditentukan oleh alat tersebut.

    Dalam panduan ini, Anda akan menemukan kueri SQL yang dapat digunakan untuk menganalisis log di Log Analytics atau BigQuery. Kueri SQL yang disediakan dalam panduan ini berasal dari project Analisis Keamanan Komunitas (CSA). CSA adalah kumpulan analisis keamanan dasar open source yang dirancang untuk memberi Anda dasar pengukuran kueri dan aturan bawaan yang dapat digunakan kembali untuk mulai menganalisis log Google Cloud Anda.

Bagian berikut memberikan informasi mendetail mengenai cara menyiapkan dan menerapkan setiap langkah dalam alur kerja analisis log keamanan.

Aktifkan log

Proses pengaktifan log melibatkan langkah-langkah berikut:

  1. Identifikasi log yang Anda butuhkan dengan menggunakan alat pencakupan log dalam panduan ini.
  2. Catat filter log yang dihasilkan oleh alat cakupan log untuk digunakan nanti saat mengonfigurasi sink log.
  3. Aktifkan logging untuk setiap jenis log atau layanan Google Cloud yang diidentifikasi. Bergantung pada layanannya, Anda mungkin juga perlu mengaktifkan log audit Akses Data yang sesuai seperti yang dijelaskan nanti di bagian ini.

Mengidentifikasi log menggunakan alat pencakupan log

Untuk membantu mengidentifikasi log yang memenuhi kebutuhan keamanan dan kepatuhan, Anda dapat menggunakan alat pencakupan log yang ditunjukkan di bagian ini. Alat ini menyediakan tabel interaktif yang mencantumkan log penting yang relevan dengan keamanan di seluruh Google Cloud, termasuk Cloud Audit Logs, log Transparansi Akses, log jaringan, dan beberapa log platform. Alat ini memetakan setiap jenis log ke area berikut:

Alat cakupan log juga menghasilkan filter log yang muncul tepat setelah tabel. Saat Anda mengidentifikasi log yang diperlukan, pilih log tersebut di alat untuk memperbarui filter log tersebut secara otomatis.

Prosedur singkat berikut menjelaskan cara menggunakan alat pencakupan log:

  • Untuk memilih atau menghapus log dalam alat cakupan log, klik tombol di samping nama log.
  • Untuk memilih atau menghapus semua log, klik tombol di samping judul Log type.
  • Untuk melihat teknik MITRE ATT&CK yang dapat dipantau oleh setiap jenis log, klik di samping judul Taktik dan teknik MITRE ATT&CK.

Alat pencakupan logg

Merekam filter log

Filter log yang otomatis dibuat oleh alat pencakupan log berisi semua log yang telah Anda pilih di alat ini. Anda dapat menggunakan filter apa adanya atau menyaring filter log lebih lanjut sesuai kebutuhan Anda. Misalnya, Anda dapat menyertakan (atau mengecualikan) resource hanya dalam satu atau beberapa project tertentu. Setelah memiliki filter log yang memenuhi persyaratan logging, Anda harus menyimpan filter untuk digunakan saat merutekan log. Misalnya, Anda dapat menyimpan filter dalam editor teks atau menyimpannya dalam variabel lingkungan sebagai berikut:

  1. Di bagian "Auto-generated log filter" yang mengikuti alat ini, salin kode untuk filter log.
  2. Opsional: Edit kode yang disalin untuk menyaring filter.
  3. Di Cloud Shell, buat variabel untuk menyimpan filter log:

    export LOG_FILTER='LOG_FILTER'
    

    Ganti LOG_FILTER dengan kode untuk filter log.

Mengaktifkan log platform khusus layanan

Untuk setiap log platform yang Anda pilih di alat pencakupan log, log tersebut harus diaktifkan (biasanya pada tingkat resource) berdasarkan layan ke layanan. Misalnya, log Cloud DNS diaktifkan di tingkat jaringan VPC. Demikian juga, Log Alur VPC diaktifkan di tingkat subnet untuk semua VM di subnet, dan log dari Logging Aturan Firewall diaktifkan di tingkat aturan firewall individual.

Setiap log platform memiliki petunjuk sendiri tentang cara mengaktifkan logging. Namun, Anda dapat menggunakan alat pencakupan log untuk membuka petunjuk yang relevan dengan cepat untuk setiap log platform.

Guna mempelajari cara mengaktifkan logging untuk log platform tertentu, lakukan hal berikutini:

  1. Di alat pencakupan log, temukan log platform yang ingin Anda aktifkan.
  2. Di kolom Aktifkan secara default, klik link Enable yang sesuai dengan log tersebut. Link tersebut akan membawa Anda ke petunjuk terperinci tentang cara mengaktifkan logging untuk layanan itu

Mengaktifkan log audit Akses Data

Seperti yang Anda lihat dalam alat pencakupan log, log audit Akses Data dari Cloud Audit Logs menyediakan cakupan deteksi ancaman yang luas. Namun, volumenya bisa jadi cukup besar. Mengaktifkan log audit Akses Data ini dapat mengakibatkan biaya tambahan terkait penyerapan, penyimpanan, ekspor, dan pemrosesan log tersebut. Bagian ini menjelaskan cara mengaktifkan log dan menyajikan beberapa praktik terbaik untuk membantu Anda melakukan kompromi antara nilai dan biaya.

Log audit Akses Data—kecuali untuk BigQuery—dinonaktifkan secara default. Untuk mengonfigurasi log audit Akses Data untuk layanan Google Cloud selain BigQuery, Anda harus mengaktifkannya secara eksplisit dengan menggunakan konsol Google Cloud atau dengan menggunakan Google Cloud CLI untuk mengedit objek kebijakan Identity and Access Management (IAM). Saat mengaktifkan log audit Akses Data, Anda juga dapat mengonfigurasi jenis operasi yang dicatat. Ada tiga jenis log audit Akses Data:

  • ADMIN_READ: Merekam operasi yang membaca metadata atau informasi konfigurasi.
  • DATA_READ: Merekam operasi yang membaca data yang disediakan pengguna.
  • DATA_WRITE: Merekam operasi yang menulis data yang disediakan pengguna.

Perhatikan bahwa Anda tidak dapat mengonfigurasi perekaman operasi ADMIN_WRITE, yaitu operasi yang menulis metadata atau informasi konfigurasi. ADMIN_WRITE Operasi disertakan dalam log audit Aktivitas Admin dari Cloud Audit Logs sehingga tidak dapat dinonaktifkan.

Mengelola volume log audit Akses Data

Saat mengaktifkan log audit Akses Data, tujuannya adalah untuk memaksimalkan nilai dalam hal visibilitas keamanan sekaligus membatasi biaya dan beban pengelolaannya. Untuk membantu Anda mencapai sasaran tersebut, sebaiknya lakukan tindakan berikut untuk memfilter log bernilai rendah dan bervolume tinggi:

  • Prioritaskan layanan yang relevan seperti layanan yang menghosting beban kerja, kunci, dan data sensitif. Untuk contoh layanan tertentu yang mungkin ingin Anda prioritaskan daripada layanan lainnya, lihat Contoh konfigurasi log audit Akses Data.
  • Prioritaskan project yang relevan seperti project yang menghosting beban kerja produksi, bukan project yang menghosting lingkungan staging dan developer. Untuk memfilter semua log dari project tertentu, tambahkan ekspresi berikut ke filter log untuk sink Anda. Ganti PROJECT_ID dengan ID project tempat Anda ingin memfilter semua log:

    Project Ekspresi filter log
    Mengecualikan semua log dari project tertentu
    NOT logName =~ "^projects/PROJECT_ID"
        
  • Prioritaskan subset operasi akses data seperti ADMIN_READ, DATA_READ, atau DATA_WRITE untuk set minimal operasi yang tercatat. Misalnya, beberapa layanan seperti Cloud DNS menulis ketiga jenis operasi, tetapi Anda dapat mengaktifkan logging hanya untuk ADMIN_READ operasi. Setelah mengonfigurasi salah satu dari tiga jenis operasi akses data ini, Anda dapat mengecualikan operasi tertentu yang memiliki volume sangat tinggi. Anda dapat mengecualikan operasi bervolume tinggi ini dengan memodifikasi filter log sink. Misalnya, Anda memutuskan untuk mengaktifkan logging audit Akses Data lengkap, termasuk operasi DATA_READ di beberapa layanan penyimpanan penting. Untuk mengecualikan operasi baca data traffic tinggi tertentu dalam situasi ini, Anda dapat menambahkan ekspresi filter log yang direkomendasikan berikut ke filter log sink Anda:

    Layanan Ekspresi filter log
    Mengecualikan log bervolume tinggi dari Cloud Storage
    NOT (resource.type="gcs_bucket" AND
        (protoPayload.methodName="storage.buckets.get" OR
        protoPayload.methodName="storage.buckets.list")) 
    Mengecualikan log bervolume tinggi dari Cloud SQL
    NOT (resource.type="cloudsql_database" AND
        protoPayload.request.cmd="select") 
  • Prioritaskan resource yang relevan seperti resource yang menghosting workload dan data yang paling sensitif. Anda dapat mengklasifikasikan resource berdasarkan nilai data yang diproses, dan risiko keamanannya, seperti apakah resource tersebut dapat diakses secara eksternal atau tidak. Meskipun log audit Akses Data diaktifkan per layanan, Anda dapat memfilter resource atau jenis resource tertentu melalui filter log.

  • Kecualikan akun utama tertentu agar akses datanya tidak dicatat. Misalnya, Anda dapat mengecualikan akun pengujian internal agar tidak tercatat operasinya. Untuk mempelajari lebih lanjut, lihat Tetapkan pengecualian di dokumentasi log audit Akses Data.

Contoh konfigurasi log audit Akses Data

Tabel berikut menyediakan konfigurasi log audit Akses Data dasar pengukuran yang dapat Anda gunakan untuk project Google Cloud guna membatasi volume log sekaligus mendapatkan visibilitas keamanan yang berharga:

Tingkat Layanan Jenis log audit Akses Data Taktik MITRE ATT&CK
Layanan autentikasi & otorisasi IAM
Identity-Aware Proxy (IAP)1
Cloud KMS
Secret Manager
Resource Manager
ADMIN_READ
DATA_READ
Penemuan
Akses Kredensial
Eskalasi Akses
Layanan penyimpanan BigQuery (diaktifkan secara default)
Cloud Storage1, 2
DATA_READ
DATA_WRITE
Koleksi
Pemindahan yang tidak sah
Layanan infrastructure Compute Engine
Kebijakan Organisasi
ADMIN_READ Penemuan

1 Mengaktifkan log audit Akses Data untuk IAP atau Cloud Storage dapat menghasilkan volume log yang besar saat ada traffic tinggike resource web yang dilindungi IAP atau ke objek Cloud Storage.

2 Mengaktifkan log audit Akses Data untuk Cloud Storage dapat merusak penggunaan download browser terautentikasi untuk objek non-publik. Untuk mengetahui detail selengkapnya dan solusi yang disarankan untuk masalah ini, lihat panduan pemecahan masalah Cloud Storage

Dalam contoh konfigurasi, perhatikan bagaimana layanan dikelompokkan dalam tingkatan sensitivitas berdasarkan data, metadata, atau konfigurasi yang mendasarinya. Tingkatan ini menunjukkan perincian yang direkomendasikan untuk logging audit Akses Data berikut ini:

  • Layanan autentikasi & otorisasi: Untuk tingkat layanan ini, sebaiknya audit semua operasi akses data. Level audit ini membantu Anda memantau akses ke kunci sensitif, secret, dan kebijakan IAM Anda. Memantau akses ini dapat membantu Anda mendeteksi taktik MITRE ATT&CK seperti Discovery, Akses Kredensial, dan Eskalasi Akses.
  • Layanan penyimpanan: Untuk tingkat layanan ini, kami merekomendasikan untuk mengaudit operasi akses data yang melibatkan data yang disediakan pengguna. Tingkat audit ini membantu Anda memantau akses ke data Anda yang berharga dan sensitif. Memantau akses ini dapat membantu Anda mendeteksi taktik MITRE ATT&CK seperti Koleksi and Pemindahan yang tidak sah terhadap data Anda.
  • Layanan infrastruktur: Untuk tingkat layanan ini, sebaiknya audit operasi akses data yang melibatkan metadata atau informasi konfigurasi. Tingkat audit ini membantu Anda memantau pemindaian konfigurasi infrastruktur. Memantau akses ini dapat membantu Anda mendeteksi taktik MITRE ATT&CK seperti Discovery terhadap workload Anda.

Log rute

Setelah log diidentifikasi dan diaktifkan, langkah berikutnya adalah merutekan log ke satu tujuan. Tujuan pemilihan rute, jalur, dan kompleksitas bervariasi, bergantung pada alat analisis yang Anda gunakan, seperti yang ditunjukkan pada diagram berikut.

Cara merutekan log: ke BigQuery dan Log Analytics menggunakan sink log, ke SIEM pihak ketiga dengan menggunakan sink log dan Pub/Sub, serta ke Google Security Operations menggunakan penyerapan langsung.

Diagram menunjukkan opsi pemilihan rute berikut:

  • Jika menggunakan Log Analytics, Anda memerlukan sink gabungan untuk menggabungkan log dari seluruh organisasi Google Cloud ke dalam satu bucket Cloud Logging.

  • Jika menggunakan BigQuery, Anda memerlukan sink gabungan untuk menggabungkan log dari seluruh organisasi Google Cloud Anda ke dalam satu set data BigQuery.

  • Jika Anda menggunakan Google Security Operations dan subset log yang telah ditetapkan ini memenuhi kebutuhan analisis keamanan, Anda dapat otomatis menggabungkan log ini ke dalam akun Google Security Operations menggunakan penyerapan Google Security Operations bawaan. Anda juga dapat melihat kumpulan log yang telah ditentukan ini dengan melihat kolom Dapat diekspor langsung ke Google Security Operations pada alat pencakupan log. Untuk mengetahui informasi selengkapnya tentang cara mengekspor log yang telah ditetapkan ini, lihat Menyerap log Google Cloud ke Google Security Operations.

  • Jika Anda menggunakan BigQuery atau SIEM pihak ketiga, atau ingin mengekspor kumpulan log yang diperluas ke Google Security Operations, diagram menunjukkan bahwa langkah tambahan diperlukan antara mengaktifkan log dan menganalisisnya. Langkah tambahan ini terdiri dari mengonfigurasi sink gabungan yang merutekan log yang dipilih dengan tepat. Jika Anda menggunakan BigQuery, sink ini adalah yang Anda butuhkan untuk merutekan log ke BigQuery. Jika Anda menggunakan SIEM pihak ketiga, Anda harus memiliki sink menggabungkan log yang dipilih di Pub/Sub atau Cloud Storage sebelum log tersebut dapat ditarik ke alat analisis Anda.

Opsi pemilihan rute ke Google Security Operations dan SIEM pihak ketiga tidak dibahas dalam panduan ini. Namun, bagian berikut memberikan langkah-langkah mendetail untuk merutekan log ke Log Analytics atau BigQuery:

  1. Menyiapkan satu tujuan
  2. Membuat sink log gabungan
  3. Memberikan akses ke sink
  4. Mengonfigurasi akses baca ke tujuan
  5. Verifikasi bahwa log dirutekan ke tujuan

Menyiapkan satu tujuan

Log Analytics

  1. Buka konsol Google Cloud di project Google Cloud tempat Anda ingin menggabungkan log.

    Buka Konsol Google Cloud

  2. Di terminal Cloud Shell, jalankan perintah gcloud berikut untuk membuat bucket log:

    gcloud logging buckets create BUCKET_NAME \
      --location=BUCKET_LOCATION \
      --project=PROJECT_ID
    

    Ganti hal berikut:

    • PROJECT_ID: ID project Google Cloud tempat log gabungan akan disimpan.
    • BUCKET_NAME: nama bucket Logging baru.
    • BUCKET_LOCATION: lokasi geografis bucket Logging baru. Lokasi yang didukung adalah global, us, atau eu. Untuk mempelajari region penyimpanan ini lebih lanjut, lihat Region yang didukung. Jika Anda tidak menentukan lokasi, maka region global akan digunakan, yang berarti log dapat secara fisik berlokasi di region mana pun.

  3. Pastikan bahwa bucket telah dibuat:

    gcloud logging buckets list --project=PROJECT_ID
    
  4. (Opsional) Tetapkan periode retensi data log di bucket. Contoh berikut memperluas retensi log yang disimpan di bucket hingga 365 hari:

    gcloud logging buckets update BUCKET_NAME \
      --location=BUCKET_LOCATION \
      --project=PROJECT_ID \
      --retention-days=365
    
  5. Upgrade bucket baru Anda untuk menggunakan Log Analytics dengan mengikuti langkah-langkah ini.

BigQuery

  1. Buka konsol Google Cloud di project Google Cloud tempat Anda ingin menggabungkan log.

    Buka Konsol Google Cloud

  2. Di terminal Cloud Shell, jalankan perintah bq mk berikut untuk membuat set data:

    bq --location=DATASET_LOCATION mk \
        --dataset \
        --default_partition_expiration=PARTITION_EXPIRATION \
        PROJECT_ID:DATASET_ID
    

    Ganti hal berikut:

    • PROJECT_ID: ID project Google Cloud tempat log gabungan akan disimpan.
    • DATASET_ID: ID set data BigQuery yang baru.
    • DATASET_LOCATION: lokasi geografis set data. Setelah set data dibuat, lokasi tidak dapat diubah.

    • PARTITION_EXPIRATION: masa aktif default (dalam detik) untuk partisi dalam tabel yang dipartisi yang dibuat oleh sink log. Anda akan mengonfigurasi sink log di bagian berikutnya. Sink log yang Anda konfigurasi menggunakan tabel yang dipartisi menurut hari berdasarkan stempel waktu entri log. Partisi (termasuk entri log terkait) akan dihapus PARTITION_EXPIRATION detik setelah tanggal partisi.

Membuat sink log gabungan

Anda mengarahkan log organisasi ke tujuan dengan membuat sink gabungan di tingkat organisasi. Untuk menyertakan semua log yang dipilih dalam alat pencakupan log, konfigurasikan sink dengan filter log yang dihasilkan oleh alat pencakupan log.

Log Analytics

  1. Di terminal Cloud Shell, jalankan perintah gcloud berikut untuk membuat sink gabungan di tingkat organisasi:

    gcloud logging sinks create SINK_NAME \
      logging.googleapis.com/projects/PROJECT_ID/locations/BUCKET_LOCATION/buckets/BUCKET_NAME \
      --log-filter="LOG_FILTER" \
      --organization=ORGANIZATION_ID \
      --include-children
    

    Ganti hal berikut:

    • SINK_NAME: nama sink yang merutekan log.
    • PROJECT_ID: ID project Google Cloud tempat log gabungan akan disimpan.
    • BUCKET_LOCATION: lokasi bucket Logging yang Anda buat untuk penyimpanan log.
    • BUCKET_NAME: nama bucket Logging yang Anda buat untuk penyimpanan log.
    • LOG_FILTER: filter log yang disimpan dari alat pencakupan log.
    • ORGANIZATION_ID: ID resource untuk organisasi Anda.

    Flag --include-children penting agar log dari semua project Google Cloud dalam organisasi Anda juga disertakan. Untuk mengetahui informasi selengkapnya, lihat Menggabungkan dan merutekan log tingkat organisasi ke tujuan yang didukung.

  2. Pastikan sink dibuat:

    gcloud logging sinks list --organization=ORGANIZATION_ID
    
  3. Dapatkan nama akun layanan yang terkait dengan sink yang baru saja Anda buat:

    gcloud logging sinks describe SINK_NAME --organization=ORGANIZATION_ID
    

    Outputnya terlihat mirip dengan yang berikut ini:

    writerIdentity: serviceAccount:p1234567890-12345@logging-o1234567890.`
    
  4. Salin seluruh string untuk writerIdentity yang dimulai dengan serviceAccount:. ID ini adalah akun layanan sink. Sampai Anda memberikan memberikan akses tulis ke bucket log akun layanan ini, pemilihan rute log dari sink ini akan gagal. Anda memberikan akses tulis ke identitas penulis sink di bagian berikutnya.

BigQuery

  1. Di terminal Cloud Shell, jalankan perintah gcloud berikut untuk membuat sink gabungan di level organisasi:

    gcloud logging sinks create SINK_NAME \
      bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET_ID \
      --log-filter="LOG_FILTER" \
      --organization=ORGANIZATION_ID \
      --use-partitioned-tables \
      --include-children
    

    Ganti hal berikut:

    • SINK_NAME: nama sink yang merutekan log.
    • PROJECT_ID: ID untuk project Google Cloud tempat Anda ingin menggabungkan log.
    • DATASET_ID: ID set data BigQuery yang Anda buat.
    • LOG_FILTER: filter log yang disimpan dari alat pencakupan log.
    • ORGANIZATION_ID: ID resource untuk organisasi Anda.

    Flag --include-children penting agar log dari semua project Google Cloud dalam organisasi Anda juga disertakan. Untuk mengetahui informasi selengkapnya, lihat Menggabungkan dan merutekan log tingkat organisasi ke tujuan yang didukung.

    Flag --use-partitioned-tables penting agar data dipartisi menurut hari berdasarkan kolom timestamp entri log Hal ini menyederhanakan pembuatan kueri data dan membantu mengurangi biaya kueri dengan mengurangi jumlah data yang dipindai oleh kueri. Manfaat lain dari tabel yang dipartisi adalah Anda dapat menetapkan masa berlaku partisi default pada level set data untuk memenuhi persyaratan retensi log Anda. Anda telah menetapkan masa berlaku partisi default saat membuat tujuan set data di bagian sebelumnya. Anda juga dapat memilih untuk menetapkan masa berlaku partisi di setiap level tabel, yang memberi Anda kontrol retensi data di terperinci berdasarkan jenis log.

  2. Pastikan sink dibuat:

    gcloud logging sinks list --organization=ORGANIZATION_ID
    
  3. Dapatkan nama akun layanan yang terkait dengan sink yang baru saja Anda buat:

    gcloud logging sinks describe SINK_NAME --organization=ORGANIZATION_ID
    

    Outputnya terlihat mirip dengan yang berikut ini:

    writerIdentity: serviceAccount:p1234567890-12345@logging-o1234567890.`
    
  4. Salin seluruh string untuk writerIdentity yang dimulai dengan serviceAccount:. ID ini adalah akun layanan sink. Sampai Anda memberikan akses tulis akun layanan ini ke set data BigQuery, perutean log dari sink ini akan gagal. Anda memberikan akses tulis ke identitas penulis sink di bagian berikutnya.

Memberikan akses ke sink

Setelah membuat sink log, Anda harus memberi sink akses untuk menulis ke tujuannya, baik itu bucket Logging maupun set data BigQuery.

Log Analytics

Untuk menambahkan izin ke akun layanan sink, ikuti langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman IAM:

    Buka halaman IAM.

  2. Pastikan Anda telah memilih project Google Cloud tujuan yang berisi bucket Logging yang Anda buat untuk penyimpanan log pusat.

  3. Klik Grant access.

  4. Di kolom New principals, masukkan akun layanan sink tanpa awalan serviceAccount:. Ingat bahwa identitas ini berasal dari kolom writerIdentity yang Anda ambil di bagian sebelumnya setelah Anda membuat sink.

  5. Di menu drop-down Pilih peran, pilih Penulis Bucket Log.

  6. Klik Add IAM condition untuk membatasi akses akun layanan hanya ke bucket log yang Anda buat.

  7. Masukkan Judul dan Deskripsi untuk kondisi.

  8. Di menu drop-down Jenis kondisi, pilih Resource > Nama.

  9. Di menu drop-down Operator, pilih Diakhiri dengan.

  10. Pada kolom Value, masukkan lokasi dan nama bucket sebagai berikut:

    locations/BUCKET_LOCATION/buckets/BUCKET_NAME
    
  11. Klik Simpan untuk menambahkan kondisi tersebut.

  12. Klik Save untuk menetapkan izin.

BigQuery

Untuk menambahkan izin ke akun layanan sink, ikuti langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka BigQuery.

    Buka BigQuery

  2. Buka set data BigQuery yang Anda buat untuk penyimpanan log pusat.

  3. Di tab Info set data, klik menu drop-down Sharing lalu klik Permissions.

  4. Di panel samping Dataset Permissions, klik Add Principal.

  5. Di kolom New principals, masukkan akun layanan sink tanpa awalan serviceAccount:. Ingat bahwa identitas ini berasal dari kolom writerIdentity yang Anda ambil di bagian sebelumnya setelah Anda membuat sink.

  6. Di menu drop-down Peran, pilih Editor Data BigQuery.

  7. Klik Simpan.

Setelah Anda memberikan akses ke sink, entri log akan mulai mengisi tujuan sink: bucket Logging atau set data BigQuery.

Mengonfigurasi akses baca ke tujuan

Setelah sink log merutekan log dari seluruh organisasi Anda ke dalam satu tujuan, Anda dapat melakukan penelusuran di semua log tersebut. Gunakan izin IAM untuk mengelola izin dan memberikan akses sesuai kebutuhan.

Log Analytics

Untuk memberikan akses guna melihat dan membuat kueri log di bucket log baru Anda, ikuti langkah-langkah berikut.

  1. Di Konsol Google Cloud, buka halaman IAM:

    Buka halaman IAM.

    Pastikan Anda telah memilih project Google Cloud yang akan digunakan untuk menggabungkan log.

  2. Click Add.

  3. Di kolom New principal, tambahkan akun email Anda.

  4. Di menu drop-down Select a role, pilih Logs Views Accessor.

    Peran ini memberi akun utama yang baru ditambahkan akses baca ke semua tampilan untuk setiap bucket dalam project Google Cloud. Untuk membatasi akses pengguna, tambahkan kondisi yang memungkinkan pengguna hanya membaca dari bucket baru Anda.

    1. Klik Tambahkan Kondisi.

    2. Masukkan Judul dan Deskripsi untuk kondisi.

    3. Di menu drop-down Jenis kondisi, pilih Resource > Nama.

    4. Di menu drop-down Operator, pilih Diakhiri dengan.

    5. Di kolom Value, masukkan lokasi dan nama bucket, serta tampilan log default _AllLogs seperti berikut:

      locations/BUCKET_LOCATION/buckets/BUCKET_NAME/views/_AllLogs
      
    6. Klik Simpan untuk menambahkan kondisi tersebut.

  5. Klik Save untuk menetapkan izin.

BigQuery

Untuk memberikan akses melihat dan melakukan kueri log di set data BigQuery Anda, ikuti langkah-langkah di bagian Pemberian akses ke set data dalam dokumentasi BigQuery.

Verifikasi bahwa log dirutekan ke tujuan

Log Analytics

Saat Anda merutekan log ke bucket log yang diupgrade ke Log Analytics, Anda dapat melihat dan membuat kueri semua entri log melalui satu tampilan log dengan skema terpadu untuk semua jenis log. Ikuti langkah berikut untuk memverifikasi bahwa log diarahkan dengan benar.

  1. Di konsol Google Cloud, buka halaman Log Analytics:

    Buka Log Analytics

    Pastikan Anda telah memilih project Google Cloud yang akan digunakan untuk menggabungkan log.

  2. Klik tab Log Views.

  3. Luaskan tampilan log di bagian bucket log yang telah Anda buat (yaitu BUCKET_NAME) jika belum diperluas.

  4. Pilih tampilan log default _AllLogs. Sekarang Anda dapat memeriksa seluruh skema log di panel kanan, seperti yang ditunjukkan pada screenshot berikut:

    Log Analytics dengan tabel cloudaudit_googleapis_com_data_access yang dipilih.

  5. Di samping _AllLogs, klik Query . Tindakan ini akan mengisi editor Query dengan sampel kueri SQL untuk mengambil entri log yang baru saja dirutekan.

  6. Klik Run query untuk melihat entri log yang baru saja dirutekan.

Bergantung pada tingkat aktivitas dalam project Google Cloud di organisasi Anda, Anda mungkin harus menunggu beberapa menit sampai beberapa log dibuat, lalu dirutekan ke bucket log Anda.

BigQuery

Saat Anda mengarahkan log ke set data BigQuery, Cloud Logging akan membuat tabel BigQuery untuk menyimpan entri log seperti yang ditunjukkan ada screenshot berikut:

Penjelajah BigQuery dengan tabel cloudaudit_googleapis_com_data_access yang dipilih.

Screenshot menunjukkan cara Cloud Logging memberi nama setiap tabel BigQuery berdasarkan nama log tempat entri log berada. Misalnya, the cloudaudit_googleapis_com_data_access tabel yang dipilih di screenshot berisi log audit Akses Data yang ID log-nya adalah cloudaudit.googleapis.com%2Fdata_access. Selain diberi nama berdasarkan entri log yang sesuai, setiap tabel juga dipartisi berdasarkan stempel waktu untuk setiap entri log.

Bergantung pada tingkat aktivitas dalam project Google Cloud di organisasi Anda, Anda mungkin harus menunggu beberapa menit sampai beberapa log dibuat, lalu dirutekan ke set data BigQuery.

Analisis log

Anda dapat menjalankan berbagai kueri terhadap log platform dan audit. Daftar berikut menyediakan kumpulan contoh pertanyaan keamanan yang mungkin ingin Anda ajukan dari log Anda sendiri. Untuk setiap pertanyaan dalam daftar ini, ada dua versi kueri CSA yang sesuai: satu untuk digunakan dengan Log Analytics dan satu lagi untuk digunakan dengan BigQuery. Gunakan versi kueri yang cocok dengan tujuan sink yang sebelumnya Anda siapkan.

Log Analytics

Sebelum menggunakan salah satu kueri SQL di bawah ini, ganti MY_PROJECT_ID dengan ID project Google Cloud tempat Anda membuat bucket log (yaitu PROJECT_ID), dan MY_DATASET_ID dengan region dan nama bucket log tersebut (yaitu BUCKET_LOCATION.BUCKET_NAME).

Buka Log Analytics

BigQuery

Sebelum menggunakan salah satu kueri SQL di bawah ini, ganti MY_PROJECT_ID dengan ID project Google Cloud tempat Anda membuat set data BigQuery (yaitu PROJECT_ID), dan MY_DATASET_ID dengan nama set data tersebut, yaitu DATASET_ID.

Buka BigQuery

  1. Pertanyaan terkait login dan akses
  2. Pertanyaan terkait perubahan izin
  3. Pertanyaan aktivitas penyediaan
  4. Pertanyaan terkait penggunaan beban kerja
  5. Pertanyaan terkait akses data
  6. Pertanyaan keamanan jaringan

Pertanyaan terkait login dan akses

Contoh kueri ini melakukan analisis untuk mendeteksi upaya login yang mencurigakan atau upaya akses awal ke lingkungan Google Cloud Anda.

Apakah ada upaya login mencurigakan yang ditandai oleh Google Workspace?

Dengan menelusuri log Cloud Identity yang merupakan bagian dari Audit Login Google Workspace, kueri berikut mendeteksi upaya login mencurigakan yang ditandai oleh Google Workspace. Upaya login tersebut dapat dilakukan dari Google Cloud Console, konsol Admin, atau gcloud CLI.

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.method_name, parameter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS parameter
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND proto_payload.audit_log IS NOT NULL
  AND proto_payload.audit_log.service_name = "login.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.login.LoginService.loginSuccess"
  AND JSON_VALUE(parameter.name) = "is_suspicious"
  AND JSON_VALUE(parameter.boolValue) = "true"

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`,
  UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS parameter
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND protopayload_auditlog.metadataJson IS NOT NULL
  AND protopayload_auditlog.serviceName = "login.googleapis.com"
  AND protopayload_auditlog.methodName = "google.login.LoginService.loginSuccess"
  AND JSON_VALUE(parameter, '$.name') = "is_suspicious"
  AND JSON_VALUE(parameter, '$.boolValue') = "true"

Apakah ada kegagalan login berlebihan dari identitas pengguna mana pun?

Dengan menelusuri log Cloud Identity yang merupakan bagian dari Audit Login Google Workspace, kueri berikut mendeteksi pengguna yang mengalami tiga kegagalan login atau lebih berturut-turut dalam 24 jam terakhir.

Log Analytics


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  MIN(timestamp) AS earliest,
  MAX(timestamp) AS latest,
  count(*) AS attempts
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND proto_payload.audit_log.service_name = "login.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.login.LoginService.loginFailure"
GROUP BY
  1
HAVING
  attempts >= 3

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  MIN(timestamp) AS earliest,
  MAX(timestamp) AS latest,
  count(*) AS attempts
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND protopayload_auditlog.serviceName="login.googleapis.com"
  AND protopayload_auditlog.methodName="google.login.LoginService.loginFailure"
GROUP BY
  1
HAVING
  attempts >= 3

Adakah upaya akses yang melanggar Kontrol Layanan VPC?

Dengan menganalisis log audit Kebijakan Ditolak dari Cloud Audit Logs, kueri berikut mendeteksi upaya akses yang diblokir oleh Kontrol Layanan VPC. Setiap hasil kueri dapat menunjukkan potensi aktivitas berbahaya seperti upaya akses dari jaringan yang tidak sah menggunakan kredensial yang dicuri.

Log Analytics


SELECT
  timestamp,
  log_name,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  JSON_VALUE(proto_payload.audit_log.metadata.violationReason) as violationReason, 
  IF(JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations) IS NULL, 'ingress', 'egress') AS violationType,
  COALESCE(
    JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].targetResource),
    JSON_VALUE(proto_payload.audit_log.metadata.egressViolations[0].targetResource)
  ) AS  targetResource,
  COALESCE(
    JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].servicePerimeter),
    JSON_VALUE(proto_payload.audit_log.metadata.egressViolations[0].servicePerimeter)
  ) AS  servicePerimeter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND proto_payload.audit_log IS NOT NULL
  AND JSON_VALUE(proto_payload.audit_log.metadata, '$."@type"') = 'type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata'
ORDER BY
  timestamp DESC
LIMIT 1000

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  JSON_VALUE(protopayload_auditlog.metadataJson, '$.violationReason') as violationReason, 
  IF(JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations') IS NULL, 'ingress', 'egress') AS violationType,
  COALESCE(
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].targetResource'),
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.egressViolations[0].targetResource')
  ) AS  targetResource,
  COALESCE(
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].servicePerimeter'),
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.egressViolations[0].servicePerimeter')
  ) AS  servicePerimeter
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_policy`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  AND JSON_VALUE(protopayload_auditlog.metadataJson, '$."@type"') = 'type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata'
ORDER BY
  timestamp DESC
LIMIT 1000

Apakah ada upaya akses yang melanggar kontrol akses IAP?

Dengan menganalisis log Load Balancer Aplikasi eksternal, kueri berikut mendeteksi upaya akses yang diblokir oleh IAP. Setiap hasil kueri mungkin dapat menunjukkan upaya akses awal atau upaya eksploitasi kerentanan.

Log Analytics


SELECT
  timestamp,
  http_request.remote_ip,
  http_request.request_method,
  http_request.status,
  JSON_VALUE(resource.labels.backend_service_name) AS backend_service_name,
  http_request.request_url
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND JSON_VALUE(json_payload.statusDetails) = "handled_by_identity_aware_proxy"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  httpRequest.remoteIp,
  httpRequest.requestMethod,
  httpRequest.status,
  resource.labels.backend_service_name,
  httpRequest.requestUrl,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].requests`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND jsonpayload_type_loadbalancerlogentry.statusdetails = "handled_by_identity_aware_proxy"
ORDER BY
  timestamp DESC

Pertanyaan terkait perubahan izin

Contoh kueri ini menjalankan analisis atas aktivitas administrator yang mengubah izin, termasuk perubahan pada kebijakan IAM, grup dan keanggotaan grup, akun layanan, serta kunci terkait. Perubahan izin tersebut dapat memberikan akses tingkat tinggi ke lingkungan atau data sensitif.

Adakah pengguna yang ditambahkan ke grup dengan hak istimewa tinggi?

Dengan menganalisis log audit Audit Admin Google Workspace, kueri berikut mendeteksi pengguna yang telah ditambahkan ke salah satu grup dengan hak istimewa yang tercantum dalam kueri. Anda menggunakan ekspresi reguler dalam kueri untuk menentukan grup mana (seperti admin@example.com atau prod@example.com) yang akan dipantau. Hasil kueri apa pun dapat menunjukkan eskalasi hak istimewa yang berbahaya atau tidak disengaja.

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.resource_name,
  (SELECT JSON_VALUE(x.value)
   FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
   WHERE JSON_VALUE(x.name) = "USER_EMAIL") AS user_email,
  (SELECT JSON_VALUE(x.value)
   FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
   WHERE JSON_VALUE(x.name) = "GROUP_EMAIL") AS group_email,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 DAY)
  AND proto_payload.audit_log.service_name = "admin.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.admin.AdminService.addGroupMember"
  AND EXISTS(
    SELECT * FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
    WHERE
      JSON_VALUE(x.name) = "GROUP_EMAIL"
      AND REGEXP_CONTAINS(JSON_VALUE(x.value), r'(admin|prod).*') -- Update regexp with other sensitive groups if applicable
  )

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.methodName,
  protopayload_auditlog.resourceName,
  (SELECT JSON_VALUE(x, '$.value')
   FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
   WHERE JSON_VALUE(x, '$.name') = "USER_EMAIL") AS userEmail,
  (SELECT JSON_VALUE(x, '$.value')
   FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
   WHERE JSON_VALUE(x, '$.name') = "GROUP_EMAIL") AS groupEmail,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 DAY)
  AND protopayload_auditlog.serviceName = "admin.googleapis.com"
  AND protopayload_auditlog.methodName = "google.admin.AdminService.addGroupMember"
  AND EXISTS(
    SELECT * FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
    WHERE
      JSON_VALUE(x, '$.name') = 'GROUP_EMAIL'
      AND REGEXP_CONTAINS(JSON_VALUE(x, '$.value'), r'(admin|prod).*') -- Update regexp with other sensitive groups if applicable
  )

Apakah ada izin yang diberikan melalui akun layanan?

Dengan menganalisis log audit Aktivitas Admin dari Cloud Audit Logs, kueri berikut mendeteksi izin apa pun yang telah diberikan ke akun utama melalui akun layanan. Contoh izin yang mungkin diberikan adalah kemampuan untuk meniru identitas akun layanan tersebut atau membuat kunci akun layanan. Setiap hasil kueri dapat mengindikasikan adanya eskalasi hak istimewa atau risiko kebocoran kredensial.

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email as grantor,
  JSON_VALUE(bindingDelta.member) as grantee,
  JSON_VALUE(bindingDelta.role) as role,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  -- AND log_id = "cloudaudit.googleapis.com/activity"
  AND (
    (resource.type = "service_account"
    AND proto_payload.audit_log.method_name LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND proto_payload.audit_log.method_name = "SetIamPolicy"
    AND JSON_VALUE(bindingDelta.role) LIKE "roles/iam.serviceAccount%")
  )
  AND JSON_VALUE(bindingDelta.action) = "ADD"
  -- Principal (grantee) exclusions
  AND JSON_VALUE(bindingDelta.member) NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail as grantor,
  bindingDelta.member as grantee,
  bindingDelta.role,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName,
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`,
  UNNEST(protopayload_auditlog.servicedata_v1_iam.policyDelta.bindingDeltas) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY)
  AND (
    (resource.type = "service_account"
    AND protopayload_auditlog.methodName LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND protopayload_auditlog.methodName = "SetIamPolicy"
    AND bindingDelta.role LIKE "roles/iam.serviceAccount%")
  )
  AND bindingDelta.action = 'ADD'
  -- Principal (grantee) exclusions
  AND bindingDelta.member NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

Apakah ada kunci atau akun layanan yang dibuat oleh identitas yang tidak disetujui?

Dengan menganalisis log audit Aktivitas Admin, kueri berikut mendeteksi semua akun layanan atau kunci yang dibuat secara manual oleh pengguna. Misalnya, Anda dapat mengikuti praktik terbaik untuk hanya mengizinkan pembuatan akun layanan oleh akun layanan yang disetujui sebagai bagian dari alur kerja otomatis. Oleh karena itu, pembuatan akun layanan apa pun di luar alur kerja tersebut dianggap tidak mematuhi kebijakan dan mungkin berbahaya.

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.resource_name,
  JSON_VALUE(proto_payload.audit_log.response.email) as service_account_email
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="service_account"
  AND proto_payload.audit_log.method_name LIKE "%CreateServiceAccount%"
  AND proto_payload.audit_log.authentication_info.principal_email NOT LIKE "%.gserviceaccount.com"

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.methodName,
  protopayload_auditlog.resourceName,
  JSON_VALUE(protopayload_auditlog.responseJson, "$.email") as serviceAccountEmail
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY)
  AND resource.type="service_account"
  AND protopayload_auditlog.methodName LIKE "%CreateServiceAccount%"
  AND protopayload_auditlog.authenticationInfo.principalEmail NOT LIKE "%.gserviceaccount.com"

Apakah ada pengguna yang ditambahkan ke (atau dihapus dari) kebijakan IAM sensitif?

Dengan menelusuri log audit Aktivitas perubahan akses pengguna atau grup untuk resource yang diamankan oleh IAP seperti layanan backend Compute Engine. Kueri berikut menelusuri semua pembaruan kebijakan IAM untuk resource IAP yang melibatkan peran IAM roles/iap.httpsResourceAccessor. Peran ini memberikan izin untuk mengakses resource HTTPS atau layanan backend. Setiap hasil kueri dapat menunjukkan upaya untuk mengabaikan pertahanan layanan backend yang mungkin terekspos ke internet.

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  resource.type,
  proto_payload.audit_log.resource_name,
  JSON_VALUE(binding, '$.role') as role,
  JSON_VALUE_ARRAY(binding, '$.members') as members
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.response, '$.bindings')) AS binding
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  -- AND log_id = "cloudaudit.googleapis.com/activity"
  AND proto_payload.audit_log.service_name = "iap.googleapis.com"
  AND proto_payload.audit_log.method_name LIKE "%.IdentityAwareProxyAdminService.SetIamPolicy"
  AND JSON_VALUE(binding, '$.role') = "roles/iap.httpsResourceAccessor"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  resource.type,
  protopayload_auditlog.resourceName,
  JSON_VALUE(binding, '$.role') as role,
  JSON_VALUE_ARRAY(binding, '$.members') as members
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`,
  UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.responseJson, '$.bindings')) AS binding
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  AND protopayload_auditlog.serviceName = "iap.googleapis.com"
  AND protopayload_auditlog.methodName LIKE "%.IdentityAwareProxyAdminService.SetIamPolicy"
  AND JSON_VALUE(binding, '$.role') = "roles/iap.httpsResourceAccessor"
ORDER BY
  timestamp DESC

Pertanyaan aktivitas penyediaan

Contoh kueri ini melakukan analisis untuk mendeteksi aktivitas admin yang mencurigakan atau tidak wajar, seperti penyediaan dan konfigurasi resource.

Apakah ada perubahan pada setelan logging?

Dengan menelusuri log audit Aktivitas Admin, kueri berikut mendeteksi perubahan apa pun yang dilakukan pada setelan logging. Pemantauan setelan logging membantu Anda mendeteksi penonaktifan log audit yang tidak disengaja atau berbahaya serta teknik pengelakan pertahanan yang serupa.

Log Analytics


SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email, 
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

BigQuery


SELECT
  receiveTimestamp, timestamp AS eventTimestamp,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.authenticationInfo.principalEmail, 
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  protopayload_auditlog.serviceName = "logging.googleapis.com"

Apakah ada Log Alur VPC yang dinonaktifkan secara aktif?

Dengan menelusuri log audit Aktivitas Admin, kueri berikut mendeteksi semua subnet yang Log Alur VPCnya dinonaktifkan secara aktif . Pemantauan setelan Log Alur VPC membantu Anda mendeteksi penonaktifan yang tidak disengaja atau berbahaya terhadap Log Alur VPC dan teknik penghindaran pertahanan serupa.

Log Analytics


SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email, 
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  proto_payload.audit_log.method_name = "v1.compute.subnetworks.patch" 
  AND (
    JSON_VALUE(proto_payload.audit_log.request, "$.logConfig.enable") = "false"
    OR JSON_VALUE(proto_payload.audit_log.request, "$.enableFlowLogs") = "false"
  )

BigQuery


SELECT
  receiveTimestamp, timestamp AS eventTimestamp,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.authenticationInfo.principalEmail, 
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
protopayload_auditlog.methodName = "v1.compute.subnetworks.patch" 
AND JSON_VALUE(protopayload_auditlog.requestJson, "$.logConfig.enable") = "false"

Apakah ada terlalu banyak aturan firewall yang dimodifikasi dalam seminggu terakhir?

Dengan menelusuri log audit Aktivitas Admin, kueri berikut mendeteksi perubahan aturan firewall yang sangat banyak pada hari tertentu dalam seminggu terakhir. Untuk menentukan apakah ada pencilan, kueri melakukan analisis statistik terhadap jumlah harian perubahan aturan firewall. Rata-rata dan standar deviasi dihitung untuk setiap hari dengan melihat kembali jumlah harian sebelumnya dengan periode lihat balik 90 hari. Outliers diperhitungkan jika jumlah harian lebih dari dua deviasi standar di atas rata-rata. Kueri, termasuk faktor deviasi standar dan periode lihat balik, semuanya dapat dikonfigurasi agar sesuai dengan profil aktivitas penyediaan cloud Anda dan untuk meminimalkan positif palsu (PP).

Log Analytics

SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.authentication_info.principal_email IGNORE NULLS) AS actors,
      COUNT(*) AS counter
    FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
      AND proto_payload.audit_log.method_name LIKE "v1.compute.firewalls.%"
      AND proto_payload.audit_log.method_name NOT IN ("v1.compute.firewalls.list", "v1.compute.firewalls.get")
    GROUP BY
      day
  )
)
WHERE
  counter > avg + 2 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) 
ORDER BY
  counter DESC

BigQuery


SELECT
  *,
  AVG(counter) OVER (
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
  STDDEV(counter) OVER (
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
  COUNT(*) OVER (
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
FROM (
  SELECT
    EXTRACT(DATE FROM timestamp) AS day,
    ARRAY_AGG(DISTINCT protopayload_auditlog.methodName IGNORE NULLS) AS actions,
    ARRAY_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail IGNORE NULLS) AS actors,
    COUNT(*) AS counter
  FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
  WHERE
    timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
    AND protopayload_auditlog.methodName LIKE "v1.compute.firewalls.%"
    AND protopayload_auditlog.methodName NOT IN ("v1.compute.firewalls.list", "v1.compute.firewalls.get")
  GROUP BY
    day
)
WHERE TRUE
QUALIFY
  counter > avg + 2 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) 
ORDER BY
  counter DESC

Apakah ada VM yang dihapus dalam seminggu terakhir?

Dengan menelusuri log audit Aktivitas Admin, kueri berikut mencantumkan setiap instance Compute Engine yang dihapus dalam seminggu terakhir. Kueri ini dapat membantu Anda mengaudit penghapusan resource dan mendeteksi potensi aktivitas berbahaya.

Log Analytics

SELECT
  timestamp,
  JSON_VALUE(resource.labels.instance_id) AS instance_id,
  proto_payload.audit_log.authentication_info.principal_email, 
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  resource.type = "gce_instance"
  AND proto_payload.audit_log.method_name = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  instance_id
LIMIT
  1000

BigQuery


SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance"
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  resource.labels.instance_id
LIMIT
  1000

Pertanyaan terkait penggunaan beban kerja

Sampel kueri ini melakukan analisis untuk memahami siapa dan apa yang memakai beban kerja cloud dan API Anda, serta membantu mendeteksi potensi perilaku berbahaya secara internal atau eksternal.

Apakah ada penggunaan API yang sangat tinggi oleh identitas pengguna dalam seminggu terakhir?

Dengan menganalisis semua Cloud Audit Logs, kueri berikut mendeteksi penggunaan API yang sangat tinggi oleh identitas pengguna pada hari tertentu dalam seminggu terakhir. Penggunaan tinggi yang tidak biasa tersebut dapat menjadi indikator potensi penyalahgunaan API, ancaman orang dalam, atau kebocoran kredensial. Untuk menentukan apakah ada pencilan, kueri ini melakukan analisis statistik atas jumlah tindakan harian per akun utama. Rata-rata dan deviasi standar dihitung untuk setiap hari dan untuk setiap utama dengan melihat kembali jumlah harian sebelumnya dengan periode lihat balik 60 hari. Pencilan diperhitungkan jika jumlah harian untuk pengguna lebih dari tiga deviasi standar di atas rata-ratanya. Kueri, termasuk faktor standar deviasi dan periode lihat balik, dapat dikonfigurasi agar sesuai dengan profil aktivitas penyediaan cloud Anda dan untuk meminimalkan positif palsu (PP).

Log Analytics


SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      PARTITION BY principal_email
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      proto_payload.audit_log.authentication_info.principal_email,
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      COUNT(*) AS counter
    FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
      AND proto_payload.audit_log.authentication_info.principal_email IS NOT NULL
      AND proto_payload.audit_log.method_name NOT LIKE "storage.%.get"
      AND proto_payload.audit_log.method_name NOT LIKE "v1.compute.%.list"
      AND proto_payload.audit_log.method_name NOT LIKE "beta.compute.%.list"
    GROUP BY
      proto_payload.audit_log.authentication_info.principal_email,
      day
  )
)
WHERE
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) 
ORDER BY
  counter DESC

BigQuery


SELECT
  *,
  AVG(counter) OVER (
    PARTITION BY principalEmail
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
  STDDEV(counter) OVER (
    PARTITION BY principalEmail
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
  COUNT(*) OVER (
    PARTITION BY principalEmail
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
FROM (
  SELECT
    protopayload_auditlog.authenticationInfo.principalEmail,
    EXTRACT(DATE FROM timestamp) AS day,
    ARRAY_AGG(DISTINCT protopayload_auditlog.methodName IGNORE NULLS) AS actions,
    COUNT(*) AS counter
  FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_*`
  WHERE
    timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
    AND protopayload_auditlog.authenticationInfo.principalEmail IS NOT NULL
    AND protopayload_auditlog.methodName NOT LIKE "storage.%.get"
    AND protopayload_auditlog.methodName NOT LIKE "v1.compute.%.list"
    AND protopayload_auditlog.methodName NOT LIKE "beta.compute.%.list"
  GROUP BY
    protopayload_auditlog.authenticationInfo.principalEmail,
    day
)
WHERE TRUE
QUALIFY
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) 
ORDER BY
  counter DESC

Berapa penggunaan penskalaan otomatis per hari dalam sebulan terakhir?

Dengan menganalisis log audit Aktivitas Admin, kueri berikut melaporkan penggunaan penskalaan otomatis menurut hari selama sebulan terakhir. Kueri ini dapat digunakan untuk mengidentifikasi pola atau anomali yang menjamin penyelidikan keamanan lebih lanjut.

Log Analytics


SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  proto_payload.audit_log.method_name,
  COUNT(*) AS counter
FROM
   `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  resource.type = "gce_instance_group_manager"
  AND log_id = "cloudaudit.googleapis.com/activity"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

BigQuery


SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

Pertanyaan terkait akses data

Sampel kueri ini melakukan analisis untuk memahami siapa yang mengakses atau mengubah data di Google Cloud.

Pengguna mana yang paling sering mengakses data dalam seminggu terakhir?

Kueri berikut menggunakan log audit Akses Data untuk menemukan identitas pengguna yang paling sering mengakses data tabel BigQuery selama seminggu terakhir.

Log Analytics


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  COUNT(*) AS COUNTER
FROM 
   `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  (proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND log_id = "cloudaudit.googleapis.com/data_access"
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

Pengguna mana yang mengakses data di tabel "akun" bulan lalu?

Kueri berikut menggunakan log audit Akses Data untuk menemukan identitas pengguna yang paling sering dikueri tabel accounts tertentu selama sebulan terakhir. Selain placeholder MY_DATASET_ID dan MY_PROJECT_ID untuk tujuan ekspor BigQuery Anda, kueri berikut menggunakan DATASET_ID dan PROJECT_ID placeholder. Anda harus mengganti ke placeholder DATASET_ID dan PROJECT_ID untuk menentukan tabel target yang aksesnya sedang dianalisis, seperti tabel accounts dalam contoh ini.

Log Analytics


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  COUNT(*) AS COUNTER
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(proto_payload.audit_log.authorization_info) authorization_info
WHERE
  (proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.Query")
  AND authorization_info.permission = "bigquery.tables.getData"
  AND authorization_info.resource = "projects/[PROJECT_ID]/datasets/[DATASET_ID]/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`,
  UNNEST(protopayload_auditlog.authorizationInfo) authorizationInfo
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND authorizationInfo.permission = "bigquery.tables.getData"
  AND authorizationInfo.resource = "projects/[PROJECT_ID]/datasets/[DATASET_ID]/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

Tabel apa yang paling sering diakses dan oleh siapa?

Kueri berikut menggunakan log audit Akses Data untuk menemukan tabel BigQuery dengan data yang paling sering dibaca dan diubah selama sebulan terakhir. Data ini menampilkan identitas pengguna terkait beserta perincian total frekuensi data dibaca versus diubah.

Log Analytics


SELECT
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.authentication_info.principal_email,
  COUNTIF(JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataRead") IS NOT NULL
    OR JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

BigQuery


SELECT
  protopayload_auditlog.resourceName,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

Apa saja 10 kueri teratas terhadap BigQuery dalam seminggu terakhir?

Kueri berikut menggunakan log audit Akses Data untuk menemukan kueri yang paling umum selama seminggu terakhir. Kode ini juga mencantumkan pengguna yang sesuai dan tabel yang dirujuk.

Log Analytics


SELECT
  COALESCE(
   JSON_VALUE(proto_payload.audit_log.metadata, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_VALUE(proto_payload.audit_log.metadata, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT proto_payload.audit_log.authentication_info.principal_email, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(proto_payload.audit_log.metadata, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(proto_payload.audit_log.metadata, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_VALUE(proto_payload.audit_log.metadata, "$.jobChange") IS NOT NULL
    OR JSON_VALUE(proto_payload.audit_log.metadata, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

BigQuery


SELECT
  COALESCE(
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobChange") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

Apa saja tindakan paling umum yang tercatat dalam log akses data selama sebulan terakhir?

Kueri berikut menggunakan semua log dari Cloud Audit Logs untuk menemukan 100 tindakan yang paling sering yang tercatat selama sebulan terakhir.

Log Analytics


SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND log_id="cloudaudit.googleapis.com/data_access"
GROUP BY
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

BigQuery


SELECT
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

Pertanyaan terkait keamanan jaringan

Contoh kueri ini menjalankan analisis atas aktivitas jaringan Anda di Google Cloud.

Adakah koneksi dari alamat IP baru ke subnetwork tertentu?

Kueri berikut mendeteksi koneksi dari alamat IP sumber baru ke subnet tertentu dengan menganalisis Log Alur VPC. Dalam contoh ini, alamat IP sumber dianggap baru jika dilihat pertama kali dalam 24 jam terakhir selama periode lihat balik 60 hari. Anda mungkin ingin menggunakan dan menyesuaikan kueri ini di subnet yang berada dalam cakupan persyaratan kepatuhan tertentu seperti PCI.

Log Analytics


SELECT
  JSON_VALUE(json_payload.connection.src_ip) as src_ip,
  -- TIMESTAMP supports up to 6 digits of fractional precision, so drop any more digits to avoid parse errors
  MIN(TIMESTAMP(REGEXP_REPLACE(JSON_VALUE(json_payload.start_time), r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS firstInstance,
  MAX(TIMESTAMP(REGEXP_REPLACE(JSON_VALUE(json_payload.start_time), r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS lastInstance,
  ARRAY_AGG(DISTINCT JSON_VALUE(resource.labels.subnetwork_name)) as subnetNames,
  ARRAY_AGG(DISTINCT JSON_VALUE(json_payload.dest_instance.vm_name)) as vmNames,
  COUNT(*) numSamples
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND JSON_VALUE(json_payload.reporter) = 'DEST'
  AND JSON_VALUE(resource.labels.subnetwork_name) IN ('prod-customer-data')
GROUP BY
  src_ip
HAVING firstInstance >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  lastInstance DESC,
  numSamples DESC

BigQuery


SELECT
  jsonPayload.connection.src_ip as src_ip,
  -- TIMESTAMP supports up to 6 digits of fractional precision, so drop any more digits to avoid parse errors
  MIN(TIMESTAMP(REGEXP_REPLACE(jsonPayload.start_time, r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS firstInstance,
  MAX(TIMESTAMP(REGEXP_REPLACE(jsonPayload.start_time, r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS lastInstance,
  ARRAY_AGG(DISTINCT resource.labels.subnetwork_name) as subnetNames,
  ARRAY_AGG(DISTINCT jsonPayload.dest_instance.vm_name) as vmNames,
  COUNT(*) numSamples
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].compute_googleapis_com_vpc_flows`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND jsonPayload.reporter = 'DEST'
  AND resource.labels.subnetwork_name IN ('prod-customer-data')
GROUP BY
  src_ip
HAVING firstInstance >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  lastInstance DESC,
  numSamples DESC

Adakah koneksi yang diblokir oleh Google Cloud Armor?

Kueri berikut membantu mendeteksi potensi upaya eksploitasi dengan menganalisis log Load Balancer Aplikasi eksternal untuk menemukan koneksi yang diblokir oleh kebijakan keamanan yang dikonfigurasi di Google Cloud Armor. Kueri ini mengasumsikan bahwa Anda telah mengonfigurasi kebijakan keamanan Google Cloud Armor pada Load Balancer Aplikasi eksternal. Kueri ini juga mengasumsikan bahwa Anda telah mengaktifkan logging Load Balancer Aplikasi eksternal seperti yang dijelaskan dalam petunjuk yang disediakan oleh link Aktifkan di alat pencakupan logsingkat ini.

Log Analytics


SELECT
  timestamp,
  http_request.remote_ip,
  http_request.request_method,
  http_request.status,
  JSON_VALUE(json_payload.enforcedSecurityPolicy.name) AS security_policy_name,
  JSON_VALUE(resource.labels.backend_service_name) AS backend_service_name,
  http_request.request_url,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND JSON_VALUE(json_payload.statusDetails) = "denied_by_security_policy"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  httpRequest.remoteIp,
  httpRequest.requestMethod,
  httpRequest.status,
  jsonpayload_type_loadbalancerlogentry.enforcedsecuritypolicy.name,
  resource.labels.backend_service_name,
  httpRequest.requestUrl,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].requests`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND jsonpayload_type_loadbalancerlogentry.statusdetails = "denied_by_security_policy"
ORDER BY
  timestamp DESC

Apakah ada virus atau malware tingkat tinggi yang terdeteksi oleh Cloud IDS?

Kueri berikut menunjukkan virus atau malware tingkat tinggi yang terdeteksi oleh Cloud IDS dengan menelusuri Cloud IDS Threat Logs. Kueri ini mengasumsikan bahwa Anda telah mengonfigurasi endpoint Cloud IDS.

Log Analytics


SELECT
  JSON_VALUE(json_payload.alert_time) AS alert_time,
  JSON_VALUE(json_payload.name) AS name,
  JSON_VALUE(json_payload.details) AS details,
  JSON_VALUE(json_payload.application) AS application,
  JSON_VALUE(json_payload.uri_or_filename) AS uri_or_filename,
  JSON_VALUE(json_payload.ip_protocol) AS ip_protocol,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="ids.googleapis.com/Endpoint"
  AND JSON_VALUE(json_payload.alert_severity) IN ("HIGH", "CRITICAL")
  AND JSON_VALUE(json_payload.type) = "virus"
ORDER BY 
  timestamp DESC

BigQuery


SELECT
  jsonPayload.alert_time,
  jsonPayload.name,
  jsonPayload.details,
  jsonPayload.application,
  jsonPayload.uri_or_filename,
  jsonPayload.ip_protocol
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].ids_googleapis_com_threat`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="ids.googleapis.com/Endpoint"
  AND jsonPayload.alert_severity IN ("HIGH", "CRITICAL")
  AND jsonPayload.type = "virus"
ORDER BY 
  timestamp DESC

Apa saja domain Cloud DNS teratas yang dikueri dari jaringan VPC Anda?

Kueri berikut mencantumkan 10 domain teratas yang dikueri Cloud DNS dari jaringan VPC Anda selama 60 hari terakhir. Kueri ini mengasumsikan bahwa Anda telah mengaktifkan logging DNS Cloud untuk jaringan VPC, seperti yang dijelaskan dalam petunjuk yang disediakan oleh link Aktifkan di alat cakupan log.

Log Analytics


SELECT
  JSON_VALUE(json_payload.queryName) AS query_name,
  COUNT(*) AS total_queries
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND log_id="dns.googleapis.com/dns_queries"
GROUP BY
  query_name
ORDER BY
  total_queries DESC
LIMIT
  10

BigQuery


SELECT
 jsonPayload.queryname AS query_name,
 COUNT(*) AS total_queries
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].dns_googleapis_com_dns_queries`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
GROUP BY
 query_name
ORDER BY
 total_queries DESC
LIMIT
 10

Langkah selanjutnya