前幾天有一則新聞,中國網攻 唐鳳出招破解了:數位發展部網站一秒都沒卡過,內文大概是這樣

自美國眾議院議長裴洛西訪台後,中共就在台灣進行了軍演,與此同時,也有不少境外IP頻頻對我國公、私部門進行攻擊。接任行政院數位發展部首任部長的唐鳳,近日接受媒體專訪時提及此事,指出以Web3為主的分散式架構,將可以完全排除阻斷性攻擊。

唐鳳近日接受《自由時報》專訪,被問及政府機關網站遭到資安攻擊,政府是否有因應作為?唐鳳則形容這幾天的狀況就像是電話佔線,而這個技術也叫大量阻斷服務攻擊(DDoS),其實政府的資料並沒有外泄,而電話線也沒壞掉。但唐鳳指出,電話打不進去,就多設專線的方式,從某個角度來看就像是消耗戰,要投入資源。

唐鳳說,數位發展部的網站在共軍演習當天上線,這個網站是採取Web3的架構,是個分散型網絡、不對稱防禦的架構,在共軍開始軍演當天中午上線,「目前為止一秒鐘都沒有卡住過」。唐鳳指出,比起傳統的流量清洗必須要花資源防禦,Web3就像是有人進線後接的就會是機器人,不需要再有接線生了,和消耗戰不一樣。

至於是否會推廣到各機關部會,唐鳳表示,這個新的架構骨幹不需額外花錢,設計目的就是為了避免遭阻斷攻擊,也鼓勵大家「打打看」,若能撐得住,沒問題的話就會推廣了。

後續可以看到一些比較不以為然的討論 臉書

在數位發展部的官網網址加上 Cloudflare 的參數,https://moda.gov.tw/cdn-cgi/trace 試一下,嗯,確實是用 Cloudflare,身為國家機關,談到資安,怎麼沒有支持國貨,用我們偉大的 HiNet 資安艦隊 呢?

身為網頁基層勞工和乙丙丁戊己方,對 PDIS 上的專案感到敬佩,但也最不齒媒體記者亂寫,把某某技術神話的作為:
「目前為止一秒鐘都沒有卡住過」
「這個新的架構骨幹不需額外花錢」

等下又有人私訊說能不能幫他免費架個抖音,反正 IPFS 人人都可以免費放檔案上去、流量也不用錢,唐鳳還說 CDN 也不用錢耶?
或是又有企業投入五年五百塊,叫工程師把常常塞爆系統的線上報名、電商網站、超耗流量的線上課程影片丟到 IPFS,改成跟數位發展部官網一樣的系統架構怎麼辦? 新聞說這樣網站就不會卡耶?

有些老闆或企業主最喜歡拿這種美好的新聞去質問技術人員,覺得新聞是不會騙人的,實作起來有問題一定是基層勞工的技術不夠。
真的有這麼厲害? 總之今天來玩看看 Cloudflare 的 IPFS 功能,架設一個去中心化的網站。

何謂 IPFS?

InterPlanetary File System,中文翻成星際檔案系統/行星檔案系統,名字很炫,但檔案沒有上太空啦! 概念有點像小時候用的 BT 或 Foxy 一樣,檔案不在一個中心伺服器上面,而是靠地球上大家的電腦開分流當節點,節點越多理論上就越快,完全沒人用,網路上沒有任何節點時,內容就掛了。

檔案在 IPFS 裡面通常會有一組 CID (ContentID 的簡稱,一串長得像亂碼的 hash 值,依據由檔案內容產生CIDv1 Spec),目前 Brave 瀏覽器 可以直接開 ipfs://CID…. 或 ipns://moda.gov.tw 這兩種通訊協定網址。

之前第一次聽到 IPFS 這個技術,是在一個區塊鏈交易所工程師的 NFT 的程式開發教學中,工程師把做好的圖片跟 metadata 丟到某個 IPFS 服務上面,然後再把剛剛上傳檔案後得到的 CID(hash 值)貼到智能合約程式裡面,過程只有短短幾秒鐘,教學裡沒有解釋程式裡一堆 IPFS:// 開頭的地址是幹嘛用的,也沒說為何非得用 IPFS?

聽到 NFT 這個名詞,好像就從勤學向上的新技術學習者,變成臭不可聞的 Web3 跟風賭博仔? Web3 的投機仔都在搞一些亂七八糟的東西,像是浪費電挖礦(加密貨幣的 POW 機制)、搞龐氏騙局資金盤割韭菜、把 CRUD 就能做的東西硬套上 Web3 變成蚊子區塊鏈、搞 NFT 和賦能收割粉絲、搞 ICO 圈錢發貨幣、XX to Earn、玩起來有夠糞的 GameFi,炒作各種據說未來會大漲的虛擬東西?
但別忘記技術本身通常是中立的,菜刀被拿去殺人,應該要責怪的是拿菜刀去殺人的人,或是讓兇手引發殺人動機的原因,而不是責怪製造菜刀的人。

之前有一個號稱區塊鏈技術的內容創作與公共討論平台 Matters,還有影音平台 DTube,也同樣是把文章和影片存到 IPFS 星際檔案系統裡面去。類似概念的去中心化檔案系統不只有 IPFS,像是好和弦之前推一個影音平台 Odysee,Odysee 背後則是用另一套檔案系統 LBRY

至於 IPFS 算是區塊鏈嗎? 應該只能說是 Web3 跟去中心化概念相關的產物之一。一般通常要直接跟區塊鏈扯上關係的,通常是要在區塊鏈 Layer 0~N 裡面的東西,目前真正有用上區塊鏈的檔案儲存技術有 Arweave 跟 Filecoin,像 Arweave 是 Proof of Access 機制,丟上去的檔案就分散放在想要挖 AR 幣的礦工的電腦裡。

何謂 Cloudflare?

Cloudflare 是一家美國的 CDN 業者,裡面的服務包山包海,美股代號叫NET
用 CDN 服務最好選在本地有節點的,速度才不會太慢,Cloudflare 在 2016 年開始在台灣有節點 Taipei: CloudFlare’s 77th Data Center is Now Live
有別於其他 CDN 或網路資安防禦業者,Cloudflare 可以免費註冊,而且能使用的功能很多,但是免費版機房線路資源有限,CDN 連線常常被繞去海外,享用不到台灣節點的高速,而讓台灣本地使用者覺得網站變慢。
IPFS 不是 Cloudflare 發明的,只是剛好 Cloudflare 有提供一些 Web3 的功能,今天要用的是它其中的 IPFS Gateway 功能。

使用 Cloudflare 的 IPFS Gateway 讓網址指向 IPFS 內的 CID

本來要看到 IPFS 上面的檔案非常麻煩,檔案的地址都是一長串 hash 值(ContentID),必須得用特定的網頁瀏覽器或軟體,才能瀏覽 IPFS:// 或 IPNS:// 協定的線上檔案。或是透過一些 IPFS public gateway,用 HTTP 協定配上一長串帶 hash 值的網址(例如 https://ipfs.io/ipfs/QmQi2QsnHnULtqhWkmcdbNdmSowPQ7VY4hfqPbnU7mSpYX ) 也能瀏覽線上檔案。
Cloudflare 自己也提供了一個 Gateway 功能,讓使用者只要跟平常上網一樣輸入一個簡單的子域名或網頁檔案路徑,就可以看到 IPFS 上的檔案了。網頁製作的時間不算,其餘應該 5 分鐘就可以設定完成。

1.啟用 Web3 Gateway 功能

點擊 Cloudflare 側邊的 Web3 選項,會看到 Web3 Gateway 的說明,點擊 subscribe

本處選擇使用 IPFS Gateway

2.選擇免費方案

每月 50GB 的免費流量

3.綁定付款方式

