labunix's blog

labunixのラボUnix

Fortigate-60Cから30Eに移行してみる。

■Fortigate-60Cから30Eに移行してみる。
 何を移行するべきかといえば、interfaceやサービスモード等のglobalポリシーが同じ状態ならば、
 アドレス(IP)、サービス(ポート)、ポリシー(firewall)3つだけ。

■lsecは以下からパスの通ったbinに実行権限を付けて配置しておく。

 lsec
 https://github.com/labunix/lsec

$ cd [$PATHのいずれかのパス]
$ curl https://raw.githubusercontent.com/labunix/lsec/master/lsec > lsec
$ cgmod +x lsec

■Fortigate-60Cはサポートが終了してバージョンアップが出来ないモデル。
 Fortigate-30Eを移行先として、無線APと統合することにした。

$ sudo dmesg | awk '/tty/&&/usb/'
[   18.288639] usb 3-4: pl2303 converter now attached to ttyUSB0

$ ls -l /dev/serial/by-id/
合計 0
lrwxrwxrwx 1 root root 13 112 20:50 usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0 -> ../../ttyUSB0

$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 112 20:50 /dev/ttyUSB0

$ script fortigate-30e.log
$ sudo screen /dev/ttyUSB0

# diagnose debug report
# exit
[Ctrl] [a] [k]

■「diagnose debug report」で見ても以外と差異が少なかった。
 後でFortiOS 5.4.12

$ nkf -Lu -d fortigate-30e.log > fortigate-30e-nkf.log 
$ ssh admin@fgt-60c "diagnose debug report" > fortigate-60c.log
$ vimdiff -R fortigate-{60c,30e-nkf}.log

... 
Version: FortiGate-60C v5.2.11,build0754,170421 (GA)                         |  Version: FortiGate-30E v5.4.1,build1064,160608 (GA)   
...


■「show full-configuration」コマンドで比較すると、
 さすがにfortiguardで取得した箇所や設定しなくても良いコンフィグも出て差異が大きい。

$ ssh admin@fgt-60c "show full-configuration" > full-fortigate-60c.log

$ sudo screen /dev/ttyUSB0
...
show full-configuration
...

$ nkf -Lu -d full-fortigate-30e.log > full-fortigate-30e-nkf.log

■なので、showコマンドを比較する方針とする。
 showコマンドの場合はデフォルトがmoreなので、
 standardで「ter len 0」相当を設定する必要がある。

config system console
    set output standard
end

show

■ところで、移行したい範囲というのはそれほど多くない。
 firewall、system、logがあれば、後は新しい設定をしたい。

$ FGT=30e; awk '$0 ~ /^config/{print $2 | "sort -uV"}' show-fortigate-${FGT}-nkf.log > ${FGT}config.log 
$ FGT=60c; awk '$0 ~ /^config/{print $2 | "sort -uV"}' show-fortigate-${FGT}-nkf.log > ${FGT}config.log 

