Como você altera o cabeçalho do servidor retornado pelo nginx?

141

Existe uma opção para ocultar a versão, para que ela exiba apenas o nginx, mas existe uma maneira de ocultar isso também para que não mostre nada ou mude o cabeçalho?

daniels
fonte
34
btw, para ocultar a versão do nginx, você precisa definir 'server_tokens off'.
Yanchenko
2
Se você se preocupa em remover o nginx do cabeçalho, também pode removê-lo dos redirecionamentos e das páginas de erro.
Fabianegli #

Respostas:

57

Como o Apache, esta é uma edição rápida na fonte e recompila. Em Calomel.org :

A sequência Server: é o cabeçalho que é enviado de volta ao cliente para informar qual tipo de servidor http você está executando e possivelmente qual versão. Essa sequência é usada por lugares como Alexia e Netcraft para coletar estatísticas sobre quantos e de que tipo de servidor web estão ativos na Internet. Para dar suporte ao autor e às estatísticas do Nginx, recomendamos manter essa sequência como está. Mas, por segurança, você pode não querer que as pessoas saibam o que você está executando e pode mudar isso no código-fonte. Edite o arquivo de origem src/http/ngx_http_header_filter_module.c nas linhas 48 e 49. Você pode alterar a String para o que quiser.

## vi src/http/ngx_http_header_filter_module.c (lines 48 and 49)
static char ngx_http_server_string[] = "Server: MyDomain.com" CRLF;
static char ngx_http_server_full_string[] = "Server: MyDomain.com" CRLF;

Março de 2011 EDIT: Adereços para Flavius abaixo por apontar uma nova opção, substituindo o padrão de Nginx HttpHeadersModule com o bifurcada HttpHeadersMoreModule . A recompilação do módulo padrão ainda é a solução rápida e faz sentido se você deseja usar o módulo padrão e não alterará a sequência do servidor com frequência. Mas se você quiser mais do que isso, o HttpHeadersMoreModule é um projeto forte e permite que você faça todo tipo de magia negra em tempo de execução com seus cabeçalhos HTTP.

joelhardi
fonte
18
usando 'server_tokens off;' é de longe a maneira mais fácil de fazer isso ... certifique-se de colocá-lo em um bloco "http" ou "servidor"
farinspace
35
Isso oculta o número da versão, mas a pergunta era "Eu sei que posso ocultar o número da versão, como faço para alterar ou excluir a string inteira do 'Servidor'?" Não há como fazer isso usando o nginx pronto para uso.
Joelhardi
Outra solução rápida (para a versão 1.7.8) para remover completamente o cabeçalho do servidor é: comente as linhas 49 e 50 (correspondentes às linhas 48, 49 acima), 280-283 e 458-469. Para referência futura: os dois últimos são os dois blocos if se configurados r->headers_out.server.
pauluss86
3
Esta resposta é um pouco, mas antiga agora. A resposta de @jamescampbell é mais precisa agora.
Jmcollin92
Se você planeja usar esse método para mascarar o servidor, convém também editar o arquivo src / http / ngx_http_special_response.c para alterar as mensagens de erro do servidor.
Brogan
143

Se você estiver usando o nginx para fazer proxy de um aplicativo de back-end e desejar que o back-end anuncie seu próprio Server:cabeçalho sem que o nginx o substitua, você poderá entrar na server {…}estrofe e definir:

proxy_pass_header Server;

Isso convencerá o nginx a deixar esse cabeçalho sozinho e a não reescrever o valor definido pelo back-end.

Brandon Rhodes
fonte
11
Se você estiver fazendo essa alteração por motivos de segurança, não tenho certeza de que isso seja suficiente. Se o seu servidor precisar retornar uma mensagem de erro, o cabeçalho continuará sendo 'nginx'
KC Baltz
10
embora isso resolva o problema facilmente, há uma coisa a ser levada em consideração: ao usar um proxy reverso, os arquivos estáticos estão sendo veiculados pelo nginx; portanto, quando você abre, por exemplo, imagem no painel de rede do firebug, ainda pode ver o servidor como nginx
dav
IMO, esta é a melhor resposta. Esta solução não requer nenhuma extensão de software especial e funciona com o nginx base.
Kris
81

A última atualização foi há um tempo atrás, então aqui está o que funcionou para mim no Ubuntu:

sudo apt-get update
sudo apt-get install nginx-extras

Em seguida, adicione as duas linhas a seguir na httpseção nginx.confgeralmente localizada em /etc/nginx/nginx.conf:

sudo nano /etc/nginx/nginx.conf
server_tokens off; # removed pound sign
more_set_headers 'Server: Eff_You_Script_Kiddies!';

Além disso, não esqueça de reiniciar o nginx com sudo service nginx restart.

