PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengaudit PostgreSQL Menggunakan pgAudit

Audit dalam teknologi informasi (TI) adalah proses pemeriksaan infrastruktur TI organisasi untuk memastikan kepatuhan terhadap persyaratan yang ditetapkan oleh standar yang diakui atau kebijakan yang ditetapkan. Aturan perlindungan data, seperti peraturan GDPR baru, menjadi semakin ketat untuk melindungi data pengguna, jadi audit database Anda harus disiapkan dengan benar untuk memastikan aplikasi dan data pengguna Anda aman dari kerentanan. Dalam posting blog ini, kita akan membahas pgAudit – alat yang menghasilkan log audit yang diperlukan untuk memfasilitasi audit PostgreSQL.

Apa itu pgAudit?

Ekstensi Audit PostgreSQL, pgAudit, adalah ekstensi sumber terbuka yang mencatat peristiwa dalam database PostgreSQL dalam log audit terperinci. Ini menggunakan fasilitas logging PostgreSQL asli, sehingga log audit akan menjadi bagian dari log PostgreSQL. Ekstensi ini didasarkan pada proyek pgAudit 2ndQuadrant yang ditulis oleh Simon Riggs, Abhijit Menon-Sen, dan Ian Barwick, dan termasuk penyempurnaan oleh David Steele dari Crunchy Data.

Mengapa pgAudit lebih dari log_statement=all?

Kita dapat mencatat semua pernyataan di PostgreSQL hanya dengan menyetel log_statement=all . Jadi mengapa menggunakan pgAudit sama sekali? Log pernyataan dasar (menggunakan log_statement ) hanya akan mencantumkan operasi yang dilakukan terhadap database. Ini tidak akan memberikan kemampuan untuk memfilter operasi, dan log tidak akan dalam format yang tepat yang diperlukan untuk audit. pgAudit juga menyediakan perincian untuk mencatat kelas pernyataan tertentu seperti READ (SELECT dan COPY ), WRITE (INSERT , UPDATE , DELETE , dll.), DDL dll. Selain itu, ia menyediakan audit tingkat objek di mana hanya operasi pada hubungan tertentu yang akan dicatat.

Keuntungan lain pgAudit dibandingkan pencatatan log pernyataan dasar adalah ia menyediakan detail operasi yang dilakukan, bukan hanya mencatat operasi yang diminta. Misalnya, pertimbangkan untuk mengeksekusi blok kode anonim menggunakan pernyataan DO.

DO $$
BEGIN
	EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;

Log pernyataan dasar akan menghasilkan:

2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  statement: DO $$
        BEGIN
            EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
        END $$;

pgAudit akan mencatat operasi yang sama seperti:

2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  AUDIT: SESSION,4,1,FUNCTION,DO,,,"DO $$
        BEGIN
            EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
        END $$;",<not logged>
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  AUDIT: SESSION,4,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT),<not logged>

Hal di atas dengan jelas menunjukkan fungsi pgAudit yang mencatat operasi dan internalnya dengan output terstruktur yang memudahkan pencarian.

Cara Mengaudit PostgreSQL Menggunakan pgAuditClick Untuk Tweet

Bagaimana cara menginstal pgAudit?

pgAudit adalah ekstensi yang tersedia untuk diunduh dari repositori PostgreSQL, atau dapat dikompilasi dan dibuat dari sumber. Sebagai langkah pertama, paket tersebut perlu diunduh dan diinstal pada mesin yang menjalankan PostgreSQL (paket ekstensi ini telah diinstal sebelumnya pada semua penerapan ScaleGrid PostgreSQL).

Setelah diinstal, perlu dimuat ke PostgreSQL. Ini dicapai dengan menambahkan pgaudit ke shared_preload_libraries parameter konfigurasi. Restart PostgreSQL diperlukan agar perubahan konfigurasi ini efektif. Langkah selanjutnya adalah mengaktifkan ekstensi pada database dengan menjalankan CREATE EXTENSION pgaudit .

Sekarang ekstensi sudah siap, kita perlu memastikan untuk mengatur parameter konfigurasi agar ekstensi mulai masuk log. Ini bisa sesederhana mengatur parameter pgaudit.log untuk menilai all dan pgAudit akan mulai login session modus.

Sekarang kita tahu cara menginstal dan mengaktifkan pgAudit, mari kita bahas dua mode logging audit yang ditawarkan, sesi dan objek.

Log Audit Sesi

Dalam mode sesi, pgAudit akan mencatat semua operasi yang dilakukan oleh pengguna. Mengatur pgaudit.log parameter ke salah satu nilai yang ditentukan, selain NONE , akan mengaktifkan pencatatan audit sesi. pgaudit.log parameter menentukan kelas pernyataan yang akan dicatat dalam mode sesi. Nilai yang mungkin adalah:READ , WRITE , FUNCTION , ROLE , DDL , MISC , MISC_SET , ALL dan NONE .

Menyetel pgaudit.log parameter ke ALL akan mencatat semua pernyataan. Parameter dapat menerima beberapa kelas menggunakan daftar yang dipisahkan koma dan kelas tertentu dapat dikecualikan dengan tanda –. Misalnya, jika Anda ingin mencatat semua pernyataan kecuali MISC kelas, nilai pgaudit.log akan menjadi ALL, -MISC, -MISC_SET . Anda juga dapat mengaktifkan pgAudit untuk membuat entri log terpisah untuk setiap referensi relasi dalam pernyataan dengan menyetel pgaudit.log_relation untuk aktif.

