Mengaudit PostgreSQL menggunakan pgAudit

Halaman ini menjelaskan audit database menggunakan ekstensi pgAudit, yang membantu Anda mengonfigurasi banyak log yang sering kali diperlukan untuk mematuhi sertifikasi pemerintah, keuangan, dan ISO.

Untuk mengetahui informasi umum tentang ekstensi PostgreSQL di Cloud SQL, lihat Ekstensi PostgreSQL.

Ringkasan

Audit database di Cloud SQL untuk PostgreSQL tersedia melalui ekstensi pgAudit open source.

Dengan ekstensi ini, Anda dapat merekam dan melacak operasi SQL yang dilakukan terhadap instance database tertentu secara selektif. Ekstensi ini memberi Anda kemampuan audit untuk memantau dan mencatat subkumpulan operasi tertentu.

Ekstensi pgAudit berlaku untuk perintah dan kueri SQL yang dijalankan. Sebaliknya, Cloud Audit Logs harus digunakan untuk mengaudit operasi administratif dan pemeliharaan yang dilakukan di instance Cloud SQL.

Lihat halaman Log audit untuk informasi selengkapnya tentang logging audit di Cloud SQL.

Menyiapkan pengauditan database di Cloud SQL

Langkah-langkah untuk logging audit menggunakan ekstensi pgAudit mencakup:

  1. Mengaktifkan flag cloudsql.enable_pgaudit di Cloud SQL.
  2. Menjalankan perintah untuk membuat ekstensi pgAudit.
  3. Menetapkan nilai untuk flag pgaudit.log.

Setelah menyiapkan audit database, Anda dapat melihat log dan, jika perlu, menonaktifkan logging.

Menyiapkan pengauditan

Bagian ini menjelaskan dasar-dasar penyiapan operasi audit database.

Flag awal untuk mengaktifkan pengauditan

Di Cloud SQL, Anda menggunakan flag database untuk banyak operasi, termasuk menyesuaikan parameter PostgreSQL dan mengonfigurasi instance. Dengan flag cloudsql.enable_pgaudit, pengauditan instance database tertentu dapat dilakukan. Anda dapat mengubah nilai flag cloudsql.enable_pgaudit melalui Google Cloud Console atau perintah gcloud.

Gunakan petunjuk standar untuk flag guna mengaktifkan tanda cloudsql.enable_pgaudit, dengan menyetel nilai ke on. Misalnya, untuk menggunakan perintah gcloud, tentukan hal berikut, dengan mengganti nama instance Anda dengan [INSTANCE_NAME]:

gcloud sql instances patch [INSTANCE_NAME] --database-flags cloudsql.enable_pgaudit=on

Flag cloudsql.enable_pgaudit tercantum bersama flag lain yang didukung dan khusus untuk Cloud SQL.

Menjalankan perintah untuk membuat ekstensi pgAudit

Setelah mengaktifkan flag database, jalankan perintah CREATE EXTENSION menggunakan klien psql yang kompatibel. Perintah berikut membuat ekstensi pgAudit untuk semua database di instance Cloud SQL:

CREATE EXTENSION pgaudit;

Menetapkan nilai untuk flag pgaudit.log

Gunakan petunjuk standar untuk flag guna menetapkan nilai untuk flag pgaudit.log.

Misalnya, untuk mengaktifkan audit untuk semua operasi database pada sebuah instance, Anda dapat menggunakan perintah gcloud berikut:

  gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

Mengonfigurasi setelan lain untuk database

Untuk mengonfigurasi setelan audit untuk database, ikuti prosedur di bagian Menyesuaikan logging audit database section.

Lihat log audit database

Untuk melihat log audit, aktifkan log audit Akses Data untuk project Anda. Log pgAudit yang dibuat untuk instance tertentu dikirim ke Cloud Logging sebagai log audit Akses Data. Pengguna dapat melihat log pgAudit yang dibuat melalui aplikasi Logs Explorer.

Di aplikasi Logs Explorer log pgAudit dapat dilihat dengan memilih filter log cloudaudit.googleapis.com/data_access.

Atau, Anda dapat menggunakan kueri berikut untuk menampilkan semua log pgAudit untuk project Cloud SQL tertentu:

resource.type="cloudsql_database"
logName="projects/<your-project-name>/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"

Format log untuk pgAudit

Setiap entri log pgAudit di log audit Akses Data memiliki kolom yang mewakili informasi yang dikumpulkan untuk kueri.

Berikut ini contohnya:

