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

Cara Mengaudit Database PostgreSQL

Audit adalah cara yang baik untuk menjaga data Anda seaman mungkin, dan untuk mengetahui apa yang terjadi di database Anda. Ini juga diperlukan untuk banyak peraturan atau standar keamanan, seperti PCI - Industri Kartu Pembayaran. Ini bukan pengecualian untuk database PostgreSQL Anda.

PostgreSQL telah mendapatkan reputasi yang kuat untuk arsitektur yang telah terbukti, keandalan, integritas data, rangkaian fitur yang kuat, ekstensibilitas, dan dedikasi komunitas open source di balik perangkat lunak untuk secara konsisten memberikan solusi yang berkinerja dan inovatif.

Karena itu, seharusnya menjadi opsi untuk mengaudit database PostgreSQL, bukan? Nah, jawabannya adalah ya. Di blog ini, kita akan melihat apa itu ekstensi pgAudit dan bagaimana menginstal dan menggunakannya di database PostgreSQL Anda.

Apa itu pgAudit?

Ekstensi Audit PostgreSQL (pgAudit) menyediakan logging sesi dan objek audit yang mendetail melalui fasilitas logging PostgreSQL standar.

Log pernyataan dasar dapat disediakan oleh fasilitas logging standar dengan log_statement =all. Ini dapat diterima untuk pemantauan dan penggunaan dasar lainnya tetapi tidak memberikan tingkat detail yang umumnya diperlukan untuk audit. Tidaklah cukup memiliki daftar semua operasi yang dilakukan terhadap database. Juga harus dimungkinkan untuk menemukan pernyataan tertentu yang menarik bagi auditor. Fasilitas logging standar menunjukkan apa yang diminta pengguna, sedangkan pgAudit berfokus pada detail tentang apa yang terjadi saat database memenuhi permintaan.

Cara Menginstal pgAudit di PostgreSQL

Untuk contoh ini, kita akan menggunakan instalasi CentOS 7. Pada titik ini, kami mengira Anda telah menginstal database PostgreSQL Anda, jika tidak, Anda dapat mengikuti posting blog ini untuk menjalankannya dengan cara yang mudah menggunakan ClusterControl.

Sekarang, Anda harus memiliki repositori PostgreSQL di OS Anda, seperti ini:

$ cat /etc/yum.repos.d/postgresql.repo

# PGDG Red Hat Enterprise Linux / CentOS stable common repository for all PostgreSQL versions

[pgdg-common]

name=PostgreSQL common for RHEL/CentOS $releasever - $basearch

baseurl=http://download.postgresql.org/pub/repos/yum/common/redhat/rhel-$releasever-$basearch

enabled=1

gpgcheck=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG

# PGDG Red Hat Enterprise Linux / CentOS stable repositories:

[pgdg]

name=PostgreSQL 12 $releasever - $basearch

#baseurl=http://yum.postgresql.org/12/redhat/rhel-$releasever-$basearch

baseurl=http://download.postgresql.org/pub/repos/yum/12/redhat/rhel-$releasever-$basearch/

enabled=1

gpgcheck=0

[pgdg-source]

name=PostgreSQL 12 $releasever - $basearch - Source

baseurl=http://yum.postgresql.org/srpms/12/redhat/rhel-$releasever-$basearch

enabled=0

gpgcheck=0

Jika Anda memeriksa paket pgaudit yang tersedia, Anda seharusnya memiliki:

pgaudit14_12.x86_64 : PostgreSQL Audit Extension

Jadi, mari kita instal:

$ yum install pgaudit14_12

Sekarang, Anda perlu menambahkannya di file konfigurasi postgresql.conf, yang secara default terletak di /var/lib/pgsql/12/data/postgresql.conf, dan mulai ulang layanan PostgreSQL untuk menerapkan perubahan.

shared_preload_libraries = 'pgaudit, pg_stat_statements'

Setelah memulai ulang layanan database, Anda perlu membuat ekstensi:

postgres=# CREATE EXTENSION pgaudit;

CREATE EXTENSION

And now, you can run the following query to check the new extension created:

postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';

  name   | default_version | installed_version |             comment

---------+-----------------+-------------------+---------------------------------

 pgaudit | 1.4.1           | 1.4.1             | provides auditing functionality

(1 row)

Konfigurasi pgAudit

Anda dapat memverifikasi konfigurasi saat ini dengan menjalankan kueri berikut:

postgres=# SELECT name,setting FROM pg_settings WHERE name LIKE 'pgaudit%';

            name            | setting

----------------------------+---------

 pgaudit.log                | none

 pgaudit.log_catalog        | on

 pgaudit.log_client         | off

 pgaudit.log_level          | log

 pgaudit.log_parameter      | off

 pgaudit.log_relation       | off

 pgaudit.log_statement_once | off

 pgaudit.role               |

