Kueri SQL untuk insight keamanan

Dokumen ini menjelaskan cara menganalisis log audit Cloud Logging menggunakan kueri SQL standar BigQuery di halaman Log Analytics. Dengan kueri SQL, Anda dapat menggabungkan dan menganalisis log audit, yang memberikan informasi tentang aktivitas administratif dan akses di resource Google Cloud Anda.

Tentang log audit

Ada empat jenis log audit yang dapat ditulis oleh layanan Google Cloud:

  • Log audit Aktivitas Admin: Log audit Aktivitas Admin merekam panggilan API atau tindakan lain yang mengubah konfigurasi atau metadata resource. Log ini selalu ditulis; Anda tidak dapat mengonfigurasi, mengecualikan, atau menonaktifkannya.

  • Log audit Akses Data: Log audit Akses Data merekam panggilan API yang membaca konfigurasi atau metadata resource, serta panggilan API berbasis pengguna yang membuat, mengubah, atau membaca data resource yang disediakan pengguna. Karena mengakses data adalah operasi API yang sering dilakukan, log ini dinonaktifkan secara default (kecuali untuk BigQuery).

  • Log audit Peristiwa Sistem: Log audit Peristiwa Sistem berisi entri log untuk tindakan Google Cloud yang mengubah konfigurasi resource. Log ini dihasilkan oleh sistem Google; log ini tidak dihasilkan oleh tindakan pengguna. Anda tidak dapat mengonfigurasi, mengecualikan, atau menonaktifkan log audit Peristiwa Sistem.

  • Log audit Kebijakan Ditolak: Log audit Kebijakan Ditolak dicatat saat layanan Google Cloud menolak akses ke pengguna atau akun layanan karena pelanggaran kebijakan keamanan. Log ini tidak dapat dinonaktifkan, tetapi Anda dapat menggunakan filter pengecualian untuk mencegah log ini disimpan dalam Logging.

Untuk informasi selengkapnya tentang log audit, lihat Ringkasan log audit. Untuk mengetahui daftar layanan yang terintegrasi dengan log audit, lihat Layanan Google Cloud dengan log audit.

Menggunakan log audit untuk mengidentifikasi pelanggaran kebijakan atau aktivitas yang mencurigakan

Anda dapat menggunakan log audit untuk mengidentifikasi pelanggaran kebijakan atau aktivitas yang mencurigakan:

Sebelum memulai

  • Pastikan Anda memiliki project, folder, atau organisasi Google Cloud yang menghasilkan log audit.

  • Pastikan Anda memiliki akses ke tampilan di bucket log tempat log audit dirutekan. Bucket log harus diupgrade untuk menggunakan Log Analytics. Untuk informasi cara membuat bucket log yang diupgrade agar dapat menggunakan Log Analytics, lihat Mengonfigurasi bucket log.

  • Untuk mendapatkan izin yang diperlukan untuk membuat sink dan melihat log, minta administrator untuk memberi Anda peran IAM berikut:

    Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses.

    Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

    Bergantung pada log audit yang ingin dilihat, Anda mungkin memerlukan peran atau izin terpisah. Untuk mengetahui informasi tentang cara menetapkan peran IAM, baca dokumentasi Kontrol akses dengan IAM Logging.

  • Untuk menggunakan kueri dalam dokumen ini di halaman Log Analytics, lakukan hal berikut:

    1. Pada panel navigasi Google Cloud Console, pilih Logging, lalu pilih Log Analytics:

      Buka Log Analytics

    2. Identifikasi nama tabel untuk tampilan log dengan menjalankan kueri default:

      Dalam daftar Log views, cari tampilan log, lalu pilih Query. Panel Query diisi dengan kueri default, yang menyertakan nama tabel yang dikueri. Nama tabel memiliki format project_ID.region.bucket_ID.view_ID.

      Untuk mengetahui informasi selengkapnya tentang cara mengakses kueri default, lihat Membuat kueri tampilan log.

    3. Ganti TABLE dengan nama tabel yang sesuai dengan tampilan yang ingin Anda kueri, lalu salin kueri tersebut.

    4. Tempel kueri di panel Query, lalu klik Run query.

Sampel kueri

Bagian ini menyediakan contoh kueri SQL untuk membuat kueri log audit.

Perubahan yang dilakukan pada setelan Pencatatan log

Untuk mengidentifikasi kapan log audit dinonaktifkan atau saat perubahan dilakukan pada setelan Logging default, buat kueri log audit Aktivitas Admin:

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
  `TABLE`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

Menentukan tindakan paling umum yang dilakukan dalam sebulan terakhir

Untuk mengidentifikasi tindakan mana yang paling sering dilakukan dalam 30 hari terakhir, buat kueri semua log audit:

SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM
  `TABLE`
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

Kueri sebelumnya menelusuri semua log audit dalam 30 hari terakhir, dan menampilkan 100 tindakan yang paling sering dilakukan dengan informasi tentang method_name, service_name, jenis resource, dan penghitung tindakan yang dilakukan.

Mendeteksi peran yang diberikan pada akun layanan

Untuk mengidentifikasi peniruan akun layanan, atau peran yang diberikan pada akun layanan, buat kueri log audit Aktivitas Admin:

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
  `TABLE`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 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

Kueri sebelumnya akan menelusuri log audit yang mencatat peran yang diberikan ke akun utama pada akun layanan. Peran pembuat Token Akun Layanan memungkinkan akun utama meniru akun layanan. Kueri ini juga menentukan rentang waktu tujuh hari terakhir dan mengecualikan penerima hibah yang disetujui (%@example.com).

Mengidentifikasi penggunaan API yang tinggi oleh akun utama

Untuk mengidentifikasi penggunaan API yang sangat tinggi oleh akun utama, buat kueri semua log audit:

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 `TABLE`
    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

Untuk akun utama yang ditentukan, principal_email, kueri menghitung rata-rata jumlah panggilan API per hari, dan simpangan baku dari panggilan API tersebut. Jika jumlah rata-rata panggilan API lebih besar dari rata-rata berjalan ditambah tiga kali standar deviasi, kueri akan menampilkan informasi berikut:

  • Penghitung dari tindakan yang dilakukan.
  • Tindakan rata-rata yang dihitung yang dilakukan per hari.
  • Tindakan spesifik yang dilakukan.

Langkah selanjutnya