這邊需要輸入信用卡或綁定 PayPal,不然無法繼續下一步。
新聞裡說好的不需額外花錢呢? 超過 50GB 就要花錢了吧,政府網站的流量有這麼低?

4.Purchase Complete

付款方式設定完成之後,就可以看到 Web3 Gateway 的設定畫面,跟平常設定 DNS Zone 那邊的畫面有點像? 其實在 2018 年的時候,Cloudflare 就有推出相關功能,可以在 DNS 那邊用 TXT 紀錄設 DNSLink 連結到 IPFS 了,可參考一篇網路上的文章 教程:利用Cloudflare網關搭建訪問IPFS網站 – 台部落,只是現在被獨立出來,包成一個 Web3 的功能。

本來一開始不知道原理,想說 DNS 那邊要先設定 A 紀錄或 CNAME 指向一台原始的網頁伺服器,然後 Web3 Gateway 這邊再做細部相關設定?
不是這樣的! 在這套 IPFS 架站法,甚至可以連網頁伺服器都不用準備,DNS 那邊用過的子域名名稱,這邊也不能再重複使用,會提示 An A, AAAA, or CNAME record with that host already exists.

5.上傳網頁到 IPFS

做了一個非常簡單的 html 網頁,放了幾張圖,一開始先用 ipfs-desktop 拿自己的電腦當節點,整個資料夾上傳後就可以拿到 CID(一串 hash 值),但用
https://cloudflare-ipfs.com/ipfs/CID 或是 https://ipfs.io/ipfs/CID 或 ipfs://CID 都連不太上,經常 504 Gateway Time-out,好像一次撞到 Troubleshooting 裡面的其中兩個天條: Nodes in the IPFS network have difficulty connecting to them through their NAT (Internet router),檔案所在節點的機器和路由設備需要再另外設定 4001 port 才能讓外人連進來,既然沒有節點就變成 No node with the requested content is online 連不上。

後來把軟體刪了,放到某個傻瓜型 IPFS 的線上檔案服務,應該是有配置好的公開節點,速度就正常得多。

PS:在 #moda | g0v.tw | slack archive 裡面有看到討論,發現數位發展部有自己弄 IPFS node,不是像我一樣偷懶只用別人準備好的節點。

自己架 IPFS node,然後網站內容先上到 ipns://moda.gov.tw 。如果有用 HTTPS 來連,則是連到一分鐘前的 ipfs snapshot

6.設定域名和對應的 IPFS CID

一開始的目標,讓一個子域名對應到 IPFS 上的某個位址 CID,就輸入域名名稱跟 DNSLink

DNSLink 還有其它設定格式,可參考 Cloudflare 的官方文件 DNSLink。我這邊輸入的格式是 /ipns/cloudflare-ipfs.com/ipfs/檔案資料夾的CID/ipfs/檔案資料夾的CID

別人已經包好的網址也可以反查 CID,懶得打指令的可以用Google Admin Toolbox – Dig,選擇 TXT,然後輸入 _dnslink.moda.gov.tw,就可以得到別人的設定值如 "dnslink=/ipfs/Qmehv7mtjAcyGhkrYUp7noEnphf9X1oHzSU5SET6QptfaW"

7.設定完成

設定之後多了一筆出來,稍等一下,打網址就可以看到我上傳到 IPFS 的網頁了

IPFS 速度很慢?

因為 Cloudflare 的 IPFS Gateway 流量用超過要付錢,所以設定好的測試網站沒有打算放出來給大家看。速度看起來還行,沒有想像中的慢。


( test.jpg 的 cf-cache-status 是 MISS)

不過仔細看了一下 Cloudflare 的官方說明 How the gateways work

簡單來說在使用者跟 IPFS 中間還是隔了一層 Cloudflare 的 Data Center,有快取時不會直接存取 IPFS。

