[toc]
# 現有狀態
## 設定方式
客戶使用 Microsoft DNS 服務建立網域黑名單阻擋,設定方式就是將要阻擋的網域在 DNS 服務中建立 Zone。就像以下的設定測試範例。

查詢下列網域為例:
- **`xigov.tw`**
- **`tesla.xigov.tw`**
- **`mail.tesla.xigov.tw`**

:::warning
- **`xigov.tw`** 為 zone 名稱,但沒有設定 **`@`** 紀錄,所以無法正確回應。
- **`tesla.xigov.tw`** 和 **`mail.tesla.xigov.tw`** 皆無設定 **`A`** 紀錄,所以回應 **NXDOMAIN**。
:::
## 網域黑名單
目前客戶從現有 DNS 服務中匯出網域黑名單設定,將要阻擋的網域名稱儲存成文字檔 **`blockdomain.list`**。簡單地計算,共有 3,892 筆紀錄。

# Infoblox RPZ
我們可以透過 Infoblox 提供的 Local RPZ 將先前的網域黑名單匯入成為阻擋規則。
## 建立 Local RPZ
首先在 **Data Management** > **DNS** > **Response Policy Zones** 中建立一組 Local RPZ **`local-block-domain.rpz`**。
還是透過簡單的 API 方式來達成吧!
**create_local_rpz.sh**
```bash
#!/bin/bash
function create_local_rpz () {
data="{
\"fqdn\": \"${local_rpz_fqdn}\",
\"comment\": \"${local_rpz_comment}\",
\"grid_primary\": [
{
\"name\": \"${grid_master_hostname}\",
\"stealth\": false
}
],
\"rpz_policy\": \"${local_rpz_policy}\",
\"rpz_severity\": \"${local_rpz_severity}\",
\"rpz_type\": \"LOCAL\"
}"
api='zone_rp'
curl -s -k -X POST -L "${api_baseurl}/${api}" \
-H 'Content-Type: application/json' \
-H "Authorization: Basic ${auth_token}" \
--data "${data}" | jq -r
}
local_rpz_fqdn='local-block-domain.rpz'
local_rpz_comment='Client blacklist feed for Local RPZ via API'
local_rpz_policy='NXDOMAIN'
local_rpz_severity='MAJOR'
echo -e "\n[TASK] Create the Local RPZ for Domain Blacklist"
create_local_rpz
```
**執行結果**

從 Grid Manager 管理介面可以檢視已完成 Local RPZ 建立。

## 新增 Local RPZ 規則
由於網域黑名單約有 3,900 筆紀錄,使用人工手動輸入真的是很浪費時間,除了可以用 CSV 匯入(但目前還不知道 CSV 格式),所以還是簡單地使用 API 方式來達成目標吧。
**add_blacklist_to_rpz.sh**
```bash
#!/bin/bash
function add_block_domain_name () {
block_domain="$1"
data="{
\"name\": \"${blocklist_domain}.${local_rpz_fqdn}\",
\"canonical\": \"\",
\"comment\": \"Created by API\",
\"rp_zone\": \"${local_rpz_fqdn}\"
}"
api='record:rpz:cname'
curl -s -k -X POST -L "${api_baseurl}/${api}" \
-H 'Content-Type: application/json' \
-H "Authorization: Basic ${auth_token}" \
--data "${data}" | jq -r
}
blocklist_file='blockdomain.list'
local_rpz_fqdn='local-block-domain.rpz'
echo -e "\n[TASK] Add a Block Domain(No Such Domain) Rule to the Local RPZ"
block_domains=($(cat ${blocklist_file}))
block_domain_count=${#block_domains[@]}
for ((i=0;i<${block_domain_count};i++)); do
echo -e " >>> adding \"${block_domains[$i]}\""
add_block_domain_name "${block_domains[$i]}"
done
```
**執行結果**

<中間省略...>

從 Grid Manager 點選先前建立的 **local-block-domain.rpz**,可以檢視新增規則的成果,看起來結果還行!

:::warning
目前在管理介面並找不到全部紀錄的筆數。
:::
# 功能測試
我們先從網域黑名單當中,找了以下網域(或主機?)來進行 DNS 查詢檢測。
- i.xigov.tw
- v.xigov.tw
- www.i.xigov.tw
- www.v.xigov.tw
- www.xigov.tw
- www.x.xigov.tw
- xigov.tw
- x.xigov.tw

:::warning
在這個階段我們還沒有發現問題!由提供的網域黑名單,實在不清楚帶有 **`www`** 開頭的紀錄是主機名稱還是網域名稱?但客戶設定的方式都是透過建立 zone,就暫時都先當作是網域吧?!
以 **`www`** 開頭的紀錄,在不負責的初步檢查約有 392 筆,還真的不少!

<以下省略>
:::
## MS DNS
- **nslookup 工具**
先從 Windows 平台上使用 nslookup,對於所撿取的網域進行查詢動作,並觀察回應訊息。


:::info
- 由於 MS DNS 對於惡意網域阻擋的設定,就是採用一般 zone 組態,因為並未設定對應 IP 資訊,所以回應並無任何結果。
- 若是以與**設定 zone 名稱相同**的**網域名稱**進行查詢,結果就是**無任何回應**。
- 若是以**帶有與設定 zone 名稱**的網域名稱,也因為沒有 Resource Record,所以就會回應為 **Non-existent domain**。
- 不管是上述那一類型,也都可以達到網域名稱查詢的阻擋行為。
- 終端用戶環境應該要能夠限制手動指定 DNS 服務主機或是阻斷利用外部 DNS 進行查詢的行為。
:::
- **dig 工具**
在 Linux 平台上用 dig 檢視狀態,使用相同的網域進行查詢。

