Jak zmienić nagłówek serwera zwracany przez nginx?

141

Istnieje opcja ukrycia wersji, aby wyświetlała tylko nginx, ale czy istnieje sposób, aby to ukryć, aby nic nie wyświetlało ani nie zmieniało nagłówka?

daniels
źródło
34
btw, aby ukryć wersję nginx, musisz wyłączyć 'server_tokens'.
yanchenko
2
Jeśli zależy Ci na usunięciu nginx z nagłówka, możesz również chcieć usunąć go z przekierowań i stron błędów.
fabianegli

Odpowiedzi:

57

Podobnie jak Apache, jest to szybka edycja źródła i ponowna kompilacja. Z Calomel.org :

Serwer: ciąg to nagłówek, który jest odsyłany do klienta, aby poinformować go, jakiego typu serwer http używasz i prawdopodobnie w jakiej wersji. Ten ciąg jest używany przez miejsca takie jak Alexia i Netcraft do zbierania statystyk dotyczących liczby i typu serwerów WWW dostępnych w Internecie. Aby wesprzeć autora i statystyki dotyczące Nginx, zalecamy zachowanie tego ciągu bez zmian. Jednak ze względów bezpieczeństwa możesz nie chcieć, aby ludzie wiedzieli, co używasz i możesz to zmienić w kodzie źródłowym. Edytuj plik źródłowy, src/http/ngx_http_header_filter_module.c spójrz na linie 48 i 49. Możesz zmienić String na cokolwiek chcesz.

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

Edycja z marca 2011 r .: Podziękowania dla Flaviusa poniżej za wskazanie nowej opcji, zastępującej standardowy HttpHeadersModule Nginx przez rozwidlony HttpHeadersMoreModule . Rekompilacja standardowego modułu jest nadal szybką poprawką i ma sens, jeśli chcesz użyć standardowego modułu i nie będziesz często zmieniać łańcucha serwera. Ale jeśli chcesz czegoś więcej, HttpHeadersMoreModule jest silnym projektem i umożliwia wykonywanie wszelkiego rodzaju czarnej magii w czasie wykonywania z nagłówkami HTTP.

joelhardi
źródło
18
używając 'server_tokens off;' jest zdecydowanie najłatwiejszym sposobem ... pamiętaj, aby umieścić go w bloku „http” lub „server”
farinspace
35
To ukrywa numer wersji, ale pytanie brzmiało: „Wiem, że mogę ukryć numer wersji, jak zmienić lub usunąć cały ciąg„ Server ”?” Nie ma sposobu, aby to zrobić za pomocą gotowego do użycia nginx.
joelhardi
Inną szybką poprawką (dla wersji 1.7.8), aby całkowicie usunąć nagłówek serwera, jest: zakomentuj wiersze 49 i 50 (odpowiadające liniom 48, 49 powyżej), 280-283 i 458-469. Na przyszłość: ostatnie dwa to oba ustawione bloki if r->headers_out.server.
pauluss86
3
Ta odpowiedź jest teraz trochę, ale stara. Odpowiedź @jamescampbell jest teraz dokładniejsza.
jmcollin92
Jeśli planujesz użyć tej metody do zamaskowania serwera, możesz również edytować plik src / http / ngx_http_special_response.c, aby zmienić komunikaty o błędach serwera.
Brogan
143

Jeśli używasz nginx do proxy aplikacji zaplecza i chcesz, aby zaplecze reklamowało swój własny Server:nagłówek bez nadpisywania go przez nginx, możesz wejść do swojej server {…}sekcji i ustawić:

proxy_pass_header Server;

To przekona nginx do pozostawienia tego nagłówka w spokoju i nie przepisywania wartości ustawionej przez zaplecze.

