架構
Merak 零信任網路是怎麼運作的
「零信任」這個詞被行銷講壞了。它聽起來像一種態度,但實際上它是一組很具體的工程決策:連線由誰發起、身分用什麼表示、金鑰放在哪裡、授權在哪一層做、失敗時會發生什麼事。
這篇文章把 Merak 這類零信任網路存取(ZTNA)網路拆成八個機制,每個機制配一張圖。你只要知道 TCP 大概是怎麼建立連線的、憑證大概是什麼東西,就能讀完。看不懂的名詞在文末有對照表,每個都附了原始規格或說明的連結。
先講清楚要解決什麼問題
傳統網路安全是邊界模型:把公司資產放在一道牆裡面,牆上開一個門(VPN 閘道或防火牆),驗證發生在門口。通過驗證的人拿到一個內網 IP,從此他在牆內的可達範圍由網段和防火牆規則決定,而不是由「他是誰」決定。
這個模型的問題不在於門不夠牢,而在於門後面沒有第二道判斷。攻擊者只要偷到一組能過門的憑據,之後在內網移動就幾乎不受阻礙——這在攻擊技術分類裡叫做橫向移動(lateral movement),是絕大多數資料外洩事件中最關鍵的一段。
- 攻擊者可走的路徑
- 被授權的單一連線
- 網路邊界
圖說文字版
並列比較兩種信任模型:左側的邊界模型以網路位置決定可達性,右側的身分模型以逐條連線的授權決定可達性。
左側:邊界模型(先進網路,再談權限)
- 一組被盜的帳號從外部通過閘道,進入內部網段。
- 網段內有四台主機:檔案伺服器、ERP、資料庫、監控系統。
- 攻擊者取得立足點後,可沿網段內部逐步橫向移動,最終抵達全部四台主機。
- 驗證只發生一次,之後由網段決定誰能連到誰。
- 結論:一個立足點等於同網段全部可達。
右側:身分模型(先驗身分,再開通道)
- 用戶端持有使用者憑證與裝置憑證,身分為 identity: alice。
- 對象是同樣四個服務:檔案伺服器、ERP、資料庫、監控系統。
- 政策只授權 ERP,因此只有一條連線被建立。
- 其餘三個服務對這個身分沒有任何回應,連探測都得不到結果。
- 結論:帳號被冒用時,攻擊者只取得該身分原有的權限,範圍不會擴大。
零信任的核心主張只有一句話:網路上的位置不構成信任的理由。要落實這句話,得先把「連得到」和「被授權」這兩件事在架構上徹底分開。
一、把「決定誰能連」和「實際搬運資料」拆開
第一個結構性決策是平面分離——這個詞借自網路設備的控制平面與轉發平面概念。
- 控制平面負責身分登錄、政策定義、憑證簽發,以及每一條連線的授權決策。它做決定,但完全不經手應用資料。
- 資料平面是一組彼此相連的邊緣節點,組成網狀網路,實際轉送流量。它搬東西,但不做授權決定(它只執行控制平面同步下來的結果)。
- 控制連線:節點與控制平面
- 鏈路連線:節點與節點
- 邊緣連線:應用與節點
圖說文字版
控制平面與資料平面的職責切分,以及連接兩者的三類連線。
控制平面
- 負責身分登錄、政策定義、憑證簽發、逐連線授權決策。
- 不經手任何應用層資料。
資料平面(邊緣節點網狀網路)
- 由邊緣節點 A、B、C 組成網狀網路,實際搬運流量。
- 用戶端以應用內 SDK 或本機代理接入。
- 受保護的服務沒有對外監聽埠。
三類連線
- 控制連線:端點與控制平面之間,用於登錄、授權與政策下發。
- 鏈路連線:邊緣節點彼此之間,構成網狀資料路徑。
- 邊緣連線:端點與邊緣節點之間,是流量真正進出的那一段。
- 三類連線全部是雙向 TLS,每一端都得出示自己的憑證;沒有任何一段是明文或匿名的。
這個切法有兩個直接後果。第一,廠商不在資料路徑上——控制平面看得到「誰在什麼時候要求連什麼」,但看不到內容。這在跨境資料傳輸與特定產業的合規審查裡,通常比效能數字更關鍵。第二,資料平面沒有一個集中的閘道,也就沒有一個一掛掉全體斷線的單點故障。
圖上那三類連線全部走雙向 TLS(mTLS)。一般上網用的 TLS 只有伺服器出示憑證,用戶端是匿名的;雙向 TLS 則要求兩端都出示憑證,所以連線本身就攜帶了雙方的身分。沒有任何一段是明文,也沒有任何一段是匿名的。
二、身分不是一組帳號密碼,是一張憑證
在這種網路裡,每一個主體——人、裝置、服務、工作負載——的身分就是一張 X.509 憑證。
如果你沒接觸過 PKI,可以先建立這個心智模型:憑證是一份「公鑰 + 這個公鑰屬於誰」的聲明,由一個受信任的簽發者(CA)用它自己的私鑰簽名。驗證方檢查簽名,就能確認這份聲明沒被竄改。但憑證本身是公開資訊,光有憑證不能證明你是誰——要證明身分,你得證明你握有對應的私鑰。
所以整個註冊流程的設計目標只有一個:讓私鑰從產生到使用,全程不離開端點。
- 走網路的訊息
- 只在本機發生的步驟
- 自動續期迴圈
圖說文字版
端點取得憑證身分的完整流程,共七個步驟,重點在私鑰從不離開裝置。
參與者
- 端點(人、裝置或服務)。
- 控制平面。
步驟
- ① 一次性註冊 token(JWT)以帶外方式交給端點。
- ② 端點依 token 內記載的位址連線,索取控制平面的憑證。
- ③ 控制平面回傳憑證;端點驗證對方確實持有對應私鑰。
- ④ 端點在本機產生金鑰對,私鑰寫入本機保存區,只把公鑰包成 CSR 送出。
- ⑤ 送出憑證簽署請求(CSR)連同註冊 token。
- ⑥ 控制平面驗證通過後簽發憑證鏈,身分自此成立。
- ⑦ 到期前自動重跑步驟 ⑤ 與 ⑥ 續期,不需人工換發。
重點
- 私鑰自始至終沒有離開裝置——即使整段傳輸被完整錄下,也複製不出這個身分。
流程的關鍵在第 ④ 步。端點在本機產生一組非對稱金鑰對,私鑰寫進本機保存區,然後把公鑰包成一份憑證簽署請求(CSR,RFC 2986)送出去。控制平面驗證後簽發憑證鏈回來。
這代表:就算有人完整錄下整段註冊流量,他也組不出這個身分——他手上只有公鑰。這和「把密碼或 API 金鑰送過網路」是本質上不同的安全模型;後者只要傳輸或儲存任一環出問題,憑據就複製出去了。
第 ① 步的那張一次性註冊 token 通常是一個帶有效期的 JWT(RFC 7519),只能用一次,作用僅僅是「告訴端點該連到哪裡、並讓控制平面認得這次註冊」。它換到憑證之後就作廢了。
值得注意的細節: 就算你的主要登入方式是 OpenID Connect 或帳號密碼,用戶端在連上邊緣節點之前,仍然必須先換到一張臨時憑證——因為資料平面全程要求 mTLS,沒有憑證根本建不起連線。人的登入方式和連線的身分載體,是兩件事。
三、為什麼要加密兩次
看到「全程 mTLS」又看到「端對端加密」,第一個反應通常是:這不是重複了嗎?
不是。它們保護的是不同的東西,而且是巢狀關係。
- mTLS:逐段、每段各自金鑰
- AEAD:端對端、金鑰只在兩端
- 原始應用酬載
圖說文字版
左側是封裝順序,右側是同一條路徑上各節點分別解得開什麼。
封裝順序(由內而外)
- 最內層:應用酬載,可以是 HTTP、SQL 或任何協定。
- 中間層:AEAD 封裝,金鑰只存在於通訊的兩端。
- 最外層:mTLS 1.2 以上,每一段連線各自持有不同金鑰。
- 兩層彼此獨立,換掉其中一層不影響另一層。
路徑上誰解得開什麼
- 路徑為:應用 A → 中繼邊緣節點 → 應用 B,中間分成 mTLS ① 與 mTLS ② 兩段。
- 應用 A 持有端對端金鑰 Ke。
- 應用 B 持有端對端金鑰 Ke。
- 中繼邊緣節點不持有 Ke,只轉送它解不開的密文。
- 因此中繼節點即使被攻陷,讀到的仍然只是密文。
- 傳輸層(mTLS)是逐段的。用戶端到節點 A 是一段、節點 A 到節點 B 是另一段,各自有各自的金鑰。它負責的是「這一跳的對象是誰、這一跳的內容別人聽不到」。
- 應用資料層(AEAD)是端對端的。酬載在來源端就用認證式加密(AEAD,RFC 5116)封好,金鑰只有通訊的兩端持有,中間節點沒有。實務上會用像 ChaCha20-Poly1305(RFC 8439)這類同時提供機密性與完整性的演算法——「認證式」的意思是密文被改一個位元,解密方會直接判定失敗,而不是解出一堆垃圾。
這一層的意義很直接:中繼節點只轉送它解不開的密文。資料平面對酬載的機密性而言是「不受信任」的元件,就算某個節點整台被拿下,攻擊者拿到的還是密文。
端對端的邊界落在哪裡取決於接入方式:如果加密邊界內嵌在應用程式本身,邊界就在兩個應用之間;如果因為系統老舊不能改程式,改用本機代理承接,邊界就在兩個代理之間。後者仍然涵蓋整段網路路徑,只是最後那一小段(代理到應用的本機迴路)在保護範圍外——這是導入時要明確標示的取捨。
四、每一條連線都重新問一次「可以嗎」
拿到有效憑證,只完成了認證(你是誰),還沒完成授權(你可以做什麼)。這兩者被混為一談,是很多存取控制設計出錯的起點。
每當有人要對某個服務開一條新連線,判定會依序走完四道:
- 判定鏈
- 全過:開通僅限該服務的通道
- 任一失敗:拒絕
圖說文字版
每一條連線都必須依序通過四道判定,四項全過才會建立通道。
前提
- 持有憑證只代表通過「認證」;每開一條新連線,下面四道判定都要重走一次。
四道判定(依序)
- ① identity:憑證有效,且該身分已完成登錄。
- ② policy:政策確實授權此身分使用該服務。
- ③ path:連線走的是被授權的節點與路徑。
- ④ posture:端點姿態符合政策要求。
結果
- 四項全過 → 建立通道,且該通道僅通向這一個服務。
- 任一道不通過 → 拒絕,且不回傳任何足以辨識該服務存在的資訊。
- 授權範圍就是這條通道本身——它到不了任何沒被授權的服務。
重點在於授權的粒度與時機。粒度是「單一服務」而不是「一個網段」,時機是「每一條連線」而不是「每一次登入」。這兩點合起來,就是最小權限原則在網路層的實作:某個端點被入侵時,攻擊者能碰到的僅限於那個身分原本就被授權的那幾個服務,圖 01 右邊那些連不到的服務,對他來說一樣連不到。
設計陷阱: 授予同一服務的多條政策之間通常是 OR 聯集——只要有一條通過就放行。如果你替同一組 identity 與 service 同時掛了一條「帶姿態檢查」和一條「不帶姿態檢查」的政策,後者會靜默地讓姿態檢查失效,而且系統不會報錯,因為兩條政策各自都合法。寫政策時務必把聯集語意算進去。
五、通過之後還要一直通過
第 ④ 道的**姿態檢查(posture check)**值得單獨講,因為它是少數會在連線「已經建立之後」還持續作用的機制。
- 評估通過
- 端點狀態改變
- 授權消失,連線終止
圖說文字版
同一條時間軸上比較兩種姿態檢查模型:只檢查一次,與連線期間持續評估。
上排:只在建立連線時檢查一次
- 建立連線的當下通過檢查。
- 之後某個時刻,端點偏離合規狀態。
- 既有連線仍然活著,直到使用者自己斷線為止。
下排:連線期間持續評估
- 連線建立後,每次狀態比對都持續通過。
- 端點偏離合規的那一刻被立即偵測到。
- 授權隨即消失,既有連線當場終止。
回報機制
- 回報是變更驅動的:端點定期比對自身狀態,只有發生變化時才送出,而不是定時全量上報。
一般的存取控制是「進門時檢查」,所以一台在上班時合規、下午被裝了東西的筆電,那條連線可以一路撐到使用者自己關掉。持續評估的差別在於:偏移發生的當下,既有連線就會被關閉,不用等下次重連。
常見的檢查類型大致是這幾種:
| 檢查類型 | 判定的東西 | 常見用途 |
|---|---|---|
| 作業系統 / 版本 | 指定的 OS,可再指定版本範圍(用 Semver 之類的表達式) | 擋掉停止支援、不再收安全更新的版本 |
| 網路介面位址 | 端點的介面位址落在允許清單內 | 綁定特定的公司配發設備 |
| 多因子(MFA) | 端點目前已啟用並通過 TOTP(RFC 6238) 驗證,可設逾時 | 高敏感服務要求近期驗證過 |
| 程序 | 依執行檔路徑、二進位雜湊或簽章指紋比對 | 確認防毒/端點防護確實在跑 |
| 網域成員 | 端點是指定網域的成員 | 區分公司資產與個人裝置 |
MFA 是其中唯一帶時間語意的:可以設定「多久以前驗證過才算數」,並在裝置鎖定或休眠喚醒後要求重新提交。
值得留意的是回報機制:姿態回報是變更驅動的——端點定期比對自身狀態,只在有變化時才送出回報,而不是每隔幾秒把全部狀態上傳一次。這對規模化很重要,也順帶解釋了為什麼偏移偵測會有秒級而非毫秒級的延遲。
六、服務為什麼「掃不到」:把連線方向反過來
這是整套架構裡最違反直覺、也最有效的一招。
要理解它,先回到 TCP 建立連線的基本事實。一個服務要能被連上,就必須開一個入站監聽埠——等於對整個網路廣播「我在這裡,這個埠可以連我」。而任何開著的埠在 port scan 下都會現形:掃描者送一個 SYN,只要收到 SYN-ACK,就確認了「這裡有東西」。接下來就是版本指紋辨識、憑證探測、已知漏洞比對、登入頁爆破——整條攻擊鏈的第一步,就是那個回應。
監聽埠本身就是攻擊面。 所以零信任網路的做法是:不要有監聽埠。
- 掃描者的探測封包
- 回應 = 現形
- 服務主動撥出的連線
- 沿既有連線反向送回的流量
圖說文字版
對比兩種暴露模型:傳統服務開入站監聽埠,與服務只對外撥出、從不接受入站連線。
上排:傳統,服務開一個入站監聽埠等人來連
- 掃描者可以是網際網路上的任何人,向服務送出 TCP SYN。
- 防火牆必須為入站流量開一條 allow 規則。
- 服務主機的狀態是 :443 LISTEN。
- 服務回應 SYN-ACK,位置與存在因此現形。
- 有回應就是指紋辨識、憑證探測與登入頁爆破的起點。
下排:出站撥號,服務只撥出,從不接受入站連線
- 服務主機的狀態是 no listener,沒有任何監聽埠。
- 防火牆的入站規則可以全部 default-deny。
- 掃描者送出 TCP SYN 後,沒有 SYN-ACK,也沒有 RST——什麼都沒有。
- ① 服務主動向邊緣節點撥出一條 TCP 連線(outbound)。
- ② 授權流量沿這條既有連線反向送回服務。
承載服務的節點不開任何對外監聽埠,而是主動向資料平面撥出一條 TCP 連線,並在這條已經建立的連線上,把自己註冊為該服務的終端者。之後所有要送往這個服務的授權流量,都由邊緣節點沿著這條既有通道「反向」送回去。服務端從頭到尾只曾撥出,從未接受過任何來自網際網路的入站連線。
對掃描者來說,結果是這樣的:
| 面向 | 傳統入站服務 | 出站撥號 |
|---|---|---|
| 連線方向 | 用戶端 → 服務(inbound) | 服務 → 邊緣節點(outbound) |
| 對外監聽埠 | 需要開放 | 沒有任何 listener |
| SYN 掃描結果 | 回 SYN-ACK,現形 | 沒有回應,等同不存在 |
| 入站防火牆規則 | 需要 allow 規則 | 可全部 default-deny |
| 公網 IP / NAT 設定 | 通常需要 | 不需要 |
注意最後兩列的實務價值。因為只需要放行出站(通常是 443,多數環境本來就開著),服務端可以把入站防火牆設成全部拒絕;也因為連線是從內往外建立的,它天然穿透 NAT 與 CGNAT——這就是為什麼服務可以部署在完全沒有公網 IP 的私有網段裡,卻仍然能被授權的人存取:它從來不需要「被連入」。
值得說清楚的是這招防的是什麼、不防的是什麼。它移除的是被任意掃描與探測的可能性,也就是攻擊鏈最前面那一段;它不會讓應用程式本身的漏洞消失。已被授權的身分打進來時,你的 SQL injection 還是 SQL injection。
七、流量怎麼走:成本導向路由與自動改道
合法流量進入資料平面之後,還有一個問題:走哪條路?
- 原本的最低成本路徑
- 故障鏈路
- 自動改道後的路徑
圖說文字版
網狀資料平面上的成本導向路由,以及一段鏈路故障後的自動改道。
拓撲
- 用戶端與服務之間由多個邊緣節點組成網狀網路,存在數條可行路徑。
- 每一段鏈路都標有成本值。
正常狀態
- 流量走總成本最低的路徑,成本為 9 + 11 = 20。
鏈路故障後
- 其中一段鏈路失效,路由自動改走次低成本的替代路徑。
- 改道後的總成本為 12 + 14 = 26。
- 過程中沒有集中閘道需要切換,因此不存在單點故障。
重點
- 路徑是算出來的:量測到的延遲加上各段設定成本,永遠走總成本最低的那一條。
資料平面持續量測各段鏈路的延遲,路徑選擇是成本導向的:量測到的延遲、加上維運者為各段鏈路設定的成本、加上終端者本身的成本與優先序,取總和最低的路徑。概念上就是一張加權圖上的最短路徑問題,只是權重會隨著量測結果變動。
某段鏈路故障或壅塞時,路由自動改走替代路徑,對上層應用近乎無感。這和單一閘道的架構有結構性的差別——閘道式架構下,閘道掛掉就是全體斷線,而網狀資料平面沒有那個「全體」。
八、這套架構的限制
任何說「這個架構沒有取捨」的文件都不值得讀。以下幾點應該在評估階段就攤開來:
- 端點或服務側需要部署元件。 完全無法安裝任何東西、也無法用一台獨立主機在前面承接的環境,不適用。
- 控制平面的可用性是關鍵路徑。 授權決策依賴控制平面,所以它的高可用設計必須納入架構評估,不能當作附屬元件。
- 不取代應用層的權限控管。 這套機制決定「這個身分能不能連到這個服務」,服務內部的角色、資料列權限、稽核,仍然是應用程式自己的責任。
- 既有的網路監控會出現盲點。 端對端加密意味著中間節點看不到內容,原本依賴閘道側檢查流量的監控與 DLP 機制需要重新規劃——通常改成在端點側或應用側取得可見性。
- 政策的聯集語意容易誤用。 前面提過的 OR 聯集陷阱,在政策數量長起來之後是最常見的設定錯誤來源,值得建立審查機制。
名詞對照與延伸閱讀
| 名詞 | 一句話解釋 | 出處 |
|---|---|---|
| 零信任架構 | 不以網路位置作為信任依據的架構原則 | NIST SP 800-207 |
| TLS 1.3 | 目前的傳輸層加密標準 | RFC 8446 |
| 雙向 TLS(mTLS) | 連線兩端都出示憑證的 TLS 用法 | Mutual authentication |
| X.509 憑證 | 公鑰與其持有者身分的標準格式 | RFC 5280 |
| PKI | 憑證的簽發、驗證與撤銷體系 | Public key infrastructure |
| CSR | 只含公鑰的憑證簽署請求 | RFC 2986 |
| 憑證撤銷狀態查詢 | 確認一張憑證是否已被撤銷 | RFC 6960 |
| JWT | 帶簽章的權杖格式,常用於一次性註冊與登入 | RFC 7519 |
| OpenID Connect | 建立在 OAuth 2.0 上的身分驗證層 | OIDC Core |
| PKCE | 公開用戶端的授權碼防攔截機制 | RFC 7636 |
| AEAD | 同時保證機密性與完整性的加密模式 | RFC 5116 |
| ChaCha20-Poly1305 | 一種常見的 AEAD 演算法 | RFC 8439 |
| TOTP | 以時間為基礎的一次性密碼,MFA 常用 | RFC 6238 |
| TCP 連線建立 | 三向交握與 SYN/SYN-ACK 的定義 | RFC 9293 |
| 連接埠掃描 | 逐一探測哪些埠有回應的技術 | Port scanner |
| NAT / CGNAT | 位址轉換,以及電信級的共用位址空間 | RFC 3022 · RFC 6598 |
| 橫向移動 | 攻擊者在內網從一台主機擴散到下一台 | MITRE ATT&CK TA0008 |
| 最小權限原則 | 只給剛好夠用的權限 | Principle of least privilege |
| 控制平面 / 資料平面 | 做決定的部分與搬資料的部分分離 | Forwarding plane |
| 單點故障 | 單一元件失效導致整體失效 | Single point of failure |
| 語意化版本 | 版本號的比較規則,姿態檢查會用到 | Semantic Versioning |
這篇的圖示為說明用的簡化架構:成本導向路由的完整權重、姿態回報週期、控制平面的高可用拓撲等細節為了清楚起見已經略去,實際數值與行為以產品文件為準。如果你想針對特定環境討論導入方式,或需要更完整的技術規格,歡迎透過聯絡我們提出。