labunix's blog

labunixのラボUnix

たくさんのブロックリストURLをワンライナーでFortigateのfirewallに適用する。

■たくさんのブロックリスト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