¿Puedo ocultar toda la información del servidor / sistema operativo?

80

No quiero que nadie pueda detectar que estoy usando NGINX o incluso Ubuntu desde Internet. Existen herramientas (como BuiltWith) que escanean servidores para detectar qué herramientas están utilizando. Además, algunas herramientas de craqueo pueden ayudar con la detección. ¿Qué es lo mejor / más cercano que puedo conseguir para ocultar toda esta información desde el exterior?

orokusaki
fuente

Respuestas:

115

Puede detener la salida de la versión de Nginx y OS agregando

server_tokens off;

a un http, servero locationcontexto.

O si desea eliminar completamente el encabezado del servidor, debe compilar Nginx con el módulo Encabezados más, ya que el encabezado está codificado en la fuente Nginx, y este módulo permite cambiar cualquier encabezado http.

 more_clear_headers Server;

Sin embargo, hay muchas formas ocultas en que los servidores funcionan por accidente a través de su implementación que pueden ayudar a identificar el sistema. Por ejemplo, cómo responde a una solicitud SSL incorrecta. No veo una forma práctica de prevenir esto.

Algunas de las cosas que podría sugerir:

  • cambiar plantillas de error
  • bloquear todos los puertos excepto los servicios necesarios
Andy
fuente
15
Convenido. Mire la detección del sistema operativo de nmap, por ejemplo: esto analiza las respuestas de los hosts de destino a las solicitudes de IP / TCP y puede determinar el sistema operativo de esa manera. Realmente no vale la pena poner esfuerzo en esto.
EEAA
66
+1 por consejo de ErikA. Es mejor asegurar su servidor lo mejor que pueda en lugar de confiar en la seguridad a través de la oscuridad.
Andy Smith
44
Los tokens del servidor solo desactivan el número de versión. Nginx no permite eliminar completamente el encabezado.
Martin Fjordvald
45
ignorar factores de seguridad importantes como "sin números de versión" y probablemente incluso "sin nombre de proveedor de servidor" es solo ... un error de principiante. Por supuesto, la seguridad a través de la oscuridad no hace nada por su seguridad en sí misma, pero seguro que al menos protegerá contra los vectores de ataque más mundanos y simplistas: la seguridad a través de la oscuridad es un paso necesario , puede ser el primero y nunca debería ser la última seguridad medición: omitirlo por completo es un error muy grave, incluso los servidores web más seguros pueden descifrarse si se conoce un vector de ataque específico de la versión.
specializt
1
Todavía hay un molesto nombre de servidor "Nginx" devuelto en el cuerpo de una respuesta de redireccionamiento 301 y no se encontró forma de evitar eso hasta ahora, la regla de usar una plantilla html personalizada no funciona para 301.
Guillaume Perrot
31

Si ha instalado nginx usando apt-get en Debian o Ubuntu, es posible que necesite instalar el paquete nginx-extras para configurar o borrar el encabezado "Servidor"

Una vez hecho esto, puede agregar las siguientes líneas en nginx.conf (generalmente /etc/nginx/nginx.conf):

Para borrar el encabezado "Servidor" por completo:

more_clear_headers Server; 

Para establecer una cadena personalizada como "Servidor"

more_set_headers 'Server: some-string-here';
señor del paquete
fuente
1
Confirmado more_clear_headers Server;funciona también en Debian Jessie 8.5 versión nginx: nginx / 1.6.2
Brandon
Esta respuesta necesita más votos a favor. Aunque quizás debería tenerse en cuenta que la directiva debe colocarse dentro del bloque http del archivo conf (creo)
Andy
2
Esto funciona en http, server, location, y location ifcontextos. Fuente: documentación de ngx_headers_more
Kelvin
1
Para usuarios de ubuntu: sudo apt-get install nginx-extras y luego configure los encabezados
jchnxu
Para mí esto falló con unknown directive "more_set_headers". Lo resolvió habilitando el módulo explícitamente en /etc/nginx/nginx.conf. Simplemente agregue load_module modules/ngx_http_headers_more_filter_module.so;al comienzo del archivo de configuración.
rapstacke
18

@ Martin F. Sí, lo hace. Tendrá que compilarlo desde la fuente y cambiar lo que se necesita antes de compilar la fuente.

Supongo que descargó la última versión estable, la descomprimió y sabe dónde están los archivos. Si ese es el caso, haga lo siguiente:

nano src/http/ngx_http_header_filter_module.c

Luego busque la línea 48 si recuerdo correctamente.

static char ngx_http_server_string[] = "Server: nginx" CRLF;

Reemplace nginx con MyWhateverServerNameIWant ej.

static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF; 

Entonces