Brandon Rhodes
źródło
11
Jeśli wprowadzasz tę zmianę ze względów bezpieczeństwa, nie jestem pewien, czy to wystarczy. Jeśli serwer musi zwrócić komunikat o błędzie, nagłówek nadal będzie miał postać „nginx”
KC Baltz
10
chociaż to rozwiązuje problem łatwo, jednak należy wziąć pod uwagę jedną rzecz: podczas korzystania z odwrotnego proxy pliki statyczne są obsługiwane przez nginx, więc po otwarciu np. obrazu w panelu sieciowym firebuga nadal możesz zobaczyć serwer jako nginx
dav
IMO, to najlepsza odpowiedź. To rozwiązanie nie wymaga żadnego specjalnego rozszerzenia oprogramowania i działa z podstawowym nginxem.
Kris,
81

Ostatnia aktualizacja była jakiś czas temu, więc oto, co działało dla mnie na Ubuntu:

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

Następnie dodaj następujące dwie linie do httpsekcji programu nginx.conf, która zwykle znajduje się w /etc/nginx/nginx.conf:

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

Nie zapomnij też zrestartować nginx z sudo service nginx restart.

jamescampbell
źródło
2
Czy jest coś podobnego na YUM? yum install nginx-extras nie działa.
PKHunter
3
@PKHunter Nie próbowałem tego w diabelskim języku YUM, ale zobaczę, co znajdę.
jamescampbell
2
To z pewnością najlepsza odpowiedź. Należy to zaakceptować. To tylko jeden, który odpowiada na wszystkie przypadki.
jmcollin92
6
Ustawienie pustego ciągu na Serwer: pominie nagłówek serwera:more_set_headers 'Server: ';
Cody Craven
1
Dziękuję, to działa jak urok bez jakiejkolwiek ponownej kompilacji. Dobra robota;)
MitchellK
37

Prosto, edytuj /etc/nginx/nginx.conf i usuń komentarz z

#server_tokens off;

Wyszukaj sekcję http .

Rui Marques
źródło
3
to działa dobrze, kiedy już to zrobisz, wszystko co możesz zobaczyć o serwerze w nagłówkach to: nginx (brak numeru wersji) Dzięki! : D
jacktrade
13
Autor pytania jest już świadomy tej opcji, która usuwa numer wersji, ale nie pozwala na dostosowanie wartości zwracanej w nagłówku „server”.
Makotosan
12
To nie wszystko, ale tylko wersja serwerowa.
Witryna cyfrowa
3
Nie usuwa nagłówka odpowiedzi dla Server = nginx
sasha
Myślę, że przekazanie wersji nginx jest kwestią bezpieczeństwa. Dlatego dla wielu osób jest to „wystarczająco dobre” rozwiązanie. Warto również zauważyć, że będzie to musiało wejść do każdego bloku serwera, w przypadku, gdy masz blok serwera dla portu 80 i 443.
Jeremy
35

To bardzo proste: dodaj te linie do sekcji serwera:

server_tokens off;
more_set_headers 'Server: My Very Own Server';
Farsheed
źródło
10
Musisz skompilować nginx z modułem 3th partia wiki.nginx.org/HttpHeadersMoreModule do tego
hostmaster
10
W systemie Ubuntu możesz zainstalować, nginx-extraaby uzyskać ten moduł.
Stan Bondi
11
jeśli wierzyć automatycznemu rozszerzaniu apt-get, jest to nginx-extras z
literą
1
Uwaga: przedrostek „Server:” jest potrzebny do przesłonięcia istniejącej wartości Server:.
elBradford
25

Istnieje specjalny moduł: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Ten moduł umożliwia dodawanie, ustawianie lub usuwanie dowolnego określonego nagłówka wyjściowego lub wejściowego.

Jest to udoskonalona wersja standardowych nagłówków moduł ponieważ zapewnia więcej narzędzi jak resetowanie lub usuwanie „wbudowane nagłówków” jak Content-Type, Content-Lengthi Server.

Umożliwia również określenie opcjonalnych kryteriów kodu stanu HTTP za pomocą -sopcji i opcjonalnych kryteriów typu zawartości przy użyciu -topcji podczas modyfikowania nagłówków wyjściowych za pomocą dyrektyw more_set_headers i more_clear_headers ...

Flavius
źródło
3
Skompiluj nginx za pomocą--add-module=/path-to-headers-more-nginx-module
mate64
Wygląda na to, że zostało to przeniesione do OpenResty: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy,
Czy istnieje sposób na uzyskanie tego modułu bez konieczności ponownej kompilacji nginx ze źródła dla Centos 7?
Prachi
19

