Comment changer l'en-tête du serveur renvoyé par nginx?

141

Il existe une option pour masquer la version afin qu'elle n'affiche que nginx, mais y a-t-il un moyen de masquer cela aussi afin qu'il n'affiche rien ou ne change pas l'en-tête?

Daniels
la source
34
btw, pour masquer la version de nginx, vous devez désactiver 'server_tokens off'.
yanchenko
2
Si vous souhaitez supprimer nginx de l'en-tête, vous pouvez également le supprimer des redirections et des pages d'erreur.
fabianegli

Réponses:

57

Comme Apache, il s'agit d'une modification rapide de la source et d'une recompilation. De Calomel.org :

La chaîne Server: est l'en-tête qui est renvoyé au client pour lui dire quel type de serveur http vous utilisez et éventuellement quelle version. Cette chaîne est utilisée par des sites comme Alexia et Netcraft pour collecter des statistiques sur le nombre et le type de serveur Web en direct sur Internet. Pour prendre en charge l'auteur et les statistiques de Nginx, nous vous recommandons de conserver cette chaîne telle quelle. Mais, pour des raisons de sécurité, vous ne voudrez peut-être pas que les gens sachent ce que vous exécutez et vous pouvez modifier cela dans le code source. Modifiez le fichier source src/http/ngx_http_header_filter_module.c en regardant les lignes 48 et 49. Vous pouvez changer la chaîne en ce que vous voulez.

## 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;

Edition de mars 2011: Props à Flavius ​​ci-dessous pour avoir signalé une nouvelle option, remplaçant le HttpHeadersModule standard de Nginx par le HttpHeadersMoreModule fourchu . Recompiler le module standard est toujours la solution rapide, et a du sens si vous souhaitez utiliser le module standard et ne changez pas souvent la chaîne du serveur. Mais si vous voulez plus que cela, le HttpHeadersMoreModule est un projet fort et vous permet de faire toutes sortes de magie noire d'exécution avec vos en-têtes HTTP.

Joelhardi
la source
18
en utilisant 'server_tokens off;' est de loin le moyen le plus simple de le faire ... assurez-vous de le mettre dans un bloc "http" ou "serveur"
farinspace
35
Cela masque le numéro de version, mais la question était "Je sais que je peux masquer le numéro de version, comment puis-je modifier ou supprimer toute la chaîne" Serveur "?" Il n'y a aucun moyen de le faire en utilisant nginx prêt à l'emploi.
joelhardi
Une autre solution rapide (pour la version 1.7.8) pour supprimer complètement l'en-tête du serveur est: commentez les lignes 49 et 50 (correspondant aux lignes 48, 49 ci-dessus), 280-283 et 458-469. Pour référence future: les deux derniers sont tous les deux des blocs if qui sont définis r->headers_out.server.
pauluss86
3
Cette réponse est un peu ancienne maintenant. La réponse de @jamescampbell est plus précise maintenant.
jmcollin92
Si vous prévoyez d'utiliser cette méthode pour masquer votre serveur, vous pouvez également modifier le fichier src / http / ngx_http_special_response.c pour modifier les messages d'erreur du serveur.
Brogan
143

Si vous utilisez nginx pour proxy une application back-end et que vous voulez que le back-end annonce son propre en- Server:tête sans que nginx l'écrase, alors vous pouvez aller à l'intérieur de votre server {…}strophe et définir:

proxy_pass_header Server;

Cela convaincra nginx de laisser cet en-tête seul et de ne pas réécrire la valeur définie par le back-end.

Brandon Rhodes
la source
11
Si vous apportez ce changement pour des raisons de sécurité, je ne suis pas sûr que ce soit suffisant. Si votre serveur doit renvoyer un message d'erreur, l'en-tête sera toujours 'nginx'
KC Baltz
10
bien que cela résout le problème facilement, cependant il y a une chose à prendre en compte: lorsque vous utilisez un proxy inverse, les fichiers statiques sont servis via nginx, donc lorsque vous ouvrez par exemple une image dans Firebug Net Panel, vous pouvez toujours voir le serveur comme nginx
dav
OMI, c'est la meilleure réponse. Cette solution ne nécessite aucune extension logicielle spéciale et fonctionne avec le nginx de base.
Kris
81