$ sdiff -l *config.log
antivirus						      (
application						      (
dlp							      (
dnsfilter						      <
endpoint-control					      (
firewall						      (
gui							      (
icap							      (
ips							      (
log							      (
							      >	netscan
router							      (
spamfilter						      (
system							      (
user							      (
voip							      (
vpn							      (
waf							      |	wanopt
webfilter						      (
web-proxy						      (
wireless-controller					      (

■各セクション毎の「end」が抜けないようにして抽出。

$ FGT=30e; cat show-fortigate-${FGT}-nkf.log |sed -e 's/^end/  end/g' | lsec "^config firewall|^config system|^config log" > ${FGT}-conf
$ FGT=60c; cat show-fortigate-${FGT}-nkf.log |sed -e 's/^end/  end/g' | lsec "^config firewall|^config system|^config log" > ${FGT}-conf

3列目のセクションを抽出して差異のあるセクションを取り除く。

$ FGT=30e; awk '$0 ~ /^config/&&NF>2{print $2" "$3 | "sort -uV"}' ${FGT}-conf > ${FGT}-conf2
$ FGT=60c; awk '$0 ~ /^config/&&NF>2{print $2" "$3 | "sort -uV"}' ${FGT}-conf > ${FGT}-conf2

$ sdiff {60c,30e}-conf2 | awk '/<|>|\|/'
firewall DoS-policy					      <
firewall DoS-policy6					      <
firewall explicit-proxy-policy				      <
firewall identity-based-route				      <
firewall interface-policy				      <
firewall interface-policy6				      <
firewall ldb-monitor					      <
firewall local-in-policy				      <
firewall local-in-policy6				      <
							      >	firewall multicast-address6
firewall policy6					      <
firewall policy46					      <
firewall policy64					      <
firewall sniffer					      <
firewall ttl-policy					      <
firewall vip						      <
log gui-display						      <
log syslogd						      |	log null-device
system autoupdate					      |	system auto-install
							      >	system central-management
							      >	system cluster-sync
system ddns						      |	system dhcp
system dns-database					      |	system email-server
system dns-server					      <
system fortisandbox					      <
							      >	system physical-switch
system replacemsg-group					      <
system session-sync					      <
system snmp						      |	system virtual-switch
system stp						      <

$ DEL=$(diff {60c,30e}-conf2 | awk '/^>|^</{printf "config %s %s|",$2,$3}' | sed -e 's/^/"/' -e 's/|$/"\n/g')

$ FGT=30e;cat ${FGT}-conf | lsec -v "${DEL}" > ${FGT}-conf3
$ FGT=30e;cat ${FGT}-conf | lsec -v "${DEL}" > ${FGT}-conf3

■次に各セクションを確認しながら、純粋に不要なセクションを除いていく。
 これで十分すぎるほど小さくなった差分を確認できる。
 結果的に、interface、address、service、policyだけ移行できれば問題なさそう。

$ cat 30e-conf3 | lsec "system console"
config system console
    set output standard
  end

$ FGT=30e; awk '$0 ~ /^config/{print $2" "$3 | "sort -uV"}' ${FGT}-conf3 > ${FGT}-conf4
$ FGT=60c; awk '$0 ~ /^config/{print $2" "$3 | "sort -uV"}' ${FGT}-conf3 > ${FGT}-conf4

$ sdiff {60c,30e}-conf4config system ntp
firewall DoS-policy					      <
firewall address						firewall address
firewall address6						firewall address6
firewall multicast-address					firewall multicast-address
firewall policy							firewall policy
firewall profile-protocol-options				firewall profile-protocol-options
firewall schedule						firewall schedule
firewall service						firewall service
firewall shaper							firewall shaper
firewall ssl-ssh-profile					firewall ssl-ssh-profile
log memory							log memory
log threat-weight						log threat-weight
system accprofile						system accprofile
system admin							system admin
system console							system console
system custom-language						system custom-language
system dns							system dns
system fortiguard						system fortiguard
system global							system global
system ha							system ha
system interface						system interface
system ntp							system ntp
system replacemsg						system replacemsg
system replacemsg-image						system replacemsg-image
system session-helper						system session-helper
system settings							system settings
							      >	system virtual-switch

$ DEL="firewall DoS-policy|firewall address6|firewall multicast-address|firewall profile-protocol-options"
$ DEL="${DEL}|firewall schedule|firewall shaper|firewall ssl-ssh-profile|log threat-weight"
$ DEL="${DEL}|system accprofile|system console|system custom-language|system fortiguard|system ha"
$ DEL="${DEL}|system replacemsg|system session-helper|system settings|system virtual-switch"
$ FGT=30e; cat ${FGT}-conf3 | lsec -v "${DEL}" > ${FGT}-conf5
$ FGT=60c; cat ${FGT}-conf3 | lsec -v "${DEL}" > ${FGT}-conf5

$ diff {60c,30e}-conf5 | wc -l
770

$ grep ^config 60c-conf5
config system global
config system interface
config system admin
config system dns
config system ntp
config firewall address
config firewall service category
config firewall service custom
config firewall service group
config firewall policy
config log memory setting

■仕上げに。「edit 数字」は、「edit 0」で自動で割り振ってくれる。
 lsecにマッチするように先頭のスペースを除く。

$ FGT=30e;sed -e 's/.*edit [1-9]*/edit 0 /g' -e 's/.*config /config /g' ${FGT}-conf5 > ${FGT}-conf6
$ FGT=60c;sed -e 's/.*edit [1-9]*/edit 0 /g' -e 's/.*config /config /g' ${FGT}-conf5 > ${FGT}-conf6

■先頭のconfigがなくても、
 以下は移行しないfirewall policyの一部。
 アドレス定義オブジェクトとfirewall定義の関係は読み取れる。
 一応、firewall policyは順序が重要なので、登録後の並べ替えはきちんと確認しておく必要がある。

$ cat 60c-conf6 | lsec "WHR-HP-AMPG"
edit 0 "WHR-HP-AMPG"
        set subnet 192.168.102.254 255.255.255.255
    next
edit 0 
        set srcintf "dmz"
        set dstintf "wan1"
        set srcaddr "WHR-HP-AMPG"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "DNS" "NTP" "HTTPS" "HTTP"
        set utm-status enable
        set profile-protocol-options "default"
        set nat enable
        set fixedport enable
    next

■もう少し埋もれないにしたいなら、以下のようにする。

$ key="WHR-HP-AMPG";ls *-conf6 | \
    awk -v key=${key} '{print "echo \042["$1"]\042;cat "$1" | lsec "key" | awk \047{if(/"key"/){print \042+ \042$0}else{print \042  \042$0}}\047"}' | sh
[30e-conf6]
[60c-conf6]
+ edit 0 "WHR-HP-AMPG"
          set subnet 192.168.102.254 255.255.255.255
      next
  edit 0 
          set srcintf "dmz"
          set dstintf "wan1"
+         set srcaddr "WHR-HP-AMPG"
          set dstaddr "all"
          set action accept
          set schedule "always"
          set service "DNS" "NTP" "HTTPS" "HTTP"
          set utm-status enable
          set profile-protocol-options "default"
          set nat enable
          set fixedport enable
      next