所以覺得快,可能只是剛好在 Cloudflare 的 Data Center 有 cache 而已,不是 IPFS 的真實直連速度。
拿 Brave 瀏覽器開這幾個網址看看,才是接近真的 IPFS 的真實直連速度,如果還是很快也不要心存僥倖,可能只是附近剛好有節點。
ipfs://Qmehv7mtjAcyGhkrYUp7noEnphf9X1oHzSU5SET6QptfaW
ipfs://QmQi2QsnHnULtqhWkmcdbNdmSowPQ7VY4hfqPbnU7mSpYX
ipns://moda.gov.tw
https://moda-gov-tw.ipns.dweb.link/

在這個架站實驗中,我甚至連網頁伺服器都不用準備,整個測試網站的圖文所有檔案通通都在 IPFS 上面,既然壓根兒就沒有網頁伺服器,何來「攻破」之說? 的確是有趣的概念。

實務上的其他問題

1.域名管理權限問題

前面看似只有5步,但還少了一大段前置作業,首先要把 DNS Name Server 託管到 Cloudflare,前置作業先做完,才能在5分鐘內輕鬆秒殺後續作業。
免費版的 Cloudflare 不能只放單一個子域名,要把整個域名的 Name Server 都換成 Cloudflare 的,然後以後要變更任何一筆 DNS 紀錄通通要到 Coudflare 操作,這就牽涉網域管理權限問題,非常麻煩。但也很好解決,只要升級到一個月 200 美元以上的 Business 版本就可以把單一個子域名搬到 Cloudflare,就是錢的問題而已,但問題是沒錢。
除了看似沒什麼的設定要花大錢,搞資安防禦也不是人人都玩得起的,一個月 200 美金,或是用多少付多少的計費防禦服務? 現在架站服務需求非常 M 型化,有些網站好好的,還每個月花很多錢在持續找人強化再強化,優化再優化。也有些人只用 1年1000含主機、甚至免費架站、或沒訂單就不用付錢的免費電商 Saas,一年花費可能都不到 200 美金。

預算有限或是專業度不足的情況下,最後常常導致資安變成一些奇怪的應付式作為。

另外講個小故事,國內的主機商通常有一招被攻擊時的簡易防禦法,就是從機房端設定只限台灣 IP 的使用者連線,把國外的 IP 阻擋掉,所以會發現有時候使用者開了 VPN 飛到國外之後,發現一些超商的包裹查詢、某些線上服務網站會打不開,就是網站的主機做了諸如此類的設定。但是這招懶人防禦法在 2020/9 的時候破功臺灣多家主機託管商遭DDoS攻擊,元兇是國內IP疑大量DVR設備遭入侵 ,因為攻擊來源的 IP 都是國內的…

2.多一層 Cloudflare,是不是網站就不會掛掉,SLA 100%?

這又是另一個層面的問題,從正常網路工程邏輯來說,從在瀏覽器輸入網址,到看到網頁,中間經過 N 道程序,多一道程序就多一支鬼,今天多了一道 CDN,難道 CDN 就不會故障?

Web3 的去中心化、匿名性…各種核心概念大家應該都聽到煩了,但其實大部份區塊鏈的程式主體或節點或相關應用,也是運行在各大公有雲或網路機房業者裡面,像乙太坊是在 AWS,只要機房掛掉或是被勒令關閉,都有機會對區塊鏈的交易和運行產生影響,其實沒有想像中的那麼去中心化。

回到 Cloudflare+IPFS 的架構,事實上 Cloudflare 在今年6月才發生全球大當機一次,那時候改手上的網站改到一半,不知道為什麼出現 502 bad gateway – nginx 的訊息然後網站打不開? 主機商查機器狀態卻都是正常的,但打網址確實連不上網站? 當時我還很緊張,因為我的環境不是 Nginx 的,怎麼會跑出 nginx 的訊息? 難道 DNS 被竄改了?

後來自己發現是有掛 Cloudflare 的網站都壞掉了,故障原因可以查看官方說明 Cloudflare outage on June 21, 2022