La dernière mise à jour remonte à un certain temps, voici donc ce qui a fonctionné pour moi sur Ubuntu:

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

Ajoutez ensuite les deux lignes suivantes à la httpsection de nginx.conf, qui se trouve généralement dans /etc/nginx/nginx.conf:

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

N'oubliez pas non plus de redémarrer nginx avec sudo service nginx restart.

jamescampbell
la source
2
Y a-t-il quelque chose de similaire sur YUM? yum install nginx-extras n'a pas fonctionné.
PKHunter
3
@PKHunter Je ne l'ai pas essayé dans la langue du diable de YUM mais je vais voir ce que je peux trouver.
jamescampbell
2
C'est certainement la meilleure réponse. Cela devrait être accepté. Ce n'est que celui qui répond à tous les cas.
jmcollin92
6
Définir une chaîne vide sur Server: supprimera l'en-tête du serveur:more_set_headers 'Server: ';
Cody Craven
1
Merci cela fonctionne comme un charme sans aucune recompilation d'aucune sorte. Bravo;)
MitchellK
37

Simple, éditez /etc/nginx/nginx.conf et supprimez le commentaire de

#server_tokens off;

Recherchez la section http .

Rui Marques
la source
3
cela fonctionne bien, une fois que vous faites cela, tout ce que vous pouvez voir sur le serveur sur les en-têtes est: nginx (pas de numéro de version) Merci! : D
jacktrade
13
L'auteur de la question connaît déjà cette option, qui supprime le numéro de version, mais ne vous permet pas de personnaliser la valeur qui est renvoyée dans l'en-tête "serveur".
Makotosan
12
Cela ne cache pas tout, mais uniquement la version du serveur.
Site numérique
3
Ne supprime pas l'en-tête de réponse pour Server = nginx
sasha
Je pense que passer la version de nginx est un problème de sécurité. Donc, pour beaucoup de gens, c'est une solution «assez bonne». Il convient également de noter que cela devra aller dans chaque bloc de serveur, au cas où vous auriez un bloc de serveur pour les ports 80 et 443.
Jeremy
35

C'est très simple: ajoutez ces lignes à la section serveur:

server_tokens off;
more_set_headers 'Server: My Very Own Server';
Farsheed
la source
10
Vous devez compiler nginx avec le module tiers wiki.nginx.org/HttpHeadersMoreModule pour cela
hostmaster
10
Sur Ubuntu, vous pouvez installer nginx-extrapour obtenir ce module.
Stan Bondi
11
si l'on en croit apt-get autoexpansion, ce sont des nginx-extras avec un "s" à la fin
Tjunkie
1
Remarque, vous avez besoin du préfixe «Server:» pour remplacer la valeur Server: existante.
elBradford
25

Il existe un module spécial: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Ce module vous permet d'ajouter, de définir ou d'effacer toute sortie ou en-tête d'entrée que vous spécifiez.

Ceci est une version améliorée de la norme en- têtes Module car il fournit plus de services publics comme la réinitialisation ou de compensation « têtes builtin » comme Content-Type, Content-Lengthet Server.

Il vous permet également de spécifier un critère de code d'état HTTP facultatif à l'aide du -s option et un critère de type de contenu optionnel à l'aide de l' -toption tout en modifiant les en-têtes de sortie avec les directives more_set_headers et more_clear_headers ...

Flavius
la source
3
Compilez nginx avec--add-module=/path-to-headers-more-nginx-module
mate64
On dirait que cela a été déplacé vers OpenResty: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy
Existe-t-il un moyen d'obtenir ce module sans avoir à recompiler nginx à partir des sources pour Centos 7?
Prachi
19

