如何在 AWS 负载均衡器响应中禁用 Apache HTTP 标头信息?
Posted
技术标签:
【中文标题】如何在 AWS 负载均衡器响应中禁用 Apache HTTP 标头信息?【英文标题】:How to disable Apache HTTP Header info in AWS Load Balancer Response? 【发布时间】:2019-04-16 15:52:03 【问题描述】:我在 Apache 服务器上使用 AWS Elastic Beanstalk 部署了一个 node.js 环境。我在环境中运行了 PCI 扫描,但出现 2 次失败:
Apache ServerTokens 信息披露 Web 服务器 HTTP 标头信息披露当然,我认为我需要使用以下内容更新 httpd.conf 文件:
ServerSignature Off
ServerTokens Prod
但是,鉴于 Elastic Beanstalk 和 Elastic Load Balancer 的性质,一旦环境扩展、添加新服务器、重启等,实例配置就会被覆盖。
我还尝试将以下内容放入 .htaccess 文件中:
RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto =http
RewriteRule .* https://%HTTP:Host%REQUEST_URI [L,R=permanent]
# Security hardening for PCI
Options -Indexes
ServerSignature Off
# Dissallow iFrame usage outside of loylap.com for PCI Security Scan
Header set X-Frame-Options SAMEORIGIN
在 node js 端,我使用“helmet”包来应用一些安全措施,我还使用“express-force-https”包来确保应用程序强制执行 https。但是,这些似乎只有在 Express 应用程序启动和重定向之后才会生效。
我为 HTTP(端口 80)和 HTTPS(端口 443)设置了 Elastic Load Balancer 侦听器,但是 HTTP 请求会立即路由到 HTTPS。
当我运行以下 curl 命令时:
curl -I https://myenvironment.com --head
我得到了可以接受的回复:
Server: Apache
但是,当我在 http 端点上运行相同的请求时(即在重定向之前等):
curl -I http://myenvironment.com --head
我收到一条回复,其中披露了有关我的服务器的更多信息,因此 PCI 失败:
Server: Apache/2.4.34 (Amazon)
如何强制我的环境限制 HTTP 和 HTTPS 上的 http 标头响应?
【问题讨论】:
【参考方案1】:感谢 @stdunbar 使用 ebextensions 引导我找到正确的解决方案。
解决方案对我有用,如下所示:
-
在项目根目录中创建一个名为
.ebextensions/01_server_hardening.config
的文件
将以下内容添加到文件中:
files:
"/etc/httpd/conf.d/03_server_hardening.conf":
mode: "000644"
owner: root
group: root
content: |
ServerSignature Off
ServerTokens Prod
container_commands:
01_reload_httpd:
command: "sudo service httpd reload"
(注意:此 YAML 文件中的缩进很重要 - 上面代码中的 2 个空格而不是制表符)。
在弹性 beanstalk 部署期间,这将在 /etc/httpd/conf.d 文件夹中创建一个新的 conf 文件,该文件夹默认设置为扩展 ELB 中的 httpd.conf 设置。
内容手动关闭ServerSignature并将ServerTokens设置为Prod,达到PCI标准。
运行容器命令会强制重启 httpd(对于这个特定版本的 Amazon linux - ubuntu 和其他版本需要它们自己的标准 reload
)。
将新命令部署到我的 EB 环境后,我的 curl 命令在 HTTP 和 HTTPS 上按预期运行。
【讨论】:
【参考方案2】:现在有一个更简单、更好的解决方案。
/etc/httpd/conf.d/elasticbeanstalk
文件夹在内置应用服务器重启时被删除(例如,当使用内置 Tomcat 的 EB 时)。由于 .ebextensions 没有重新运行上述解决方案停止工作。
仅当应用程序服务器重新启动时才会出现这种情况(例如通过 Lambda 或 Elastic Beanstalk Web 控制台)。如果 EC2 实例重新启动,这不是问题。
解决方案是将 .conf 文件放在 .ebextensions 的子文件夹中。
.ebextensions httpd conf.d name_of_your_choosing.conf文件的内容与上面的 .ebextensions 的输出相同,例如
ServerSignature Off
ServerTokens Prod
此解决方案将在应用服务器重新启动后继续存在,并且更易于创建和管理。
【讨论】:
来这个问题但使用nginx的人,如果配置文件创建在.platform/nginx/conf.d/your_config_file.conf
,该解决方案同样适用【参考方案3】:
您最终需要实现一些 ebextensions 才能将此更改应用于您的每个 Beanstalk 实例。这是一种机制,允许您创建一个或多个在 beanstalk 初始化期间运行的文件。我有一个旧的,我没有在你的确切情况下测试过,但它会像你展示的那样重写 HTTP->HTTPS。它用于 Tomcat Elastic Beanstalk 类型 - 不同的环境可能使用不同的配置。我的看起来像:
files:
"/tmp/00_application.conf":
mode: "000644"
owner: root
group: root
content: |
<VirtualHost *:80>
RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule ^(.*)$ https://%HTTP_HOST$1 [R,L]
</VirtualHost>
container_commands:
01_enable_rewrite:
command: "echo 'LoadModule rewrite_module modules/mod_rewrite.so' >> /etc/httpd/conf/httpd.conf"
02_cp_application_conf:
command: "cp /tmp/00_application.conf /etc/httpd/conf.d/elasticbeanstalk/00_application.conf"
同样,这有点旧,尚未针对您的确切用例进行测试,但希望它可以帮助您入门。
这需要与您的部署一起打包 - 即在 Java 中为 .jar
或 .war
或在其他环境中为 .zip
。查看文档链接以了解有关部署的更多信息。
【讨论】:
感谢@stdunbar - 我希望不要仅仅因为它似乎应该更基本的修复而走 ebextensions 路线。我认为你是对的,这可能是唯一的选择,我会试一试!以上是关于如何在 AWS 负载均衡器响应中禁用 Apache HTTP 标头信息?的主要内容,如果未能解决你的问题,请参考以下文章
您如何使用托管在 AWS 上的 grafana 监控您的响应时间
如何为 AutoScale 实例使用 AWS 负载均衡器代理协议?