🔐 FortiGate 自動化備份 + 版本比對實戰:排程、CLI、差異檢查完整指南
在企業環境中,FortiGate 扮演的是整個網路出入口與 Gateway 安全核心,
任何一條 Policy、路由、物件或 VPN 設定改錯,都可能直接影響整個公司上網與服務存活。
如果這些設定沒有做好「定期備份 + 版本差異比對」,當某天出現連線異常或安全事件,
想回頭找「到底是誰、在什麼時候改了什麼」就會非常痛苦。
本文會實作一套可落地的流程:利用 FortiGate CLI 匯出設定檔,
再搭配 Linux 管理主機 + 排程 + git 自動化備份,並用 Diff 工具檢查差異,
讓 FortiGate 設定也能享受類似「程式碼版本控制」的管理方式。
📌 一、整體架構與設計思路
先用一張簡化架構圖說明流程:
┌──────────────────────────────┐
│ Linux 管理主機(Backup) │
│ - ssh key 登入 FortiGate │
│ - 排程備份(cron / systemd) │
│ - git 管理版本 + Diff │
└───────────▲──────────────────┘
│
ssh / scp │
│
┌───────┴────────┐
│ FortiGate 防火牆 │
│ - CLI 已開啟 │
│ - 管理帳號 │
└─────────────────┘
實作目標:
- 每天自動抓一份設定檔回管理主機。
- 依日期命名與放進 git repository 中管理。
- 透過 git diff / VS Code / Beyond Compare 等工具檢查差異。
- 必要時可快速還原到歷史版本設定(手動或半自動)。
🧰 二、FortiGate CLI 設定備份方式總覽
FortiGate 本身支援多種備份方式:
- Web GUI:手動下載設定檔(加密 / 未加密)。
- CLI:
execute backup config ...備份到 TFTP / FTP / SCP / USB。 - 顯示設定:
show full-configuration,可直接當純文字版本使用。 - 新版可搭配 Automation / Script,但仍建議由外部管理主機統一控管。
本文主軸會使用:
- 方式 A:Linux 管理主機以 SSH 登入 FortiGate,執行
show full-configuration,將輸出導入檔案。 - 方式 B:在 FortiGate 上執行
execute backup config scp/ TFTP,自動推回管理主機。
📡 三、方式 A:SSH + show full-configuration(最直覺好 Diff)
1. 建立 FortiGate 管理帳號(建議)
在 FortiGate CLI 中建立一個專用的備份帳號,例如 backup:
config system admin
edit "backup"
set accprofile "read-only"
set vdom "root"
set password <strong-password>
next
end
若需要匯出完整設定(包含敏感資訊),權限可視情況調整為更高級別,但建議僅開啟必要權限,並限制來源 IP。
config system admin
edit "backup"
set trusthost1 10.0.10.0 255.255.255.0
next
end
2. 在 Linux 管理主機產生 SSH 金鑰並複製到 FortiGate
# 管理主機產生金鑰
ssh-keygen -t ed25519 -f ~/.ssh/fortigate_backup -C "fortigate-backup"
# 將 public key 貼到 FortiGate 帳號設定中
# (可在 GUI > System > Administrators > backup > SSH public key)
設定完成後,測試從管理主機免密碼登入:
ssh -i ~/.ssh/fortigate_backup backup@10.0.0.254
3. 撰寫備份腳本:抓取完整設定並丟進 git
在管理主機建立一個專用目錄,例如 /opt/fortigate-backup:
sudo mkdir -p /opt/fortigate-backup
sudo chown $(whoami): /opt/fortigate-backup
cd /opt/fortigate-backup
git init
建立 shell script,例如 backup_fgt.sh:
#!/bin/bash
set -e
FGT_HOST="10.0.0.254"
FGT_USER="backup"
SSH_KEY="$HOME/.ssh/fortigate_backup"
TODAY=$(date +"%Y-%m-%d_%H%M")
OUTDIR="/opt/fortigate-backup/configs"
mkdir -p "$OUTDIR"
OUTFILE="${OUTDIR}/fortigate_${FGT_HOST}_${TODAY}.conf"
# 1) 透過 SSH 執行 show full-configuration
ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no \
${FGT_USER}@${FGT_HOST} \
'show full-configuration' > "$OUTFILE"
# 2) 建立/更新最新 symlink 方便快速查看
ln -sfn "$OUTFILE" "${OUTDIR}/fortigate_${FGT_HOST}_latest.conf"
# 3) 加入 git 版本控制
cd /opt/fortigate-backup
git add "$OUTFILE"
git commit -m "Backup ${FGT_HOST} at ${TODAY}" || echo "No change to commit"
記得給執行權限:
chmod +x /opt/fortigate-backup/backup_fgt.sh
4. 利用 cron 排程每日備份
crontab -e
加入每天凌晨 03:10 執行一次:
10 3 * * * /opt/fortigate-backup/backup_fgt.sh >/tmp/backup_fgt.log 2>&1
這樣就完成「每天從 FortiGate 拉一份完整設定、丟進 git repository 裡」的自動化流程。
💾 四、方式 B:FortiGate 自動推送設定(execute backup config ...)
另一種做法是讓 FortiGate 主動把設定推到 TFTP / FTP / SCP 主機:
1. CLI 手動備份到 TFTP(示意)
execute backup config tftp FGT-01_$(get system time).conf 10.0.10.10
不同 FortiOS 版本指令略有差異,常見格式為:
execute backup config tftp <filename> <server-ip>execute backup config ftp <filename> <server-ip> <user> <password>execute backup config scp <filename> <user>:<server-ip>:<path>(視版本支援)
實務上可以搭配 Script / Automation Profile 定期執行,不過多數情況還是建議由外部管理主機統一排程與版本控管,比較好集中管理。
🧪 五、Diff:快速找出「誰改了什麼」
有了每日備份檔後,下一步就是「比較差異」。
1. 使用 git log / git diff
cd /opt/fortigate-backup
# 查看歷史備份紀錄
git log --oneline --graph
# 比較最近兩次備份差異
git diff HEAD~1 HEAD
# 指定某兩個時間點的差異
git diff <commit-id-1> <commit-id-2>
搭配 VS Code / Beyond Compare 等 GUI 工具,可以更直覺地看到每條 policy、物件、路由的新增、刪除與修改。
2. 直接用 diff 比較兩個檔案
diff -u fortigate_10.0.0.254_2025-12-01_0310.conf \
fortigate_10.0.0.254_2025-12-03_0310.conf | less
使用 -u 會顯示上下文,有利於閱讀。
🛡 六、安全性與權限控管建議
FortiGate 設定檔中可能包含:
- VPN 帳號密碼
- 管理介面設定
- 內部網段結構與拓樸
因此,對備份主機與 git repository 要特別注意:
- 備份目錄權限限制,例如
chmod 700 /opt/fortigate-backup。 - 若推到遠端 git server,建議架在內網或私有 GitLab / Gitea,不要公開。
- 必要時可再用 GPG 等方式加密設定檔,解密權限僅限少數管理者。
- 管理主機本身需做好硬碟加密與登入控管。
🧯 七、還原(Restore)與實務建議
備份只是第一步,關鍵是「真的能還原」。
- 定期在 Lab / 測試機器上實際測試匯入設定檔。
- 遇到重大變更(例如 Gateway / Routing 大調整)前,手動做一份額外備份並標註。
- 如有多台 FortiGate(HQ + Branch),記得分別建立不同子目錄與命名規則。
簡單建議命名方式:
/opt/fortigate-backup/configs/
├── FGT-HQ_2025-12-03_0310.conf
├── FGT-BR1_2025-12-03_0310.conf
└── FGT-DC_2025-12-03_0310.conf
配合 git tag 註記重要節點,例如:
git tag -a "before-dc-migration" -m "DC 網路改版前最後版本"
git push --tags
📋 八、FortiGate 設定備份 + Diff 實作 Checklist
✅ 在 FortiGate 建立專用備份帳號(限制來源 IP)
✅ 在 Linux 管理主機建立 SSH 金鑰並測試免密碼登入
✅ 撰寫 backup_fgt.sh 自動抓取 show full-configuration
✅ 以日期與設備代號命名備份檔
✅ 使用 git 管理備份版本(git add & commit)
✅ 設定 cron / systemd timer 每日排程執行
✅ 定期使用 git diff / diff / GUI 工具檢查差異
✅ 確認備份主機與 repository 權限管控完善
✅ 不定期實際測試 Restore 與還原流程
💬 互動留言引導(FortiGate 備份 / Diff 實戰分享區)
如果你在實作 FortiGate 自動化備份、排程或 Diff 的過程中遇到:
- SSH 金鑰登入卡關或不能免密碼
- show full-configuration 輸出不完整或中途被截斷
- 多台 FortiGate 不知道如何設計命名與目錄結構
- 想把備份與其他設備(例如 Switch / Router)一起管理
歡迎在下方留言你的 FortiGate 型號、FortiOS 版本與目前做法, 我會把有代表性的案例整理成補充篇更新在本文,讓這套備份 + Diff 流程更完整。
🔗 延伸閱讀
- 🧰 FortiGate CLI 實戰:基本設定、常用排錯指令與備援檢查
- 🛡 FortiGate Policy 設計最佳實務:物件、群組與規則排序策略
- 📁 Linux + git 設定管理:集中管理防火牆 / Switch / Router 備份
- 🛡 Linux 安全強化:SELinux / AppArmor / Auditd / Fail2Ban 完整指南
- 📊 GoAccess + Nginx/Apache Dashboard 教學:即時 Web Log 分析與安全事件觀察
— WWFandy・FortiGate Backup & Diff Notes
沒有留言: