[toc] # 現有狀態 ## 設定方式 客戶使用 Microsoft DNS 服務建立網域黑名單阻擋,設定方式就是將要阻擋的網域在 DNS 服務中建立 Zone。就像以下的設定測試範例。 ![螢幕快照 2023-12-21 14-07-17](https://hackmd.io/_uploads/BJuMPL-Da.png) 查詢下列網域為例: - **`xigov.tw`** - **`tesla.xigov.tw`** - **`mail.tesla.xigov.tw`** ![螢幕快照 2023-12-21 15-47-11](https://hackmd.io/_uploads/BkhZAwbvT.png) :::warning - **`xigov.tw`** 為 zone 名稱,但沒有設定 **`@`** 紀錄,所以無法正確回應。 - **`tesla.xigov.tw`** 和 **`mail.tesla.xigov.tw`** 皆無設定 **`A`** 紀錄,所以回應 **NXDOMAIN**。 ::: ## 網域黑名單 目前客戶從現有 DNS 服務中匯出網域黑名單設定,將要阻擋的網域名稱儲存成文字檔 **`blockdomain.list`**。簡單地計算,共有 3,892 筆紀錄。 ![圖片](https://hackmd.io/_uploads/r1Mr7uWDa.png) # 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 ``` **執行結果** ![圖片](https://hackmd.io/_uploads/S1TTorbwT.png) 從 Grid Manager 管理介面可以檢視已完成 Local RPZ 建立。 ![螢幕快照 2023-12-21 13-36-50](https://hackmd.io/_uploads/ByD8kUZDT.png) ## 新增 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 ``` **執行結果** ![圖片](https://hackmd.io/_uploads/H18DhHbDp.png) <中間省略...> ![圖片](https://hackmd.io/_uploads/Bkhj0BZDa.png) 從 Grid Manager 點選先前建立的 **local-block-domain.rpz**,可以檢視新增規則的成果,看起來結果還行! ![圖片](https://hackmd.io/_uploads/SJVtJ8WvT.png) :::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 ![螢幕快照 2023-12-21 14-45-51](https://hackmd.io/_uploads/HJhHyw-vT.png) :::warning 在這個階段我們還沒有發現問題!由提供的網域黑名單,實在不清楚帶有 **`www`** 開頭的紀錄是主機名稱還是網域名稱?但客戶設定的方式都是透過建立 zone,就暫時都先當作是網域吧?! 以 **`www`** 開頭的紀錄,在不負責的初步檢查約有 392 筆,還真的不少! ![螢幕快照 2023-12-21 17-59-54](https://hackmd.io/_uploads/rJG-6YbvT.png) <以下省略> ::: ## MS DNS - **nslookup 工具** 先從 Windows 平台上使用 nslookup,對於所撿取的網域進行查詢動作,並觀察回應訊息。 ![螢幕快照 2023-12-21 14-25-02](https://hackmd.io/_uploads/SyRdnIWPp.png) ![螢幕快照 2023-12-21 14-27-38](https://hackmd.io/_uploads/B1LYhUbDp.png) :::info - 由於 MS DNS 對於惡意網域阻擋的設定,就是採用一般 zone 組態,因為並未設定對應 IP 資訊,所以回應並無任何結果。 - 若是以與**設定 zone 名稱相同**的**網域名稱**進行查詢,結果就是**無任何回應**。 - 若是以**帶有與設定 zone 名稱**的網域名稱,也因為沒有 Resource Record,所以就會回應為 **Non-existent domain**。 - 不管是上述那一類型,也都可以達到網域名稱查詢的阻擋行為。 - 終端用戶環境應該要能夠限制手動指定 DNS 服務主機或是阻斷利用外部 DNS 進行查詢的行為。 ::: - **dig 工具** 在 Linux 平台上用 dig 檢視狀態,使用相同的網域進行查詢。 ![圖片](https://hackmd.io/_uploads/BykdBuMwp.png) :::info - **status: NOERROR**: 表示查詢沒有問題。 - **QUESTION SECTION**: 表示查詢內容。 - **AUTHORITY SECTION**: 表示從哪台 DNS 獲取相關紀錄訊息。 - 查詢內容皆為 **zone 名稱**,由於沒有設定相關紀錄,所以並沒有回覆答案 **ANSWER SECTION**。 - 查詢結果與使用 nslookup 工具相同。 ::: 測試帶有 tesla 前綴的網域名稱進行查詢測試。 ![圖片](https://hackmd.io/_uploads/HyIbpdMw6.png) :::info - **status: NXDOMAIN**: 因為找不到對應的 IP 紀錄,所以回覆 **NXDOMAIN**。 - 其餘取得資訊皆與之前相同。 - 查詢結果與使用 nslookup 工具相同。 ::: ## Infoblox DNS 接著我們從先前建立的 Local RPZ 中選取相同的網域名稱進行查詢測試,並透過 syslog 紀錄觀察結果。 ![圖片](https://hackmd.io/_uploads/Hk6l7tGD6.png) :::info 根據名稱比對所採取的策略是 **Block Domain Name (No Such Domain)**。 ::: 使用 dig 工具對 Infoblox DNS 進行相同指定的網域名稱進行查詢檢視結果。 ![圖片](https://hackmd.io/_uploads/SkoTvYMv6.png) :::info - **status: NXDOMAIN**: 因為查詢的網域名稱符合指定的 Local RPZ 阻擋規則 (No Such Domain),所以查詢結果為 **NXDOMAIN**。 - 因為符合規則,所以也不會有其他區塊資訊。 - **Infoblox 有正確阻擋該查詢行為**。 ::: 從 Infoblox Grid 管理介面,選擇 **Administration** > **Logs** > **Syslog** 檢視紀錄。若有觸發 RPZ 規則,在日誌紀錄檢視會出現 **CEF(Common Even Format) 訊息**。 ![螢幕快照 2023-12-22 11-36-59](https://hackmd.io/_uploads/HJVYDtfv6.png) 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** 頁面檢視相關資訊。 ![圖片](https://hackmd.io/_uploads/H1OWQizvT.png) ![圖片](https://hackmd.io/_uploads/SkHBmjfv6.png) 也可以從 **Reporting** > **Dashboards** 和 **Reports** 中,搜尋 **rpz** 關鍵字相關的報表檢視。 - Dashboards - Datailed RPZ Violations by Subscriber ID ![圖片](https://hackmd.io/_uploads/SksguiGDT.png) - Dashboards - DNS Top RPZ Hits ![圖片](https://hackmd.io/_uploads/HyXHdjMPp.png) - Dashboards - DNS Top RPZ Hits by Clients ![圖片](https://hackmd.io/_uploads/Bk8v_jzPa.png) - Reports - Datailed RPZ Violations by Subscriber ID ![圖片](https://hackmd.io/_uploads/SJj-KoGwa.png) - Reports - DNS Top RPZ Hits ![圖片](https://hackmd.io/_uploads/Hk-2_jGw6.png) - Reports - DNS Top RPZ Hits by Clients ![圖片](https://hackmd.io/_uploads/HJgRuozDp.png) ## 發現問題 若在指定的網域前帶有不固定字串,這裡以 **tesla** 為測試範例,再次向 Infoblox 進行 DNS 查詢確認是否會觸發 RPZ 規則?原有客戶使用 zone 設定,是可以回應 NXDOMAIN 訊息已達到阻擋功能。 ![螢幕快照 2023-12-22 14-14-40](https://hackmd.io/_uploads/H1lF2sMPa.png) <font color=red>**發現問題 >>**</font> 並沒有觸發 RPZ 規則而遭到阻擋,而是因為問到**外部 DNS** 回應 **NXDOMAIN**。 :::warning 因為查詢的 FQDN 並未符合任何一個 RPZ 規則,所以 Infoblox 無法提供預想的阻擋行為。 ::: ### 問題修正 為了要符合需求,嘗試增加帶有 **`*.`** 前綴的 RPZ 規則。還是使用 API 方式進行設定吧! ![圖片](https://hackmd.io/_uploads/BkvNf3zv6.png) 檢視建立規則。 ![螢幕快照 2023-12-22 14-51-28](https://hackmd.io/_uploads/Bk-tLnMw6.png) 重新進行測試並觀察結果!根據先前經驗,查詢的網域名稱都已回應 **NXDOMAIN**。 ![螢幕快照 2023-12-22 14-54-48](https://hackmd.io/_uploads/Sklqu3fv6.png) 從管理介面查詢事件紀錄,也有相關 **RPZ 規則觸發紀錄**。 ![螢幕快照 2023-12-22 14-57-14](https://hackmd.io/_uploads/SJbXthMva.png) 再試試看帶有 **`tesla.modely.`** 前綴的網域名稱是否可以成功觸發?! ![螢幕快照 2023-12-22 15-24-57](https://hackmd.io/_uploads/HyJEohzDT.png) 看來這樣配置是沒有問題的! ![螢幕快照 2023-12-22 15-24-19](https://hackmd.io/_uploads/Sy8N92GPa.png) :::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)