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

ApsaraDB RDS:sql_firewall拡張機能を使用する

最終更新日:Jan 11, 2024

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

前提条件

RDSインスタンスは、次のPostgreSQLバージョンのいずれかを実行します。
  • PostgreSQL 12
  • PostgreSQL 11
  • PostgreSQL 10
重要 ApsaraDB RDS for PostgreSQLは、sql_firewall拡張機能をサポートしなくなりました。 既存のsql_firewall拡張機能は引き続き使用できます。 ただし、拡張機能によりシステムが故障する可能性があります。 潜在的なリスクを防ぐために、できるだけ早い機会に拡張機能の使用をやめることをお勧めします。

sql_firewall拡張機能を削除する場合は、DROP extension sql_firewall; ステートメントを実行して拡張機能をアンインストールし、拡張機能を表す値をshared_preload_librariesパラメーターから削除します。 パラメーターの変更方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。

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

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文を実行しません。

操作

  • 拡張機能を作成
    Create extension sql_firewall;
  • 拡張機能を削除する
    drop extension sql_firewall;
  • モードを切り替える

    ApsaraDB for RDSコンソールで、sql_firewall.firewallパラメーターを見つけます。 パラメーター値を変更し、RDSインスタンスを再起動します。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。

    sql_firewall.firewallパラメーターの有効な値:

    • disable: sql_firewall拡張機能を無効にします。
    • learning: 学習モードを有効にします。
    • permissive: permissiveモードを有効にします。
    • enforcing: enforcingモードを有効にします。
  • 機能関数
    • sql_firewall_reset()

      この関数はホワイトリストを消去します。 この関数は、rds_superuserロールで許可され、強制モードが無効になっている場合にのみ呼び出すことができます。

    • sql_firewall_stat_reset()

      この関数は統計を削除します。 この関数は、rds_superuserロールで許可され、強制モードが無効になっている場合にのみ呼び出すことができます。

  • 関数を表示する
    • sql_firewall.sql_firewall_statements

      この関数は、RDSインスタンスのホワイトリストにあるすべてのSQL文を返します。 この関数は、各SQL文が実行された回数も返します。

      postgres=# select * from sql_firewall.sql_firewall_statements;
           userid | queryid | クエリ | 呼び出し
          --------+------------+---------------------------------+-------
               10 | 3294787656 | select * from k1 where uid = ? ; | 4
          (1行) 
    • sql_firewall.sql_firewall_stat

      この関数は、許可モードで生成されたアラートの数と、強制モードで生成されたエラーの数を返します。 最初の数値はsql_warningによって測定され、2番目の数値はsql_errorによって測定されます。

      postgres=# select * from sql_firewall.sql_firewall_stat;
           sql_warning | sql_error
          -------------+-----------
                     2 | 1
          (1行) 

-- 許可モード

    postgres=# select * from sql_firewall.sql_firewall_statements;
    警告: 禁止されているSQLステートメント
     userid | queryid | クエリ | 呼び出し
    --------+------------+---------------------------------+-------
         10 | 3294787656 | select * from k1 where uid = 1; | 1
    (1行)

    postgres=# select * from k1 where uid = 1;
     uid | uname
    -----+-------------
       1 | パークギュリ
    (1行)

    postgres=# select * from k1 where uid = 3;
     uid | uname
    -----+-----------
       3 | グーハ-ラ
    (1行)

    postgres=# select * from k1ここで、uid = 3または1 = 1;
    警告: 禁止されているSQLステートメント
     uid | uname
    -----+----------------
       1 | パークギュリ
       2 | ニコール・ユング
       3 | グーハ-ラ
       4 | ハン・スンヨン
       5 | カン・ジヨン
    (5行)

-施行モード

    postgres=# select * from k1 where uid = 3;
     uid | uname
    -----+-----------
       3 | グーハ-ラ
    (1行)

    postgres=# select * from k1ここで、uid = 3または1 = 1;
    ERROR: 禁止されているSQL文
    postgres=#