嗯...今天要來聊一個我自己覺得蠻實用,但可能有點冷門的東西:Cloudflare Access。
你有沒有遇過一種情況?就是你弄了一個服務,可能是一個還在開發中的網站、一個給家人朋友用的私人相簿,或是一個小小的內部儀表板... 你想讓它上線,方便從任何地方連線,但又超級不希望路人甲乙丙丁都能隨便看到。🤔
以前可能就要搞什麼 IP 白名單、或是用 .htaccess 設個很醜的密碼輸入框,超麻煩。老實說,現在有更優雅的作法了,而且...還是免費的。
重點一句話
簡單講,就是用 Cloudflare 的免費功能,幫你任何一個子網域(subdomain)加上一個需要帳號密碼登入的保護頁,只有你允許的人才能進去看裡面的內容。
這整個東西背後的概念,Cloudflare 叫它「零信任」(Zero Trust)。聽起來很厲害,但說穿了就是「我誰都不信,每次都要檢查」。想像一下,以前用 VPN 像是有大門鑰匙,進去之後整棟樓隨便你逛。零信任就是,就算你進了大門,要去 A 房間要刷一次卡,去 B 房間又要再刷一次。它會在每個服務的門口都派一個警衛,檢查你的身份。說真的,現在網路攻擊這麼多,這種想法才是對的。
怎麼選:Cloudflare Tunnel 還是直接 DNS 設定?
在開始動手前,有個觀念要先釐清。要用 Cloudflare 保護你的服務,主要有兩種方式。很多人會搞混,我自己一開始也看很久... Orz。
一種是裝一個叫 `cloudflared` 的小程式(也叫 Cloudflare Tunnel)在你的伺服器上。另一種是我們今天要做的,完全不用在伺服器上裝任何東西,只要在 Cloudflare 的 DNS 後台設定就好。
這兩種差在哪?我弄了個簡單的比較表,讓你比較好懂。
| 比較項目 | 方法一:Cloudflare Tunnel (裝代理程式) | 方法二:DNS-Only (只改設定) |
|---|---|---|
| 設定複雜度 | 要進主機下指令,對新手來說有一點點門檻。 | 無腦,全部在網頁上點一點就好,超簡單。 |
| 安全性 | 更高。你的主機甚至可以完全不對外開放任何 port,它會自己建立一條通往 Cloudflare 的加密通道。 | 也算安全。雖然主機還是要開著 port,但所有流量都先經過 Cloudflare 過濾跟驗證。 |
| 適用情境 | 超適合藏在公司或家裡內網的服務,那種根本沒有對外 IP 的機器。 | 最適合已經在 VPS 或雲端主機上跑的服務,反正它本來就有對外 IP。 |
| 我的碎碎念 | 說真的,這個比較強大,但殺雞焉用牛刀?除非你真的要藏內網服務,不然有點大材小用。 | 今天的主角。對 90% 的個人專案或小型應用來說,這個就夠用了,又快又方便。 |
好,今天我們就專心講第二種,最簡單的那個。
步驟與要點
開始前,先確定你已經有這幾樣東西了:
- 一個你自己的網域 (domain)。
- 這個網域已經加到 Cloudflare 裡面管理了。(這也是免費的,還能防 DDoS,沒理由不用吧)
- 你想保護的那個子網域,例如 `secret.example.com`,已經在 Cloudflare 的 DNS 裡設定好了。
什麼?你還沒設好 DNS?好吧,那我順便講一下...
第一步:確認 DNS 設定(如果還沒做的話)
假設你想保護的子網域是 `my.example.com`。
- 登入你的 Cloudflare 帳號。
- 去到你網域的 DNS 設定頁面。
- 新增一筆紀錄:
- 類型 (Type): `CNAME` (或 `A` 紀錄也可以,看你主機情況)
- 名稱 (Name): `my` (Cloudflare 會自動幫你補上 `.example.com`)
- 目標 (Target): 指向你那台伺服器的 IP 位址或另一個主機名稱。
- 代理狀態 (Proxy status): 這個最重要!一定要是橘色的雲 (Proxied)。這代表所有流量都會經過 Cloudflare。如果是灰色的,那就沒用了。
對,就像這樣。搞定這個才能繼續下一步。
第二步:在 Zero Trust 新增一個「應用程式」
DNS 好了之後,我們就要去 Cloudflare 的另一個地方設定了。它現在叫做「Zero Trust」儀表板,你從主選單的左邊就能找到。
- 進去之後,點左邊的 `Access` -> `Applications`。
- 勇敢地按下那個藍色的 `Add an application` 按鈕。
- 接著,它會問你是哪種類型,我們選 `Self-hosted`。嗯,就是「我自己架的服務」的意思。
- 再來要填一些基本資料:
- Application name: 隨便取個你好記的名字,例如「我的秘密基地」。
- Subdomain: 這裡就要填寫你剛剛設定的那個子網域,例如 `my`。
- Domain: 選擇你的主網域,例如 `example.com`。
- ...它下面還有個 `Path` 的選項,這蠻好用的。如果你不是要保護整個子網域,只是要保護 `my.example.com/admin/` 這個路徑底下的東西,就可以在這裡設定。很彈性。
- 外觀什麼的可以先跳過,直接按 `Next`。
第三步:設定「誰」可以登入
這一步是核心中的核心。你要告訴 Cloudflare,怎樣的身份才算是「合法」的。這東西他們叫「Identity providers」(身份提供者)。
你會看到很多選項,像是 Google Workspace、Azure AD、GitHub...等等。原文的作者是用 Google Workspace,這在公司環境下非常合理,直接用公司帳號登入。這點在台灣很多用 Google Workspace 的新創或中小企業也很適用。
不過呢,我自己是覺得,如果你只是個人用戶,或是小貓兩三人的小團隊,根本不用搞這麼複雜。你可以直接用它預設的 `One-time PIN`(一次性密碼)。
它的運作方式是:當有人要登入時,在頁面上輸入他的 Email,Cloudflare 就會寄一封信給他,裡面有一組 6 位數的密碼,回來頁面輸入密碼就能登入。是不是超簡單?雖然安全性沒辦法跟綁定 Google 帳號比,但對於保護一些非金錢、非機密的服務,老實說,很夠用了。
好,在 `Configure an application` 這個頁面,你就可以幫你的應用程式設定規則了。
- Policy name: 再取個好懂的名字,像是「只允許我自己」。
- Action: 選擇 `Allow`(允許)。
- Session Duration: 就是登入一次可以維持多久,預設 24 小時我覺得差不多。
- 最重要的來了,底下的 `Configure rules`:
- 這裡就是設定「條件」的地方。
- 你可以新增一個 `Include` 規則。
- 從 `Selector` 下拉選單中,選擇 `Emails`。
- 在右邊的 `Value` 欄位,輸入你允許登入的 Email 地址,例如 `my.email@gmail.com`。可以輸入多個。
- 你看,這樣就設定好了「只有這個 Email 可以透過一次性密碼的方式登入」。
當然,Cloudflare Access 的規則系統比這強大太多了。你可以參考他們的官方文件,裡面有教你怎麼設定更複雜的規則,例如「必須是 A 群組的成員、而且要從台灣的 IP 連線、而且不能用手機」。這些規則可以組合,真的非常強大。但我們今天先求有,再求好。
對了,順便分享一下,如果你真的想接 Google Workspace 或 GitHub 登入,你要先去左邊選單的 `Settings` -> `Authentication` 裡面,新增一個 Identity Provider,照著它的步驟跟 Google/GitHub 那邊的後台設定串接起來。Cloudflare 的文件寫得蠻清楚的,一步一步跟著做通常不會錯。設定好了之後,再回到剛剛應用程式的規則設定頁面,`Selector` 裡面就會多出 `Login method` 讓你選了。
第四步:測試!
全部設定完,按下儲存。等個大概... 30 秒到 1 分鐘讓設定全球生效。然後,打開你的瀏覽器,輸入你保護的那個子網域 `https://my.example.com`。
如果一切順利,你就不會直接看到你的服務內容了。你會被導到一個 Cloudflare 的登入頁面,上面寫著要你輸入 Email 來接收登入碼。
輸入你剛剛在後台允許的那個 Email,去收信,把收到的 PIN 碼填回去... 鏘鏘!你就被導回你原本的服務頁面了。🎉
小結... 嗎?
其實也沒什麼好總結的。我自己弄完這個之後,覺得真的蠻酷的。以前要實現類似的效果,都要自己寫程式、管 session、或是去弄很複雜的伺服器設定。現在只要在 Cloudflare 後台點一點滑鼠,就能幫任何一個 HTTP 服務加上企業等級的驗證大門。
重點是,這個核心功能,個人免費方案就玩得到。這讓很多個人開發者或小團隊,可以用幾乎零成本的方式,大幅提高一些內部工具或測試網站的安全性。我覺得這點 Cloudflare 真的很大方。
所以,如果你也有那種「想上線又不想給人看」的尷尬服務,不妨花個十分鐘試試看吧。應該是不會讓你失望的。
那你呢?你有用過 Cloudflare Access 嗎?或是有什麼其他保護私有服務的好方法?在下面留言分享你的經驗吧!
