Posso ocultar todas as informações do servidor / sistema operacional?

80

Não quero que ninguém seja capaz de detectar que estou usando o NGINX ou mesmo o Ubuntu da Internet. Existem ferramentas por aí (como o BuiltWith) que examinam os servidores para detectar quais ferramentas estão sendo usadas. Além disso, algumas ferramentas de cracking podem ajudar na detecção. Qual é o melhor / mais próximo possível de esconder todas essas informações de fora?

orokusaki
fonte

Respostas:

115

Você pode interromper a saída da versão do Nginx e do SO adicionando

server_tokens off;

para um http, serverou locationcontexto.

Ou, se você deseja remover completamente o cabeçalho do servidor, é necessário compilar o Nginx com o módulo Mais cabeçalhos, pois o cabeçalho está codificado na fonte do Nginx e esse módulo permite alterar os cabeçalhos http.

 more_clear_headers Server;

No entanto, existem muitas maneiras ocultas que os servidores executam por acidente por meio de sua implementação, o que pode ajudar a identificar o sistema. Por exemplo, como ele responde a uma solicitação SSL incorreta. Não vejo uma maneira prática de evitar isso.

Algumas das coisas que posso sugerir:

  • alterar modelos de erro
  • bloquear todas as portas, exceto os serviços necessários
Andy
fonte
15
Acordado. Observe a detecção de SO do nmap, por exemplo - ela analisa as respostas dos hosts de destino às solicitações de IP / TCP e é capaz de determinar o SO dessa maneira. Realmente não vale a pena colocar esforço nisso.
EEAA
6
+1 no conselho de ErikA. Melhor proteger o servidor da melhor maneira possível, em vez de confiar na segurança através da obscuridade.
Andy Smith
4
Os tokens de servidor desativam apenas o número da versão. O Nginx não permite remover completamente o cabeçalho.
Martin Fjordvald
45
desconsiderar fatores de segurança importantes como "sem número de versão" e provavelmente até mesmo "sem nome de fornecedor de servidor" é apenas ... um erro para iniciantes. É claro que a segurança através da obscuridade não faz nada pela sua segurança, mas com certeza protegerá contra os vetores de ataque mais mundanos e simplistas - a segurança através da obscuridade é uma etapa necessária , pode ser a primeira e nunca deve ser a última segurança Ignorar completamente a medição é um erro muito grave, mesmo os servidores da Web mais seguros podem ser quebrados se um vetor de ataque específico da versão for conhecido.
specializt
1
Ainda existe um nome de servidor irritante "Nginx" retornado no corpo de uma resposta de redirecionamento 301 e não foi possível evitar isso até agora, a regra para usar um modelo html personalizado não funciona para 301.
Guillaume Perrot
31

Se você instalou o nginx usando o apt-get no Debian ou Ubuntu, pode ser necessário instalar o pacote nginx-extras para definir ou limpar o cabeçalho "Servidor"

Feito isso, você pode adicionar as linhas abaixo no nginx.conf (geralmente /etc/nginx/nginx.conf):

Para limpar o cabeçalho "Servidor" completamente:

more_clear_headers Server; 

Para definir uma sequência personalizada como "Servidor"

more_set_headers 'Server: some-string-here';
senhor dos pacotes
fonte
1
more_clear_headers Server;Trabalhos confirmados também no Debian Jessie 8.5 versão nginx: nginx / 1.6.2
Brandon
Esta resposta precisa de mais votos. Embora, talvez, deve-se notar que a directiva precisa ser colocado dentro do bloco http do arquivo conf (eu acho)
Andy
2
Isso funciona em http, server, location, e location ifcontextos. Fonte: ngx_headers_more documentation
Kelvin
1
Para usuários do ubuntu: sudo apt-get install nginx-extras e defina os cabeçalhos
jchnxu
Para mim, isso falhou unknown directive "more_set_headers". Resolvido via ativação explícita do módulo em /etc/nginx/nginx.conf. Basta adicionar load_module modules/ngx_http_headers_more_filter_module.so;no início do arquivo de configuração.
rapstacke 6/09
18