:::info
- **status: NOERROR**: 表示查詢沒有問題。
- **QUESTION SECTION**: 表示查詢內容。
- **AUTHORITY SECTION**: 表示從哪台 DNS 獲取相關紀錄訊息。
- 查詢內容皆為 **zone 名稱**,由於沒有設定相關紀錄,所以並沒有回覆答案 **ANSWER SECTION**。
- 查詢結果與使用 nslookup 工具相同。
:::
測試帶有 tesla 前綴的網域名稱進行查詢測試。

:::info
- **status: NXDOMAIN**: 因為找不到對應的 IP 紀錄,所以回覆 **NXDOMAIN**。
- 其餘取得資訊皆與之前相同。
- 查詢結果與使用 nslookup 工具相同。
:::
## Infoblox DNS
接著我們從先前建立的 Local RPZ 中選取相同的網域名稱進行查詢測試,並透過 syslog 紀錄觀察結果。

:::info
根據名稱比對所採取的策略是 **Block Domain Name (No Such Domain)**。
:::
使用 dig 工具對 Infoblox DNS 進行相同指定的網域名稱進行查詢檢視結果。

:::info
- **status: NXDOMAIN**: 因為查詢的網域名稱符合指定的 Local RPZ 阻擋規則 (No Such Domain),所以查詢結果為 **NXDOMAIN**。
- 因為符合規則,所以也不會有其他區塊資訊。
- **Infoblox 有正確阻擋該查詢行為**。
:::
從 Infoblox Grid 管理介面,選擇 **Administration** > **Logs** > **Syslog** 檢視紀錄。若有觸發 RPZ 規則,在日誌紀錄檢視會出現 **CEF(Common Even Format) 訊息**。

CEF 紀錄範例:
```log!
CEF:0|Infoblox|NIOS|9.0.1-49999-eb87c18471a7|RPZ-QNAME|NXDOMAIN|7|app=DNS dst=10.7.150.85 src=10.7.1.125 spt=35336 view=_default qtype=A msg="rpz QNAME NXDOMAIN rewrite x.xigov.tw [A] via x.xigov.tw.local-block-domain.rpz" CAT=RPZ
```
:::info
- **Infoblox|NIOS|x.x.x**: 顯示 Infoblox 產品及版本資訊。
- **RPZ-QNAME**: 屬於 hard-coded constant。
- **7**: 顯示 log severity 級別。
- 8 = Critical
- 7 = Major
- 6 = Warning
- 4 = Informational
- **app=DNS**: 屬於 DNS 應用服務。
- **dst**: 顯示目的端 IP 位址,一般是 Infoblox DNS 的 IP 位址。
- **src**: 顯示來源端 IP 位址,向 Infoblox DNS 要求 DNS 服務的來源 IP 位址。若有發生 DNS 安全威脅紀錄,可檢視該項目得知 IP 資訊。
- **spt**: Source port。
- **view**: DNS view,一般為 **default**。
- **qtype**: Query type,DNS 查詢類型。這裡得知是查詢 **A** 紀錄。
- **msg**: RPZ 規則相關訊息。從這裡可以知道是觸發 **local-block-domain.rpz** RPZ 規則。另外規則為 **x.xigov.tw**。
- **CAT**: 顯示該規則類型,此為 RPZ 類別。
:::
若有發生 RPZ 規則觸發情形,可在 **Dashboards** > **Status** > **Security** 頁面檢視相關資訊。


也可以從 **Reporting** > **Dashboards** 和 **Reports** 中,搜尋 **rpz** 關鍵字相關的報表檢視。
- Dashboards - Datailed RPZ Violations by Subscriber ID

- Dashboards - DNS Top RPZ Hits

- Dashboards - DNS Top RPZ Hits by Clients

- Reports - Datailed RPZ Violations by Subscriber ID

- Reports - DNS Top RPZ Hits

- Reports - DNS Top RPZ Hits by Clients

## 發現問題
若在指定的網域前帶有不固定字串,這裡以 **tesla** 為測試範例,再次向 Infoblox 進行 DNS 查詢確認是否會觸發 RPZ 規則?原有客戶使用 zone 設定,是可以回應 NXDOMAIN 訊息已達到阻擋功能。

<font color=red>**發現問題 >>**</font> 並沒有觸發 RPZ 規則而遭到阻擋,而是因為問到**外部 DNS** 回應 **NXDOMAIN**。
:::warning
因為查詢的 FQDN 並未符合任何一個 RPZ 規則,所以 Infoblox 無法提供預想的阻擋行為。
:::
### 問題修正
為了要符合需求,嘗試增加帶有 **`*.`** 前綴的 RPZ 規則。還是使用 API 方式進行設定吧!

檢視建立規則。

重新進行測試並觀察結果!根據先前經驗,查詢的網域名稱都已回應 **NXDOMAIN**。

從管理介面查詢事件紀錄,也有相關 **RPZ 規則觸發紀錄**。

再試試看帶有 **`tesla.modely.`** 前綴的網域名稱是否可以成功觸發?!

看來這樣配置是沒有問題的!

:::success
原有使用 MS DNS 建立 zone 阻擋網域的方式,若要轉由 Infoblox RPZ 方式達成相同效果,應該需要完成
- 建立 Local RPZ。
- 整理現有網域黑名單清單。
- 根據清單原有每筆紀錄至少須建立 2 筆 RPZ 規則。
- **`domain.name`**
- **`*.domain.name`**
- 以上設定在**不優化原有網域黑名單紀錄**為前提。
:::
:::info
上述設定方式已經通過專家認證及確認!:100:
:::
# 參考
- [Infoblox - Configuring Rules for RPZs](https://docs.infoblox.com/space/nios90/280269891/Configuring+Rules+for+RPZs)