sql_firewall拡張機能は、SQLインジェクションを防止するデータベースレベルのファイアウォールです。 定義されたSQLルールを学習し、ルールをホワイトリストとしてPolarDBクラスターに保存します。 ルールに従わないユーザー操作は禁止されています。
前提条件
PolarDB for PostgreSQLクラスターでPostgreSQL 11が実行されます。
注意事項
sql_firewall拡張は共有メモリを消費します。 クラスターの起動時にsql_firewallライブラリがロードされていない場合 (デフォルト値) 、拡張機能は作成できますが、期待どおりに機能しません。 sql_firewall拡張機能を使用するには、sql_firewallをshared_preload_librariesパラメーターに追加します。
コンソールでshared_preload_librariesパラメーターを設定できます。 詳細については、「クラスターパラメーターの指定」「」をご参照ください。 このパラメーターを変更すると、クラスターが再起動します。 作業は慎重に行ってください。
学習、寛容、および施行モード

sql_firewall拡張機能は、次のモードをサポートします。
学習: 拡張機能は、実行される一般的なSQL文を記録し、それらをホワイトリストに追加します。
Permissive: 拡張機能は、実行されるSQL文をチェックします。 SQL文がホワイトリストにない場合、拡張機能はSQL文を実行しますが、アラートを生成します。
Enforcing: 拡張機能は、実行されるSQL文をチェックします。 SQL文がホワイトリストにない場合、拡張機能はSQL文を実行せず、エラーを返します。
手順
sql_firewall拡張機能の学習モードを有効にします。 特定の期間待機して、拡張機能がより多くのSQL文を学習するようにします。
sql_firewall拡張機能を許可モードに切り替えます。 このモードでは、拡張機能は、ホワイトリストにないSQL文のアラートを生成します。 これらのSQL文がリスクの高い文であるかどうかは、ビジネス要件に基づいて確認できます。 これらのステートメントが高リスクのステートメントでない場合は、学習モードに切り替えて、これらのSQLステートメントをホワイトリストに追加します。
sql_firewall拡張機能を強制モードに切り替えます。 このモードでは、拡張機能はホワイトリストにないSQL文を実行しません。
使用状況
dbms_job拡張子を作成します。
CREATE EXTENSION sql_firewall;dbms_job拡張子を削除します。
DROP EXTENSION sql_firewall;ネットワーク分離モードを拡張ホワイトリストモードに切り替える
sql_firewall.firewallパラメーター値を変更し、PolarDBクラスターを再起動します。
説明sql_firewall.firewallパラメーターはコンソールに表示されません。 その値を変更するには、お問い合わせ。
sql_firewall.firewallパラメーターの有効な値:
disable: sql_firewall拡張機能を無効にします。
learning: 学習モードを有効にします。
permissive: permissiveモードを有効にします。
enforcing: enforcingモードを有効にします。
関数
sql_firewall_reset()
この関数はホワイトリストを消去します。 この関数は、polar_superuserロールで許可され、強制モードが無効になっている場合にのみ呼び出すことができます。
sql_firewall_stat_reset()
この関数は統計を削除します。 この関数は、polar_superuserロールで許可され、強制モードが無効になっている場合にのみ呼び出すことができます。
関数を表示する
sql_firewall.sql_firewall_statements
この関数は、PolarDBクラスターのホワイトリストにあるすべてのSQL文を返します。 この関数は、各SQL文が実行された回数も返します。
sql_firewall.sql_firewall_stat
この関数は、許可モードで生成されたアラートの数と、強制モードで生成されたエラーの数を返します。 最初の数値はsql_warningによって測定され、2番目の数値はsql_errorによって測定されます。
例
許可モード
SELECT * FROM sql_firewall.sql_firewall_statements; WARNING: Prohibited SQL statement userid | queryid | query | calls --------+------------+---------------------------------+------- 10 | 3294787656 | select * from k1 where uid = 1; | 1 (1 row) SELECT * FROM k1 WHERE uid = 1; uid | uname -----+------------- 1 | Park Gyu-ri (1 row) SELECT * FROM k1 WHERE uid = 3; uid | uname -----+----------- 3 | Goo Ha-ra (1 row) 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)実施モード
SELECT * FROM k1 WHERE uid = 3; uid | uname -----+----------- 3 | Goo Ha-ra (1 row) SELECT * FROM k1 WHERE uid = 3 OR 1 = 1; ERROR: Prohibited SQL statement