sql_firewall拡張機能は、SQLインジェクションを防止するデータベースレベルのファイアウォールです。 定義されたSQLルールを学習し、ルールをApsaraDB RDS for PostgreSQLインスタンスにホワイトリストとして保存します。 ルールに従わないユーザー操作は禁止されています。
前提条件
RDSインスタンスは、次のPostgreSQLバージョンのいずれかを実行します。- PostgreSQL 12
- PostgreSQL 11
- PostgreSQL 10
sql_firewall拡張機能を削除する場合は、DROP extension sql_firewall;
ステートメントを実行して拡張機能をアンインストールし、拡張機能を表す値をshared_preload_librariesパラメーターから削除します。 パラメーターの変更方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。
学習、寛容、および施行モード
sql_firewall拡張機能は、次のモードをサポートします。
- 学習: 拡張機能は、実行される一般的なSQL文を記録し、それらをホワイトリストに追加します。
- Permissive: 拡張機能は、実行されるSQL文をチェックします。 SQL文がホワイトリストにない場合、拡張機能はSQL文を実行しますが、アラートを生成します。
- Enforcing: 拡張機能は、実行されるSQL文をチェックします。 SQL文がホワイトリストにない場合、拡張機能はSQL文を実行せず、エラーを返します。
手順
- sql_firewall拡張機能の学習モードを有効にします。 特定の期間待機して、拡張機能がより多くのSQL文を学習するようにします。
- sql_firewall拡張機能を許可モードに切り替えます。 このモードでは、拡張機能は、ホワイトリストにないSQL文のアラートを生成します。 これらのSQL文がリスクの高い文であるかどうかは、ビジネス要件に基づいて確認できます。 これらのステートメントが高リスクのステートメントでない場合は、学習モードに切り替えて、これらのSQLステートメントをホワイトリストに追加します。
- 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_reset()
- 関数を表示する
- 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行)
- sql_firewall.sql_firewall_statements
例
-- 許可モード
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=#