Installez Nginx Extras

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

Les détails du serveur peuvent être supprimés de la réponse en ajoutant les deux lignes suivantes dans le nginx.conf (sous la section http)

more_clear_headers Server;
server_tokens off;
Aamish Baloch
la source
Premièrement, c'est ce que @jamescampbell a mentionné ci-dessus. Deuxièmement, cela nécessite que Nginx soit compilé à partir des sources ( yum install nginx-extrasne fonctionne pas - je suppose que cela fonctionne sur Debia / Ubuntu, etc. avec le apt-get.)
Khom Nazid
Cela fonctionne sans avoir compilé nginx à partir des sources. Il vous suffit de charger le module: ngx_http_headers_more_filter_module de nginx.conf
creekorful
après avoir exécuté "apt-get install nginx-extras", il a rétrogradé la version de mon nginx de 1.16 à 1.14
grayaii
15

Si vous êtes d'accord pour changer simplement l'en-tête en une autre chaîne de cinq lettres ou moins, vous pouvez simplement patcher le binaire.

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

Ce qui, en tant que solution, présente quelques avantages notables. À savoir, que vous pouvez permettre à votre versioning nginx d'être gérée par le gestionnaire de packages (donc, pas de compilation à partir de la source) même si nginx-extras n'est pas disponible pour votre distribution, et vous n'avez pas à vous soucier des éléments supplémentaires code de quelque chose comme nginx-extras étant vulnérable.

Bien sûr, vous voudrez également définir l'option server_tokens off, pour masquer le numéro de version, ou corriger également cette chaîne de format.

Je dis "cinq lettres ou moins" car bien sûr, vous pouvez toujours remplacer:

nginx \ r \ 0

avec

bob \ r \ 0 \ r \ 0

laissant les deux derniers octets inchangés.

Si vous voulez réellement plus de cinq caractères, vous voudrez laisser server_tokens activé et remplacer la chaîne de format (légèrement plus longue), bien qu'une fois encore, il y ait une limite supérieure sur cette longueur imposée par la longueur de la chaîne de format - 1 (pour le retour chariot).

... Si rien de ce qui précède n'a de sens pour vous, ou si vous n'avez jamais patché un binaire auparavant, vous voudrez peut-être rester à l'écart de cette approche.

Flèche du Parthe
la source
1
@PKHunter hm? L'avantage de cela est que cela fonctionne sans avoir à compiler à partir de zéro. Aucun code source impliqué. Il corrige directement le binaire compilé .
Tir parthe du
1
Il n'est pas du tout conscient du format de fichier - il s'agit simplement de remplacer une séquence d'octets par une séquence d'octets différente - il est donc toujours utile de vérifier que la séquence d'octets que vous remplacez n'est vraiment que la chaîne que vous souhaitez remplacer et non , disons, du code exécutable dans un sous-programme (ce qui est assez improbable, mais quand même).
Tir parthe du
1
Donc, vous exécutez simplement cette sedcommande ci-dessus, la `which nginx`partie retourne le chemin vers le binaire et la sedcommande effectue le remplacement d'octet.
Tir parthe du
1
Les octets nuls mentionnés plus loin dans la réponse font référence au fait que vous pouvez utiliser des en-têtes plus courts que la longueur totale de la chaîne tant que vous terminez le remplacement par un octet nul. en.wikipedia.org/wiki/Null-terminated_string
Parthe Shot
1
Ah. Oui, c'est l'exécutable. Et vous devez également être un utilisateur avec une autorisation d'écriture sur le fichier. Et je ne serais pas surpris si vous deviez redémarrer nginxpour que les modifications prennent effet. Tout cela dit? Je vous exhorte à ne pas utiliser l’une des autres réponses. Si toutes les choses que je dis ne vous sont pas déjà familières et que vous ne savez pas à quoi /etcsert le répertoire, alors un piratage comme celui-ci est un peu dangereux.
Tir parthe
2

