我可以隐藏所有服务器/操作系统信息吗?

oro*_*aki 112 ubuntu nginx

我不希望任何人能够从互联网上检测到我正在使用 NGINX 甚至 Ubuntu。有一些工具(例如 BuiltWith)可以扫描服务器以检测它们正在使用哪些工具。此外,一些破解工具可能有助于检测。我可以从外部隐藏所有这些信息的最佳/最接近的方法是什么?

And*_*ndy 146

您可以通过添加来阻止它输出 Nginx 和 OS 的版本

server_tokens off;
Run Code Online (Sandbox Code Playgroud)

httpserverlocation上下文。

或者,如果您想完全删除 Server 标头,则需要使用 Headers More 模块编译 Nginx,因为标头在 Nginx 源代码中是硬编码的,并且该模块允许更改任何 http 标头。

 more_clear_headers Server;
Run Code Online (Sandbox Code Playgroud)

然而,服务器通过它们的实施意外执行的许多隐藏方式可能有助于识别系统。例如,它如何响应错误的 SSL 请求。我没有看到防止这种情况的实用方法。

我可能建议的一些事情:

  • 更改错误模板
  • 阻止除所需服务之外的所有端口

  • 完全无视诸如“无版本号”甚至“无服务器供应商名称”之类的重要安全因素只是......初学者的错误。**当然**通过默默无闻的安全性对您的安全本身没有任何作用**但是**它肯定至少可以防止最平凡,最简单的攻击媒介 - 通过默默无闻的安全性是**必要的**步骤,它可能是第一个,并且**永远**不应该是最后一个安全度量 - 完全跳过它是一个_非常_严重的错误,如果已知特定版本的攻击向量,即使是最安全的网络服务器也可能被破解。 (60认同)
  • 同意。例如,查看 nmap 的操作系统检测——它查看目标主机对 IP/TCP 请求的响应,并能够以这种方式确定操作系统。真的不值得为此付出努力。 (17认同)
  • +1 对 ErikA 的建议。最好尽可能地保护您的服务器,而不是依靠默默无闻的安全性。 (6认同)
  • 在 301 重定向响应的正文中仍然返回了一个令人讨厌的服务器名称“Nginx”,到目前为止,没有办法避免这种情况,使用自定义 html 模板的规则不适用于 301。 (6认同)
  • 服务器令牌仅关闭版本号。Nginx 不允许完全删除标头。 (4认同)
  • 无需使用“Headers More 模块”重新编译 nginx,只需安装所需的包,例如使用 apt install libnginx-mod-http-headers-more-filter 即可 (2认同)

小智 46

如果您在 Debian 或 Ubuntu 中使用 apt-get 安装了 nginx,则可能需要安装 nginx-extras 包来设置或清除“服务器”标头

完成此操作后,您可以在 nginx.conf(通常为 /etc/nginx/nginx.conf)中添加以下行:

要完全清除“服务器”标题:

more_clear_headers Server; 
Run Code Online (Sandbox Code Playgroud)

将自定义字符串设置为“服务器”

more_set_headers 'Server: some-string-here';
Run Code Online (Sandbox Code Playgroud)

  • `nginx-extras` 安装了很多额外的附加功能。如果您只需要覆盖服务器标头,那么您也可以只安装`sudo apt-get install libnginx-mod-http-headers-more-filter` (8认同)
  • 对我来说,这失败了`未知指令“more_set_headers”`。通过在`/etc/nginx/nginx.conf`中显式启用模块解决了这个问题。只需在配置文件的开头添加`load_module modules/ngx_http_headers_more_filter_module.so;`。 (3认同)
  • 这适用于 `http`、`server`、`location` 和 `location if` 上下文。来源:[ngx_headers_more 文档](https://github.com/openresty/headers-more-nginx-module#more_clear_headers) (2认同)
  • 对于 ubuntu 用户:`sudo apt-get install nginx-extras` 然后设置标题 (2认同)

小智 22

@Martin F. 是的。您必须从源代码编译它并在编译源代码之前更改所需的内容。

我假设您下载了解压后的最后一个稳定版本,并且您知道文件在哪里。如果是这种情况,请执行以下操作:

nano src/http/ngx_http_header_filter_module.c
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,然后查找第 48 行。

static char ngx_http_server_string[] = "Server: nginx" CRLF;
Run Code Online (Sandbox Code Playgroud)

用 MyWhateverServerNameIWant 替换 nginx 例如

static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF; 
Run Code Online (Sandbox Code Playgroud)

然后

nano src/core/nginx.h 
Run Code Online (Sandbox Code Playgroud)

寻找线

#define NGINX_VER          "nginx/" NGINX_VERSION
Run Code Online (Sandbox Code Playgroud)

将“nginx/”更改为“MyWhateverServerNameIWant/”,以便读取

#define NGINX_VER          "MyWhateverServerNameIWant" NGINX_VERSION
Run Code Online (Sandbox Code Playgroud)

最后,如果您还想更改版本号

寻找 #define NGINX_VERSION "1.0.4" 行

并为您想要的任何版本更改“1.0.4”。例如它会读

#define NGINX_VERSION      "5.5.5"
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。尽管如此。保护服务器远不止不显示正在运行的内容。PHP 本质上是不安全的,Linux 也是如此。当然,如果采取所有必要的措施来实现体面的安全性,Linux 可以非常安全。就 PHP 而言,我建议使用Suoshin来帮助加强代码的安全性。

  • +1,谢谢。我将离开@Andy's 作为官方,只是因为方法更简单,但这是很好的信息。 (5认同)

mat*_*fer 7

经过大量时间研究如何在 ubuntu 上自定义 nginx 风格,我意识到您可以为此使用 lua 模块。

在 ubuntu 14.04 上,如果您安装了该nginx-extras软件包,则可以使用以下方法删除服务器标头:

header_filter_by_lua 'ngx.header["server"] = nil';

把它放在 http 块中,每个请求都将缺少Server标头。

如果它不起作用nginx -V,请运行以验证您是否已将 lua 模块编译到您的 nginx 副本中。如果没有,您可能可以使用替代软件包来获取它。


小智 7

建议使用新指令header_filter_by_lua_block而不是header_filter_by_lua ,它直接在大括号 ( )之间内联 Lua 源。这样就不需要转义特殊字符了。{}

header_filter_by_lua_block { ngx.header["server"] = nil }

https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block


小智 6

1)安装nginx-extras软件包旁边nginx

apt install nginx-extras
Run Code Online (Sandbox Code Playgroud)

2)打开nginx.conf并在http块内添加以下行:

more_clear_headers Server;
server_tokens off;
Run Code Online (Sandbox Code Playgroud)

删除 nginx 服务器标头

3) 重启 nginx


小智 5

只是想指出,即使服务器标头从响应中删除,服务器的名称(例如 nginx 或 openresty)仍然在服务器发生错误时发送的 html 错误响应中清晰可见。

任何人都可以很容易地得到这个响应,例如发送一个太长的标头。Nginx 将返回一个 400 Bad Request,它不包含服务器标头(如果已修复),但 html 本身会显示它:

Nginx 错误

PS我也不知道如何摆脱这个,真的html本身会放弃它,所以应该有一种方法可能根本不生成这些?

  • 对您想要自定义的所有错误使用“error_page”指令。例如,“error_page 400 /err/400”将提供“/err/400”中的任何内容来代替默认响应。 (2认同)