arumes31/fortigate-scp-backup
GitHub: arumes31/fortigate-scp-backup
基于 Web 的 FortiGate 防火墙配置自动备份管理平台,通过 SCP 定期拉取并留存配置历史,支持多设备管理与失败告警。
Stars: 1 | Forks: 0
使用 SCP 备份 FortiGate 防火墙配置的 Web 应用程序。
## 功能
- **防火墙管理**:添加、删除和管理多个 FortiGate 防火墙,支持自定义 SSH 凭据和备份间隔。
- **自动备份**:使用 APScheduler 安排定期备份并设置保留策略。
- **备份历史记录**:查看和下载之前的备份配置。
- **错误日志**:通过详细日志监控失败的备份尝试。
- **邮件通知**:通过 SMTP 接收备份失败的警报(可通过环境变量配置)。
- **反向代理支持**:兼容使用 X-Forwarded 标头的反向代理。
- **会话管理**:1 小时后或 IP 地址变更时自动登出。
## 截图

## 前置条件
- Docker
- 拥有已启用 SSH 和 SCP 的 FortiGate 防火墙的访问权限
```
config system global
set admin-scp enable
end
```
- scp profile
```
config system accprofile
edit "scp-profile"
set comments "https://community.fortinet.com/t5/FortiGate/Technical-Tip-Backing-Up-the-FortiGate-configuration-file-via/ta-p/367088"
set secfabgrp read
set ftviewgrp read
set authgrp read
set sysgrp custom
set netgrp read
set loggrp read
set fwgrp read
set vpngrp read
set utmgrp read
set wifi read
set cli-diagnose enable
set cli-get enable
set cli-show enable
set cli-exec enable
set cli-config enable
config sysgrp-permission
set admin read-write
set upd read
set cfg read
set mnt read
end
next
end
```
- scp user
```
config system admin
edit "scpuser"
set accprofile "scp-profile"
set password xxxxxxxXCHANGEMExxxxx
next
end
```
## 安装
### 使用 Docker Compose
或者,使用以下 `docker-compose.yml` 配置来运行该应用:
```
services:
fortisafe-app:
container_name: "fortisafe-app"
environment:
- "DEFAULT_SCP_USER=fortisafe"
- "DEFAULT_SCP_PASSWORD=XXXXXX"
- "TOTP_ENABLED=true"
- "TOTP_SECRET=XXXXXX"
- "MAIL_SERVER=smtp.test.com"
- "MAIL_PORT=25"
- "MAIL_USER=fortisafe@test.com"
- "MAIL_PASSWORD=XXXXXX"
- "MAIL_RECIPIENT=user1@test.com"
- "TZ=Europe/Vienna"
- "RADIUS_ENABLED=true"
- "RADIUS_PORT=1812"
- "RADIUS_SECRET=fortisafe-XXXXXX"
- "RADIUS_SERVER=192.168.0.100"
- "PG_HOST=fortisafe-db"
- "PG_PORT=5432"
- "PG_USER=postgre"
- "PG_PASSWORD=XXXXXXTDB"
- "PG_DATABASE=firewall_backups"
image: "ghcr.io/arumes31/fortigate-scp-backup:latest"
ports:
- "8521:8521/tcp"
volumes:
- "/mnt/.../backups:/app/backups"
restart: unless-stopped
depends_on:
fortisafe-db:
condition: service_healthy
restart: true
fortisafe-db:
container_name: "fortisafe-db"
image: postgres:latest
environment:
- "POSTGRES_USER=postgre"
- "POSTGRES_PASSWORD=XXXXXXTDB"
- "POSTGRES_DB=firewall_backups"
restart: unless-stopped
volumes:
- "/mnt/.../data:/var/lib/postgresql/data"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgre -d firewall_backups"]
interval: 5s
timeout: 5s
retries: 5
```
## 模块
### FGT ADM VPN Config
该模块提供了一种为 FortiGate 防火墙管理和生成 VPN 配置的方法。
- **通过以下方式启用**:`EXT_ADM_VPN_CONF=true` 环境变量。
- **公开的 Graylog Endpoint**:`/fgt-adm-vpn-conf/graylog_dsv` - 提供无需身份验证的 DSV 数据(`Firewallname;Remote_IP;Status`),以便与 Graylog 集成。支持集群主机名(如果设置了 `cluster_hostnames`,则每个 VPN 配置包含多个条目)。
## 用法
1. 在 `http://localhost:8521`(或您的反向代理 URL)访问该应用。
2. 使用默认凭据登录:
- 用户名:`admin`
- 密码:`changeme`
- **注意**:首次登录时必须更改密码。
3. 点击“Add New Firewall”,填写详细信息并提交,以添加新的防火墙。
4. 安排备份或通过“Backup Now”按钮触发手动备份。
5. 从相应的链接查看备份历史记录或错误日志。
6. 点击右上角的“Change Password”按钮更改您的密码。
## 配置
APP(应用):
可以通过设置环境变量来自定义应用:
- `TZ`:时区(默认值:`Europe\Vienna`)。
- `TOTP_ENABLED`:为 admin 用户启用 TOTP 身份验证(默认值:`false`)。
- `TOTP_SECRET`:admin 用户的 TOTP 密钥(`false` 16 个字符 - 默认值:`random-not-displayed`)
- `RADIUS_ENABLED`:启用 RADIUS 身份验证(默认值:`false`)。
- `RADIUS_SERVER`:RADIUS 服务器地址(默认值:`localhost`)。
- `RADIUS_PORT`:RADIUS 服务器端口(默认值:`1812`)。
- `RADIUS_SECRET`:RADIUS 共享密钥(默认值:`secret`)。
- `DEFAULT_SCP_USER`:默认 SCP 用户名(默认值:`test`)。
- `DEFAULT_SCP_PASSWORD`:默认 SCP 密码。
- `FORTIGATE_CONFIG_PATH`:FortiGate 上配置文件的路径(默认值:`sys_config`)。
- `MAIL_SERVER`:SMTP 服务器地址(默认值:`smtp.example.com`)。
- `MAIL_PORT`:SMTP 端口(默认值:`587`)。
- `MAIL_USER`:SMTP 用户名(默认值:`user@example.com`)。
- `MAIL_PASSWORD`:SMTP 密码。
- `MAIL_RECIPIENT`:用于接收失败通知的电子邮件收件人(默认值:`MAIL_USER` 的值)。
- `GRAYLOG_URL`:用于状态检查的 Graylog API URL(例如:`https://graylog.example.com`)。
- `GRAYLOG_TOKEN`:用于身份验证的 Graylog API token。
- `GRAYLOG_SEARCH_TIMEFRAME`:检查近期日志的时间范围(以秒为单位)(默认值:`86400`)。
- `GRAYLOG_SEARCH_QUERY`:用于识别在线状态的查询(默认值:`fw_inventory_status:online`)。
- `PG_HOST`: fortisafe-db
- `PG_PORT`: 5432
- `PG_USER`: postgre
- `PG_PASSWORD`: XXXXXXTDB
- `PG_DATABASE`: firewall_backups
DB(数据库):
- `POSTGRES_USER`: postgre
- `POSTGRES_PASSWORD`: XXXXXXTDB
- `POSTGRES_DB`: firewall_backups
## 生成 TOTP SECRET
Powershell:
```
# 定义 Base32 alphabet (A-Z, 2-7)
$base32Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
# 生成随机 Base32 key 的函数
function Generate-Base32Key {
$keyLength = 16 # Standard length for pyotp.random_base32()
$randomKey = -join (1..$keyLength | ForEach-Object {
$base32Alphabet[(Get-Random -Minimum 0 -Maximum $base32Alphabet.Length)]
})
return $randomKey
}
# 生成并输出 key
$key = Generate-Base32Key
Write-Output $key
```
## 批量上传
CSV 内容:
```
fqdn,username,password,interval_minutes,retention_count,ssh_port
firewall1.example.com,username,password,180,300,9422
firewall2.example.com,username,password,60,600,22
```
`username` 和 `password`:可选,如果为空则默认为 `DEFAULT_SCP_USER` 和 `DEFAULT_SCP_PASSWORD`。
## 故障排除
- **备份失败**:检查日志以获取详细错误(例如:SSH/SCP 问题)。确保 FortiGate 允许 SCP 并且配置路径正确。
- **超时问题**:如果网络延迟较高,请通过修改 `app.py` 来增加 keep-alive 间隔。
- **邮件未发送**:验证 SMTP 凭据和服务器的可访问性。
## 贡献
1. Fork 该仓库。
2. 创建一个功能分支:`git checkout -b feature-name`。
3. 提交您的更改:`git commit -m "Add feature-name"`。
4. 推送到该分支:`git push origin feature-name`。
5. 发起一个 pull request。
## 许可证
该项目基于 MIT 许可证授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 前置条件
- Docker
- 拥有已启用 SSH 和 SCP 的 FortiGate 防火墙的访问权限
```
config system global
set admin-scp enable
end
```
- scp profile
```
config system accprofile
edit "scp-profile"
set comments "https://community.fortinet.com/t5/FortiGate/Technical-Tip-Backing-Up-the-FortiGate-configuration-file-via/ta-p/367088"
set secfabgrp read
set ftviewgrp read
set authgrp read
set sysgrp custom
set netgrp read
set loggrp read
set fwgrp read
set vpngrp read
set utmgrp read
set wifi read
set cli-diagnose enable
set cli-get enable
set cli-show enable
set cli-exec enable
set cli-config enable
config sysgrp-permission
set admin read-write
set upd read
set cfg read
set mnt read
end
next
end
```
- scp user
```
config system admin
edit "scpuser"
set accprofile "scp-profile"
set password xxxxxxxXCHANGEMExxxxx
next
end
```
## 安装
### 使用 Docker Compose
或者,使用以下 `docker-compose.yml` 配置来运行该应用:
```
services:
fortisafe-app:
container_name: "fortisafe-app"
environment:
- "DEFAULT_SCP_USER=fortisafe"
- "DEFAULT_SCP_PASSWORD=XXXXXX"
- "TOTP_ENABLED=true"
- "TOTP_SECRET=XXXXXX"
- "MAIL_SERVER=smtp.test.com"
- "MAIL_PORT=25"
- "MAIL_USER=fortisafe@test.com"
- "MAIL_PASSWORD=XXXXXX"
- "MAIL_RECIPIENT=user1@test.com"
- "TZ=Europe/Vienna"
- "RADIUS_ENABLED=true"
- "RADIUS_PORT=1812"
- "RADIUS_SECRET=fortisafe-XXXXXX"
- "RADIUS_SERVER=192.168.0.100"
- "PG_HOST=fortisafe-db"
- "PG_PORT=5432"
- "PG_USER=postgre"
- "PG_PASSWORD=XXXXXXTDB"
- "PG_DATABASE=firewall_backups"
image: "ghcr.io/arumes31/fortigate-scp-backup:latest"
ports:
- "8521:8521/tcp"
volumes:
- "/mnt/.../backups:/app/backups"
restart: unless-stopped
depends_on:
fortisafe-db:
condition: service_healthy
restart: true
fortisafe-db:
container_name: "fortisafe-db"
image: postgres:latest
environment:
- "POSTGRES_USER=postgre"
- "POSTGRES_PASSWORD=XXXXXXTDB"
- "POSTGRES_DB=firewall_backups"
restart: unless-stopped
volumes:
- "/mnt/.../data:/var/lib/postgresql/data"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgre -d firewall_backups"]
interval: 5s
timeout: 5s
retries: 5
```
## 模块
### FGT ADM VPN Config
该模块提供了一种为 FortiGate 防火墙管理和生成 VPN 配置的方法。
- **通过以下方式启用**:`EXT_ADM_VPN_CONF=true` 环境变量。
- **公开的 Graylog Endpoint**:`/fgt-adm-vpn-conf/graylog_dsv` - 提供无需身份验证的 DSV 数据(`Firewallname;Remote_IP;Status`),以便与 Graylog 集成。支持集群主机名(如果设置了 `cluster_hostnames`,则每个 VPN 配置包含多个条目)。
## 用法
1. 在 `http://localhost:8521`(或您的反向代理 URL)访问该应用。
2. 使用默认凭据登录:
- 用户名:`admin`
- 密码:`changeme`
- **注意**:首次登录时必须更改密码。
3. 点击“Add New Firewall”,填写详细信息并提交,以添加新的防火墙。
4. 安排备份或通过“Backup Now”按钮触发手动备份。
5. 从相应的链接查看备份历史记录或错误日志。
6. 点击右上角的“Change Password”按钮更改您的密码。
## 配置
APP(应用):
可以通过设置环境变量来自定义应用:
- `TZ`:时区(默认值:`Europe\Vienna`)。
- `TOTP_ENABLED`:为 admin 用户启用 TOTP 身份验证(默认值:`false`)。
- `TOTP_SECRET`:admin 用户的 TOTP 密钥(`false` 16 个字符 - 默认值:`random-not-displayed`)
- `RADIUS_ENABLED`:启用 RADIUS 身份验证(默认值:`false`)。
- `RADIUS_SERVER`:RADIUS 服务器地址(默认值:`localhost`)。
- `RADIUS_PORT`:RADIUS 服务器端口(默认值:`1812`)。
- `RADIUS_SECRET`:RADIUS 共享密钥(默认值:`secret`)。
- `DEFAULT_SCP_USER`:默认 SCP 用户名(默认值:`test`)。
- `DEFAULT_SCP_PASSWORD`:默认 SCP 密码。
- `FORTIGATE_CONFIG_PATH`:FortiGate 上配置文件的路径(默认值:`sys_config`)。
- `MAIL_SERVER`:SMTP 服务器地址(默认值:`smtp.example.com`)。
- `MAIL_PORT`:SMTP 端口(默认值:`587`)。
- `MAIL_USER`:SMTP 用户名(默认值:`user@example.com`)。
- `MAIL_PASSWORD`:SMTP 密码。
- `MAIL_RECIPIENT`:用于接收失败通知的电子邮件收件人(默认值:`MAIL_USER` 的值)。
- `GRAYLOG_URL`:用于状态检查的 Graylog API URL(例如:`https://graylog.example.com`)。
- `GRAYLOG_TOKEN`:用于身份验证的 Graylog API token。
- `GRAYLOG_SEARCH_TIMEFRAME`:检查近期日志的时间范围(以秒为单位)(默认值:`86400`)。
- `GRAYLOG_SEARCH_QUERY`:用于识别在线状态的查询(默认值:`fw_inventory_status:online`)。
- `PG_HOST`: fortisafe-db
- `PG_PORT`: 5432
- `PG_USER`: postgre
- `PG_PASSWORD`: XXXXXXTDB
- `PG_DATABASE`: firewall_backups
DB(数据库):
- `POSTGRES_USER`: postgre
- `POSTGRES_PASSWORD`: XXXXXXTDB
- `POSTGRES_DB`: firewall_backups
## 生成 TOTP SECRET
Powershell:
```
# 定义 Base32 alphabet (A-Z, 2-7)
$base32Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
# 生成随机 Base32 key 的函数
function Generate-Base32Key {
$keyLength = 16 # Standard length for pyotp.random_base32()
$randomKey = -join (1..$keyLength | ForEach-Object {
$base32Alphabet[(Get-Random -Minimum 0 -Maximum $base32Alphabet.Length)]
})
return $randomKey
}
# 生成并输出 key
$key = Generate-Base32Key
Write-Output $key
```
## 批量上传
CSV 内容:
```
fqdn,username,password,interval_minutes,retention_count,ssh_port
firewall1.example.com,username,password,180,300,9422
firewall2.example.com,username,password,60,600,22
```
`username` 和 `password`:可选,如果为空则默认为 `DEFAULT_SCP_USER` 和 `DEFAULT_SCP_PASSWORD`。
## 故障排除
- **备份失败**:检查日志以获取详细错误(例如:SSH/SCP 问题)。确保 FortiGate 允许 SCP 并且配置路径正确。
- **超时问题**:如果网络延迟较高,请通过修改 `app.py` 来增加 keep-alive 间隔。
- **邮件未发送**:验证 SMTP 凭据和服务器的可访问性。
## 贡献
1. Fork 该仓库。
2. 创建一个功能分支:`git checkout -b feature-name`。
3. 提交您的更改:`git commit -m "Add feature-name"`。
4. 推送到该分支:`git push origin feature-name`。
5. 发起一个 pull request。
## 许可证
该项目基于 MIT 许可证授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。标签:FortiGate, Python, 无后门, 测试用例, 自动化备份, 请求拦截, 运维管理, 逆向工具, 防火墙管理