share facebook facebook twitter menu hatena pocket slack

2018.12.12 WED

AWS WAF の IPSet を管理するコマンドラインツール wafoo のそれから… 〜 gem 化してリリースしてみた 〜

川原 洋平

WRITTEN BY 川原 洋平

これは

集え、初老丸達よ。初老丸達による世界に向けた技術的(又はそれに関連する)な物語を綴るカレンダーです。我こそ初老丸という方、初老丸予備軍の方も奮ってご参加下さい。ジーク・初老丸!

qiita.com

初老丸 Advent Calendar 2018 第 5 日目の記事になる予定です.

tl;dr

以前に以下のような記事を書きました.

tl;dr シチュエーション別 wafoo ヘルプ 取り敢えず、IPSet の一覧を取得 特定の IPSet ID の IP アドレス一覧を取得 IP アドレスの追加 IP アドレスの削除 雑な tl;dr AWS WAF のアクセス制御を IP アドレスを条件として行う際に設定する IPSets の管理を比較的頻繁...

inokara.hateblo.jp

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::WAFAws::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 より、2つの新機能のご紹介です。

AWS WAF に嬉しい2つの機能が追加されました!ひとつは、IPv4 で CIDR 指定の自由度が高くなりました!ふたつめは、クエリ文字列パラメータのパターンマッチングが強化されました!

dev.classmethod.jp

従来の 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 の英語がアレな感じで恐縮ですが, 何卒, ご容赦ください.

よろしければ, ご利用いただきましてフィードバック等いただけると幸いです.

元記事はこちら

AWS WAF の IPSet を管理するコマンドラインツール wafoo のそれから… 〜 gem 化してリリースしてみた 〜

川原 洋平

川原 洋平

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。