我有“服务器:Apache”,并希望删除它。我按照如下说明将其添加到httpd.conf:
httpd.conf
ServerSignature Off ServerTokens Prod Header unset Server
但是最后一行没有效果。前两行已经改变了头的内容(之前它还包含了关于操作系统和PHP的信息),但是我需要完全删除它。怎么做?
wqnecbli1#
Apache不允许你完全取消这个设置。事实上,一些开发者强烈反对添加这个,尽管它是一个简单的代码更改,已经被建议(甚至被编写!)了好几次。请参见here和here,了解一些讨论,其中提到了这个问题并被拒绝。他们对此给出了各种理由,包括:1.这可能会使统计Apache的安装数量变得更加困难。我怀疑,这是主要原因。Web服务器的使用存在激烈的竞争,Apache的一个竞争对手(可能以N开头,也可能不以N开始)经常发布它如何在Apache上取得进展,而且大多数扫描都将基于HTTP头,所以我可以理解为什么不愿意让隐藏这一点变得更容易。1.模糊的安全性是一个神话,它给人一种错误的安全感,因为很容易根据服务器对特定请求的响应方式来确定服务器可能是哪个软件。虽然这有一点道理,但默认情况下将ServerTokens指定为Full肯定是一个安全问题,会泄漏太多信息,而不是在公共网站上默认显示的信息。1.不提供服务器头可能违反HTTP规范,也可能不违反。这似乎在一些争议中,仍然没有回答为什么他们不允许你把它改为一些随机字符串,而不是Apache。1.这使得调试问题变得很困难,但是您可能认为需要调试的任何人都知道或者能够找到确切的版本。1.代理服务器“可能”处理不同的请求,如果他们知道在另一端的服务器类型。这是错误的代理服务器IMHO,我怀疑它做了很多了。1.如果人们真的想修改或隐藏这个头文件,他们可以编辑源代码。坦白地说,这是一个危险的建议,建议没有代码经验的人这样做,如果他们从一个非打包的版本运行只是为了添加这个头文件,可能会导致其他安全问题。他们甚至在官方文档中添加了以下内容:建议不要将ServerTokens设置为小于最小值,因为这会使调试互操作问题更加困难。另请注意,禁用服务器:header根本没有做任何事情来让你的服务器更安全。“通过模糊来安全”的想法是一个神话,并导致一种错误的安全感。恕我直言,这个理由是荒谬的,正如我所说,如果这是不允许的主要原因,那么我不明白他们为什么不改变他们的立场。在更坏的情况下,它没有增加任何东西,因为他们说,它阻止了这整个问题被提出,虽然我个人认为,你给出的不必要的信息越少,越好,所以更希望能够关闭这个。除非出现不太可能的180度大转弯,否则你只剩下:1.将其设置为最小值(以便显示“Apache”)-这可能已经足够好了1.编辑源代码--除了最偏执的人之外,这是矫枉过正的,这意味着每个新版本都需要进行同样的修改。1.安装ModSecurity--它(至少以前)允许你覆盖(但不是删除)这个头文件,以隐藏服务器软件。安装这个可能有点过头了,尽管WAF还有其他好处。1.代理Apache在另一个Web服务器之后,允许您更改此字段。1.切换到另一个Web服务器。但是需要注意的是,对于第4点和第5点,大多数其他的Web服务器都不允许你关闭它,所以这不是Apache独有的问题。例如,Nginx不允许在不编辑源代码的情况下关闭它。
dgtucam12#
要获取头文件,如果在服务器上,这似乎可以充分工作(所有测试都在Ubuntu 14.04 Trusty Tahr上完成):
curl -v http://localhost:80/ | head
它会产生类似如下的结果:
< HTTP/1.1 200 OK < Date: Mon, 25 Jan 2021 09:17:51 GMT * Server Apache/2.4.7 (Ubuntu) is not blacklisted < Server: Apache/2.4.7 (Ubuntu)
要删除版本号,请编辑文件/etc/apache2/conf-enabled/security.conf并修改以下行:
/etc/apache2/conf-enabled/security.conf
ServerTokens OS
ServerTokens Prod
ServerSignature On
ServerSignature Off
并重新启动Apache:
sudo service apache2 restart
您现在应该会得到如下响应:
< HTTP/1.1 200 OK < Date: Mon, 25 Jan 2021 09:20:03 GMT * Server Apache is not blacklisted < Server: Apache
要完全删除单词Apache,请首先删除install ModSecurity:
Apache
sudo apt-get install libapache2-mod-security2
以下行似乎不是必需的(启用模块并重新启动Apache),但供参考:
sudo a2enmod security2 sudo service apache2 restart
检查模块是否已启用:
apachectl -M | grep security
其应显示:
security2_module (shared)
尽管你可以修改/etc/modsecurity/modsecurity.conf(通过重命名modsecurity.conf-recommended),但修改/etc/apache2/apache.conf似乎更容易 (注意,你可以使用任何你想要的名字,在本例中我只是使用了一个空格):
/etc/modsecurity/modsecurity.conf
modsecurity.conf-recommended
/etc/apache2/apache.conf
<IfModule security2_module> SecRuleEngine on ServerTokens Min SecServerSignature " " </IfModule>
(使用Min而不是Full还可以防止诸如mod_fastcgi之类的模块出现在空白服务器名称之后。)然后重新启动Apache:
Min
Full
mod_fastcgi
现在,当您运行命令时:
您应该得到:
< HTTP/1.1 200 OK < Date: Mon, 25 Jan 2021 09:31:11 GMT * Server is not blacklisted < Server:
qkf9rpyu3#
请务必遵守随附的许可证文件!APACHE版本2.4.46目前正在进行以下工作:要完全删除Server:标头,请执行以下操作:1.从https://httpd.apache.org下载Apache源代码,解压缩并编辑它。1.编辑文件httpd-2.4.46/server/core.c,并更改以下行:
Server:
httpd-2.4.46/server/core.c
enum server_token_type { SrvTk_MAJOR, /* eg: Apache/2 */ SrvTk_MINOR, /* eg. Apache/2.0 */ SrvTk_MINIMAL, /* eg: Apache/2.0.41 */ SrvTk_OS, /* eg: Apache/2.0.41 (UNIX) */ SrvTk_FULL, /* eg: Apache/2.0.41 (UNIX) PHP/4.2.2 FooBar/1.2b */ SrvTk_PRODUCT_ONLY /* eg: Apache */ };
收件人:
enum server_token_type { SrvTk_MAJOR, /* eg: Apache/2 */ SrvTk_MINOR, /* eg. Apache/2.0 */ SrvTk_MINIMAL, /* eg: Apache/2.0.41 */ SrvTk_OS, /* eg: Apache/2.0.41 (UNIX) */ SrvTk_FULL, /* eg: Apache/2.0.41 (UNIX) PHP/4.2.2 FooBar/1.2b */ SrvTk_PRODUCT_ONLY, /* eg: Apache */ SrvTk_NONE /* removes Server: header */ };
1.更改另一行:
if (ap_server_tokens == SrvTk_PRODUCT_ONLY) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT); } else if (ap_server_tokens == SrvTk_MINIMAL) { ap_add_version_component(pconf, AP_SERVER_BASEVERSION); } else if (ap_server_tokens == SrvTk_MINOR) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MINORREVISION); } else if (ap_server_tokens == SrvTk_MAJOR) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MAJORVERSION); } else { ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ")"); }
if (ap_server_tokens == SrvTk_PRODUCT_ONLY) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT); } else if (ap_server_tokens == SrvTk_MINIMAL) { ap_add_version_component(pconf, AP_SERVER_BASEVERSION); } else if (ap_server_tokens == SrvTk_MINOR) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MINORREVISION); } else if (ap_server_tokens == SrvTk_MAJOR) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MAJORVERSION); } else if (ap_server_tokens == SrvTk_NONE) { ap_add_version_component(pconf, ""); } else { ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ")"); }
1.并更改以下内容:
if (!strcasecmp(arg, "OS")) { ap_server_tokens = SrvTk_OS; } else if (!strcasecmp(arg, "Min") || !strcasecmp(arg, "Minimal")) { ap_server_tokens = SrvTk_MINIMAL; } else if (!strcasecmp(arg, "Major")) { ap_server_tokens = SrvTk_MAJOR; } else if (!strcasecmp(arg, "Minor") ) { ap_server_tokens = SrvTk_MINOR; } else if (!strcasecmp(arg, "Prod") || !strcasecmp(arg, "ProductOnly")) { ap_server_tokens = SrvTk_PRODUCT_ONLY; } else if (!strcasecmp(arg, "Full")) { ap_server_tokens = SrvTk_FULL; } else { return "ServerTokens takes 1 argument: 'Prod(uctOnly)', 'Major', 'Minor', 'Min(imal)', 'OS', or 'Full'"; }
if (!strcasecmp(arg, "OS")) { ap_server_tokens = SrvTk_OS; } else if (!strcasecmp(arg, "Min") || !strcasecmp(arg, "Minimal")) { ap_server_tokens = SrvTk_MINIMAL; } else if (!strcasecmp(arg, "Major")) { ap_server_tokens = SrvTk_MAJOR; } else if (!strcasecmp(arg, "Minor") ) { ap_server_tokens = SrvTk_MINOR; } else if (!strcasecmp(arg, "Prod") || !strcasecmp(arg, "ProductOnly")) { ap_server_tokens = SrvTk_PRODUCT_ONLY; } else if (!strcasecmp(arg, "Full")) { ap_server_tokens = SrvTk_FULL; } else if (!strcasecmp(arg, "None")) { ap_server_tokens = SrvTk_NONE; } else { return "ServerTokens takes 1 argument: 'Prod(uctOnly)', 'Major', 'Minor', 'Min(imal)', 'OS', 'Full' or 'None'"; }
1.从您修改的源代码编译Apache。请参阅:http://httpd.apache.org/docs/current/install.html1.在httpd.conf中设置以下内容:
ServerSignature Off ServerTokens None
或:1.从https://httpd.apache.org下载Apache源代码,解压缩并编辑它。1.编辑文件httpd-2.4.46/server/core.c,并更改以下内容:
至:
if (ap_server_tokens == SrvTk_PRODUCT_ONLY) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT); } else if (ap_server_tokens == SrvTk_MINIMAL) { ap_add_version_component(pconf, AP_SERVER_BASEVERSION); } else if (ap_server_tokens == SrvTk_MINOR) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MINORREVISION); } else if (ap_server_tokens == SrvTk_MAJOR) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MAJORVERSION); } else { ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ")"); } ap_add_version_component(pconf, "");
所以,如果你改变主意了,你可以把ServerTokens设置成Prod或者别的什么...标头就会回来。再改成None,它就没了:)我知道这是一个迟来的答案。但是,它仍然可以帮助很多!
ServerTokens
Prod
None
mrfwxfqh4#
该方法:
Header always set "Server" "Generic Web Server"
仅适用于2XX个响应。如果您的重写规则包含重定向,则会忽略该规则并返回由 ServerTokens 选项设置的值。最后,我修改了include/ap_release. h中定义产品名称的变量。更简单,可以使用单个sed完成:
sed 's/AP_SERVER_BASEPRODUCT\ "Apache"/AP_SERVER_BASEPRODUCT\ "Generic Web Server"/' include/ap_release.h
h9a6wy2h5#
如果只需要隐藏有关正在运行的Web服务器的信息,您可以尝试在配置文件中添加以下行:
Header set "Server" "Generic Web Server".
drkbr07n6#
您可能还没有启用mod_headers。检查是否已启用:
mod_headers
root@host: a2query -m headers
如果启用mod headers,则输出应类似于headers (enabled by ...)。如果未启用,请使用以下命令激活模块:
mod headers
headers (enabled by ...)
a2enmod headers
6条答案
按热度按时间wqnecbli1#
Apache不允许你完全取消这个设置。事实上,一些开发者强烈反对添加这个,尽管它是一个简单的代码更改,已经被建议(甚至被编写!)了好几次。请参见here和here,了解一些讨论,其中提到了这个问题并被拒绝。
他们对此给出了各种理由,包括:
1.这可能会使统计Apache的安装数量变得更加困难。我怀疑,这是主要原因。Web服务器的使用存在激烈的竞争,Apache的一个竞争对手(可能以N开头,也可能不以N开始)经常发布它如何在Apache上取得进展,而且大多数扫描都将基于HTTP头,所以我可以理解为什么不愿意让隐藏这一点变得更容易。
1.模糊的安全性是一个神话,它给人一种错误的安全感,因为很容易根据服务器对特定请求的响应方式来确定服务器可能是哪个软件。虽然这有一点道理,但默认情况下将ServerTokens指定为Full肯定是一个安全问题,会泄漏太多信息,而不是在公共网站上默认显示的信息。
1.不提供服务器头可能违反HTTP规范,也可能不违反。这似乎在一些争议中,仍然没有回答为什么他们不允许你把它改为一些随机字符串,而不是Apache。
1.这使得调试问题变得很困难,但是您可能认为需要调试的任何人都知道或者能够找到确切的版本。
1.代理服务器“可能”处理不同的请求,如果他们知道在另一端的服务器类型。这是错误的代理服务器IMHO,我怀疑它做了很多了。
1.如果人们真的想修改或隐藏这个头文件,他们可以编辑源代码。坦白地说,这是一个危险的建议,建议没有代码经验的人这样做,如果他们从一个非打包的版本运行只是为了添加这个头文件,可能会导致其他安全问题。
他们甚至在官方文档中添加了以下内容:
建议不要将ServerTokens设置为小于最小值,因为这会使调试互操作问题更加困难。另请注意,禁用服务器:header根本没有做任何事情来让你的服务器更安全。“通过模糊来安全”的想法是一个神话,并导致一种错误的安全感。
恕我直言,这个理由是荒谬的,正如我所说,如果这是不允许的主要原因,那么我不明白他们为什么不改变他们的立场。在更坏的情况下,它没有增加任何东西,因为他们说,它阻止了这整个问题被提出,虽然我个人认为,你给出的不必要的信息越少,越好,所以更希望能够关闭这个。
除非出现不太可能的180度大转弯,否则你只剩下:
1.将其设置为最小值(以便显示“Apache”)-这可能已经足够好了
1.编辑源代码--除了最偏执的人之外,这是矫枉过正的,这意味着每个新版本都需要进行同样的修改。
1.安装ModSecurity--它(至少以前)允许你覆盖(但不是删除)这个头文件,以隐藏服务器软件。安装这个可能有点过头了,尽管WAF还有其他好处。
1.代理Apache在另一个Web服务器之后,允许您更改此字段。
1.切换到另一个Web服务器。
但是需要注意的是,对于第4点和第5点,大多数其他的Web服务器都不允许你关闭它,所以这不是Apache独有的问题。例如,Nginx不允许在不编辑源代码的情况下关闭它。
dgtucam12#
标题检索
要获取头文件,如果在服务器上,这似乎可以充分工作(所有测试都在Ubuntu 14.04 Trusty Tahr上完成):
它会产生类似如下的结果:
删除版本号
要删除版本号,请编辑文件
/etc/apache2/conf-enabled/security.conf
并修改以下行:ServerTokens OS
至ServerTokens Prod
ServerSignature On
至ServerSignature Off
并重新启动Apache:
您现在应该会得到如下响应:
删除“Apache”一词
要完全删除单词
Apache
,请首先删除install ModSecurity:以下行似乎不是必需的(启用模块并重新启动Apache),但供参考:
检查模块是否已启用:
其应显示:
尽管你可以修改
/etc/modsecurity/modsecurity.conf
(通过重命名modsecurity.conf-recommended
),但修改/etc/apache2/apache.conf
似乎更容易 (注意,你可以使用任何你想要的名字,在本例中我只是使用了一个空格):(使用
Min
而不是Full
还可以防止诸如mod_fastcgi
之类的模块出现在空白服务器名称之后。)然后重新启动Apache:
最终检查
现在,当您运行命令时:
您应该得到:
qkf9rpyu3#
我不对任何原因负责!
请务必遵守随附的许可证文件!
APACHE版本2.4.46目前正在进行以下工作:
要完全删除
Server:
标头,请执行以下操作:1.从https://httpd.apache.org下载Apache源代码,解压缩并编辑它。
1.编辑文件
httpd-2.4.46/server/core.c
,并更改以下行:收件人:
1.更改另一行:
收件人:
1.并更改以下内容:
收件人:
1.从您修改的源代码编译Apache。请参阅:http://httpd.apache.org/docs/current/install.html
1.在
httpd.conf
中设置以下内容:或:
1.从https://httpd.apache.org下载Apache源代码,解压缩并编辑它。
1.编辑文件
httpd-2.4.46/server/core.c
,并更改以下内容:至:
所以,如果你改变主意了,你可以把
ServerTokens
设置成Prod
或者别的什么...标头就会回来。再改成None
,它就没了:)我知道这是一个迟来的答案。但是,它仍然可以帮助很多!
mrfwxfqh4#
该方法:
仅适用于2XX个响应。如果您的重写规则包含重定向,则会忽略该规则并返回由 ServerTokens 选项设置的值。
最后,我修改了include/ap_release. h中定义产品名称的变量。更简单,可以使用单个sed完成:
h9a6wy2h5#
如果只需要隐藏有关正在运行的Web服务器的信息,您可以尝试在配置文件中添加以下行:
drkbr07n6#
您可能还没有启用
mod_headers
。检查是否已启用:
如果启用
mod headers
,则输出应类似于headers (enabled by ...)
。如果未启用,请使用以下命令激活模块: