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 TweetBagaimana 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>
|
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.