Le seul moyen est de modifier le fichier src / http / ngx_http_header_filter_module.c. J'ai changé nginx à la ligne 48 en une chaîne différente.

Ce que vous pouvez faire dans le fichier de configuration nginx est de définir server_tokens . Cela empêchera nginx d'imprimer le numéro de version.

Pour vérifier les choses, essayez curl -I http://vurbu.com/ | serveur grep

Il devrait revenir

Server: Hai
Jauder Ho
la source
3
Eh bien, ce n'est pas le seul moyen. D'autres alternatives ont été présentées dans d'autres réponses.
Radko Dinev
1

Après avoir lu la réponse de Parthian Shot, je fouille dans /usr/sbin/nginxun fichier binaire. Ensuite, j'ai découvert que le fichier contient ces trois lignes.

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

Fondamentalement, les deux premiers d'entre eux sont destinés à la server_tokens on;directive (version serveur incluse). Ensuite, je change les critères de recherche pour qu'ils correspondent à ces lignes dans le fichier binaire.

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

Après avoir creusé plus loin, j'ai découvert que le message d'erreur produit par nginx est également inclus dans ce fichier.

<hr><center>nginx</center>

Il y en a trois, un sans la version, deux d'entre eux inclus la version. Je lance donc la commande suivante pour remplacer la chaîne nginx dans le message d'erreur.

sed -i 's/center>nginx/center>thing/' `which nginx`
Afrig Aminuddin
la source
Merci pour cela. Mais votre première commande exécutée à l'intérieur du /usr/sbindossier donne ceci:sed: can't read is: No such file or directory
Khom Nazid
1

Selon la documentation de nginx , il prend en charge les valeurs personnalisées ou même l'exclusion:

Syntax: server_tokens on | off | build | string;

mais malheureusement uniquement avec un abonnement commercial :

De plus, dans le cadre de notre abonnement commercial, à partir de la version 1.9.13, la signature sur les pages d'erreur et la valeur du champ d'en-tête de réponse «Serveur» peuvent être définies explicitement en utilisant la chaîne avec des variables. Une chaîne vide désactive l'émission du champ «Serveur».

adrhc
la source
0

Je sais que l'article est un peu vieux, mais j'ai trouvé une solution simple qui fonctionne sur une distribution basée sur Debian sans compiler nginx à partir des sources.

Première installation du package nginx-extras

sudo apt installer nginx-extras

Ensuite, chargez le module nginx http headers more en éditant nginx.conf et en ajoutant la ligne suivante dans le bloc serveur

modules load_module / ngx_http_headers_more_filter_module.so;

Une fois cela fait, vous aurez accès aux directives more_set_headers et more_clear_headers.

ruisseau
la source
0

Le package Nginx-extra est désormais obsolète.

Ce qui suit a donc fonctionné pour moi alors que j'ai essayé d'installer divers paquets more_set_headers 'Server: My Very Own Server';

Vous pouvez simplement faire ce qui suit et aucune information de serveur ou de version ne sera renvoyée

    server_tokens '';

si vous souhaitez simplement supprimer le numéro de version, cela fonctionne

   server_tokens off;
Prajwal
la source
-4

Demandez-vous la valeur de l'en-tête du serveur dans la réponse? Vous pouvez essayer de changer cela avec une directive add_header, mais je ne suis pas sûr que cela fonctionnera. http://wiki.codemongers.com/NginxHttpHeadersModule

Vasil
la source
1
oui, l'en-tête du serveur. mais n'y a-t-il pas un moyen plus propre comme sur lighttpd par exemple où j'ai juste server.tag = "peu importe"? le add_header ne fonctionne que pour les codes de réponse 200, 204, 301, 302 ou 304, donc si le serveur fait en quelque sorte un 500, cela ne fonctionnera pas
Daniels