千万不要想着折腾 Cloudflare Browser Rendered Terminal

最近不知怎么突发奇想又看回了赛博菩萨 cloudflare,看到使用 Cloudflare Tunnel 的时候有一个 Browser Rendered Terminal,就想着给自己的服务器装一下,结果非常失望,is a total waste of time。

Cloudflare 的 Zero Trust 产品有两个非常给力的工具,Cloudflare tunnel 和 Cloudflare access。

Cloudflare Tunnel

Tunnel 可以用来给你的服务器打洞,比如你有一个内网服务,运行在本地的某个端口(例如 http://localhost:8080),通过 Cloudflare Tunnel,你可以轻松地将这个服务暴露到公网,好处是 Cloudflare 帮你做了安全相关的事情,同时如果没有公网 IP,也可以访问。

Cloudflare Tunnel 的工作原理是通过 cloudflared 工具建立一条加密的隧道,将你的本地服务流量转发到 Cloudflare 的全球网络。你可以给这个服务绑定一个域名,外部用户通过访问这个域名即可访问你的服务,而无需直接连接到你的服务器。

Cloudflare Access

当你把内网服务使用 Tunnel 暴露给外网后,所有人都可以访问了,如果我们只希望特定的人可以使用我们的服务,通常需要实现一套登录功能,这不仅麻烦,而且自己实现的可能安全度不高。

Cloudflare Access 可以帮助你轻松实现基于身份验证的访问控制,而无需自己开发复杂的登录功能,它可以限制只有特定用户或用户组才能访问你的内网服务,从而大大提升安全性。同时,Cloudflare Access 支持与常见的身份提供商(如 Google Workspace、Azure AD、Okta、GitHub 等)集成,用户在访问你的服务时需要通过这些身份提供商验证身份,免去了自己管理密码。

当用户尝试访问你的服务时,Cloudflare Access 会拦截请求,并将用户引导到身份验证页面。用户通过身份验证后,Cloudflare Access 会根据你配置的访问策略决定是否允许访问。如果通过验证,用户的请求会被转发到你的服务;否则,访问会被拒绝。

Cloudflare Access 中提供的 Browser Rendered Terminal 功能

Connect to SSH in the browser · Cloudflare Zero Trust docs

Access 还提供了一个叫做 Browser Rendered Terminal 功能,根据文档介绍,它可以在浏览器中渲染一个 Terminal 用来通过 SSH 的方式访问你的服务器。

那自然想到一个非常棒的用法,就是把自己的服务器使用 tunnel 连接,设置 Access 以及 Browser Rendered Terminal,实现的效果就是我们可以使用 Access 的统一登录方式,管理我们所有的服务器了,再也不用记住所有的服务器密码了。(什么,你说为什么不设置 SSH 证书登录?我平时用很多终端设备,实在是懒得配置一遍)

同时因为有 Access 拦截,安全性也比单纯的密码大大提高了!

坑

但配下来才发现这个 Browser Rendered Terminal 就像是一个半成品,并不能很好的使用:

Tunnel 与 Access 的域名配置让人迷惑

这里就不得不吐槽以下 Cloudfare 产品的界面交互了,配置 Tunnel 的时候,我们需要绑定域名,这里很容易理解,这个域名会解析到你对应的服务上。

image.png

但当我们接下来设置 Access 的时候,神奇的是有需要输域名。其实也可以理解,毕竟 Access 也不是必须配合 Tunnel 来使用,但是两边输入的时候都会提示你会帮你设置 DNS,很让人担心是不是给我之前 Tunnel 覆盖掉。

image.png

Tunnel 与 Access 的配置有 Bug

先设置 Tunnel 的域名,再设置 Access 的域名,两个域名一样,会发现访问域名返回的是一个空白页面。

鼓捣了半天,把 access 的域名改成别的再改回来,就好了。

过了 Access 还是需要输入密码

image.png

Tunnel 只是帮你在服务器本地调用了 ssh localhost:22 这样的话,你其实还是需要输入账号和密码,到这里就蛋疼了,这不是脱了裤子放屁么。

目前的解决方式是禁止了 root 的登陆,然后设置了一个平时使用的用户,限制该用户只能通过本地 ssh 来登陆,这样的话这个用户可以设置一个非常简单的密码,输入一下成本也不高了。

远程登陆不能直接 ssh,而是需要经过 Access,让 Access 来保障安全。

说一下如何设置某个账户只能本地登陆。

  1. 启用 pam_access:
    编辑 /etc/pam.d/sshd 文件,确保包含以下行(如果没有,则添加):

    text
    1
    account required pam_access.so
  2. 配置访问规则:
    编辑 /etc/security/access.conf 文件,添加以下规则:

    text
    1
    2
    3
    +:work:127.0.0.1
    +:work:::1
    -:work:ALL

    这里尝试过使用 +:work:LOCAL ,发现不行,还是会被屏蔽,所以改为了 127.0.0.1。

  3. 重启 SSH 服务:

    1
    sudo systemctl restart sshd

都设置完以后效果还不错,浏览器 terminal 做的字体什么的都挺好看。