當發生這種 CDN 業者大當機的情況時,我們的「去中心網頁設計」可能又要變成一場騙局了,打網址進來就是看不到網頁嘛!
當然我們可以說只要另外使用支援 IPFS 通訊協定的瀏覽器,用 IPFS:// 或 IPNS:// 的通訊協定和特定的其他名稱,還是可以看到數位發展部的網站呀! 或是找其他的 IFPS Public Gateway 來連線到對應的 CID 去,但一般民眾會用嗎…

3.更新網頁問題

另外有幾篇相關新聞提到攻擊後網頁被竄改的問題,這剛好是 Web3 和 IPFS 的強項,檔案放上網路之後就無法替換,只有把檔案 unpin,然後等著從節點中被清掉。
既然檔案無法「覆蓋」,那要怎麼更新網頁?

每一次上傳檔案都會產生一組新的 CID,那就變成每一次更新網頁,就要重做一次步驟6,登入 Cloudflare 裡面修改 IPFS Gateway 裡面的 DNSLink 值,非常辛苦。雖然 Cloudflare 有提供 API,讓上傳檔案後修改 DNSLink 值的整個過程能更順暢,但執行換版的身分驗證,呼叫 API 的程式要放在哪? 還是得準備地方來放,然後寫程式串 API 啊…

4.新的資安隱患?

除了更新網頁有不同的玩法,如果用 IPFS 當網站系統架構,還有其他的特色…

例如理論上以後再也不用怕政府網站刪文,只要每天定時把人家網站的 CID 查好留起來,甚至自己開一個 IPFS 節點,把每一次的 CID Pin 住,發現刪文時,再把歷史的 CID 連結 ipfs:// 調出來,理論上還是可以看到被刪除前的內容。

近幾年很多軟體工程的作業方式改用 git 做版控,或是用一些 CI&CD 工具來半自動化輔助更新網站程式,新的資安事件就開始多起來,開始發生有人把內含機敏資訊的設定檔、金鑰資訊、API KEY 也丟到一些可以公開搜尋的、或只要猜到連結就能看的線上空間去,在國內外造成各種 git 洩漏之類的資安問題,

類似概念的問題可能一堆新手投入 IPFS 星際檔案系統之後重演,像剛剛步驟6中,提供了一個方法可以查到別人網站的 IPFS CID,於是我們就可以在 IPFS desktop 節點軟體中,根據 CID 輕鬆把別人放在 IPFS 的網站整個下載回來好好研究,看有沒有什麼隱藏頁面、隱藏檔案、機敏資訊之類的。

5.免費的 IPFS,收費的服務

使用 IPFS 檔案系統本身是不用錢的,任何人都可以放檔案上去,任何人都可以讀取檔案,那怎麼還會有一堆 IPFS 的收費服務?
除了提供更簡單的上傳介面、自己電腦不用安裝軟體、不用學操作指令、電腦或路由器不用另外開放 port 讓人進來、自己不用另外準備專用的節點(網路上有看到用 Raspberry PI 當 IPFS 節點的文章),還有為程式開發人員提供更方便的 API 和檔案處理參數(例如圖片壓縮)。
還有最重要的是為了提供穩定、保證有檔案的節點,避免像我那樣,檔案上傳之後連自己都連不太上,或是檔案不存於任何節點,就沒人可以看到檔案了。

既然講到收費方式,Cloudflare 的 Web3 Gateway 如果用量大的話也要付錢(如上面步驟3的綁定付款方式),一些上傳介面跟存取很方便的 IPFS 代管服務,用量稍大一點就要付錢(如下圖),或是像 Infura 會把 6 個月內沒人瀏覽的檔案 unpin

而以部分案子的收費方式,這種每個月產生帳單,可能需要帳單實報實銷的東西,要怎麼寫政府標案、規劃預算、請款呢? 這真是個好問題。

6.有後端程式的網站不能這樣用吧

