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ファイル
概要
制限・許可するルールを設定します。
rule
とusers
を設定します。
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"
運用上データベースを直接操作しないといけない場合、予め制限できてると操作ミスやコンプライアンスの遵守など対応できるのかなと思います。
詳しい設定は公式をご確認ください。