通过添加头部验证(Header Validation)来保护源站,可以确保只有来自可信来源的请求才能访问源站,从而有效地防御各种攻击,并防止源站 IP 泄露。 以下是如何使用头部验证来保护源站的详细说明:
1. 头部验证的原理
头部验证的核心思想是,在合法的请求中添加自定义的 HTTP Header,并在源站服务器上验证这些 Header 的存在和值。只有当请求中包含正确的 Header 及其对应的值时,源站才会处理该请求。 这可以防止攻击者绕过 CDN 或其他安全措施直接访问源站。
2. 如何实现头部验证
* 在 CDN 或边缘服务器上设置自定义 Header:
* 在 CDN 或边缘服务器的配置中,设置一个或多个自定义的 HTTP Header,例如 X-CDN-Auth
,并为其指定一个复杂且难以猜测的值,例如 abcdefg1234567
。
* 确保 CDN 或边缘服务器在每次向源站发起请求时,都会自动添加这些 Header。
* 在源站服务器上配置验证规则:
* 修改源站服务器的配置(例如,使用 Nginx、Apache 或其他 Web 服务器),使其能够检查请求中是否存在指定的 Header,以及 Header 的值是否正确。
* 如果请求中缺少 Header 或 Header 的值不正确,服务器应拒绝该请求,返回一个错误代码(例如 403 Forbidden)。
3. 源站实施步骤
1. 选择 Header 名称和值: 选择一个不容易被猜测的 Header 名称,例如 X-My-Secret-Header
,并为其生成一个复杂且随机的值。
2. 配置 CDN 或边缘服务器: 在 CDN 或边缘服务器的配置中,添加上一步骤中选择的 Header 和值。具体的配置方法取决于您使用的 CDN 或边缘服务器。
* 示例 (Cloudflare): 在 Cloudflare 的 Page Rules 中,您可以设置将特定的 Header 添加到发往源站的请求中。
* 示例 (Akamai): 在 Akamai 的配置中,您可以创建一个自定义规则,将 Header 添加到发往源站的请求中。
3. 配置源站服务器: 配置您的源站服务器,使其能够验证请求中的 Header。以下是一些常见的服务器配置示例:
Nginx配置:
server {
listen 80;
server_name your_domain.com;
location / {
if ($http_x_my_secret_header != "your_secret_value") {
return 403;
}
proxy_pass http://your_origin_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Apache配置:
<VirtualHost *:80>
ServerName your_domain.com
<Location />
Require expr "%{HTTP_X_MY_SECRET_HEADER} == 'your_secret_value'"
ProxyPass http://your_origin_server
ProxyPassReverse http://your_origin_server
</Location>
</VirtualHost>
Node.js (Express)配置:
const express = require('express');
const app = express();
app.use((req, res, next) => {
if (req.headers['x-my-secret-header'] !== 'your_secret_value') {
return res.status(403).send('Forbidden');
}
next();
});
app.get('/', (req, res) => {
res.send('Hello from Origin Server!');
});
app.listen(3000, () => {
console.log('Origin server listening on port 3000');
});
雷池WAF配置:
4.CDN配置
阿里云ESA添加头部配置
自定义域名可选择等于或包含,请求头名称及请求头值与上方源站配置一致
5. 测试配置:
* 通过 CDN 或边缘服务器访问您的网站或应用程序,确保可以正常访问。
* 尝试绕过 CDN 直接访问您的源站,确保收到 403 Forbidden 错误。
6. 注意事项
* Header 值保密: 确保 Header 的值足够复杂,并且只有授权的人员知道。
* HTTPS: 始终使用 HTTPS 加密传输,以防止 Header 信息被窃听。
* 错误处理: 在源站服务器上配置适当的错误处理,以便在验证失败时返回有用的错误信息。
* 性能影响: 头部验证对性能的影响很小,但建议进行测试以确保不会影响用户体验。
通过以上步骤,您可以有效地使用头部验证来保护您的源站 IP,防止未经授权的访问和潜在的网络攻击。