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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/sam/.ssh/id_rsa): ssh-deploy
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ssh-deploy.
Your public key has been saved in ssh-deploy.pub.
The key fingerprint is:
SHA256:ptwHC/QG/83TmrE4sy+5H8jouIDienA2jpfBVrQf9Z4 sam@SamMBP.local
The key's randomart image is:
+---[RSA 3072]----+
| |
| . . |
| . .o. . |
| o..+ . |
| . . ...S. . |
|. B. ..* *E+ . |
|.B.+. o + =.* . |
|o.= . o .=. B |
|o+ o.. +O* |
+----[SHA256]-----+

完成後會得到兩把 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

create repository

輸入一個 Repository name,並且確認是 Public,然後勾選 ADD a README file

repository information

接著拉到最下面點選 Create Repository,這樣就建立完成。

設定 Deploy public key

接下來要把剛剛產生出來的 SSH RSA Public Key (公鑰) 設定在 Deploy Keys 裏面

在最右邊點選 Settings

repository setting

在選擇左側選單的 Deploy Keys 之後,點選右邊視窗上方的 Add deploy key

deploy keys setting

輸入 Title 名稱,在這裡設定為 DEPLOY_KEY_PUBKey 的部分就將剛剛產生的公鑰用編輯器打開,複製內文然後貼上,並且勾選 Allow write access

add public deploy key

確認都完成之後點選 Add key

新增 RBL 檔案

這個部分是建立一個空白的 RBL 檔案,而這個檔案裡面會是一行一個 IP 或是網段(以 cidr 格式表示)

add rbl file

這裡的檔案名稱設定的是 rbl-ip_home.txt,這個檔名等等會用在 workflow 裡面

commit rbl file

確認沒有問題就點選 Commit Changes

commit change

建立 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

issue label

create label

label 顏色可以自行挑選

新增 White list 檔案

可以參照剛剛在 Public repository 建立 RBL 檔案的方式,也建立一個檔名為 whitelist.txt 的檔案。

然後可以將你想要 bypass 檢查的 IP 寫上去 (一行一個 IP)。

設定 workflow permission

接下來要先設定 workflow 的權限,讓他可以針對這個 repository 有 read/write 的權限

Settings -> Actions -> General

private repos setting

workflow permission

設定 SSH RSA private key

把先前產生的 SSH RSA private key 設定成 Secret variable,讓 workflow 可以取用這個 variable 對剛剛建立好的 public repository 進行 git 操作

Settings -> Secrets and variables -> Actions

secrets setting

Name 為 DEPLOY_KEY_PRI,然後將 private key 的內容貼在 Secret

create secret

建立 Workflow

這裡是整個自動化的重頭戲,利用 GitHub Action 來打造自動化的流程,以下是流程說明

  1. 當一個 issue 建立時會觸發 workflow,取得 IP 後首先判斷是否為白名單 (White list),如果是,將 issue 加入一個 label name 為 whitelist,然後 close 這個 issue,並結束這個 workflow;如果不是白名單,則繼續執行下個步驟。
  2. 判斷該 IP 是否已存在於黑名單,如果是,將 issue 加入一個 label name 為 duplicate,然後 close 這個 issue,並結束這個 workflow;如果不是,則把這個 IP 寫進指定的 RBL 檔案,並將 issue 加入一個 label name 為 added,然後 close 這個 issue,結束這個 workflow。

下面是 這個 workflow 的 yml

記得變更 GIT_USERNAMEGIT_MAIL 及第 52 行 repository 的資訊

Actions -> set up a workflow yourself

github actions

將上方調整好的 yml 內容貼在 content 裡,並點選 Commit changes...

create workflow

這樣 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

create trigger

fortios event

event setting

建立 Action

Security Fabric -> Automation -> Action -> Create New

接下來建立一個 Action

create action

選擇 Webhook

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 可以自訂

webhook setting

PAT Token 必須要能夠 access 你的 private repository,並且針對 issues 的權限要有 Read and Write

建立 Stitch

Security Fabric -> Automation -> Stitch -> Create New

這個部分就將剛剛設定好的 Trigger 以及 Action 套用上去就完成了

stitch setting

FortiGate External Connectors

Security Fabric -> External Connectors

建立一個 Connector

create ext connector

選擇 IP Address

ext connector ip address

設定相關參數

ip address setting

URI of external resource 的 url 可以點擊從我們在 Github public repository 裡面專門收集 RBL IP 的檔案,選擇 Raw,然後就可以複製這個網址進行貼上

rbl file

url of raw file

FortiGate SSL VPN restric access

這裡可以參考另一篇針對 FortiGate protect self service 的文章進行設定

FortiGate protect self service via External Connectors

後記

自從設定好這個機制開始,每隔幾分鐘就一筆 RBL IP 被偵測到,第一天就累積了八百筆多的紀錄,而且這只是一般家裡所申請的網路,可見攻擊無所不在

不過這幾天下來可以發現攻擊慢慢地由幾分鐘變成幾十分鐘,然後變每小時,到現在一天可能偵測到一次,整個效果很顯著

commit stats