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

Cara Melindungi Database PostgreSQL Anda dari Serangan Cyber ​​dengan SQL Firewall

Di dunia saat ini, organisasi semakin menghadapi tingkat ancaman serangan siber yang belum pernah terjadi sebelumnya terhadap aset informasi mereka.

Serangan siber bisa datang dalam berbagai bentuk. Salah satu serangan tersebut disebut SQL injection . Dengan injeksi SQL, pemain nakal menargetkan database backend dari sistem apa pun. Biasanya, sistem ini menghadap ke publik. Peretas mencoba mengirim kueri yang tampaknya tidak berbahaya dan teratur ke database – kecuali dengan parameter yang dapat mengekspos informasi yang seharusnya tidak mereka lihat, atau merusak database dengan informasi yang salah, atau membuat sistem crash.

Pakar keamanan siber selalu berpacu dengan waktu untuk tetap berada di depan kecanggihan serangan ini, dan seperti kebanyakan perang besar, perang sekarang terjadi di setiap lini. Ini berarti keamanan harus diterapkan di setiap lapisan tumpukan aplikasi – termasuk lapisan basis data.

DBA berpengalaman biasanya mencoba mengamankan database dengan tindakan seperti kontrol akses berbasis peran (RBAC), otentikasi gabungan, audit, atau SSL. Namun, setiap tindakan ekstra untuk mengamankan database juga harus dipertimbangkan.

Salah satu tindakan perlindungan tersebut adalah firewall database. Seperti firewall biasa, firewall database menyaring lalu lintas berdasarkan daftar putih atau daftar hitam. Mereka juga dapat “belajar” dari pola akses sistem untuk memahami pernyataan mana yang dapat dipercaya dan mana yang tidak. Menggunakan alat seperti ini menambahkan lapisan perlindungan yang kuat terhadap injeksi SQL.

Pada artikel ini, kita akan berbicara tentang SQL Firewall , firewall database untuk melindungi database PostgreSQL. SQL Firewall dibangun dan didukung oleh 2ndQuadrant, pemimpin dalam teknologi PostgreSQL.

Cara Kerja Firewall SQL

SQL Firewall hadir sebagai ekstensi untuk PostgreSQL 9.4 dan yang lebih baru. Meskipun saat ini didukung hingga PostgreSQL versi 10, pekerjaan lebih lanjut sedang berlangsung untuk mendukung versi yang lebih baru.

Karena merupakan ekstensi, SQL Firewall sangat mudah dipasang dan dikonfigurasi. Setelah dikonfigurasi, ini dapat digunakan untuk memasukkan pernyataan SQL ke daftar putih terhadap database untuk pengguna individu. Daftar putih berasal dari "melatih" ekstensi dengan beban kerja khas aplikasi - biasanya berasal dari rangkaian pengujian yang berulang yang mencakup semua skenario yang mungkin. Setelah daftar putih disesuaikan dan diselesaikan, daftar tersebut dapat diekspor dan kemudian diimpor ke instans PostgreSQL lain yang melayani beban kerja serupa.

Misalnya, sebelum peluncuran aplikasi, setiap pengguna yang dikonfigurasi dapat menjalankan beban kerja sampel kualitas produksi terhadap database di lingkungan yang terkendali. Akun pengguna manusia dapat diizinkan untuk menjalankan kueri hanya-baca sementara akun pengguna aplikasi dapat diizinkan untuk menjalankan baca dan tulis. SQL Firewall kemudian memasukkan kueri baca ke daftar putih untuk akun pengguna manusia dan aplikasi dan menulis kueri hanya untuk akun pengguna aplikasi. Jika pengguna manusia kemudian mencoba menjalankan INSERT, DELETE atau UPDATE, SQL Firewall kemudian akan menolak operasi tersebut. Saat aplikasi berkembang, daftar putih juga dapat dilatih ulang dengan beban kerja yang berubah.

Setiap pernyataan yang diblokir dicatat oleh SQL Firewall, yang berarti tim operasi dapat mengirim log ini ke solusi manajemen log mereka dan mendapatkan peringatan setiap kali ada pengecualian.

