All Products
Search
Document Center

ApsaraDB RDS:Ekstensi sql_firewall

Last Updated:Mar 29, 2026
Penting

ApsaraDB RDS for PostgreSQL tidak lagi mendukung ekstensi sql_firewall. Instalasi yang sudah ada tetap berfungsi, tetapi ekstensi ini dapat menyebabkan gangguan pada sistem Anda. Segera hentikan penggunaan ekstensi ini untuk menghindari risiko potensial. Untuk menghapus ekstensi, jalankan DROP EXTENSION sql_firewall; dan hapus sql_firewall dari parameter shared_preload_libraries. Untuk petunjuk mengubah parameter, lihat Modify the parameters of an ApsaraDB RDS for PostgreSQL instance.

Ekstensi sql_firewall adalah firewall tingkat database yang melindungi dari serangan injeksi SQL. Ekstensi ini membangun daftar putih pola SQL yang diizinkan selama fase pembelajaran, lalu memberikan peringatan atau memblokir kueri apa pun yang berada di luar daftar putih tersebut.

Prasyarat

Sebelum memulai, pastikan bahwa:

  • Instans RDS Anda menjalankan salah satu versi PostgreSQL berikut:

    • PostgreSQL 12

    • PostgreSQL 11

    • PostgreSQL 10

Cara kerja

Flowchart

Ekstensi ini beroperasi dalam tiga mode, yang dikendalikan oleh parameter sql_firewall.firewall:

ModePerilaku
LearningMencatat setiap pasangan (userid, queryid) dari kueri yang dieksekusi dan menambahkannya ke daftar putih
PermissiveMemeriksa setiap kueri terhadap daftar putih. Kueri yang tidak ada dalam daftar putih tetap dieksekusi tetapi menghasilkan WARNING
EnforcingMemeriksa setiap kueri terhadap daftar putih. Kueri yang tidak ada dalam daftar putih diblokir dengan ERROR

Menyiapkan sql_firewall

Langkah 1: Instal ekstensi

CREATE EXTENSION sql_firewall;

Langkah 2: Aktifkan mode learning

Di Konsol ApsaraDB for RDS, atur sql_firewall.firewall ke learning, lalu restart instans Anda.

Jalankan beban kerja biasa Anda selama fase ini. Ekstensi mencatat semua kueri yang dieksekusi ke dalam daftar putih. Semakin lama Anda menjalankan dalam mode learning, semakin lengkap daftar putihnya.

Nilai yang valid untuk `sql_firewall.firewall`:

NilaiEfek
disableMenonaktifkan ekstensi
learningMengaktifkan mode learning
permissiveMengaktifkan mode permissive
enforcingMengaktifkan mode enforcing

Langkah 3: Beralih ke mode permissive

Atur sql_firewall.firewall ke permissive dan restart instans.

Dalam mode permissive, kueri yang tidak ada dalam daftar putih tetap dieksekusi tetapi menghasilkan peringatan WARNING: Prohibited SQL statement. Tinjau peringatan ini untuk mengidentifikasi kueri sah yang terlewat selama fase learning. Jika Anda menemukan kueri seperti itu, kembali ke mode learning, eksekusi kueri tersebut, lalu kembali ke mode permissive.

Periksa isi daftar putih saat ini dan statistik peringatan:

-- Tampilkan semua pola kueri dalam daftar putih dan jumlah eksekusinya
SELECT * FROM sql_firewall.sql_firewall_statements;

Contoh output:

 userid |  queryid   |              query              | calls
--------+------------+---------------------------------+-------
     10 | 3294787656 | select * from k1 where uid = ? ; |     4
(1 row)
-- Tampilkan jumlah peringatan dan error
SELECT * FROM sql_firewall.sql_firewall_stat;

Contoh output:

 sql_warning | sql_error
-------------+-----------
           2 |         1
(1 row)

Kolom sql_warning menunjukkan jumlah peringatan yang dihasilkan dalam mode permissive. Kolom sql_error menunjukkan jumlah kueri yang diblokir dalam mode enforcing.

Langkah 4: Beralih ke mode enforcing

Setelah daftar putih mencakup beban kerja yang diharapkan, atur sql_firewall.firewall ke enforcing dan restart instans.

Dalam mode enforcing, kueri apa pun yang tidak ada dalam daftar putih akan segera diblokir:

-- Kueri dalam daftar putih dieksekusi secara normal
SELECT * FROM k1 WHERE uid = 3;
 uid |   uname
-----+-----------
   3 | Goo Ha-ra
(1 row)
-- Upaya injeksi SQL diblokir
SELECT * FROM k1 WHERE uid = 3 OR 1=1;
ERROR:  Prohibited SQL statement

Perilaku mode permissive (sebagai perbandingan):

-- Injeksi yang sama dalam mode permissive: dieksekusi tetapi menghasilkan peringatan
SELECT * FROM k1 WHERE uid = 3 OR 1=1;
WARNING:  Prohibited SQL statement
 uid |     uname
-----+----------------
   1 | Park Gyu-ri
   2 | Nicole Jung
   3 | Goo Ha-ra
   4 | Han Seung-yeon
   5 | Kang Ji-young
(5 rows)

Referensi

Fungsi manajemen

Kedua fungsi ini memerlukan role rds_superuser dan hanya tersedia ketika ekstensi berada dalam mode disable, learning, atau permissive. Atur sql_firewall.firewall ke salah satu nilai ini sebelum memanggil fungsi tersebut.

FungsiDeskripsi
sql_firewall_reset()Menghapus semua entri dari daftar putih
sql_firewall_stat_reset()Mengatur ulang penghitung sql_warning dan sql_error

Tampilan

ViewDeskripsi
sql_firewall.sql_firewall_statementsMenampilkan semua pola (userid, queryid, query) dalam daftar putih dan jumlah eksekusi masing-masing
sql_firewall.sql_firewall_statMenampilkan jumlah kumulatif peringatan (sql_warning) dari mode permissive dan error (sql_error) dari mode enforcing

Menghapus ekstensi

DROP EXTENSION sql_firewall;

Setelah menghapus ekstensi, hapus sql_firewall dari parameter shared_preload_libraries di Konsol ApsaraDB for RDS, lalu restart instans. Untuk petunjuknya, lihat Modify the parameters of an ApsaraDB RDS for PostgreSQL instance.