■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 11月 2 20:50 usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0 -> ../../ttyUSB0
$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 11月 2 20:50 /dev/ttyUSB0
$ script fortigate-30e.log
$ sudo screen /dev/ttyUSB0
[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