@ Martin F. Sim, sim. Você precisará compilá-lo da fonte e alterar o que for necessário antes de compilar a fonte.

Suponho que você baixou a última versão estável, descompactou e sabe onde estão os arquivos. Se for esse o caso, faça o seguinte:

nano src/http/ngx_http_header_filter_module.c

Então procure a linha 48 se bem me lembro.

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

Substitua nginx por MyWhateverServerNameIWant, por exemplo

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

Então

nano src/core/nginx.h 

procure a linha

#define NGINX_VER          "nginx/" NGINX_VERSION

altere "nginx /" para "MyWhateverServerNameIWant /" para ler

#define NGINX_VER          "MyWhateverServerNameIWant" NGINX_VERSION

Finalmente, se você também quiser alterar o número da versão

procure a linha #define NGINX_VERSION "1.0.4"

e mude "1.0.4" para a versão que você desejar. Por exemplo, ele lerá

#define NGINX_VERSION      "5.5.5"

Espero que ajude. Mesmo assim. Proteger um servidor vai muito além de não mostrar o que está sendo executado. O PHP é inseguro por natureza, e o linux também. Fora do curso, o linux pode ser bastante seguro se todas as medidas necessárias forem tomadas para obter uma segurança decente. No que diz respeito ao PHP, eu recomendaria o uso do Suoshin para ajudar a fortalecer a segurança do seu código.

Martin M
fonte
4
+1, obrigado. Vou deixar a @ Andy como oficial, apenas devido à abordagem mais fácil, mas essa é uma informação excelente.
orokusaki
Eu acho que você quer dizer Suhosin.
Besouro
7

Depois de muito tempo resolvendo como criar um sabor personalizado do nginx no ubuntu, percebi que você pode usar o módulo lua para isso.

No ubuntu 14.04, se você instalar o nginx-extraspacote, poderá remover o cabeçalho do servidor usando:

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

Jogue isso no bloco http e todas as solicitações não terão um Servercabeçalho.

Se não funcionar, execute nginx -Vpara verificar se o módulo lua foi compilado na sua cópia do nginx. Caso contrário, é provável que você possa usar um pacote alternativo para obtê-lo.

Matschaffer
fonte
Confirmado que isso funciona no Debian Jessie 8.5 versão nginx: nginx / 1.6.2
Brandon
1
No teste debian isso não parece funcionar mas a instalação nginx-extrafeita more_set_headers "Server: whatever";de trabalho, de modo +1: D
Shautieh
Você só precisa da LUA ativada para que isso funcione. Tnx
glavić
1

Primeiro e mais importante: Por que usar um módulo extra como cabeçalhos mais Nginx? Apenas para ocultar o cabeçalho do servidor. Se algumas linhas, o patch simples pode alcançar a mesma solução para você.

Como o uso de um módulo extra pode resultar em instabilidade (quão bem ele foi testado com seu ambiente? Com ​​seus outros módulos etc.) ou insegurança (este módulo é atualizado regularmente com erros e / ou correções relacionadas à segurança?)

Em segundo lugar. Este tópico descreve como resposta 279389 como você pode ajustar o código Nginx para alterar o cabeçalho do servidor. O problema é que eles esqueceram o HTTP / 2. Em suma, nada vai mudar. O cabeçalho do servidor ainda estará visível.

Menos é mais é melhor. Ok, eu admito, eu também tenho procurado uma boa solução por um longo tempo. Mas finalmente encontrei:

Patch de remoção do cabeçalho do servidor Nginx

Finalmente sou resgatado daquele cabeçalho irritante do servidor Nginx.

Bertus Du Jang
fonte
0

Execute esta função bash na pasta de código-fonte nginx. Na versão nginx- $, não no src /.

Com base nesta resposta .

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
}
stranger777
fonte
-1

Consulte esta essência . Certamente irá ajudá-lo.

Aamish Baloch
fonte
9
Bem-vindo à falha do servidor! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Gerald Schneider