labunix's blog

labunixのラボUnix

Fortigateのコンフィグセクションを検索するfsecを作ってみる。

■Fortigateのコンフィグセクションを検索するfsecを作ってみる。
 以下lsecのfortigate版があると便利だと思ったので。

 https://github.com/labunix/lsec

■Fortigateのコンフィグを取得

$ ssh admin@172.31.31.XXX "show" > sample.conf

■configとeditをセクションとして、改行を「__」に変換することで行検索を可能にする。
 その後、「line=」で元のファイルの行数を表示して該当セクションを出力する。

$ awk 'BEGIN{c=0} \
       {if($0 ~ /config/){c++;b[c]=NR}else{if($0 ~ /    edit/){c++;b[c]=NR}}} \
       {a[c]=a[c]"__"$0} \
       END{for(n=0;n<=c;n++){if(a[n] ~ /DMZ-RDP/){gsub("__","\n",a[n]);print "line="b[n],a[n]}}}' sample.conf 
line=2921 
    edit "DMZ-RDP"
        set uuid 56837de6-7bb4-51ea-fa32-431b9167bd17
        set extip 192.168.102.101
        set extintf "dmz"
        set portforward enable
        set mappedip "172.31.31.92"
        set extport 8389
        set mappedport 3389
    next
end
line=3448 
    edit 15
        set name "dmz-rdp"
        set uuid 69cd7adc-7bb4-51ea-167c-11d04007c680
        set srcintf "dmz"
        set dstintf "lan"
        set srcaddr "dmz-seg"
        set dstaddr "DMZ-RDP"
        set action accept
        set schedule "always"
        set service "RDP"
        set logtraffic all
    next

■上記の変数となるのが、ファイル名と検索ワードなので、
 必要な引数がなければ以下のようにエラーを出すことにする。

$ ./fsec ;echo $?
Usage:./fsec {filename} {search word}
1

$ ./fsec sample.conf ;echo $?
Usage:./fsec {filename} {search word}
1

■文法が合っていても、ファイルが存在しなければエラー。

$ ./fsec sample.config test ;echo $?
Usage:./fsec {filename} {search word}
1

■sample.confから、DMZ-RDPを検索する例。

$ ./fsec sample.conf DMZ-RDP
line=2921 
    edit "DMZ-RDP"
        set uuid 56837de6-7bb4-51ea-fa32-431b9167bd17
        set extip 192.168.102.101
        set extintf "dmz"
        set portforward enable
        set mappedip "172.31.31.92"
        set extport 8389
        set mappedport 3389
    next
end
line=3448 
    edit 15
        set name "dmz-rdp"
        set uuid 69cd7adc-7bb4-51ea-167c-11d04007c680
        set srcintf "dmz"
        set dstintf "lan"
        set srcaddr "dmz-seg"
        set dstaddr "DMZ-RDP"
        set action accept
        set schedule "always"
        set service "RDP"
        set logtraffic all
    next

■config firewall vipの行数を検索。
 grep等でも代用できるけど、いちいちやり方を変えるのも面倒なので。

$ ./fsec sample.conf config firewall vip
line=2909 
config firewall vip

■tcp-portrange 445の検索、続けてSMBの検索。

$ ./fsec sample.conf tcp-portrange 445
line=1272 
    edit "SMB"
        set category "File Access"
        set tcp-portrange 445
    next

$ ./fsec sample.conf SMB
line=1272 
    edit "SMB"
        set category "File Access"
        set tcp-portrange 445
    next
line=1318 
    edit "Windows AD"
        set member "DCE-RPC" "DNS" "KERBEROS" "LDAP" "LDAP_UDP" "SAMBA" "SMB"
    next

■Windows ADの一部がどこにあるかor検索。

$ ./fsec sample.conf "DCE-RPC|KERBEROS|LDAP|SAMBA"
line=1015 
    edit "LDAP"
        set category "Authentication"
        set tcp-portrange 389
    next
line=1076 
    edit "DCE-RPC"
        set category "Remote Access"
        set tcp-portrange 135
        set udp-portrange 135
    next
line=1130 
    edit "SAMBA"
        set category "File Access"
        set tcp-portrange 139
    next
line=1263 
    edit "KERBEROS"
        set category "Authentication"
        set tcp-portrange 88 464
        set udp-portrange 88 464
    next
line=1268 
    edit "LDAP_UDP"
        set category "Authentication"
        set udp-portrange 389
    next
line=1318 
    edit "Windows AD"
        set member "DCE-RPC" "DNS" "KERBEROS" "LDAP" "LDAP_UDP" "SAMBA" "SMB"
    next
line=1321 
    edit "Exchange Server"
        set member "DCE-RPC" "DNS" "HTTPS"
    next
end

■作ったfsec

$ w3m -dump https://raw.githubusercontent.com/labunix/lsec/master/fsec
#!/bin/bash

if [ -f "$1" ] && [ $# -gt 1 ];then
  FILE=$1
  shift
  WORD="$@"
  awk -v word="$WORD" \
    'BEGIN{c=0} \
          {if($0 ~ /config/){c++;b[c]=NR} \
      else{if($0 ~ /    edit/){c++;b[c]=NR}}} \
          {a[c]=a[c]"__"$0} \
       END{for(n=0;n<=c;n++) \
          {if(a[n] ~ word){gsub("__","\n",a[n]);print "line="b[n],a[n]}}}' $FILE
else
  echo "Usage:$0 {filename} {search word}" >&2
  exit 1
fi