ApsaraDB RDS for PostgreSQL では、sql_firewall 拡張のサポートが終了しました。既存のインストールでは引き続き動作しますが、この拡張機能が原因でシステムが機能停止する可能性があります。潜在的なリスクを回避するため、できるだけ早くこの拡張機能の使用を停止してください。拡張機能を削除するには、DROP EXTENSION sql_firewall; を実行し、[shared_preload_libraries] パラメーターから sql_firewall を削除します。パラメーターの変更手順については、「ApsaraDB RDS for PostgreSQL インスタンスのパラメーターを変更する」をご参照ください。
sql_firewall 拡張は、データベースレベルのファイアウォールであり、SQL インジェクション攻撃に対する防御機能を提供します。学習フェーズ中に許可される SQL パターンをホワイトリストとして構築し、その後、ホワイトリストに含まれないクエリを警告またはブロックします。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
RDS インスタンスが、以下の PostgreSQL バージョンのいずれかで実行されていること:
PostgreSQL 12
PostgreSQL 11
PostgreSQL 10
仕組み

この拡張は、sql_firewall.firewall パラメーターによって制御される 3 つのモードで動作します。
| モード | 動作 |
|---|---|
| 学習 | 実行された各クエリの (userid, queryid) ペアを記録し、ホワイトリストに追加します |
| 許容 | 各クエリをホワイトリストと照合します。ホワイトリストに登録されていないクエリは実行されますが、WARNING が生成されます |
| 強制適用 | 各クエリをホワイトリストと照合します。ホワイトリストに登録されていないクエリは、ERROR によりブロックされます |
sql_firewall の設定
ステップ 1:拡張のインストール
CREATE EXTENSION sql_firewall;ステップ 2:学習モードの有効化
ApsaraDB for RDS コンソール で、sql_firewall.firewall を learning に設定し、インスタンスを再起動します。
このフェーズでは、通常のワークロードを実行してください。拡張は実行されたすべてのクエリをホワイトリストに記録します。学習モードでの実行時間が長いほど、ホワイトリストはより完全なものになります。
sql_firewall.firewall の有効な値:
| 値 | 効果 |
|---|---|
disable | 拡張を無効化します |
learning | 学習モードを有効化します |
permissive | 許容モードを有効化します |
enforcing | 強制適用モードを有効化します |
ステップ 3:許容モードへの切り替え
sql_firewall.firewall を permissive に設定し、インスタンスを再起動します。
許容モードでは、ホワイトリストに存在しないクエリも実行されますが、WARNING: Prohibited SQL statement の警告が生成されます。これらの警告を確認し、学習フェーズで見落とされた正当なクエリを特定してください。該当するクエリが見つかった場合は、再度学習モードに切り替え、そのクエリを実行した後、許容モードに戻ります。
現在のホワイトリストの内容とアラート統計を確認します:
-- すべてのホワイトリスト登録済みクエリパターンと実行回数を表示
SELECT * FROM sql_firewall.sql_firewall_statements;実行例:
userid | queryid | query | calls
--------+------------+---------------------------------+-------
10 | 3294787656 | select * from k1 where uid = ? ; | 4
(1 行)-- 警告およびエラーの発生回数を表示
SELECT * FROM sql_firewall.sql_firewall_stat;実行例:
sql_warning | sql_error
-------------+-----------
2 | 1
(1 行)sql_warning 列は、許容モードで生成された警告の数を示します。sql_error 列は、強制適用モードでブロックされたクエリの数を示します。
ステップ 4:強制適用モードへの切り替え
ホワイトリストが想定ワークロードを十分にカバーするようになったら、sql_firewall.firewall を enforcing に設定し、インスタンスを再起動します。
強制適用モードでは、ホワイトリストに存在しないクエリは即座にブロックされます。
-- ホワイトリスト登録済みクエリは正常に実行されます
SELECT * FROM k1 WHERE uid = 3; uid | uname
-----+-----------
3 | Goo Ha-ra
(1 行)-- SQL インジェクション攻撃の試みはブロックされます
SELECT * FROM k1 WHERE uid = 3 OR 1=1;ERROR: Prohibited SQL statement比較用:許容モードの動作
-- 同じインジェクション攻撃を許容モードで実行:警告を発しながら実行されます
SELECT * FROM k1 WHERE uid = 3 OR 1=1;警告: 禁止された SQL ステートメント
uid | uname
-----+----------------
1 | Park Gyu-ri
2 | Nicole Jung
3 | Goo Ha-ra
4 | Han Seung-yeon
5 | Kang Ji-young
(5 rows)参考情報
管理関数
いずれの関数も rds_superuser ロールが必要であり、拡張が disable、learning、または permissive モードのときにのみ利用可能です。呼び出す前に、sql_firewall.firewall をこれらのいずれかの値に設定してください。
| 関数 | 説明 |
|---|---|
sql_firewall_reset() | ホワイトリスト内のすべてのエントリをクリアします |
sql_firewall_stat_reset() | sql_warning および sql_error カウンターをリセットします |
ビュー
| ビュー | 説明 |
|---|---|
sql_firewall.sql_firewall_statements | ホワイトリスト登録済みのすべての (userid, queryid, query) パターンと、それぞれの実行回数を一覧表示します |
sql_firewall.sql_firewall_stat | 許容モードで発生した警告の累積回数(sql_warning)および強制適用モードで発生したエラーの累積回数(sql_error)を表示します |
拡張の削除
DROP EXTENSION sql_firewall;拡張を削除した後、ApsaraDB for RDS コンソールの [shared_preload_libraries] パラメーターから sql_firewall を削除し、インスタンスを再起動します。手順については、「ApsaraDB RDS for PostgreSQL インスタンスのパラメーターを変更する」をご参照ください。