Menyiapkan Lingkungan

Pada artikel ini, kami akan menginstal SQL Firewall untuk instance PostgreSQL 10 node tunggal yang berjalan di Red Hat Enterprise Linux 7. Pada saat penulisan, RHEL/CentOS 7 dan PostgreSQL 10 adalah versi yang didukung tertinggi. Namun, seperti yang disebutkan sebelumnya, dukungan lebih lanjut akan datang.

Catatan

[Harap diperhatikan bahwa SQL Firewall adalah produk berlisensi komersial yang tersedia untuk pelanggan Dukungan 24/7. Ini tidak tersedia untuk diunduh dari situs publik Kuadran ke-2.]

Langkah 1:Menginstal PostgreSQL 10

Sistem pengujian kami adalah instans Amazon EC2 yang menjalankan Red Hat Enterprise Linux 7.2.

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)

Kami menjalankan perintah berikut untuk mengunduh repo RPM untuk PostgreSQL 10 (x86-64).

# yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y

Selanjutnya, kita menginstal server dan paket klien.

# yum install postgresql10-server postgresql10 -y

Setelah paket berhasil diinstal, kami menjalankan perintah initdb untuk menginisialisasi database.

# /usr/pgsql-10/bin/postgresql-10-setup initdb

Initializing database ... OK

Selanjutnya, kita buat perubahan berikut pada file postgresql.conf. Secara default, ini berada di bawah direktori /var/lib/pgsql/10/data/.

listen_addresses = '*'

Kemudian, tambahkan baris berikut ke file pg_hba.conf (sekali lagi, secara default, ini berada di bawah direktori /var/lib/pgsql/10/data/).

host    all all    <our IP address range>    md5

Kami kemudian memulai layanan PostgreSQL dan mengaktifkannya untuk memulai secara otomatis.

# systemctl start postgresql-10.service
# systemctl enable postgresql-10.service

Terakhir, kita login ke instance database dari psql sebagai pengguna postgres dan mengubah sandi.

# su - postgres
-bash-4.2$ psql
psql (10.12)
Type "help" for help.

postgres=# \password
Enter new password:
Enter it again:
postgres=#

Langkah 2:Pulihkan Basis Data Contoh

Untuk meniru sistem produksi, kami telah memulihkan dua database sampel di server PostgreSQL kami. Basis data ini tersedia untuk umum:

  • Pagila : versi PostgreSQL dari database MySQL Sakila yang populer
  • Chinook : database tentang penyimpanan media digital

Langkah 3:Buat Peran dan Pengguna

Dengan database yang dibuat, kami membuat dua peran pengguna. Satu disebut “pengguna_manusia”, yang lain disebut “pengguna_aplikasi”.

Peran human_user mewakili setiap orang yang mengakses database dari back-end atau dengan alat klien. Peran app_user mewakili akun yang akan digunakan aplikasi untuk terhubung ke database.

psql -d postgres -c "CREATE ROLE human_user WITH  NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN NOREPLICATION PASSWORD '<a tough password>';"
psql -d postgres -c "CREATE ROLE app_user WITH  NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN NOREPLICATION PASSWORD '<a tough password>';"

Peran pengguna kemudian diberikan izin untuk mengakses chinook dan database pagila dengan menjalankan perintah berikut sebagai pengguna postgres:

$ psql -d postgres -c "GRANT CONNECT ON DATABASE pagila, chinook TO app_user;"

$ psql -d chinook -c "GRANT USAGE ON SCHEMA public TO app_user;"
$ psql -d chinook -c "GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;"
$ psql -d chinook -c "GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE, TRIGGER, REFERENCES ON ALL TABLES IN SCHEMA public TO app_user;"
$ psql -d chinook -c "GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO app_user;"

$ psql -d pagila -c "GRANT USAGE ON SCHEMA public TO app_user;"
$ psql -d pagila -c "GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;"
$ psql -d pagila -c "GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE, TRIGGER, REFERENCES ON ALL TABLES IN SCHEMA public TO app_user;"
$ psql -d pagila -c "GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO app_user;"