jamescampbell
fonte
2
Existe algo semelhante no YUM? O yum install nginx-extras não funcionou.
PKHunter
3
@PKHunter Eu não tentei na língua do diabo da YUM, mas vou ver o que posso encontrar.
91316 jamescampbell
2
Esta é certamente a melhor resposta. Deve ser aceito. Este é apenas um que responde a todos os casos.
Jmcollin92
6
Definir uma string vazia como Server: suprimirá o cabeçalho do servidor:more_set_headers 'Server: ';
Cody Craven
1
Obrigado, isso funciona como um encanto, sem qualquer recompilação de qualquer tipo. Bem feito;)
MitchellK
37

Simples, edite o /etc/nginx/nginx.conf e remova o comentário de

#server_tokens off;

Procure a seção http .

Rui Marques
fonte
3
isso funciona bem, depois de fazer tudo o que você pode ver sobre o servidor nos cabeçalhos, as informações são: nginx (sem número de versão) Obrigado! : D
jacktrade
13
O autor da pergunta já está ciente dessa opção, que remove o número da versão, mas não permite que você personalize o valor retornado no cabeçalho "servidor".
Makotosan
12
Isso não oculta tudo, mas apenas a versão do servidor.
Site digital
3
Não remove o cabeçalho de resposta para o servidor = nginx
sasha
Acho que passar a versão do nginx é uma preocupação de segurança. Portanto, para muitas pessoas, essa é uma solução "suficientemente boa". Também é importante notar que este terá que entrar em cada bloco do servidor, no caso de você ter um bloco servidor para a porta 80 e 443.
Jeremy
35

É muito simples: adicione estas linhas à seção do servidor:

server_tokens off;
more_set_headers 'Server: My Very Own Server';
Farsheed
fonte
10
Você precisa compilar o nginx com o módulo de terceiros wiki.nginx.org/HttpHeadersMoreModule para isso
hostmaster
10
No Ubuntu, você pode instalar nginx-extrapara obter esse módulo.
9788 Stanley
11
se quisermos acreditar apt-get autoexpansion, é nginx-extras com um "s" no final
Tjunkie
1
Observe que você precisa do prefixo "Server:" para substituir o valor existente Server:
22317 elBradford
25

Existe um módulo especial: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Este módulo permite adicionar, definir ou limpar qualquer cabeçalho de saída ou entrada que você especificar.

Esta é uma versão aprimorada do módulo de cabeçalhos padrão , pois fornece mais utilitários, como redefinir ou limpar "cabeçalhos internos" Content-Type, como Content-Length, e Server.

Também permite especificar um critério opcional de código de status HTTP usando a -sopção e um critério opcional de tipo de conteúdo usando a -topção enquanto modifica os cabeçalhos de saída com as diretivas more_set_headers e more_clear_headers ...

Flavius
fonte
3
Compile o nginx com--add-module=/path-to-headers-more-nginx-module
mate64
Parece que este foi transferido para OpenResty: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy
Existe alguma maneira de obter esse módulo sem precisar recompilar o nginx da fonte para o Centos 7?
Prachi
19

Instalar extras do Nginx

sudo apt-get update
sudo apt-get install nginx-extras

Os detalhes do servidor podem ser removidos da resposta adicionando as seguintes duas linhas no nginx.conf (na seção http)

more_clear_headers Server;
server_tokens off;
Aamish Baloch
fonte
Primeiro, é isso que o @jamescampbell mencionado acima. Segundo, isso requer que o Nginx seja compilado a partir do código-fonte ( yum install nginx-extrasnão funciona - suponho que isso funcione no Debia / Ubuntu etc com o apt-get.)
Khom Nazid
Funciona sem ter o nginx compilado a partir da fonte. Você só precisa carregar o módulo: ngx_http_headers_more_filter_module de nginx.conf
creekorful
após a execução de "apt-get install nginx-extras", ele rebaixou a versão do meu nginx 1,16-1,14
grayaii
15

Se você concorda em mudar o cabeçalho para outra sequência de cinco letras ou menos, basta corrigir o binário.

sed -i 's/nginx\r/thing\r/' `which nginx`

Que, como solução, tem algumas vantagens notáveis. Ou seja, você pode permitir que o controle de versão do nginx seja gerenciado pelo gerenciador de pacotes (portanto, sem compilação a partir do código-fonte), mesmo que o nginx-extras não esteja disponível para sua distribuição e você não precise se preocupar com nada disso. código de algo como nginx-extras sendo vulnerável.

Obviamente, você também desejará definir a opção server_tokens off, ocultar o número da versão ou corrigir a formatação da string também.

Eu digo "cinco letras ou menos" porque é claro que você sempre pode substituir:

nginx \ r \ 0

com

bob \ r \ 0 \ r \ 0

deixando os dois últimos bytes inalterados.

Se você realmente quiser mais de cinco caracteres, deixe server_tokens ativado e substitua a string de formato (um pouco mais longa), embora novamente haja um limite superior para esse comprimento imposto pelo comprimento da string de formato - 1 (para o retorno de carro).

... Se nenhuma das opções acima fizer sentido para você, ou você nunca tiver corrigido um binário antes, você pode ficar longe dessa abordagem.

