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

Ekstensi ini beroperasi dalam tiga mode, yang dikendalikan oleh parameter sql_firewall.firewall:
| Mode | Perilaku |
|---|---|
| Learning | Mencatat setiap pasangan (userid, queryid) dari kueri yang dieksekusi dan menambahkannya ke daftar putih |
| Permissive | Memeriksa setiap kueri terhadap daftar putih. Kueri yang tidak ada dalam daftar putih tetap dieksekusi tetapi menghasilkan WARNING |
| Enforcing | Memeriksa 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`:
| Nilai | Efek |
|---|---|
disable | Menonaktifkan ekstensi |
learning | Mengaktifkan mode learning |
permissive | Mengaktifkan mode permissive |
enforcing | Mengaktifkan 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 statementPerilaku 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.
| Fungsi | Deskripsi |
|---|---|
sql_firewall_reset() | Menghapus semua entri dari daftar putih |
sql_firewall_stat_reset() | Mengatur ulang penghitung sql_warning dan sql_error |
Tampilan
| View | Deskripsi |
|---|---|
sql_firewall.sql_firewall_statements | Menampilkan semua pola (userid, queryid, query) dalam daftar putih dan jumlah eksekusi masing-masing |
sql_firewall.sql_firewall_stat | Menampilkan 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.