(8 rows)

Mari kita lihat parameter ini satu per satu.

  • pgaudit.log :Menentukan kelas pernyataan mana yang akan dicatat oleh pencatatan audit sesi. Standarnya adalah tidak ada. Nilai yang mungkin adalah:
    • BACA:PILIH dan SALIN jika sumbernya adalah relasi atau kueri.
    • MENULIS:INSERT, UPDATE, DELETE, TRUNCATE, dan COPY jika tujuannya adalah relasi.
    • FUNCTION:Panggilan fungsi dan blok DO.
    • ROLE:Pernyataan terkait peran dan hak istimewa:HIBAH, cabut, CREATE/ALTER/DROP ROLE.
    • DDL:Semua DDL yang tidak termasuk dalam kelas ROLE.
    • MISC:Perintah lain-lain, mis. BUANG, ANGKAT, CHECKPOINT, VAKUM, SET.
    • MISC_SET:Berbagai perintah SET, mis. SETEL PERAN.
    • SEMUA:Sertakan semua hal di atas.
  • pgaudit.log_catalog :Menentukan bahwa pencatatan sesi harus diaktifkan jika semua relasi dalam pernyataan berada di pg_catalog. Menonaktifkan pengaturan ini akan mengurangi kebisingan di log dari alat seperti psql dan PgAdmin yang banyak meminta katalog. Standarnya aktif.
  • pgaudit.log_client :Menentukan apakah pesan log akan terlihat oleh proses klien seperti psql. Pengaturan ini umumnya harus dibiarkan dinonaktifkan tetapi mungkin berguna untuk debugging atau tujuan lain. Standarnya tidak aktif.
  • pgaudit.log_level :Menentukan tingkat log yang akan digunakan untuk entri log. Pengaturan ini digunakan untuk pengujian regresi dan mungkin juga berguna bagi pengguna akhir untuk pengujian atau tujuan lain. Standarnya adalah log.
  • pgaudit.log_parameter :Menentukan bahwa pencatatan audit harus menyertakan parameter yang diteruskan dengan pernyataan. Jika ada parameter, parameter tersebut akan dimasukkan dalam format CSV setelah teks pernyataan. Standarnya tidak aktif.
  • pgaudit.log_relation :Menentukan apakah logging audit sesi harus membuat entri log terpisah untuk setiap relasi (TABLE, VIEW, dll.) yang dirujuk dalam pernyataan SELECT atau DML. Ini adalah jalan pintas yang berguna untuk logging lengkap tanpa menggunakan logging audit objek. Standarnya tidak aktif.
  • pgaudit.log_statement_once :Menentukan apakah logging akan menyertakan teks pernyataan dan parameter dengan entri log pertama untuk kombinasi pernyataan/sub-pernyataan atau dengan setiap entri. Menonaktifkan pengaturan ini akan menghasilkan lebih sedikit pencatatan verbose tetapi dapat mempersulit penentuan pernyataan yang menghasilkan entri log, meskipun pasangan pernyataan/sub-pernyataan bersama dengan id proses seharusnya cukup untuk mengidentifikasi teks pernyataan yang dicatat dengan entri sebelumnya. Standarnya tidak aktif.
  • pgaudit.role :Menentukan peran master yang akan digunakan untuk logging audit objek. Beberapa peran audit dapat ditentukan dengan memberikannya kepada peran utama. Hal ini memungkinkan beberapa grup untuk bertanggung jawab atas berbagai aspek pencatatan audit. Tidak ada standar.

Penggunaan pgAudit

Sekarang kita telah meninjau parameter konfigurasi, mari kita lihat contoh cara menggunakannya di dunia nyata.

Untuk mengaudit semua pembacaan, penulisan, dan kueri DDL, jalankan:

test1=# set pgaudit.log = 'read,write,ddl';

SET

Dan kemudian, jalankan kalimat berikut:

test1=# CREATE TABLE table1 (id int, name text);

CREATE TABLE

test1=# INSERT INTO table1 (id, name) values (1, 'name1');

INSERT 0 1

test1=# INSERT INTO table1 (id, name) values (2, 'name2');

INSERT 0 1

test1=# INSERT INTO table1 (id, name) values (3, 'name3');

INSERT 0 1

test1=# SELECT * FROM table1;

 id | name

----+-------

  1 | name1

  2 | name2

  3 | name3

(3 rows)

Jika Anda memeriksa file log PostgreSQL, Anda akan melihat ini:

2020-11-20 19:17:13.848 UTC [25142] LOG:  AUDIT: SESSION,3,1,DDL,CREATE TABLE,,,"CREATE TABLE table1 (id int, name text);",<not logged>

