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

PolarDB:sql_firewall

最終更新日:Dec 05, 2024

sql_firewall拡張機能は、SQLインジェクションを防止するデータベースレベルのファイアウォールです。 定義されたSQLルールを学習し、ルールをホワイトリストとしてPolarDBクラスターに保存します。 ルールに従わないユーザー操作は禁止されています。

前提条件

PolarDB for PostgreSQLクラスターでPostgreSQL 11が実行されます。

注意事項

sql_firewall拡張は共有メモリを消費します。 クラスターの起動時にsql_firewallライブラリがロードされていない場合 (デフォルト値) 、拡張機能は作成できますが、期待どおりに機能しません。 sql_firewall拡張機能を使用するには、sql_firewallshared_preload_librariesパラメーターに追加します。

説明

コンソールでshared_preload_librariesパラメーターを設定できます。 詳細については、「クラスターパラメーターの指定」「」をご参照ください。 このパラメーターを変更すると、クラスターが再起動します。 作業は慎重に行ってください。

学習、寛容、および施行モード

Flowchart

sql_firewall拡張機能は、次のモードをサポートします。

  • 学習: 拡張機能は、実行される一般的なSQL文を記録し、それらをホワイトリストに追加します。

  • Permissive: 拡張機能は、実行されるSQL文をチェックします。 SQL文がホワイトリストにない場合、拡張機能はSQL文を実行しますが、アラートを生成します。

  • Enforcing: 拡張機能は、実行されるSQL文をチェックします。 SQL文がホワイトリストにない場合、拡張機能はSQL文を実行せず、エラーを返します。

手順

  1. sql_firewall拡張機能の学習モードを有効にします。 特定の期間待機して、拡張機能がより多くのSQL文を学習するようにします。

  2. sql_firewall拡張機能を許可モードに切り替えます。 このモードでは、拡張機能は、ホワイトリストにないSQL文のアラートを生成します。 これらのSQL文がリスクの高い文であるかどうかは、ビジネス要件に基づいて確認できます。 これらのステートメントが高リスクのステートメントでない場合は、学習モードに切り替えて、これらのSQLステートメントをホワイトリストに追加します。

  3. 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