すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:sql_firewall 拡張

最終更新日:Mar 29, 2026
重要

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

仕組み

Flowchart

この拡張は、sql_firewall.firewall パラメーターによって制御される 3 つのモードで動作します。

モード動作
学習実行された各クエリの (userid, queryid) ペアを記録し、ホワイトリストに追加します
許容各クエリをホワイトリストと照合します。ホワイトリストに登録されていないクエリは実行されますが、WARNING が生成されます
強制適用各クエリをホワイトリストと照合します。ホワイトリストに登録されていないクエリは、ERROR によりブロックされます

sql_firewall の設定

ステップ 1:拡張のインストール

CREATE EXTENSION sql_firewall;

ステップ 2:学習モードの有効化

ApsaraDB for RDS コンソール で、sql_firewall.firewalllearning に設定し、インスタンスを再起動します。

このフェーズでは、通常のワークロードを実行してください。拡張は実行されたすべてのクエリをホワイトリストに記録します。学習モードでの実行時間が長いほど、ホワイトリストはより完全なものになります。

sql_firewall.firewall の有効な値:

効果
disable拡張を無効化します
learning学習モードを有効化します
permissive許容モードを有効化します
enforcing強制適用モードを有効化します

ステップ 3:許容モードへの切り替え

sql_firewall.firewallpermissive に設定し、インスタンスを再起動します。

許容モードでは、ホワイトリストに存在しないクエリも実行されますが、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.firewallenforcing に設定し、インスタンスを再起動します。

強制適用モードでは、ホワイトリストに存在しないクエリは即座にブロックされます。

-- ホワイトリスト登録済みクエリは正常に実行されます
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 ロールが必要であり、拡張が disablelearning、または 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 インスタンスのパラメーターを変更する」をご参照ください。