■たくさんのブロックリストURLをワンライナーでFortigateのfirewallに適用する。 ■例えば以下のサイト一覧をFortigateのアドレスグループに変換してみる。 消費者庁の「悪質な海外ウェブサイト一覧」からURL一覧を取得してみた。 http://labunix.hateblo.jp/entry/20141126/1417013113 ■必要なパッケージはpdfgrep、wget。 $ sudo apt-get install -y pdfgrep ■「awk '{if(NR<6){print}else{tmp=$NR}};END{print}'」は 先頭のセクションのみを切り出すため。 $ test -f 141031adjustments_1.pdf || \ wget "http://www.caa.go.jp/adjustments/pdf/141031adjustments_1.pdf"; \ pdfgrep "http" "141031adjustments_1.pdf" | \ tr ' ' '\n' | awk '/http/{print $NF}' | sort -u | sed -e 's%http:\|/%%g'| \ awk 'BEGIN{print "config firewall address"}; \ /^[a-z]/ {print " edit \""$1"\"\n" \ " set type fqdn\n" \ " set fqdn \""$1"\"\n" \ " next"}; \ END{print "end"}' | \ awk '{if(NR<6){print}else{tmp=$NR}};END{print}' config firewall address edit "asazunet.com" set type fqdn set fqdn "asazunet.com" next end ■グループメンバーとなる数を確認。 $ test -f 141031adjustments_1.pdf || \ wget "http://www.caa.go.jp/adjustments/pdf/141031adjustments_1.pdf"; \ pdfgrep "http" "141031adjustments_1.pdf" | \ tr ' ' '\n' | awk '/http/{print $NF}' | sort -u | sed -e 's%http:\|/%%g'| \ awk 'BEGIN{print "config firewall address"}; \ /^[a-z]/ {print " edit \""$1"\"\n" \ " set type fqdn\n" \ " set fqdn \""$1"\"\n" \ " next"}; \ END{print "end"}' | awk '/set fqdn /{count+=1};END{print count}' 222 ■上記の中身も確認出来たら、直接sshで流し込む。 $ test -f 141031adjustments_1.pdf || \ wget "http://www.caa.go.jp/adjustments/pdf/141031adjustments_1.pdf"; \ pdfgrep "http" "141031adjustments_1.pdf" | \ tr ' ' '\n' | awk '/http/{print $NF}' | sort -u | sed -e 's%http:\|/%%g'| \ awk 'BEGIN{print "config firewall address"}; \ /^[a-z]/ {print " edit \""$1"\"\n" \ " set type fqdn\n" \ " set fqdn \""$1"\"\n" \ " next"}; \ END{print "end"}' | ssh 172.31.31.252 ■アドレスグループ名は「141031adjustments_1」とした。 $ test -f 141031adjustments_1.pdf || \ wget "http://www.caa.go.jp/adjustments/pdf/141031adjustments_1.pdf"; \ pdfgrep "http" "141031adjustments_1.pdf" | \ tr ' ' '\n' | awk '/http/{print $NF}' | sort -u | sed -e 's%http:\|/%%g'| \ awk 'BEGIN{print "config firewall addrgrp"; \ print " edit \"141031adjustments_1\""; \ printf " set member "}; \ /^[a-z]/{printf "\"%s\" ",$1}; \ END{print "\n next";print "end"}' | ssh 172.31.31.252 ■「firewall policy」を流し込む。 $ echo -e 'config firewall policy edit 0 set srcintf "internal" "dmz" set dstintf "wan1" set srcaddr "internal-seg" "dmz-seg" set dstaddr "141031adjustments_1" set schedule "always" set service "ALL" set logtraffic all next\nend' | ssh 172.31.31.252 ■後はmoveするかWeb管理画面で先頭に移動すると、 222メンバーが所属するグループは真っ先にブロックされる。 ■SquidGuardに蓄積した個人用domainsルールに 「*.」を先頭につけて追加する場合も少し変えるだけ。 $ sudo awk 'BEGIN{print "config firewall address"}; \ /^[a-z]/ {print " edit \"*."$1"\"\n" \ " set type fqdn\n" \ " set fqdn \"*."$1"\"\n" \ " next"}; \ END{print "end"}' \ /var/lib/squidguard/db/personal/domains ■一つだけ切り出すと例えば以下のようになる。 $ sudo awk 'BEGIN{print "config firewall address"}; \ /^[a-z]/ {print " edit \"*."$1"\"\n" \ " set type fqdn\n" \ " set fqdn \"*."$1"\"\n" \ " next"}; \ END{print "end"}' \ /var/lib/squidguard/db/personal/domains | awk '{if(NR<6){print}else{tmp=$NR}};END{print}' config firewall address edit "*.accesstrade.ne.jp" set type fqdn set fqdn "*.accesstrade.ne.jp" next end ■アドレスグループ「PersonalBlocked」にメンバーとして設定 $ sudo awk 'BEGIN{print "config firewall addrgrp"; \ print " edit \"PersonalBlocked\""; \ printf " set member "}; \ /^[a-z]/{printf "\"*.%s\" ",$1}; \ END{print "\n next";print "end"}' /var/lib/squidguard/db/personal/domains ■内部から外部への通信について、グループに所属する 27メンバーを拒否するよう設定。 dmz -> wan1 internal -> wan1 $ show firewall policy 9 config firewall policy edit 9 set srcintf "internal" "dmz" set dstintf "wan1" set srcaddr "internal-seg" "dmz-seg" set dstaddr "PersonalBlocked" set schedule "always" set service "ALL" set logtraffic all next end