開頭的新聞主題,敵人用 DDoS 攻擊導致網站資源被耗盡而打不開? 我們就用 Cloudflare CDN + IPFS 來解,見招拆招,但 DDoS 畢竟只是網路攻擊的其中一種,還有許多攻擊方式跟網站系統架構不是靠 IPFS 可以解決的。
如果是 CMS/電商那種有後端動態程式&關聯式資料庫的,看起來是無法運作在 IPFS 的機制上吧。數位發展部的官網現在看起來只有一頁簡單的介紹內容,等以後有 server side 程式之後,再看看還敢不敢鼓勵大家打打看。工程界常說博弈網站跟色情網站的背後的技術,通常領先一般民間網站,那在 Web3 的世界中有什麼新的解決方案?

數位發展部的網站感覺也就只是放一些公告跟靜態內容而已,不會有會員登入之類的功能,我想如果直接用一些 Static Site Generator 來做網站(在本機寫文章或做網頁,在本機用 ruby 或 node.js 伺服器和程式,或線上的 CI 工具編譯出靜態網頁檔案,然後把靜態檔案丟到線上空間的一種技術,現在被不少工程師拿來做部落格),那這個 Cloudflare CDN + IPFS 的架構應該真的就可以繼續用了。

結論:數位發展部有自己示範,這非常好

回到一開始的命題
– 用 IPFS 免費架個抖音、線上課程影片網?
Cloudflare CDN 有視訊串流的付費功能,但我們用 Web3 Gateway,免月費只有 50GB 的上下行流量額度,超過的話每 GB 跳表收費。
還有 Cloudflare 繞去海外節點的問題常會導致連線變慢的問題,還沒談網站的檔案上傳機制全部重新開發重新設計呢。
– 放到 IPFS 一秒都不會卡?
放到其他非 Cloudflare 的 IFPS Public Gateway,很大機率隨便一張圖直接卡 5 秒起跳,甚至壓根連不上。
– 把塞爆主機的線上報名或電商網站丟上去?
後端程式沒辦法放到 IPFS,瓶頸卡在運算資源不足,像 CPU 跟 RAM 不夠,或 C10K 問題的,Cloudflare 月費 200 美元以上的方案有 waiting room 之類的機制。

本來碰到 DDoS 攻擊,網站需要仰賴流量清洗機制、防火牆、WAF、CDN、夠強的硬體規格和系統架構等等,各種砸錢、砸錢、再砸錢,網站才能活下來,而數位發展部和 IPFS 的邏輯,改由仰賴 Cloudflare 的防禦機制與 CDN,跟分散式檔案系統的設計,把網路攻擊帶來的頻寬和流量分散掉。
數位發展部有親自示範,這非常好
而不是每次談到資安,
就是一些不負責實作的人在高談闊論,
講一些說要培養人員和使用者的資安素養的演講比賽、
找第三方廠商來打混戰互踢皮球、
讓一些代理國外資安或弱掃軟體的台灣代理商發大財、
基層人員準備一些”應付式資安”作為,
做更多文書工作,監管、審核廠商的軟體品質…云云,
X你娘,一堆做網站的基層勞工年薪連50都沒有,外包廠商丙丁戊己庚辛方才拿到多少錢? 要接收「長官」一些亂七八糟的「指導」、出資安檢測報告、還要兼顧什麼品質?
這樣設計的立意確實是好的,可能可以讓網站營運人員用最不用花錢花心力的方式抵禦攻擊,至於適不適合所有政府相關機構的網站,又是另一個討論層面了。

2022/8/28 更新:
今天才發現數位發展部的完整版正式網頁已經上線了,仍然是用 Cloudflare+IPFS 的架構,去查了 IPFS CID 之後發現網站有 400 多MB,大部分都是一堆照片。網站看起來沒有什麼其他特別技術,值得一提的是站內搜尋功能使用 Google 的程式化搜尋引擎,這玩意我之前在做另一個 side project 時有用過

延伸閱讀