使用Cloudflare Worker为外网服务启用Basic Auth鉴权防护

如果你在公网上部署了一个(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 编辑器中:

```javascript 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的方法来强制浏览器重新弹出登录框,但并不保证所有浏览器都能实现。