tl;dr
AWS WAF のアクセス制御を IP アドレスを条件として行う際に設定する IPSets の管理を比較的頻繁に行う必要がありそうで、毎回マネジメントコンソールを触るのは気が引けたので雑にコマンドラインツールを作ってみた。あくまでも作ってみた系の話しのなので改善点は多々、そもそも必要なのかも疑わしいけど、思いのほかサクッと動いたのでメモしておく。
名前が wafoo というのはどうでも良い。
ちなみに、AWS の認証周りは @k1LoW さんの awsecrets を利用させて頂いている。
また、コマンドラインオプション等は codenize.tools のオプションを出来るだけ参考にさせて頂いた。
シチュエーション別 wafoo
ヘルプ
$ bundle exec exe/wafoo --help Commands: wafoo apply # 指定した IPSet ID の IPset を apply する wafoo export # 指定した IPSet ID の IPset を export する wafoo help [COMMAND] # Describe available commands or one specific command wafoo list # IPSet ID の一覧を取得する wafoo version # version 情報を出力. Options: [--profile=PROFILE] [--region=REGION]
取り敢えず、IPSet の一覧を取得
雑に ip_set_id
と name
が YAML で出力される。
$ bundle exec exe/wafoo list --profile oreno-profile --region ap-northeast-1 listing... --- !ruby/struct:Aws::WAFRegional::Types::IPSetSummary ip_set_id: ${IPSet ID} name: IPSet_1 --- !ruby/struct:Aws::WAFRegional::Types::IPSetSummary ip_set_id: ${IPSet ID} name: IPSet_2
特定の IPSet ID の IP アドレス一覧を取得
bash-3.2$ bundle exec exe/wafoo export --profile ${Your Profile} --region ap-northeast-1 --ip-set-id=${IPSet ID} export... 192.168.1.8/32 192.168.1.9/32 192.168.3.0/24 192.168.4.0/32 192.168.4.1/32 192.168.4.10/32 192.168.4.11/32 192.168.4.12/32 192.168.4.13/32 192.168.4.14/32 192.168.4.15/32 192.168.4.2/32 192.168.4.3/32 192.168.4.4/32 192.168.4.5/32 192.168.4.6/32 192.168.4.7/32 192.168.4.8/32 192.168.4.9/32
カレントディレクトリの ${IPSet ID} というファイルに出力される。
$ cat ${IPSet ID} 192.168.1.8/32 192.168.1.9/32 192.168.3.0/24 192.168.4.0/32 192.168.4.1/32 192.168.4.10/32 192.168.4.11/32 192.168.4.12/32 192.168.4.13/32 192.168.4.14/32 192.168.4.15/32 192.168.4.2/32 192.168.4.3/32 192.168.4.4/32 192.168.4.5/32 192.168.4.6/32 192.168.4.7/32 192.168.4.8/32 192.168.4.9/32
IP アドレスの追加
例えば、192.168.5.0/28 を追加したとする。現時点で WAF の IPSets の辛いところが、CIDR のオクテット設定が 8
16
24
32
しか指定出来ないところ。
www.slideshare.net
wafoo ではこれら以外のオクテットを指定した場合には、自動的に IP アドレス範囲を返してくれる。(※ ネットワークアドレスとブロードキャストアドレスは今のところ除く処理は入れていない)
$ cat ${IPSet ID} 192.168.1.8/32 192.168.1.9/32 192.168.3.0/24 192.168.4.0/32 192.168.4.1/32 192.168.4.10/32 192.168.4.11/32 192.168.4.12/32 192.168.4.13/32 192.168.4.14/32 192.168.4.15/32 192.168.4.2/32 192.168.4.3/32 192.168.4.4/32 192.168.4.5/32 192.168.4.6/32 192.168.4.7/32 192.168.4.8/32 192.168.4.9/32 192.168.5.0/28
まずは dry-run
する。
$ bundle exec exe/wafoo apply --profile ${Your Profile} --region ap-northeast-1 --ip-set-id=${IPSet ID} --dry-run apply...(dry-run) -192.168.4.9/32 removed. +192.168.4.9/32 added. +192.168.5.0/28 added.
なぜか、追加した行の一つ前の行が削除、追加されるのは要改善。
そして、apply
する。
$ bundle exec exe/wafoo apply --profile ${Your Profile} --region ap-northeast-1 --ip-set-id=${IPSet ID} apply... -192.168.4.9/32 removed. +192.168.4.9/32 added. +192.168.5.0/28 added. 192.168.1.8/32 192.168.1.9/32 192.168.3.0/24 192.168.4.0/32 192.168.4.1/32 192.168.4.10/32 192.168.4.11/32 192.168.4.12/32 192.168.4.13/32 192.168.4.14/32 192.168.4.15/32 192.168.4.2/32 192.168.4.3/32 192.168.4.4/32 192.168.4.5/32 192.168.4.6/32 192.168.4.7/32 192.168.4.8/32 192.168.4.9/32 192.168.5.0/32 192.168.5.1/32 192.168.5.10/32 192.168.5.11/32 192.168.5.12/32 192.168.5.13/32 192.168.5.14/32 192.168.5.15/32 192.168.5.2/32 192.168.5.3/32 192.168.5.4/32 192.168.5.5/32 192.168.5.6/32 192.168.5.7/32 192.168.5.8/32 192.168.5.9/32
追加された結果もちゃんと確認出来る。
IP アドレスの削除
例えば、192.168.1.9/32 と 192.168.3.0/24 を削除したいとする。
$ cat ${IPSet ID} 192.168.1.8/32 192.168.4.0/32 192.168.4.1/32 192.168.4.10/32 192.168.4.11/32 192.168.4.12/32 192.168.4.13/32 192.168.4.14/32 192.168.4.15/32 192.168.4.2/32 192.168.4.3/32 192.168.4.4/32 192.168.4.5/32 192.168.4.6/32 192.168.4.7/32 192.168.4.8/32 192.168.4.9/32 192.168.5.0/32 192.168.5.1/32 192.168.5.10/32 192.168.5.11/32 192.168.5.12/32 192.168.5.13/32 192.168.5.14/32 192.168.5.15/32 192.168.5.2/32 192.168.5.3/32 192.168.5.4/32 192.168.5.5/32 192.168.5.6/32 192.168.5.7/32 192.168.5.8/32 192.168.5.9/32
まずは dry-run
する。
$ bundle exec exe/wafoo apply --profile ${Your Profile} --region ap-northeast-1 --ip-set-id=${IPSet ID} --dry-run apply...(dry-run) -192.168.1.9/32 removed. -192.168.3.0/24 removed.
一応、削除対象が出力される。
そして、apply
する。
$ bundle exec exe/wafoo apply --profile ${Your Profile} --region ap-northeast-1 --ip-set-id=${IPSet ID} apply... -192.168.1.9/32 removed. -192.168.3.0/24 removed. 192.168.1.8/32 192.168.4.0/32 192.168.4.1/32 192.168.4.10/32 192.168.4.11/32 192.168.4.12/32 192.168.4.13/32 192.168.4.14/32 192.168.4.15/32 192.168.4.2/32 192.168.4.3/32 192.168.4.4/32 192.168.4.5/32 192.168.4.6/32 192.168.4.7/32 192.168.4.8/32 192.168.4.9/32 192.168.5.0/32 192.168.5.1/32 192.168.5.10/32 192.168.5.11/32 192.168.5.12/32 192.168.5.13/32 192.168.5.14/32 192.168.5.15/32 192.168.5.2/32 192.168.5.3/32 192.168.5.4/32 192.168.5.5/32 192.168.5.6/32 192.168.5.7/32 192.168.5.8/32 192.168.5.9/32
削除対象がちゃんと削除されていることも確認出来る。
雑な
感じで色々と修正すべきところはあるけど、一応、やりたいことは実現出来ているので、とりあえず良しとしよう。