$ psql -d postgres -c "GRANT CONNECT ON DATABASE pagila, chinook TO human_user;"

$ psql -d chinook -c "GRANT USAGE ON SCHEMA public TO human_user;"
$ psql -d chinook -c "GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO human_user;"
$ psql -d chinook -c "GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE, TRIGGER, REFERENCES ON ALL TABLES IN SCHEMA public TO human_user;"
$ psql -d chinook -c "GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO human_user;"

$ psql -d pagila -c "GRANT USAGE ON SCHEMA public TO human_user;"
$ psql -d pagila -c "GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO human_user;"
$ psql -d pagila -c "GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE, TRIGGER, REFERENCES ON ALL TABLES IN SCHEMA public TO human_user;"
$ psql -d pagila -c "GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO human_user;"

Langkah 4:Memasang Firewall SQL

Menginstal SQL Firewall adalah proses yang mudah. Pertama, kita instal paketnya.

# rpm -ivh postgresql10-sqlfirewall-3.0-1.el7.x86_64.rpm

warning: postgresql10-sqlfirewall-3.0-1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID ******: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...

1:postgresql10-sqlfirewall-3.0-1.el################################# [100%]

Kemudian kita update file postgresql.conf dengan mengubah parameter shared_preload_libraries.

shared_preload_libraries = 'sqlfirewall'

Setelah selesai, kami memulai ulang layanan PostgreSQL.

# systemctl restart postgresql-10.service

Setelah layanan dimulai ulang, kami masuk ke instance sebagai pengguna postgres dan menambahkan ekstensi ke kedua database sampel.

$ psql -U postgres -d chinook -c "CREATE EXTENSION sqlfirewall;"
Password for user postgres:
CREATE EXTENSION
-bash-4.2$ psql -U postgres -d pagila -c "CREATE EXTENSION sqlfirewall;"
Password for user postgres:
CREATE EXTENSION

Gambar di bawah ini menunjukkan ekstensi yang diinstal pada kedua database. Perhatikan bagaimana ada skema khusus yang disebut "sqlfirewall" juga dibuat di kedua database. Skema ini berisi semua objek database yang terkait dengan operasi SQL Firewall.

Kita juga dapat melihat peran baru bernama "sqlfirewall_manager" dibuat secara otomatis. Pengguna yang ditambahkan ke peran ini dapat mengakses fungsi dan tampilan dalam skema sqlfirewall.

Langkah 5:Mengonfigurasi Firewall SQL

Sejumlah parameter kemudian ditambahkan ke postgresql.conf mengajukan. Untuk Red Hat Enterprise Linux dan distro turunannya, lokasi direktori default untuk file ini adalah /var/lib/pgsql/10/data/.

Dalam cuplikan kode berikut, kami sedang mengedit file dan menambahkan sejumlah parameter.

# vim /var/lib/pgsql/10/data/postgresql.conf

sqlfirewall.whitelist = 'verbose'
sqlfirewall.track = 'all'
sqlfirewall.track_utility = 'true'
sqlfirewall.save = 'true'

Kemudian kita reload semua konfigurasi.

$ psql -U postgres -d postgres
Password for user postgres:
psql (10.12)
Type "help" for help.

postgres=# SELECT pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 row)

Selanjutnya, kita biarkan prosesnya tidur sebentar.

postgres=# SELECT pg_sleep(1);
 pg_sleep
----------
(1 row)

dan kemudian periksa status daftar putih di kedua database. Jika langkah-langkah tersebut diikuti, kedua database harus mengaktifkan daftar putih.

postgres=# \connect pagila
You are now connected to database "pagila" as user "postgres".
pagila=# show sqlfirewall.whitelist;
 sqlfirewall.whitelist
-----------------------
 verbose
(1 row)

pagila=# \connect chinook;
You are now connected to database "chinook" as user "postgres".
chinook=# show sqlfirewall.whitelist;
 sqlfirewall.whitelist
-----------------------
 verbose
(1 row)

Mari kita lihat parameter yang baru saja kita tambahkan.

