使用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 编辑器中:
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的方法来强制浏览器重新弹出登录框,但并不保证所有浏览器都能实现。
- 本文标题:使用Cloudflare Worker为外网服务启用Basic Auth鉴权防护
- 本文作者:uygnil
- 本文链接:https://blog.zhoulingyu.net/index.php/archives/20/
- 版权声明:本文采用 CC BY 4.0 协议进行许可
标签:无