nano src/core/nginx.h 

busca la linea

#define NGINX_VER          "nginx/" NGINX_VERSION

cambie "nginx /" a "MyWhateverServerNameIWant /" para que se lea

#define NGINX_VER          "MyWhateverServerNameIWant" NGINX_VERSION

Finalmente si quieres también cambia el número de versión

busque la línea #define NGINX_VERSION "1.0.4"

y cambie "1.0.4" para cualquier versión que desee. Por ejemplo leerá

#define NGINX_VERSION      "5.5.5"

Espero eso ayude. Sin embargo. Asegurar un servidor va mucho más allá de no mostrar lo que se está ejecutando. PHP es inseguro por naturaleza, y también lo es Linux. Por supuesto, Linux puede ser bastante seguro si se toman todas las medidas necesarias para lograr una seguridad decente. En lo que respecta a PHP, recomendaría usar Suoshin para ayudar a fortalecer la seguridad de su código.

Martin M
fuente
44
+1, gracias. Me voy de @ Andy como oficial, solo por el enfoque más fácil, pero esta es una información excelente.
orokusaki
Creo que te refieres a Suhosin.
Escarabajo
7

Después de mucho tiempo resolviendo cómo hacer un sabor personalizado de nginx en ubuntu, me di cuenta de que puede usar el módulo lua para esto.

En ubuntu 14.04 si instala el nginx-extraspaquete, puede eliminar el encabezado del servidor usando:

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

Agregue esto en el bloque http y cada solicitud carecerá de un Serverencabezado.

Si no funciona, ejecute nginx -Vpara verificar que tiene el módulo lua compilado en su copia de nginx. Si no, es probable que haya un paquete alternativo que pueda usar para obtenerlo.

matschaffer
fuente
Confirmado que esto funciona en Debian Jessie 8.5 versión nginx: nginx / 1.6.2
Brandon
1
En las pruebas de Debian, esto no parece funcionar PERO la instalación nginx-extrahizo el more_set_headers "Server: whatever";trabajo, así que +1: D
Shautieh
Solo necesita LUA habilitado para que esto funcione. Tnx
glavić
1

Primero y principal: ¿Por qué usar un módulo adicional como encabezados más Nginx? Solo para ocultar el encabezado del servidor. Si unas pocas líneas, un parche simple puede llegar a la misma solución para usted.

Como el uso de un módulo adicional podría provocar inestabilidad (¿qué tan bien se ha probado con su entorno? Con sus otros módulos, etc.) o inseguridad (¿este módulo se actualiza regularmente con errores y / o correcciones relacionadas con la seguridad?)

En segundo lugar. Este hilo describe como respuesta 279389 cómo puede ajustar el código Nginx para cambiar el encabezado del servidor. El problema es que han olvidado HTTP / 2. En resumen, nada cambiará. El encabezado del servidor seguirá siendo visible.

Menos es más es mejor. Ok, lo admito, también he estado buscando una buena solución durante mucho tiempo. Pero finalmente encontró:

Parche de eliminación del encabezado del servidor Nginx

Finalmente soy redimido de ese molesto encabezado del servidor Nginx.

Bertus Du Jang
fuente
0

Ejecute esta función bash en la carpeta de código fuente nginx. En la versión nginx- $, no en src /.

Basado en esta respuesta .

hidengxver () {
read -r -p "Your own http_server_string for safety: " http_server_string
first_string="static char ngx_http_server_string\[\] = \"Server: nginx\" CRLF;"
second_string="static char ngx_http_server_string\[\] = \"$http_server_string\" CRLF;"
sed -ire "s/$first_string/$second_string/g" src/http/ngx_http_header_filter_module.c

read -r -p "Your own NGINX_VER const: " nginx_ver
third_string="\#define NGINX\_VER          \"nginx\/\" NGINX\_VERSION"
forth_string="\#define NGINX\_VER          \"$nginx_ver\" NGINX\_VERSION"
sed -ire "s/$third_string/$forth_string/g" src/core/nginx.h

real_nginx_version=$( grep '#define NGINX_VERSION' src/core/nginx.h | gawk -F'"' '{print $2}' )
read -r -p "Your own NGINX_VERSION const: " new_nginx_version
fifth_string="\#define NGINX\_VERSION      \"$real_nginx_version\""
sixth_string="\#define NGINX\_VERSION      \"$new_nginx_version\""
sed -ire "s/$fifth_string/$sixth_string/g" src/core/nginx.h
}
extraño777
fuente
-1

Consulte esta esencia . Seguramente te ayudará.

Aamish Baloch
fuente
99
¡Bienvenido a Server Fault! Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Gerald Schneider