tl;dr

AWS WAF のアクセス制御を IP アドレスを条件として行う際に設定する IPSets の管理を比較的頻繁に行う必要がありそうで、毎回マネジメントコンソールを触るのは気が引けたので雑にコマンドラインツールを作ってみた。あくまでも作ってみた系の話しのなので改善点は多々、そもそも必要なのかも疑わしいけど、思いのほかサクッと動いたのでメモしておく。

wafoo - AWS WAF の IPSets を管理するツール的なもの(準備中)

github.com

名前が wafoo というのはどうでも良い。
ちなみに、AWS の認証周りは @k1LoW さんの awsecrets を利用させて頂いている。

awsecrets - AWS credentials loader

github.com

また、コマンドラインオプション等は codenize.tools のオプションを出来るだけ参考にさせて頂いた。

codenize any services, and manage by DSL

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_idnameが 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

削除対象がちゃんと削除されていることも確認出来る。

雑な

感じで色々と修正すべきところはあるけど、一応、やりたいことは実現出来ているので、とりあえず良しとしよう。

元記事はこちら

AWS WAF の IPsets を管理するコマンドラインツールを雑に作っている(けど色々と改善する必要がある)