{
  protoPayload: {
    @type: "type.googleapis.com/google.cloud.audit.AuditLog"
    methodName: "cloudsql.instances.query"
    request: {
      @type: "type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
      auditClass: "READ"
      auditType: "SESSION"
      chunkCount: "1"
      chunkIndex: "1"
      command: "SELECT"
      database: "finance"
      databaseSessionId: 2209692
      parameter: "[not logged]"
      statement: "SELECT * FROM revenue"
      statementId: 2
      substatementId: 1
      user: "alice"
    }
  }
}

Berikut adalah deskripsi kolom di log audit Akses Data:

  • auditClass. Jenis pernyataan yang dicatat dalam log. Nilai yang mungkin adalah READ, WRITE, FUNCTION, ROLE, DDL, MISC, dan MISC_SET.
  • auditType. SESSION atau OBJECT.
  • chunkCount. Chunking dapat terjadi pada data yang tersedia di kolom parameter dan statement. Kolom chunkCount menunjukkan jumlah total potongan. Lihat juga deskripsi kolom chunkIndex.
  • chunkIndex. Menentukan nomor indeks potongan data di kolom parameter dan statement (dalam penampung request saat ini). Angka awalnya adalah 1. Lihat juga deskripsi kolom chunkCount.
  • perintah. Misalnya ALTER TABLE atau SELECT.
  • parameter. Kolom chunkIndex dapat menentukan konten kolom ini; lihat deskripsi kolom chunkIndex. Jika nilai untuk pgaudit.log_parameter ditetapkan, kolom parameter dapat berisi parameter pernyataan sebagai data CSV kutipan. Jika tidak ada parameter, kolom ini berisi [none]. Jika tidak, kolom ini berisi [not logged].
  • pernyataan. Pernyataan yang dijalankan di backend. Kolom chunkIndex dapat menentukan konten kolom statement; lihat deskripsi kolom chunkIndex.
  • statementId. ID pernyataan unik untuk sesi ini. Setiap ID pernyataan mewakili panggilan backend. ID pernyataan bersifat berurutan, meskipun beberapa pernyataan tidak dicatat dalam log.
  • substatementId. ID berurutan untuk setiap sub-pernyataan dalam pernyataan utama.

Beberapa kolom tersebut juga dijelaskan dalam dokumentasi pgAudit.

Menonaktifkan pengauditan

Untuk menonaktifkan pengauditan database, tetapkan nilai flagcloudsql.enable_pgaudit ke off. Nilainya dapat diubah melalui Google Cloud Console atau melalui perintah gcloud. Gunakan petunjuk standar untuk flag guna menonaktifkan flag cloudsql.enable_pgaudit.

Selain itu, jalankan perintah DROP EXTENSION menggunakan klien psql yang kompatibel untuk menghapus status ekstensi:

DROP EXTENSION pgaudit;

Menyesuaikan logging audit database di Cloud SQL

Bagian ini menjelaskan cara menyesuaikan perilaku audit instance database.

Untuk kemampuan tambahan ekstensi, tinjau dokumentasi pgAudit.

Persyaratan untuk hak istimewa superuser

Di Cloud SQL, ekstensi hanya dapat dibuat oleh pengguna yang menjadi bagian dari peran cloudsqlsuperuser. Saat membuat instance PostgreSQL baru, pengguna PostgreSQL default akan dibuat untuk Anda (meskipun Anda harus menyetel sandi pengguna). Pengguna PostgreSQL default adalah bagian dari peran cloudsqlsuperuser. Untuk mengetahui informasi selengkapnya, lihat Pengguna PostgreSQL.

Mengonfigurasi pengauditan untuk semua operasi database pada instance

Guna mengonfigurasi audit untuk semua database dalam satu instance, Anda harus menerapkan setelan pgAudit pada tingkat sistem. Parameter audit tingkat sistem hanya dapat ditetapkan sebagai flag database melalui Google Cloud Console atau perintah gcloud. Misalnya, untuk mengaktifkan audit untuk semua operasi database pada sebuah instance, Anda dapat menggunakan perintah gcloud berikut:

  gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

Mengonfigurasi operasi tertentu pada semua database instance

Untuk mengaudit semua database instance, Anda dapat menggunakan Google Cloud Console atau perintah gcloud. Misalnya, untuk mengaktifkan pengauditan hanya untuk operasi baca dan tulis pada instance, Anda dapat menggunakan perintah gcloud berikut. Contoh ini menggunakan sintaksis berbasis daftar untuk menentukan beberapa nilai:

  gcloud sql instances patch [INSTANCE_NAME] \
  --database-flags ^:^cloudsql.enable_pgaudit=on:pgaudit.log=read,write