Pertimbangkan contoh membuat tabel. Pernyataan SQL akan menjadi:

CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));

Entri log audit yang sesuai adalah:

2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE TABLE,TABLE,public.persons,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE INDEX,INDEX,public.persons_pkey,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,ALTER SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>

Logging Audit Objek

Dalam kasus tertentu, mungkin diperlukan untuk mengaudit hanya serangkaian hubungan tertentu. Dalam kasus seperti itu, menggunakan mode sesi hanya akan menghasilkan sejumlah besar log audit yang tidak sesuai dengan hubungan yang diperlukan. Mode objek sangat cocok untuk tujuan ini dan hanya dapat mengaudit serangkaian hubungan tertentu.

Log audit objek dicapai menggunakan peran PostgreSQL. Peran dapat dibuat dan diberi izin untuk mengakses hanya sekumpulan relasi tertentu. Peran ini harus ditentukan dalam parameter konfigurasi pgaudit.role . Mode objek hanya mendukung SELECT , INSERT , UPDATE dan DELETE pernyataan. Kelas pernyataan yang dicatat tergantung pada izin yang diberikan ke peran. Misalnya, jika peran hanya memiliki izin untuk melakukan SELECT , maka hanya SELECT pernyataan akan dicatat.

Di bawah ini adalah contoh pencatatan audit objek:

Buat peran dan berikan hanya SELECT izin. Setel pgaudit.role ke peran itu dan jalankan SELECT Pernyataan SQL:

CREATE ROLE audit_person;
GRANT SELECT ON persons TO audit_person;
SET pgaudit.role = 'audit_person';
SELECT * FROM persons WHERE ID=404;

Pernyataan pilih di atas akan dicatat sebagai:

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG:  AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>

Tertarik dengan solusi PostgreSQL yang terkelola sepenuhnya?

Untuk mempelajari lebih lanjut tentang bagaimana penyedia DBaaS seperti ScaleGrid dapat membantu Anda mengelola database PostgreSQL Anda, lihat halaman PostgreSQL kami. Lihat bagaimana ScaleGrid dapat membuat Anda lebih fokus mengembangkan produk, dan lebih sedikit mengelola database.

Bagaimana menginterpretasikan entri log audit?

Sejauh ini, kami telah memberikan detail tentang tampilan entri log audit, sekarang mari kita lihat format entri log audit. Setiap entri dimulai dengan log_line_prefix yang disebutkan untuk logging PostgreSQL, dan kemudian output lainnya akan dalam format CSV. Pertimbangkan entri log audit sederhana berikut:

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG:  AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>

Dalam entri di atas, nilainya

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: 

berasal dari format log_line_prefix %t:%r:%u@%d:[%p]: . Isi entri audit dimulai dari LOG: AUDIT: nilai dan mengikuti format CSV. Format nilai dalam bentuk:

AUDIT_TYPE,STATEMENT_ID,SUBSTATEMENT_ID,CLASS,COMMAND,OBJECT_TYPE,OBJECT_NAME,STATEMENT,PARAMETER

Mari kita lihat masing-masing bidang satu per satu:

Field Deskripsi Nilai dari contoh entri audit
AUDIT_TYPE Menunjukkan mode audit:SESI atau OBYEK OBJEK
STATEMENT_ID Pengidentifikasi pernyataan unik untuk setiap sesi 10
SUBSTATEMENT_ID Pengidentifikasi untuk setiap sub pernyataan dalam pernyataan utama 1
CLASS Menunjukkan kelas pernyataan seperti READ, WRITE dll yang merupakan nilai yang ditentukan untuk parameter pgaudit.log. BACA
COMMAND Perintah yang digunakan dalam pernyataan SQL PILIH
OBJECT_TYPE Dapat berupa TABLE, INDEX, VIEW, dll. TABEL
OBJECT_NAME Nama objek yang sepenuhnya memenuhi syarat public.persons
PERNYATAAN Pernyataan yang sebenarnya dieksekusi pilih * dari orang dengan ID=404;
PARAMETER Bila pgaudit.log_parameter disetel ke true, CSV parameter yang dikutip akan dicantumkan jika ada, atau “tidak ada” jika tidak ada parameter. Ketika pgaudit.log_parameter tidak disetel, nilainya akan menjadi “

Inferensi

pgAudit, dengan segala kemampuannya, menyederhanakan proses audit dengan membuat log jejak audit. Meskipun ada beberapa peringatan, seperti pencatatan objek yang diganti namanya dengan nama yang sama, itu masih merupakan alat yang kuat yang menyediakan fungsionalitas yang diperlukan. Namun, informasi audit yang ditulis dalam log mungkin tidak hanya ideal untuk proses audit – proses audit menjadi lebih baik jika log tersebut dapat dikonversi ke skema basis data, dan data audit dapat dimuat ke basis data sehingga Anda dapat dengan mudah melakukan kueri informasi. Di sinilah PostgreSQL Audit Log Analyzer (pgAudit Analyze) berguna. Untuk informasi lebih lanjut, lihat halaman github pgAudit dan pgAudit Analyze.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres SELECT di mana WHERE adalah UUID atau string

  2. Menghancurkan DB Postgres di Heroku

  3. Kesalahan PostgreSQL saat mencoba membuat ekstensi

  4. Bisakah saya meminta Postgresql untuk mengabaikan kesalahan dalam transaksi?

  5. Optimasi Kueri di PostgreSQL. JELASKAN Dasar-dasar – Bagian 3