sqlfirewall.whitelist parameter digunakan untuk mengaktifkan fungsionalitas daftar putih firewall. Parameter ini dapat memiliki salah satu dari dua nilai:"verbose" atau "protect".

Dengan opsi verbose, SQL Firewall akan menampilkan pesan peringatan kepada pengguna saat mereka mencoba menjalankan kueri yang tidak masuk daftar putih bahwa mereka tidak diizinkan melakukannya. Ketika nilainya disetel ke protected, SQL Firewall akan menampilkan pesan "izin ditolak" umum. Sebagai praktik terbaik, kami menyarankan untuk menyetel nilai ke "protect", yang tidak memberi tahu peretas mengapa perintah ditolak. Kami telah menyetel parameter ini ke "verbose" hanya untuk tujuan demonstrasi.

Nilai yang ditetapkan ke sqlfirewall.track dan sqlfirewall.track_utility parameter memastikan SQL Firewall melacak semua pernyataan untuk tujuan daftar putih.

Terakhir, atur sqlfirewall.save parameter ke “true” memastikan pernyataan yang masuk daftar putih tetap ada meskipun server di-boot ulang.

Menjalankan SQL Firewall

Menjalankan SQL Firewall melibatkan pemanggilan sejumlah fungsi yang disertakan dengan ekstensi.

Langkah 1:Memahami Fungsi Firewall SQL

Ekstensi SQL Firewall membuat sejumlah fungsi dalam skema sqlfirewall dari database tempat ia diinstal. Sebagian besar fungsi ini hanya dapat dijalankan oleh pengguna super atau anggota peran sqlfirewall_manager.

Mari kita membahas beberapa fungsi ini dengan cepat.

sqlfirewall_whitelist_mode adalah fungsi utama yang akan kita kerjakan. Fungsi ini mengaktifkan daftar putih pernyataan untuk pengguna PostgreSQL tertentu. Dibutuhkan dua parameter:satu adalah nama pengguna, yang lain adalah whitelist_mode.

mode_daftar putih parameter dapat memiliki tiga nilai:

  • Bila disetel ke “RECORD ”, SQL Firewall akan merekam semua pernyataan yang dieksekusi oleh pengguna dalam daftar putih pengguna
  • Bila disetel ke “ENFORCE ”, SQL Firewall akan memberlakukan daftar putih. Pernyataan apa pun yang tidak disertakan dalam daftar putih akan menyebabkan kesalahan
  • Nilai “MATI ” menonaktifkan fungsi daftar putih untuk pengguna, dan pengguna tidak akan dapat menjalankan kueri sama sekali

Jika Anda ingin menghapus kueri yang masuk daftar putih untuk pengguna, jalankan sqlfirewall_whitelist_delete fungsi sebagai gantinya. Fungsi ini mengambil satu parameter:nama pengguna. Setelah dijalankan, fungsi sqlfirewall_whitelist_delete menghapus semua pernyataan yang masuk daftar putih untuk pengguna.

sqlfirewall_whitelist_delete_entry fungsi digunakan untuk menghapus ID kueri individual dari daftar putih pengguna. Ini bisa berguna ketika Anda memiliki terlalu banyak kueri yang diizinkan untuk pengguna dan ingin menyempurnakannya. Fungsi ini mengambil dua parameter:nama pengguna dan ID kueri. Anda dapat menemukan ID kueri yang ingin Anda kecualikan dari daftar putih dengan melihat tampilan sqlfirewall.

sqlfirewall_whitelist_users fungsi tidak mengambil parameter apa pun. Ini mengembalikan daftar pengguna yang telah mengaktifkan daftar putih untuk akun mereka.

Anda dapat mengekspor daftar putih untuk pengguna menggunakan sqlfirewall_whitelist_export fungsi. Fungsi ini mengambil dua parameter:nama pengguna dan nama file yang mengekspor pernyataan pengguna yang masuk daftar putih. File harus berada di lokasi di mana proses server PostgreSQL memiliki akses tulis.