Perintah tersebut menimpa tanda database yang ada.

Mengonfigurasi pengauditan untuk database tertentu

Untuk mengonfigurasi audit untuk database tertentu, tetapkan parameter pgAudit di level database. Misalnya, perintah SQL berikut dapat digunakan untuk mengaktifkan pengauditan baca/tulis untuk database bernama finance:

finance=> ALTER DATABASE finance SET pgaudit.log = 'read,write';

Mengonfigurasi pengauditan untuk relasi

Mengaudit suatu relasi lebih sempit daripada mengaudit basis data tertentu.

Saat Anda mengaudit sebuah relasi, peran auditor unik akan ditetapkan ke parameter pgaudit.role. Setiap objek atau relasi yang diberikan ke peran ini akan dicatat ke dalam log.

Misalnya, untuk mengonfigurasi audit untuk semua kueri SELECT pada relasi salary dalam database employee, Anda dapat menggunakan perintah berikut:

employee=> CREATE ROLE auditor WITH NOLOGIN;
employee=> ALTER DATABASE employee SET pgaudit.role = 'auditor';
employee=> GRANT SELECT ON salary TO auditor;

Anda juga dapat mengaudit subset kolom untuk relasi tertentu.

Misalnya, perintah berikut mengonfigurasi logging audit agar hanya terjadi saat kolom income dan tax_status diakses dari relasi: salary

employee=> GRANT SELECT(income, tax_status) ON salary TO auditor;

Mengonfigurasi pengauditan untuk pengguna database

Anda dapat mengaktifkan pengauditan untuk pengguna tertentu dengan menetapkan parameter pgaudit.log pada tingkat per ROLE.

Misalnya, perintah SQL berikut menetapkan pengauditan untuk semua operasi database yang dijalankan oleh pengguna Alice:

finance=> ALTER ROLE alice SET pgaudit.log = 'all';

Tips untuk pengelolaan audit pada Cloud SQL

Saat Anda menyesuaikan perilaku audit, ingatlah hal berikut:

  • Saat tanda database cloudsql.enable_pgaudit dinonaktifkan, logging audit akan segera dihentikan. Namun, setelan pgAudit yang diterapkan (misalnya, setelan parameter pgaudit.log) dipertahankan, kecuali jika dihapus secara eksplisit.
  • Instance database dimulai ulang setiap kali nilai flag database untuk cloudsql.enable_pgaudit berubah.
  • Pengguna database yang dibuat melalui perintah CREATE ROLE eksplisit tidak memiliki hak istimewa untuk mengubah setelan audit. Hanya pengguna database yang dibuat melalui Google Cloud Console dan perintah gcloud yang dapat mengubah setelan audit.
  • Saat Anda mengaktifkan logging audit sesi dan logging audit objek, pernyataan yang berkaitan dengan keduanya akan ditambahkan ke log. Logging sesi dan logging objek tidak saling membatalkan atau memodifikasi.

Batasan ekstensi pgAudit pada Cloud SQL untuk PostgreSQL

Log audit untuk sementara ditulis ke disk instance mereka, menggunakan kapasitas disk sebelum log dikirim ke Cloud Logging. Oleh karena itu, tinjau semua informasi berikut sebelum menggunakan fitur ini:

  • Kecepatan proses transfer log adalah 4 MB per detik. Jika pemuatan dari pembuatan log melebihi kecepatan penyerapan, hal berikut dapat terjadi:
    • Penggunaan disk yang tidak diinginkan dapat terjadi.
    • Kapasitas disk dapat habis.
  • Jika Anda mengaktifkan fitur ini dan menjalankan banyak kueri yang memenuhi kriteria audit, penggunaan disk dapat meningkat terlalu cepat.
  • Sebelum menggunakan fitur ini, rencanakan untuk:
    • Aktifkan peningkatan penyimpanan otomatis.
    • Memantau penggunaan disk secara keseluruhan; beban dari pembuatan log tidak dapat dipantau secara terpisah. Gunakan metrik cloudsql.googleapis.com/database/disk/utilization di Metrics Explorer.
    • Jika perlu, kurangi penggunaan disk dengan menjalankan lebih sedikit kueri atau mengurangi pengauditan.
  • Jika ruang disk yang tersedia habis, log audit untuk beberapa kueri mungkin akan hilang.