Zainstaluj dodatki Nginx

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

Szczegóły serwera można usunąć z odpowiedzi, dodając kolejne dwa wiersze w pliku nginx.conf (w sekcji http)

more_clear_headers Server;
server_tokens off;
Aamish Baloch
źródło
Po pierwsze, właśnie o tym wspomniał wyżej @jamescampbell. Po drugie, wymaga to skompilowania Nginx ze źródła ( yum install nginx-extrasnie działa - przypuszczam, że to działa na Debia / Ubuntu itp apt-get.
Z.
Działa bez skompilowania nginx ze źródła. Wystarczy załadować moduł: ngx_http_headers_more_filter_module z nginx.conf
creekorful
po uruchomieniu „apt-get install nginx-extras”
obniżyłem
15

Jeśli nie przeszkadza ci po prostu zmiana nagłówka na inny ciąg zawierający pięć liter lub mniej, możesz po prostu załatać plik binarny.

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

Co, jako rozwiązanie, ma kilka wymiernych zalet. Mianowicie, że możesz pozwolić na obsługę wersji nginx przez menedżera pakietów (więc nie kompiluj ze źródeł), nawet jeśli nginx-extras nie jest dostępny dla twojej dystrybucji i nie musisz się martwić o żadne dodatkowe kod czegoś takiego jak nginx-extras jest podatny na ataki.

Oczywiście będziesz także chciał ustawić opcję server_tokens off, aby ukryć numer wersji lub załatać również ten ciąg formatu.

Mówię „pięć liter lub mniej”, ponieważ oczywiście zawsze możesz zamienić:

nginx \ r \ 0

z

bob \ r \ 0 \ r \ 0

pozostawiając ostatnie dwa bajty bez zmian.

Jeśli faktycznie chcesz mieć więcej niż pięć znaków, będziesz chciał pozostawić server_tokens włączone i zastąpić (nieco dłuższy) ciąg formatujący, chociaż znowu istnieje górne ograniczenie tej długości narzucone przez długość ciągu formatującego - 1 (dla powrót karetki).

... Jeśli żadne z powyższych nie ma dla Ciebie sensu lub nigdy wcześniej nie załatałeś pliku binarnego, możesz jednak trzymać się z daleka od tego podejścia.

Strzał Partów
źródło
1
@PKHunter hm? Zaletą tego jest to, że działa bez konieczności kompilowania od podstaw. Brak kodu źródłowego. Łata bezpośrednio skompilowany plik binarny .
Parthian Shot
1
W ogóle nie jest świadomy formatu pliku - po prostu zastępuje sekwencję bajtów inną sekwencją bajtów - więc zawsze warto faktycznie sprawdzić, czy sekwencja bajtów, które zastępujesz, to naprawdę tylko ciąg, który chcesz zastąpić, a nie powiedzmy, kod wykonywalny w podprogramie (co jest mało prawdopodobne, ale nadal).
Parthian Shot
1
Więc po prostu uruchomisz sedpowyższe polecenie, `which nginx`część zwraca ścieżkę do pliku binarnego, a sedpolecenie zamienia bajt.
Parthian Shot
1
Bajty zerowe wspomniane w dalszej części odpowiedzi odnoszą się do faktu, że można użyć nagłówków krótszych niż pełna długość ciągu, o ile zakończy się zamianę bajtem zerowym. en.wikipedia.org/wiki/Null-terminated_string
Parthian Shot
1
Ach. Tak, to plik wykonywalny. Musisz także być użytkownikiem z uprawnieniami do zapisu w pliku. I nie zdziwiłbym się, gdybyś musiał uruchomić się ponownie, nginxaby zmiany zaczęły obowiązywać. Wszystko to powiedział? Nalegam, abyś nie używał jednej z pozostałych odpowiedzi. Jeśli wszystkie rzeczy, o których mówię, nie są Ci znane i nie wiesz, do czego /etcsłuży katalog, to taki hack jest trochę niebezpieczny.
Parthian Shot
2

Jedynym sposobem jest zmodyfikowanie pliku src / http / ngx_http_header_filter_module.c. Zmieniłem nginx w linii 48 na inny ciąg.

To, co możesz zrobić w pliku konfiguracyjnym nginx, to wyłączyć server_tokens . Zapobiegnie to wypisywaniu numeru wersji przez nginx.

Aby to sprawdzić, spróbuj curl -I http://vurbu.com/ | Grep Server

Powinien powrócić

Server: Hai
Jauder Ho
źródło
3
Cóż, to nie jedyny sposób. Inne alternatywy zostały pokazane w innych odpowiedziach.
Radko Dinev
1

Po przeczytaniu odpowiedzi Parthian Shot zagłębiam się w /usr/sbin/nginxplik binarny. Wtedy dowiedziałem się, że plik zawiera te trzy linie.

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

Zasadniczo pierwsze dwa z nich są przeznaczone do server_tokens on;dyrektywy (w tym wersja serwerowa). Następnie zmieniam kryteria wyszukiwania, aby pasowały do ​​tych wierszy w pliku binarnym.

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

Po dalszych poszukiwaniach dowiedziałem się, że komunikat o błędzie generowany przez nginx jest również zawarty w tym pliku.

<hr><center>nginx</center>

Są trzy z nich, jeden bez wersji, dwa z nich zawierały wersję. Więc uruchamiam następujące polecenie, aby zastąpić ciąg nginx w komunikacie o błędzie.

sed -i 's/center>nginx/center>thing/' `which nginx`
Afrig Aminuddin
źródło
Dzięki za to. Ale twoje pierwsze polecenie wykonane w /usr/sbinfolderze daje to:sed: can't read is: No such file or directory
Khom Nazid,
1

Zgodnie z dokumentacją nginx obsługuje wartości niestandardowe, a nawet wykluczenie:

Syntax: server_tokens on | off | build | string;

ale niestety tylko w przypadku subskrypcji komercyjnej :

Dodatkowo, w ramach naszej komercyjnej subskrypcji, począwszy od wersji 1.9.13 podpis na stronach błędów oraz wartość pola nagłówka odpowiedzi „Serwer” można ustawić jawnie za pomocą ciągu znaków ze zmiennymi. Pusty łańcuch wyłącza wysyłanie pola „Serwer”.

adrhc
źródło
0

Wiem, że post jest trochę stary, ale znalazłem proste rozwiązanie, które działa na dystrybucji opartej na Debianie bez kompilowania nginx ze źródeł.

Najpierw zainstaluj pakiet nginx-extras

sudo apt install nginx-extras

Następnie załaduj moduł nagłówków http nginx więcej, edytując plik nginx.conf i dodając następujący wiersz w bloku serwera

moduły load_module / ngx_http_headers_more_filter_module.so;

Gdy to zrobisz, będziesz mieć dostęp do dyrektyw more_set_headers i more_clear_headers.

creekorful
źródło
0

Pakiet Nginx-extra jest teraz przestarzały.

W związku z tym, że teraz zadziałało dla mnie, gdy próbowałem zainstalować różne pakiety more_set_headers 'Serwer: mój własny serwer';

Możesz po prostu wykonać następujące czynności, a żadne informacje o serwerze ani wersji nie zostaną odesłane

    server_tokens '';

jeśli chcesz tylko usunąć numer wersji, to działa

   server_tokens off;
Prajwal
źródło
-4

Czy pytasz o wartość nagłówka serwera w odpowiedzi? Możesz spróbować to zmienić za pomocą dyrektywy add_header, ale nie jestem pewien, czy to zadziała. http://wiki.codemongers.com/NginxHttpHeadersModule

Wasilij
źródło
1
tak, nagłówek serwera. ale czy nie ma prostszego sposobu, na przykład na lighttpd, gdzie mam po prostu server.tag = "cokolwiek"? add_header działa tylko dla kodów odpowiedzi 200, 204, 301, 302 lub 304, więc jeśli serwer jakoś zrobi 500, to nie zadziała
daniels