2020-11-20 19:18:45.334 UTC [25142] LOG:  AUDIT: SESSION,4,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (1, 'name1');",<not logged>

2020-11-20 19:18:52.332 UTC [25142] LOG:  AUDIT: SESSION,5,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (2, 'name2');",<not logged>

2020-11-20 19:18:58.103 UTC [25142] LOG:  AUDIT: SESSION,6,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (3, 'name3');",<not logged>

2020-11-20 19:19:07.261 UTC [25142] LOG:  AUDIT: SESSION,7,1,READ,SELECT,,,SELECT * FROM table1;,<not logged>

Tentu saja, ini adalah contoh dasar. Anda dapat menggunakan parameter konfigurasi yang dijelaskan di bagian sebelumnya agar sesuai dengan bisnis Anda.

Mengaktifkan pgAudit dengan ClusterControl

Daripada menginstal dan mengaktifkan pgAudit secara manual, opsi lain adalah menggunakan ClusterControl CLI untuk melakukan pekerjaan untuk Anda. Untuk ini, Anda dapat menjalankan perintah berikut dari server ClusterControl Anda:

$ s9s cluster --setup-audit-logging --cluster-id=ID

Di mana ID adalah id cluster PostgreSQL.

Saat sedang berjalan, Anda dapat memantau statusnya dengan memeriksa tugas ClusterControl. Pertama, Anda memerlukan id pekerjaan, yang bisa Anda dapatkan dari daftar pekerjaan:

$ s9s job --list

163  18 RUNNING  test_dba                     admins 19:41:45            90% Setup Audit Logging

Sekarang, periksa detail pekerjaan:

$ s9s job --log --job-id=163

Using SSH credentials from cluster.

Cluster ID is 18.

The username is 'root'.

10.10.10.129:5432: Configuring audit logging.

10.10.10.129:5432: Installing 'pgaudit14_12'.

10.10.10.129:5432: Setting pgaudit.log to ROLE,DDL,MISC.

Writing file '10.10.10.129:/var/lib/pgsql/12/data/postgresql.conf'.

10.10.10.129:5432: Restarting PostgreSQL node.

10.10.10.129: waiting for server to shut down.... done

server stopped

waiting for server to start....2020-11-20 19:41:52.069 UTC [25137] LOG:  pgaudit extension initialized

2020-11-20 19:41:52.069 UTC [25137] LOG:  starting PostgreSQL 12.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit

2020-11-20 19:41:52.069 UTC [25137] LOG:  listening on IPv4 address "0.0.0.0", port 5432

2020-11-20 19:41:52.069 UTC [25137] LOG:  listening on IPv6 address "::", port 5432

2020-11-20 19:41:52.080 UTC [25137] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

2020-11-20 19:41:52.102 UTC [25137] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"

2020-11-20 19:41:52.130 UTC [25137] LOG:  redirecting log output to logging collector process

2020-11-20 19:41:52.130 UTC [25137] HINT:  Future log output will appear in directory "log".

 done

server started

10.10.10.129:5432: Waiting for node to be accessible.

10.10.10.129:5432: pgaudit 1.4.1 is enabled.

Tindakan ini akan memerlukan restart layanan database yang akan dilakukan oleh ClusterControl dalam tugas yang sama. Setelah memulai ulang, ekstensi pgAudit diaktifkan dan siap digunakan:

postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';

  name   | default_version | installed_version |             comment

---------+-----------------+-------------------+---------------------------------

 pgaudit | 1.4.1           | 1.4.1             | provides auditing functionality

(1 row)

Itu dia! Sekarang Anda dapat mengonfigurasi dan menggunakan pgAudit dengan cara yang sama seperti yang kami tunjukkan sebelumnya.

Kesimpulan

Audit diperlukan untuk banyak peraturan keamanan dan juga berguna jika Anda ingin mengetahui apa yang terjadi di database Anda, dan kapan serta siapa yang bertanggung jawab untuk itu.

Di blog ini, kami membahas tentang ekstensi PostgreSQL pgAudit sebagai cara yang baik untuk mengaudit database PostgreSQL Anda, dan kami juga menunjukkan cara mengimplementasikannya secara manual dan menggunakan ClusterControl CLI.

Perlu diingat bahwa, bergantung pada konfigurasi, pgAudit dapat menghasilkan volume data yang sangat besar. Jadi, Anda harus berhati-hati dalam menentukan apa yang perlu diaudit dan untuk berapa lama.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemicu vs. batasan pemeriksaan

  2. Cara Membangun Kembali Budak PostgreSQL yang Tidak Konsisten

  3. Driver PostgreSQL 9.2 JDBC menggunakan zona waktu klien?

  4. Menstandardisasi Keamanan PostgreSQL di Lingkungan Multi-Cloud

  5. Cara Membuat Pengguna dengan pgAdmin