Tiro Parthian
fonte
1
@PKHunter hm? A vantagem disso é que ele funciona sem precisar compilar do zero. Nenhum código fonte envolvido. Está corrigindo o binário compilado diretamente.
Parthian Shot
1
Ele não está ciente do formato do arquivo - apenas substitui uma sequência de bytes por uma sequência diferente de bytes -, portanto, sempre vale a pena verificar se a sequência de bytes que você está substituindo é apenas a sequência que você deseja substituir e não , digamos, código executável em uma sub-rotina (o que é bastante improvável, mas ainda).
Parthian Shot
1
Então, você acabou de executar esse sedcomando acima, a `which nginx`parte retorna o caminho para o binário e o sedcomando faz a substituição de bytes.
Parthian Shot
1
Os bytes nulos mencionados posteriormente na resposta referem-se ao fato de que você pode usar cabeçalhos mais curtos que o comprimento total da cadeia, desde que você termine a substituição com um byte nulo. pt.wikipedia.org/wiki/Null-terminated_string
Parthian Shot
1
Ah Sim, é o executável. E você também precisaria ser um usuário com permissão de gravação no arquivo. E não ficaria surpreso se você precisasse reiniciar nginxpara que as alterações entrassem em vigor. Tudo o que disse? Peço que você não use uma das outras respostas. Se todas as coisas que estou dizendo já não lhe são familiares e você não sabe para que /etcserve o diretório, um hack como esse é meio perigoso.
Tiro parta
2

A única maneira é modificar o arquivo src / http / ngx_http_header_filter_module.c. Mudei o nginx na linha 48 para uma string diferente.

O que você pode fazer no arquivo de configuração nginx é desativar server_tokens . Isso impedirá que o nginx imprima o número da versão.

Para verificar as coisas, tente enrolar -I http://vurbu.com/ | Servidor grep

Deve retornar

Server: Hai
Jauder Ho
fonte
3
Bem, esse não é o único caminho. Outras alternativas foram mostradas em outras respostas.
Radko Dinev 28/08
1

Depois de ler a resposta de Parthian Shot, vasculho o /usr/sbin/nginxarquivo binário. Então eu descobri que o arquivo contém essas três linhas.

Server: nginx/1.12.2
Server: nginx/1.12.2
Server: nginx

Basicamente, os dois primeiros destinam-se à server_tokens on;diretiva (versão do servidor incluída). Em seguida, altero os critérios de pesquisa para corresponder a essas linhas no arquivo binário.

sed -i 's/Server: nginx/Server: thing/' `which nginx`

Depois de cavar mais, descobri que a mensagem de erro produzida pelo nginx também está incluída neste arquivo.

<hr><center>nginx</center>

Existem três deles, um sem a versão, dois deles incluíram a versão. Então, eu executo o seguinte comando para substituir a string nginx na mensagem de erro.

sed -i 's/center>nginx/center>thing/' `which nginx`
Afrig Aminuddin
fonte
Obrigado por isso. Mas o seu primeiro comando executado dentro da /usr/sbinpasta gera o seguinte:sed: can't read is: No such file or directory
Khom Nazid 12/02/19
1

De acordo com a documentação do nginx , ele suporta valores personalizados ou até a exclusão:

Syntax: server_tokens on | off | build | string;

mas infelizmente apenas com uma assinatura comercial :

Além disso, como parte de nossa assinatura comercial, a partir da versão 1.9.13, a assinatura nas páginas de erro e o valor do campo de cabeçalho de resposta "Servidor" podem ser definidos explicitamente usando a sequência com variáveis. Uma sequência vazia desativa a emissão do campo "Servidor".

adrhc
fonte
0

Eu sei que o post é meio antigo, mas achei fácil uma solução que funciona na distribuição baseada no Debian sem compilar o nginx a partir do código-fonte.

Primeiro instale o pacote nginx-extras

sudo apt install nginx-extras

Em seguida, carregue o módulo nginx http headers more editando o nginx.conf e adicionando a seguinte linha dentro do bloco do servidor

módulos load_module / ngx_http_headers_more_filter_module.so;

Uma vez feito, você terá acesso às diretivas more_set_headers e more_clear_headers.

creekorful
fonte
0

O pacote Nginx-extra está obsoleto agora.

Portanto, o seguinte funcionou agora para mim, pois tentei instalar vários pacotes more_set_headers 'Server: My Very Own Server';

Você pode fazer o seguinte e nenhuma informação de servidor ou versão será enviada de volta

    server_tokens '';

se você quiser apenas remover o número da versão, isso funciona

   server_tokens off;
Prajwal
fonte
-4

Você está perguntando sobre o valor do cabeçalho do servidor na resposta? Você pode tentar mudar isso com uma diretiva add_header, mas não tenho certeza se funcionará. http://wiki.codemongers.com/NginxHttpHeadersModule

Vasil
fonte
1
sim, o cabeçalho do servidor. mas não existe uma maneira mais limpa como no lighttpd, por exemplo, onde eu só tenho server.tag = "tanto faz"? o add_header funciona apenas para códigos de resposta 200, 204, 301, 302 ou 304, por isso, se servidor de alguma forma fazer uma 500 não vai funcionar
Daniels