Use FortiGate Automation to collect malicious IP with GitHub
前面提到了 FortiGate 如何透過 External Connectors (Threat Feeds) 來獲取 RBL,進而運用在 Firewall Policy 上過濾進出流量之外,也可以保護 FortiGate 自身所提供的服務。
具一定規模的企業,通常會將 FortiGate 的 Traffic / System Log 導向自建的 Log Server 或是 (Security Information and Event Management, 簡稱 SIEM) 來進行分析,透過分析比對出惡意 IP 之後可以自動化的方式來連動資安設備進行阻斷,或是整理成自家的 RBL file 提供更多資安設備進行聯防。
而本篇主要針對的面向是尚未自建 Log Server / SIEM (通常是小型企業),卻也想要做到收集惡意 IP 來整理自家的 RBL,剛好公司 Firewall 採用的是 FortiGate (當然版本最好是 7.2.4 以上),來打造一個自己的 RBL 收集機制。
Requirements
這個機制要實作之前,你的 FortiGate version 要 7.2.4 以上 (原因可以參考這篇 FortiGate protect self service via External Connectors),然後要有一個 GitHub 帳號、一對 SSH RSA Key pair 以及一組 PAT Token
接下來就先說明如何建立 SSH RSA Key pair
建立 SSH RSA Key pair
這對 SSH RSA Key pair 是稍等要用在 GitHub Action Workflow 上,透過 rsa key 進行不同 repository 的 git 操作
而我本身習慣用 Linux / macOS,Windows 10 的話建議是啟動一個 WSL 來執行
Linux / macOS 開啟 terminal 執行以下指令,然後不要設定 passphrase
1 | $ ssh-keygen -t rsa |
完成後會得到兩把 Key,分別以下用途
- 私鑰 ssh-deploy (給
Private
Repository 使用) - 公鑰 ssh-deploy.pub (給
Public
Repository 使用)
註冊一個 GitHub 帳號
如果沒有申請過,可以連到 GitHub 網站,在右上角點選 Sign Up
進行申請,過程中系統會一步一步引導,還蠻容易的。
申請完成後我們就可以接下來建立 Repository
建立 Public Repository
這個 Repository 是屬於 Public (公開) 型態,也就是所有人都可以看得到,因此我們才能讓 FortiGate External Connector 不需要做額外的認證來獲取 RBL file
很多資安設備的 Feeds 不見得有提供身份認證設定功能,所以使用 Public Repository 是比較簡單的方式。
首先在 Repository 頁籤點選右邊的 New
輸入一個 Repository name,並且確認是 Public,然後勾選 ADD a README file
接著拉到最下面點選 Create Repository
,這樣就建立完成。
設定 Deploy public key
接下來要把剛剛產生出來的 SSH RSA Public Key (公鑰) 設定在 Deploy Keys
裏面
在最右邊點選 Settings
在選擇左側選單的 Deploy Keys
之後,點選右邊視窗上方的 Add deploy key
輸入 Title
名稱,在這裡設定為 DEPLOY_KEY_PUB
,Key
的部分就將剛剛產生的公鑰用編輯器打開,複製內文然後貼上,並且勾選 Allow write access
確認都完成之後點選 Add key
新增 RBL 檔案
這個部分是建立一個空白的 RBL 檔案,而這個檔案裡面會是一行一個 IP
或是網段
(以 cidr 格式表示)
這裡的檔案名稱設定的是 rbl-ip_home.txt
,這個檔名等等會用在 workflow 裡面
確認沒有問題就點選 Commit Changes
建立 Private Repository
這個 Repository 會設定成 Private 主要是因為 GitHub Action workflow 會抓取 issue 特定格式,所以基於安全性問題,不能讓其他人看到並且有權限對 issues 進行異動
流程上是讓 FortiGate Automation 偵測我們所設定好的 Login Failure Events,然後透過 Webhook 打 API 到這個 Repository 來建立一個 issue,當 issue 建立完成後,GitHub Action 會自動執行我們所設定好的 Workflow
建立方式可以參照剛剛建立 Public repository,記得類型選擇 Private
建立 issue labels
首先要先建立以下四個 issue label name
- whitelist
- added
- fortios
- sslvpn
label 顏色可以自行挑選
新增 White list 檔案
可以參照剛剛在 Public repository 建立 RBL 檔案的方式,也建立一個檔名為 whitelist.txt
的檔案。
然後可以將你想要 bypass 檢查的 IP 寫上去 (一行一個 IP)。
設定 workflow permission
接下來要先設定 workflow 的權限,讓他可以針對這個 repository 有 read/write 的權限
Settings -> Actions -> General
設定 SSH RSA private key
把先前產生的 SSH RSA private key 設定成 Secret variable,讓 workflow 可以取用這個 variable 對剛剛建立好的 public repository 進行 git 操作
Settings -> Secrets and variables -> Actions
Name 為 DEPLOY_KEY_PRI
,然後將 private key 的內容貼在 Secret
建立 Workflow
這裡是整個自動化的重頭戲,利用 GitHub Action 來打造自動化的流程,以下是流程說明
- 當一個 issue 建立時會觸發 workflow,取得 IP 後首先判斷是否為白名單 (White list),如果是,將 issue 加入一個 label name 為
whitelist
,然後 close 這個 issue,並結束這個 workflow;如果不是白名單,則繼續執行下個步驟。 - 判斷該 IP 是否已存在於黑名單,如果是,將 issue 加入一個 label name 為
duplicate
,然後 close 這個 issue,並結束這個 workflow;如果不是,則把這個 IP 寫進指定的 RBL 檔案,並將 issue 加入一個 label name 為added
,然後 close 這個 issue,結束這個 workflow。
下面是 這個 workflow 的 yml
記得變更 GIT_USERNAME
、GIT_MAIL
及第 52 行 repository
的資訊
Actions -> set up a workflow yourself
將上方調整好的 yml 內容貼在 content 裡,並點選 Commit changes...
這樣 GitHub 所需要的配置就都完成了,接下來要設定 FortiGate
FortiGate Automation
Automation 基本上設計原理是偵測 (Trigger) 你所設定的條件是否符合,符合的話就進行動作 (Action)
這裡我們拿 SSL VPN brute force attack
當範例來進行說明
建立 Trigger
Security Fabric -> Automation -> Trigger -> Create New
首先建立一個 Trigger,選擇 FortiOS Event Log
,給定一個 Name
之後點選 Event
,並選擇我們要偵測的 SSL VPN login fail
建立 Action
Security Fabric -> Automation -> Action -> Create New
接下來建立一個 Action
選擇 Webhook
然後按照下面的表格內容進行設定
Webhook Items
Items | Value |
---|---|
Protocol | HTTPS |
URL | api.github.com/repos/<your github account>/<private repository name>/issues |
Method | POST |
Custom port | 443 |
HTTP Body | {"title": "detect sslvpn login fail from %%log.remip%%","body": "%%log.remip%%","labels": ["fortios","sslvpn"]} |
Http Header
Key | Value | Description |
---|---|---|
Accept | application/vnd.github+json | |
Authorization | Bearer github_pat_XXXXXX | 建立方式可以參考GitHub PAT Token |
X-GitHub-Api-Version | 2022-11-28 | |
User-Agent | FortiGate | value 可以自訂 |
PAT Token 必須要能夠 access 你的 private repository
,並且針對 issues 的權限要有 Read and Write
建立 Stitch
Security Fabric -> Automation -> Stitch -> Create New
這個部分就將剛剛設定好的 Trigger
以及 Action
套用上去就完成了
FortiGate External Connectors
Security Fabric -> External Connectors
建立一個 Connector
選擇 IP Address
設定相關參數
URI of external resource
的 url 可以點擊從我們在 Github public
repository 裡面專門收集 RBL IP 的檔案,選擇 Raw,然後就可以複製這個網址進行貼上
FortiGate SSL VPN restric access
這裡可以參考另一篇針對 FortiGate protect self service 的文章進行設定
FortiGate protect self service via External Connectors後記
自從設定好這個機制開始,每隔幾分鐘就一筆 RBL IP 被偵測到,第一天就累積了八百筆多的紀錄,而且這只是一般家裡所申請的網路,可見攻擊無所不在
不過這幾天下來可以發現攻擊慢慢地由幾分鐘變成幾十分鐘,然後變每小時,到現在一天可能偵測到一次,整個效果很顯著