Mirip dengan fungsi sqlfirewall_whitelist_export, fungsi sqlfirewall_whitelist_import digunakan untuk mengimpor file daftar putih yang diekspor untuk pengguna ke instance PostgreSQL yang berbeda untuk pengguna tersebut. Fungsi ini juga membutuhkan dua parameter, nama pengguna, dan file yang akan diimpor. File harus berada di lokasi tempat proses server PostgreSQL dapat membacanya.

Selain itu, database target harus berupa salinan biner dari database sumber – artinya, target harus menjadi bagian dari replikasi streaming atau instance PostgreSQL yang dibuat dari sumber dengan perintah pg_basebackup. Basis data yang dibuat dari dump logis dari basis data sumber tidak dapat mengimpor file daftar putih – dalam kasus seperti itu, daftar putih harus dikonfigurasi secara manual.

Langkah 2:Mengaktifkan Daftar Putih untuk Pengguna

Sekarang kita memiliki beberapa ide tentang fungsi SQL Firewall, mari kita mulai proses daftar putih untuk human_user dan app_user di database pagila dan chinook.

Dalam cuplikan kode di bawah ini, kita menjalankan perintah berikut sebagai superuser postgres.

postgres=# \connect pagila
You are now connected to database "pagila" as user "postgres".
pagila=# SELECT sqlfirewall.sqlfirewall_whitelist_mode('human_user', 'RECORD');
 sqlfirewall_whitelist_mode
----------------------------
 t
(1 row)

pagila=# SELECT sqlfirewall.sqlfirewall_whitelist_mode('app_user', 'RECORD');\
 sqlfirewall_whitelist_mode
----------------------------
 t
(1 row)

pagila=# \connect chinook
You are now connected to database "chinook" as user "postgres".
chinook=# SELECT sqlfirewall.sqlfirewall_whitelist_mode('human_user', 'RECORD');
 sqlfirewall_whitelist_mode
----------------------------
 t
(1 row)

chinook=# SELECT sqlfirewall.sqlfirewall_whitelist_mode('app_user', 'RECORD');
 sqlfirewall_whitelist_mode
----------------------------
 t
(1 row)

Kami juga dapat mengonfirmasi dengan menjalankan fungsi sqlfirewall_whitelist_users().

$ psql -U postgres -d pagila -c "SELECT sqlfirewall.sqlfirewall_whitelist_users();"
Password for user postgres:
 sqlfirewall_whitelist_users
-----------------------------
 (17479,human_user,RECORD)
 (17480,app_user,RECORD)
(2 rows)

$ psql -U postgres -d chinook -c "SELECT sqlfirewall.sqlfirewall_whitelist_users();"
Password for user postgres:
 sqlfirewall_whitelist_users
-----------------------------
 (17479,human_user,RECORD)
 (17480,app_user,RECORD)
(2 rows)

Langkah 3:Menjalankan Beban Kerja

Dengan mengaktifkan dan merekam daftar putih, kami beralih ke akun app_user dan menjalankan beberapa kueri seperti yang ditunjukkan di bawah ini. Perhatikan bagaimana app_user memilih berbagai “bidang ID” (customer_id, staff_id, EmployeeID, dll.) dari tabel yang berbeda.

postgres=# \c - app_user
Password for user app_user:
You are now connected to database "postgres" as user "app_user".
postgres=> \connect pagila
You are now connected to database "pagila" as user "app_user".
pagila=> SELECT customer_id, first_name, last_name, email FROM public.customer;
...
pagila=> SELECT payment_id, customer_id, payment_date, amount FROM public.payment;
...
pagila=> SELECT staff_id, first_name, last_name, email FROM public.staff;
...
pagila=> \connect chinook;
You are now connected to database "chinook" as user "app_user".
chinook=> SELECT "CustomerId", "FirstName", "LastName", "Phone" FROM public."Customer";
...
chinook=> SELECT "EmployeeId", "FirstName", "LastName", "Phone", "Email" FROM public."Employee";
...

Selanjutnya, kita beralih ke akun human_user dan menjalankan beberapa kueri sederhana pada beberapa tabel yang diakses app_user.

