如果你在公网上部署了一个(Docker)服务,但由于该服务本身缺乏身份验证机制,直接将这类服务暴露在公网上存在严重的安全风险。这时候你可以使用 Cloudflare Worker 为任何 HTTP 服务轻松添加 Basic Auth 鉴权保护。

Basic Auth 是 HTTP 协议中最简单的身份验证方式,它要求用户在访问受保护资源时提供用户名和密码凭证。虽然不应将其用于高度敏感的数据(因为它仅使用 Base64 编码,而非加密),但对于保护非关键性服务和防止随机扫描非常有效。

适用场景

  • 保护暂未提供身份验证的内部工具(如个人正使用的 yt-dlp-webui,firebrowser, firefox等)
  • 限制对开发/测试环境的访问
  • 为静态网站添加简单访问控制
  • 在服务原生认证系统之上添加额外安全层

实现步骤

1. 前提准备

首先确保你拥有:

  • 一个 Cloudflare 账户
  • 已部署的服务(通过穿透或公网 IP 访问)的url,其域名已通过Cloudflare托管

2. 创建 Cloudflare Worker

登录 Cloudflare 控制台,进入 "Workers" 部分,创建一个新 worker。

3. 编写鉴权代码

将以下代码复制到 Worker 编辑器中:

export default {
  async fetch(request, env) {
    // 从环境变量获取用户名和密码
    const USER = env.USERNAME;
    const PASS = env.PASSWORD;

    // 如果环境变量未配置,直接返回错误
    if (!USER || !PASS) {
      return new Response("Server misconfiguration: missing credentials.", {
        status: 500,
        headers: {
          "Content-Type": "text/plain; charset=utf-8",
        },
      });
    }

    // 获取 Authorization 头
    const auth = request.headers.get("Authorization");
  
    // 如果没有认证信息,要求客户端提供凭证
    if (!auth || !auth.startsWith("Basic ")) {
      return new Response("Authentication required.", {
        status: 401,
        headers: {
          "WWW-Authenticate": 'Basic realm="Secure Area"',
          "Content-Type": "text/plain; charset=utf-8",
        },
      });
    }

    try {
      // 解码凭证
      const [, b64] = auth.split(" ");
      const [user, pass] = atob(b64).split(":");

      // 校验凭证
      if (user === USER && pass === PASS) {
        // 移除 Authorization 头,避免转发到后端服务
        const newHeaders = new Headers(request.headers);
        newHeaders.delete("Authorization");
      
        // 创建新的请求对象(保留原请求的所有属性)
        const newRequest = new Request(request, {
          headers: newHeaders
        });
      
        // 凭证正确,转发请求到源服务器
        return fetch(newRequest);
      }
    } catch (e) {
      console.error("Authentication error:", e);
    }

    // 凭证无效,拒绝访问
    return new Response("Invalid credentials.", {
      status: 403,
      headers: {
        "WWW-Authenticate": 'Basic realm="Secure Area"',
        "Content-Type": "text/plain; charset=utf-8",
      },
    });
  },
};

4. 配置环境变量

在 Worker 的「设置」中,添加以下环境变量:

  • USERNAME: 你设定的用户名
  • PASSWORD: 你设定的强密码

如果你想让安全性更强,可以设置变量为“秘密”,但是这样你将看不到具体的值。如果你忘记了凭证信息,只能重新部署worker。

点击部署,你已经可以通过访问cloudflare提供的worker.dev 域名网站查看效果了。如果输入错了凭证信息或者未输入,则不会显示目标url的服务,而是显示401 Unauthorized.

5. 配置路由

进入cloudflare上的你的域名板块,在侧边栏找到worker路由,将特定的路径关联上该worker。

进阶玩法

你还可以通过cloudflare worker自带的ip检测工具来封锁或自定义特定地区的相应内容。可以很好的为你的服务器设立保护层。

缺点

  • http baisc auth不支持多账户管理。您可能需要更改worker的逻辑(例如在代码中写死指定凭证,不过安全性有待考量)或修改环境变量的格式。
  • http baisc auth无法方便地实现登出,如果一定要实现该功能,可以采取更改realm的方法来强制浏览器重新弹出登录框,但并不保证所有浏览器都能实现。

标签:无

你的评论