MaxscaleでDatabase Firewall (データベースファイアウォール編)

42日目

MaxscaleでDatabase Firewall (ログ出力編) - tsaekiのブログの続き。
データベースファイアウォールを試してみます。 特定のクエリを制限したり許可したりします。 github.com

サンプルのconfigurationです

[Sample-Service]
type=service
router=readconnroute
router_options=running
servers=server1
user=maxscale
password=maxscale_password
filters=dbfw-blacklist

[dbfw-blacklist]
type=filter
module=dbfwfilter
action=block
rules=/etc/maxscale.modules.d/blacklist-rules.txt
項目 備考
action block blockはブラックリスト、allowはホワイトリスト
rules /etc/maxscale.modules.d/blacklist-rules.txt Ruleファイル。設定内容は後述

Ruleファイル

概要

制限・許可するルールを設定します。
ruleusersを設定します。
ruleではルールの設定を、usersではどのユーザにどのruleを適用するかを設定します。

rule NAME deny { wildcard | columns VALUE... | regex REGEX | limit_queries COUNT TIMEPERIOD HOLDOFF | no_where_clause} [at_times VALUE...] [on_queries [select|update|insert|delete|grant|revoke|drop|create|alter|use|load]]
# 注意
# 公式にはdenyとありますが、denyはdeprecatedで代わりにmatchを使うようです

users NAME... match { any | all | strict_all } rules RULE...

詳細は公式をご確認ください。

ルールサンプル

regexを設定したクエリを制限する

$ cat /etc/maxscale.modules.d/blacklist-rules.txt
rule deny_select match regex '(?i).*select.*from.*users.*'

users %@% match any rules deny_select

$ mysql -usample -h 127.0.0.1 -P 4008 -p sampledb -e "SELECT * FROM users"
ERROR 1141 (HY000) at line 1: Access denied for user 'sample'@'172.18.0.1' to database 'sampledb': Permission denied, query matched regular expression.

on_queriesで設定したクエリを制限する

$ cat /etc/maxscale.modules.d/blacklist-rules.txt
rule deny_select match on_queries select
users %@% match any rules deny_select

$ mysql -usample -h 127.0.0.1 -P 4008 -p sampledb -e "SELECT * FROM users"
ERROR 1141 (HY000) at line 1: Access denied for user 'sample'@'172.18.0.1' to database 'sampledb': Permission denied at this time.

columnsで設定したカラムを含んだクエリを制限する

$ cat /etc/maxscale.modules.d/blacklist-rules.txt
rule deny_select match columns name
users %@% match any rules deny_select

# Block
$ mysql -usample -h 127.0.0.1 -P 4008 -p sampledb -e "SELECT name FROM users"
ERROR 1141 (HY000) at line 1: Access denied for user 'sample'@'172.18.0.1' to database 'sampledb': Permission denied to column 'name'.

# Allow
$ mysql -usample -h 127.0.0.1 -P 4008 -p sampledb -e "SELECT * FROM users"
+-----+------------------+--------------------------------+----------+---------------+---------------------+
| id  | name             | email                          | zip      | tel           | credit_card_number  |
+-----+------------------+--------------------------------+----------+---------------+---------------------+
| 101 | 杉山 結衣        | hidaka@gmail.com               | 487-6450 | 080-2450-8701 | 4114080591739765    |
| 102 | 渚 真綾          | minoru40@yahoo.com             | 269-5000 | 57-1339-7205  | 3553715906133671    |
| 103 | 井上 修平        | taichikudo@hotmail.com         | 268-3379 | 06-1226-7644  | 4414568334566054    |
..snip..

no_where_clauseを設定して、whrereがないとdeleteしない制限をする

$ cat /etc/maxscale.modules.d/blacklist-rules.txt
rule deny_delete match no_where_clause on_queries delete
users %@% match any rules deny_delete

# Block
$ mysql -usample -h 127.0.0.1 -P 4008 -psample_password sampledb -e "DELETE FROM users"
ERROR 1141 (HY000) at line 1: Access denied for user 'sample'@'172.18.0.1' to database 'sampledb': Required WHERE/HAVING clause is missing.

# Allow
$ mysql -usample -h 127.0.0.1 -P 4008 -psample_password sampledb -e "DELETE FROM users WHERE id = 1"

運用上データベースを直接操作しないといけない場合、予め制限できてると操作ミスやコンプライアンスの遵守など対応できるのかなと思います。
詳しい設定は公式をご確認ください。