我正在尝试使用ViewerResponse事件上的Lambda @ Edge从Cloudfront响应中删除一些标头。源是一个S3存储桶。
我已经成功更改了标题,如下所示:
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
response.headers.server = [{'key': 'server', 'value': 'bunny'}];
callback(null, response);
};
但是,似乎无法一起删除标头,例如这样。
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
delete response.headers.server;
// or response.header.server = null;
// or response.headers.server = [{'key': 'server', 'value': null}];
callback(null, response);
};
此代码段不会删除,但会将服务器标头从server: AmazonS3
更改为server: CloudFront
。因此,我假设服务器标头可能是强制性的,并且会自动填充。但是我也无法删除CloudFront生成的其他标头。在lambda测试窗格中,该功能按预期工作。因此,Lambda函数完成后会发生某些事情。
作为背景,我想更改标题,因为该站点在重要客户端网络中被阻止,并提示它是一个在线存储或备份位置。
我想念什么?
答案 0 :(得分:0)
不幸的是,根据AWS的支持,CloudFront当前不支持此功能。
不可能完全删除服务器标头,我们可以将其设置为“无”,或者即使我们尝试完全删除服务器标头字段,CloudFront也会在查看器响应中添加“ Server:CloudFront”。
由于您提到了政府机构,所以您可能想问一下他们正在遵循什么政策。其中大多数可能基于CIS benchmarks用于Apache之类的事物,这些事物通常具有如下“信息泄漏”目标:
信息就是力量,并且由于安全漏洞非常依赖于特定的软件版本和配置,因此识别Web服务器详细信息可大大提高任何攻击的效率。过多的探测和请求可能会导致生成过多的“噪音”,并可能使管理员失望。如果攻击者可以准确地将其攻击作为目标,那么在检测到攻击之前成功进行折衷的机会会大大增加。 Script Kiddies不断扫描Internet并记录Web服务器公开提供的版本信息。进行此扫描的目的是为了积累在这些主机上安装的软件的数据库,然后在发布新漏洞时可以使用该数据库。
我所看到的推荐建议通常是允许除去 generic Server
标头的东西。例如,Apache指南允许Server: Apache
:
配置Apache ServerTokens指令以提供最少的信息。通过将值设置为Prod或ProductOnly。服务器HTTP响应标头中给出的唯一版本信息将是Apache,而不是安装的模块和版本的详细信息。
如果您删除了代码中的Server
标头,则CloudFront添加自己的标头不会泄漏有关后端服务器的信息,也不会为攻击者提供新的信息,因为他们已经知道他们正在连接到CloudFront IP地址。