postgres=# \c - human_user
Password for user human_user:
You are now connected to database "postgres" as user "human_user".
postgres=> \connect pagila;
You are now connected to database "pagila" as user "human_user".
pagila=> SELECT payment_date, amount FROM public.payment;
...
pagila=> SELECT first_name, last_name, email FROM public.customer;
...
pagila=> \connect chinook;
You are now connected to database "chinook" as user "human_user".
chinook=> SELECT "FirstName", "LastName", "Phone", "Email" FROM public."Employee";
...

Jika kami membuat kueri tampilan sqlfirewall  dari database mana pun sebagai pengguna postgres, kami dapat melihat kueri yang diizinkan untuk setiap pengguna.

Langkah 4:Menerapkan Daftar Putih

Dengan sampel beban kerja yang sekarang diambil, kami menerapkan daftar putih untuk kedua akun pengguna di kedua database dengan menjalankan perintah berikut. Perintah harus dijalankan oleh superuser; dalam hal ini, kami menjalankannya sebagai postgres pengguna.

postgres=# \connect pagila;
You are now connected to database "pagila" as user "postgres".
pagila=# SELECT sqlfirewall.sqlfirewall_whitelist_mode('human_user', 'ENFORCE');
 sqlfirewall_whitelist_mode
----------------------------
 t
(1 row)

pagila=# SELECT sqlfirewall.sqlfirewall_whitelist_mode('app_user', 'ENFORCE');
 sqlfirewall_whitelist_mode
----------------------------
 t
(1 row)

pagila=# \connect chinook;
You are now connected to database "chinook" as user "postgres".
chinook=# SELECT sqlfirewall.sqlfirewall_whitelist_mode('human_user', 'ENFORCE');
 sqlfirewall_whitelist_mode
----------------------------
 t
(1 row)

chinook=# SELECT sqlfirewall.sqlfirewall_whitelist_mode('app_user', 'ENFORCE');
 sqlfirewall_whitelist_mode
----------------------------
 t
(1 row)

Langkah 5:Pengujian

Untuk menguji daftar putih, kami masuk ke database pagila sebagai human_user dan mencoba menjalankan perintah yang dijalankan sebelumnya

chinook=# \c - human_user;
Password for user human_user:
You are now connected to database "chinook" as user "human_user".
chinook=> \connect pagila;
You are now connected to database "pagila" as user "human_user".

pagila=> SELECT payment_date, amount FROM public.payment;
...
pagila=> SELECT first_name, last_name, email FROM public.customer;
...

Perintah berhasil. Ini karena perintah ini dijalankan oleh human_user sebelumnya dan masuk daftar putih.

Sekarang kita coba jalankan perintah berikut. Perhatikan bagaimana human_user mencoba menjalankan kueri dengan dua bidang tambahan. Kueri ini dijalankan oleh app_user sebelumnya.

pagila=> SELECT payment_id, customer_id, payment_date, amount FROM public.payment;

Pernyataan gagal dengan pesan seperti ini:

ERROR:  Execution of non-whitelisted statement prohibited

Ini terjadi karena human_user sebelumnya menjalankan perintah untuk memilih hanya dua bidang dari tabel ini, bukan bidang tambahan (ID pembayaran dan ID pelanggan) yang dia coba akses sekarang. SQL Firewall merekam kueri sebelumnya sebagai beban kerja yang diketahui dan memasukkan kueri itu ke daftar putih. Saat dia mencoba menambahkan dua bidang baru itu dalam kuerinya, firewall memblokirnya.

Jika dipikir-pikir, beginilah cara peretas mungkin ingin mencuri nilai bidang ID sehingga dapat digunakan dalam klausa WHERE dari kueri lain untuk mendapatkan informasi lebih lanjut. Menggunakan metode daftar putih secara efektif memblokirnya.

Jadi, apa yang terjadi jika pengguna membutuhkan dua bidang tambahan ini untuk tujuan yang sah? Dalam kasus seperti itu, mode daftar putih untuk pengguna perlu diubah kembali ke “RECORD” lagi agar kueri baru dapat berjalan, dan  SQL Firewall dapat memasukkannya ke daftar putih.

