これは
初老丸 Advent Calendar 2018 第 5 日目の記事になる予定です.
tl;dr
以前に以下のような記事を書きました.
AWS WAF の IPSet をコマンドラインで操作するツールを雑に作りはじめていて, その後, 放置気味だったのを改めて見直して gem 化してリリースしてみました.
wafoo | RubyGems.org | your community gem host
使い方自体は特に変わっておらず, export
コマンドで指定した IPSets の IP アドレスリストを書き出して, 必要に応じて追加, 修正, 削除を行い apply
コマンドで登録する流れです. 登録前に --dry-run
で確認出来るので, 実際に運用する場合には --dry-run
で確認してから apply
という流れになると思います.
以前と変わったところ
IPSet 一覧表示
AWS SDK for Ruby のドキュメントを見ると, Aws::WAF と Aws::WAFRegional という 2 つのモジュールが提供されています. waf と waf regional の違いは, 前者が CloudFront に付与する WAF で, 後者が ELB に付与する WAF で別けられるようです. これらを一緒に一覧表示するようにしてみました.
$ bundle exec wafoo list +-------------+--------------------------------------+----------+ | Type | IPSets ID | Name | +-------------+--------------------------------------+----------+ | WAFRegional | xxxxxxxx-1234-5678-9000-xxxxxxxxxxxx | sample1 | | WAFRegional | xxxxxxxx-1234-5678-9000-yyyyyyyyyyyy | sample2 | | WAF | xxxxxxxx-1234-5678-9000-zzzzzzzzzzzz | sample3 | +-------------+--------------------------------------+----------+
とりあえず, こんな感じで.
オクテットではない CIDR boundary のサポート
従来の AWS WAF の IPSet では, IP アドレスの指定は /8
, /16
, /24
, /32
での CIDR 指定しか出来ませんでした. その為, これらのオクテット以外の IP アドレス (例えば, /29
とか) を登録した場合には, /32
に分割して登録するような処理をいれていましたが, 非オクテット CIDR boundary のサポートに伴い, この処理が不要となりました.
現在では, コメントアウトしていますが, 以下のような処理を行っていました.
... # def split_cidr(ipset) # addr = NetAddr::CIDR.create(ipset) # addr.enumerate # end ... # unless %w(8 16 24 32).include?(ipset.split('/').last) # ips = split_cidr(ipset) # ipsets_array = [] # ips.each do |ip| # ipsets_array << { # action: 'INSERT', # ip_set_descriptor: { # type: 'IPV4', # value: ip + '/32' # } # } # end # return ipsets_array # end ...
汚いコードしか書けない自分にとっては, コードを減らせるというのはとても嬉しいです.
べた書きコードを少しずつ...
今後のメンテンスを考慮して, べた書きしていたコードを少しずつ機能毎に分割したり, テストを追加しています.
以上
wafoo の紹介でした. コマンド実行時のメッセージ出力や README の英語がアレな感じで恐縮ですが, 何卒, ご容赦ください.
よろしければ, ご利用いただきましてフィードバック等いただけると幸いです.