用 Cloudflare Access 保護你的自架服務,不只是帳密那麼簡單
你的服務架好了、域名也設定好了,結果只靠一組帳號密碼擋在前面?這篇來聊聊我怎麼用 Cloudflare Access 替服務加上一層更紮實的保護。
緣起:公司要導入 ArgoCD,我卻開始糾結安全問題
最近公司在討論要把 CD 流程移到 ArgoCD 上,身為一個習慣「先在自己身上試刀」的工程師,我當然想先在自己的服務上玩玩看,熟悉一下整個流程再說。
ArgoCD 裝起來其實不難,但裝完之後我就開始卡在一件事上:這個 UI 要怎麼讓外面的世界存取?
ArgoCD 預設有自己的登入介面,帳號密碼保護。但說真的,這樣就夠了嗎?讓一個管理介面直接暴露在公開網路上,然後靠帳號密碼擋住所有人?光想就覺得有點不安。
我希望做到的是:就算有人知道這個網址,沒有通過第一關驗證根本進不來,帳號密碼甚至都沒機會讓你輸。
搜了一下之後,發現 Cloudflare Access 剛好就是在做這件事。
Cloudflare Access 是什麼?
簡單說,Cloudflare Access 是 Cloudflare Zero Trust 產品線裡的一塊,它讓你可以在應用程式前面加一層「訪問控制」。
概念上有點像公司內網的 VPN,但不需要真的連 VPN,使用者只要通過 Cloudflare 這邊的身份驗證,才能進到你的應用程式。整個流程大概像這樣:
1 | 使用者 → Cloudflare Access(身份驗證)→ 你的應用程式 |
如果驗證沒過,根本不會碰到你的服務,連 HTTP request 都不會打到你的 server。
它能做到什麼?
支援各種 Identity Provider
可以接 Google、GitHub、Okta、Azure AD,甚至可以用 One-time PIN(OTP)讓使用者用 Email 收驗證碼進來,不需要額外的帳號。我自己用的是 Google 登入,設定最快、最簡單。
細緻的 Policy 控制
可以設定「只有這幾個 Email 可以進來」、「只有某個 Google 帳號的 domain 可以進來」、「特定 IP 才允許」等等。對於個人服務來說,通常就是設個 Email allowlist 就夠了。
完整的 Audit Log
每次有人嘗試存取都會留下紀錄,誰在什麼時間從哪裡進來,一目了然。要排查問題的時候很方便。
完全免費(在個人使用規模下)
Cloudflare Access 免費方案支援最多 50 個使用者,對自架服務來說完全夠用。
怎麼配置 Cloudflare Access
前提:你的服務已經透過 Cloudflare Tunnel 對外,或是域名的 DNS 已經在 Cloudflare 上管理。
Step 1:進入 Cloudflare Zero Trust Dashboard
登入 Cloudflare,在左側選單找到 Zero Trust,進去之後會需要設定一個 Team Name(就是你的組織名稱,之後會出現在登入頁面的 URL 上)。
Step 2:加入 Identity Provider
在 Zero Trust Dashboard → Settings → Authentication → Login methods,點 Add new。
我選的是 Google,照著畫面設定 OAuth Client ID 跟 Secret,這部分 Google Cloud Console 那邊要開一個 OAuth 2.0 的憑證,redirect URI 填 Cloudflare 給的那個 URL 就好。
設定完可以按 Test 確認能正常驗證。
Step 3:建立 Application
在 Access → Applications,點 Add an application,選 Self-hosted。
填入:
- Application name:隨便取,方便自己辨識
- Session Duration:登入後 session 維持多久,我設 24 hours
- Application domain:你的服務 domain,例如
argocd.yourdomain.com
Step 4:設定 Policy
這是重頭戲。在 Application 裡面加一個 Policy,決定誰可以進來。
名稱隨意,Action 選 Allow,然後在 Include 裡加入規則。最直觀的做法:
- Selector:Emails
- Value:填你自己的 Email
這樣就只有你自己能通過驗證。如果有多個人要用,就列出所有 Email,或是改用 Email domain 來設。
Step 5:確認 Tunnel 設定(如果你用的是 Cloudflare Tunnel)
如果你的服務本身是透過 Cloudflare Tunnel 對外的,Tunnel 這邊不需要額外改什麼,Access 會自動套用在對應 domain 上。
不過有一點要注意:如果你有用 ArgoCD 的 CLI 工具(argocd CLI),它走的是 gRPC,Cloudflare Access 對 gRPC 的支援需要額外調整。我目前自己用的是直接開 Web UI 操作,這個問題先放著。
設定完長什麼樣子?
設定好之後,當你打開 argocd.yourdomain.com,不會直接進到 ArgoCD 的登入頁,而是先被 Cloudflare 導去一個驗證頁面:
1 | 請選擇登入方式: |
驗證通過之後,才會帶你進到 ArgoCD 的介面。這意味著:
- 沒有通過 Google 驗證的人,根本看不到 ArgoCD
- 即使有人知道這個網址,沒有在你 allowlist 裡的 Google 帳號,進不來
- ArgoCD 本身的帳號密碼就算被爆破,也沒差(因為連登入頁都看不到)
小結
說實在的,Cloudflare Access 設定起來比我想像中簡單很多,而且免費方案已經很夠用了。對於個人或小團隊的自架服務來說,這是一個幾乎零成本就能大幅提升安全性的選擇。
以前每次把服務架好對外,總有一種「就這樣?感覺不太踏實」的感覺。加上 Cloudflare Access 之後,至少知道有個額外的關卡在守著,心裡安穩多了。
如果你也有在用 Cloudflare Tunnel 架服務,真的很推薦把 Access 一起設定進去,反正不花錢,設定一次就好。
下一篇打算聊聊 ArgoCD 實際操作的心得,包含怎麼串接 GitHub repo 做到 GitOps 的流程。