Mari kita jalankan tes lain sebelum kita menyelesaikannya. Kali ini, kami akan menganggap peretas telah mengkompromikan akun app_user dan ingin menjalankan pernyataan hapus terhadap tabel "pembayaran". Ingatlah bahwa kami telah memberikan hak istimewa DELETE dan TRUNCATE kepada pengguna di atas meja.

Jadi kita masuk sebagai app_user, dan menjalankan pernyataan DELETE.

pagila=> \c - app_user
Password for user app_user:
You are now connected to database "pagila" as user "app_user".
pagila=> DELETE FROM public.payment;
ERROR:  Execution of non-whitelisted statement prohibited

Kesimpulan

Pernyataan itu ditolak karena tidak masuk daftar putih. Bahkan ketika pengguna memiliki hak untuk menghapus data dari tabel, SQL Firewall telah memblokirnya dengan benar.

Seperti yang Anda lihat, SQL Firewall adalah alat keamanan yang kuat. Ini memiliki fitur keamanan yang memungkinkannya digunakan pada mode produksi semu. Dalam mode ini, pengguna uji dapat dikonfigurasi agar pernyataannya masuk daftar putih dan kemudian fungsionalitasnya dapat diuji.

Namun, DBA dan administrator sistem perlu mengetahui beberapa poin:

Pertama-tama, ketika mode daftar putih pengguna diatur ke "RECORD", SQL Firewall tidak menghentikan pengguna untuk menjalankan kueri apa pun. Dengan kata lain, SQL Firewall harus dilatih terlebih dahulu sebelum dapat memblokir pengguna. Itulah mengapa penting untuk memastikan hak akses database normal juga diterapkan ke akun pengguna mana pun. Ini menjadi lebih penting karena anggota peran superuser dan sqlfirewall_manager dikecualikan dari aturan firewall. SQL Firewall bukanlah pengganti untuk keamanan basis data yang ada – ia ada untuk melengkapinya.

Kedua, ketika memasukkan pernyataan SELECT, INSERT, UPDATE, dan DELETE individu ke daftar putih, SQL Firewall akan memperlakukan nama objek yang digunakan dalam perintah ini yang ditulis dalam kasus yang berbeda (huruf besar, campuran, atau huruf kecil) sebagai hal yang sama. Semua perintah lain akan dibandingkan berdasarkan string kueri tekstual. Jadi, misalnya, SQL Firewall akan memperlakukan "BEGIN" dan "mulai" dan "Mulai" sebagai bagian dari kueri terpisah.

Ketiga, daftar putih SQL Firewall tidak secara otomatis mereplikasi ke node siaga di lingkungan replikasi. Namun, Anda dapat mengekspor daftar putih menggunakan fungsi sqlfirewall_whitelist_export dan mengimpornya ke server lain menggunakan fungsi sqlfirewall_whitelist_import. Sayangnya, mencadangkan database atau skema sqlfirewall dan memulihkan  di instance target tidak akan berfungsi. Selain itu, server target harus memiliki akun pengguna yang sama agar daftar putih dapat berguna.

Perlu ada pertimbangan yang cermat dari semua kemungkinan jenis kueri yang dapat dilakukan pengguna terhadap database dan menjalankan daftar putih dalam mode "RECORD" selama diperlukan untuk menangkap semua beban kerja normal. Pengambilan yang terlalu sedikit dapat membatasi akun pengguna untuk menjalankan kueri yang sah, sedangkan perekaman yang terlalu lama dapat menambahkan perintah yang tidak perlu ke daftar putih. Hal ini dapat menyebabkan penundaan untuk SQL Firewall saat membandingkan pernyataan dalam mode penegakan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengecualian dalam JPA saat menggunakan file benih untuk PostgreSQL

  2. Kembalikan baris dari INSERT dengan ON CONFLICT tanpa perlu memperbarui

  3. Membuat Database PostgreSQL

  4. Data redundan dalam pernyataan pembaruan

  5. Pertanyaan PostgreSQL Favorit Saya dan Mengapa Itu Penting