之前折腾 Cloudflare 阴差阳错摸出来这么个功能,回来翻论坛发现两年前 Cyorage 大佬写的利用Cloudflare Zero Trust中的Access来对自己的站点或某个页面加上身份认证和一些最近的教程里展示的是不太方便的邮件验证码认证,另外最近哪吒的事似乎也导致很多人有需求,所以在这稍微补充一下。
总体来说就是,对于托管到 Cloudflare 的网站(点亮黄云),Cloudflare Access/Zero Trust 可以加上两步的访问限制:
- 一是用户认证,用户必须通过指定的渠道进行登录认证(如 Cloudflare、Google、GitHub 等);
- 二是策略限制,在获取了用户身份信息之后对指定用户禁止访问或给予放行。
这比起直接用大多后端服务自己提供的认证肯定会更安全一些(同时也可以防一些简单粗暴的 DDOS),比起异地组网也省了在所有设备上一一配置的麻烦。Cloudflare Access 默认的邮件验证码不太方便,但是稍加配置之后(如下文的 Cloudflare 认证方式)一般自动跳转两次之后就可以自动过认证了。(例如我现在把 qBittorrent WebUI 设置了免登录,配合 Cloudflare tunnel 只用 Cloudflare 认证,非常丝滑。)
(截完图后知后觉发现 Cloudflare 原来有中文啊,文中会附上按钮翻译,就不重新截图了……)
认证方式添加
下面是正式的步骤。首先去配置我们想用的用户认证方法,可以从左侧菜单里点 Zero Trust,再在 集成/Integrations 里找到 标识提供程序/Identity providers,也可以直接 Ctrl+K 快捷键搜索 id,点 标识提供程序 或 Integrations > Identity providers 直接跳转。


出来的界面大概长这样:

默认的话应该只有一个 One-time PIN,也即给你邮箱发验证码的方式,个人感觉不太方便,所以这里点右边的大蓝按钮“添加标识提供程序/Add an identity provider”添加其它的认证方式。我们这里主要介绍里面 Cloudflare、GitHub 和 Google 三种。

添加起来最方便的当然是 Cloudflare 自家的认证,如果只有自己访问的话选这个就够了。

点进去之后有个“限制为帐户成员/Restrict to account members”的选项,不打开就是允许所有有 Cloudflare 账号的人认证,打开就是只有当前账号(及其成员)能用。个人用的话把它打开,Save 保存即可。
GitHub 和 Google 的复杂点,需要自己申请 App ID 用来认证,可能对于一些半私密、有时会分享出来的页面更有用些。
GitHub 的 App 需要登录后在 Developer Settings 里选 OAuth Apps进行申请。

应用名称 Application name 随便填(登录时会显示出来,也别太随便),下面的 Homepage URL 和 Authorization callback URL 分别填 https://XXX.cloudflareaccess.com 和 https://XXX.cloudflareaccess.com/cdn-cgi/access/callback。

其中 XXX 是你开通 Zero Trust 时候填的名称,可以在 Zero Trust 首页(Zero Trust 里的 Overview)里看到:

其它不用管,点 Register application 注册。注册完后 (1) 复制 Client ID,(2) 点“Generate a new client secret”生成密钥,把密钥复制保存好。然后回到 Cloudflare 里把 GitHub 认证给添加上,把 Client ID 填到 应用 ID/App ID 里,把密钥填到 客户端密码/Client secret 里。保存之后会弹出来 Finish setup 来让你认证,这一步应该是通过 GitHub 获取 GitHub 成员名单来用于认证,但个人用户似乎不 Finish setup 也可以。做完之后点 完成/Finish 即可。
Google 稍微更复杂一点,截图有点费劲了……
幸好 Cloudflare 有官方文档。总之:
-
你需要有一个 GCP 账号
-
和 GitHub 的一样,这里也需要 Zero Trust 的 URL,需要到 Zero Trust 的 Overview 里记下来:

-
接下来就跟着 Cloudflare 官方文档里的粗体字一路操作就可以了
一套操作下来结果如图:

但是,自己用的话真的一个 Cloudflare 的认证就够了。
给页面添加限制
弄完要用的认证方式之后就可以给页面添加上了。基本流程和两年前也差不多(虽然 Cloudflare UI 有点改版):
-
Zero Trust 里从 访问控制/Access Controls 里进到 应用程序/Applications,点“新建应用程序/Create new application”创建页面配置

-
弹出的对话框里选“自托管和私有/Self-hosted and private”以及“公共 DNS/Public DNS”,然后 继续/Continue

-
新建页面最上头的 目标/Destinations 设置的是需要添加限制的页面:

把页面的域名和路径 Path 填上。不填路径的话就是整个域名限制。
-
下面的 Access 策略设置的是认证完成后的准入条件。点击“创建新策略/Create new policy”开始设置,其实理论上可以通过它提供的与或非设置非常复杂的条件……但我们一般不需要那么多。

如果你只用了 Cloudflare 认证而且只允许了自己认证(*),那么你甚至可以在 Access policies 里面填 Everyone(所有人)——因为认证一步已经把除你之外的人给过滤掉了。
* 指上文说过的这个选项:

当然,保险起见还是推荐策略规则里选择 电子邮件/Emails 然后把账号的邮件填上,防止之后调整配置时一不小心真的把所有人都放行了

两年前的教程里提到了这里填的邮件需要小写,但我试了几个账号似乎大写也行?也许是 Cloudflare 修了。
满意之后往下找到“保存策略/Save policy”按钮提交。
-
下面还有个 身份验证/Authentication 可以设置网页使用的认证方式:

如果你像我一样把 Cloudflare、GitHub、Google 认证全给加上了的话,就可以在这里选择;例如监测页面用 Cloudflare 只给自己账号认证,云盘页面给 Google 认证方便共享给其他人之类的。
如果只选择了一样认证方式的话可以开“应用即时身份验证/Apply instant authentication”,直接跳转认证页面。省一次单击和页面跳转,整体体验(要配合密码管理器)更丝滑一些,推荐开。
-
另外其实还有杂七杂八一些设置可以改。例如最下面的“会话持续时间/Session Duration”可以调多久要重新认证一次,例如有个选项貌似可以把整个网站变成 Web SSH……总之大家感兴趣的可以一试。
另外,顺便说一下什么网站不太适合用这个保护吧。我原来是想把自己的 Nextcloud 和 Vaultwarden 的整个域名都给加上认证登录,但这同时也会限制 API 端点,导致客户端(如 Nextcloud 的 WebDAV、Vaultwarden 的手机端和插件)出错。
所以这种有专门客户端的网站一般没办法整个域名认证保护,最多只能在部分路径设限,除非它的客户端专门做了 Cloudflare 支持。
设置完成后就可以到对应页面去测试效果啦:

如果你开了多种认证方式的话一般就会出现上图的选择界面。而如果你开了“应用即时身份验证/Apply instant authentication”就会直接跳转到授权界面。只需授权一次,之后的登录/重新登录一般就都会自动跳转了,非常丝滑。

所以这种有专门客户端的网站一般没办法整个域名认证保护,最多只能在部分路径设限,除非它的客户端专门做了 Cloudflare 支持。
我让codex撸了一个两步验证,问题不大
开放api路径
长知识啦
不错不错,这样安全不少
已经吃上了