我正在构建一个基于 OpenVPN 的系统,客户端将连接到一个由基本身份验证保护的网站(就是这样,无法改变)。
我希望我可以通过 nginx 代理在访问网站之前为我添加正确的基本身份验证标头。这样,根据客户端使用的 IP 地址(来自 OpenVPN 配置),我将在数据库中检索其用户/密码并相应地伪造标头。因此用户不必输入任何登录名/密码。
注入基本身份验证标头很容易:
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://6.6.6.6:80;
proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";
}
其中“a2luZzppc25ha2Vk”当然是此登录名:密码的 base64。
因此现在我需要根据 $remote_addr 将 a2luZzppc25ha2Vk 替换为 DB 中找到的值
答案1
您可以通过以下方式将数据库转储到配置中:
geo $auth_base64 {
<remote_addr1>/32 <base64_1>;
<remote_addr2>/32 <base64_2>;
<remote_addrN>/32 <base64_N>;
default <base64_for_default_address>
}
当然没有“<>”。
然后将此配置包含到 http {} 部分。您可以创建简单的 cronjob(转储、测试、重新加载)。
因此,变量 $auth_base64 可以在 proxy_set_header 指令中使用:
proxy_set_header Authorization "Basic $auth_base64";
或者您可以使用第三方模块: http://www.grid.net.ru/nginx/eval.en.html 可以将后端响应评估为变量。本人未测试。现代 nginx 版本可能会出现一些问题。