nginx가 반환 한 서버 헤더를 어떻게 변경합니까?


141

버전을 숨겨서 nginx 만 표시하도록 옵션이 있지만 아무것도 숨기거나 헤더를 변경하지 않도록 숨길 수있는 방법이 있습니까?


34
btw, nginx 버전을 숨기려면 'server_tokens off'를 설정해야합니다.
yanchenko 2016 년

2
헤더에서 nginx를 제거하려는 경우 리디렉션 및 오류 페이지에서 nginx를 제거 할 수도 있습니다.
fabianegli

답변:


57

Apache와 마찬가지로 소스를 빠르게 편집하고 다시 컴파일합니다. 에서 Calomel.org :

Server : 문자열은 실행중인 http 서버 유형 및 가능한 버전을 알려주기 위해 클라이언트로 다시 전송되는 헤더입니다. 이 문자열은 Alexia 및 Netcraft와 같은 장소에서 인터넷에 존재하는 웹 서버 수와 ​​유형에 대한 통계를 수집하는 데 사용됩니다. Nginx의 저자 및 통계를 지원하려면이 문자열을 그대로 유지하는 것이 좋습니다. 그러나 보안을 위해 사람들이 실행중인 것을 알지 못하게하고 소스 코드에서이를 변경할 수 있습니다. 소스 파일 src/http/ngx_http_header_filter_module.c 을 편집하여 48 행과 49 행을보십시오. 문자열을 원하는 것으로 변경할 수 있습니다.

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

2011 년 3 월 편집 : Nginx의 표준 HttpHeadersModule 을 갈래의 HttpHeadersMoreModule로 대체하여 새로운 옵션을 지적하기 위해 아래의 Flavius를 제안 합니다. 표준 모듈을 다시 컴파일하는 것은 여전히 ​​빠른 해결 방법이며 표준 모듈을 사용하고 서버 문자열을 자주 변경하지 않는 경우에 적합합니다. 그러나 그 이상을 원한다면 HttpHeadersMoreModule은 강력한 프로젝트이며 HTTP 헤더로 모든 종류의 런타임 블랙 매직을 수행 할 수 있습니다.


18
'server_tokens off;'사용 가장 쉬운 방법입니다 ... "http"또는 "server"블록에 배치하십시오
farinspace

35
버전 번호는 숨겨져 있지만 문제는 "버전 번호를 숨길 수 있다는 것을 알고 있습니다. 전체 '서버'문자열을 어떻게 변경하거나 삭제합니까?" 즉시 사용 가능한 nginx를 사용하여이를 수행 할 방법이 없습니다.
joelhardi

서버 헤더를 완전히 제거하는 또 다른 빠른 수정 (버전 1.7.8의 경우)은 49 행 및 50 행 (위 48 행, 49 행에 해당), 280-283 및 458-469를 주석 처리합니다. 나중에 참조 할 수 있도록 마지막 두 개는 모두 if 블록으로 설정 r->headers_out.server됩니다.
pauluss86

3
이 대답은 지금은 조금 낡았지만 @jamescampbell의 대답은 이제 더 정확합니다.
jmcollin92

이 방법을 사용하여 서버를 마스킹하려는 경우 src / http / ngx_http_special_response.c 파일을 편집하여 서버의 오류 메시지를 변경할 수도 있습니다.
Brogan

143

nginx를 사용하여 백엔드 애플리케이션을 프록시하고 백엔드가 Server:nginx를 겹쳐 쓰지 않고 자체 헤더를 알리려면 server {…}스탠자 내부로 이동하여 다음을 설정할 수 있습니다 .

proxy_pass_header Server;

그러면 nginx가 해당 헤더 만 남겨두고 백엔드가 설정 한 값을 다시 쓰지 않도록합니다.


11
보안상의 이유로이 변경을 수행하는 경우 이것으로 충분하지 않습니다. 서버에서 오류 메시지를 반환해야하는 경우 헤더는 여전히 'nginx'입니다.
KC Baltz

10
이 방법으로 문제를 쉽게 해결할 수 있지만 고려해야 할 사항이 있습니다. 리버스 프록시를 사용할 때 정적 파일은 nginx를 통해 제공되므로, 예를 들어 firebug net 패널에서 이미지를 열면 여전히 서버를 nginx로 볼 수 있습니다
dav

IMO, 이것이 최선의 대답입니다. 이 솔루션은 특별한 소프트웨어 확장이 필요하지 않으며 기본 nginx와 함께 작동합니다.
Kris

81

마지막 업데이트는 얼마 전에 이루어 졌으므로 우분투에서 나를 위해 일한 것은 다음과 같습니다.

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

그런 다음 /etc/nginx/nginx.conf에 있는 http섹션에 다음 두 줄을 추가하십시오 nginx.conf.

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

또한로 nginx를 다시 시작하는 것을 잊지 마십시오 sudo service nginx restart.


2
YUM과 비슷한 것이 있습니까? yum install nginx-extras가 작동하지 않았습니다.
PKHunter

3
@ PKHunter 나는 YUM의 악마의 혀에서 그것을 시도하지 않았지만 찾을 수있는 것을 볼 것입니다.
jamescampbell

2
이것이 가장 좋은 대답입니다. 받아 들여야합니다. 이것은 모든 경우에 답하는 유일한 것입니다.
jmcollin92

6
빈 문자열을 서버로 설정 : 서버 헤더를 억제합니다 :more_set_headers 'Server: ';
Cody Craven

1
이것은 어떤 종류의 재 컴파일없이 매력처럼 작동합니다. 잘 했어요;)
MitchellK

37

간단하게 /etc/nginx/nginx.conf를 편집하고 주석을 제거하십시오.

#server_tokens off;

http 섹션을 검색 하십시오.


3
이것은 잘 작동합니다.이 작업을 수행하면 헤더 정보에서 서버에 대해 볼 수있는 모든 정보가 있습니다 : nginx (버전 번호 없음) 감사합니다! : D
jacktrade

13
질문 작성자는이 옵션에 대해 이미 알고 있습니다.이 옵션은 버전 번호를 제거하지만 "서버"헤더에 반환되는 값을 사용자 지정할 수는 없습니다.
Makotosan

12
모든 것을 숨기는 것이 아니라 서버 버전 만 숨 깁니다.
디지털 사이트

3
Server = nginx에 대한 응답 헤더를 제거하지 않습니다
sasha

nginx 버전을 전달하는 것이 보안 문제라고 생각합니다. 많은 사람들에게 이것은 "충분한"솔루션입니다. 또한 포트 80 및 443에 대한 서버 블록이있는 경우 각 서버 블록에 들어가야합니다.
Jeremy

35

매우 간단합니다. 서버 섹션에 다음 줄을 추가하십시오.

server_tokens off;
more_set_headers 'Server: My Very Own Server';

10
이를 위해 타사 모듈 wiki.nginx.org/HttpHeadersMoreModule 을 사용하여 nginx를 컴파일해야 합니다
hostmaster

10
우분투에서 설치 nginx-extra하면 해당 모듈을 얻을 수 있습니다 .
Stan Bondi

11
우리가 apt-get autoexpansion을 믿는다면, 그것은 끝에 "s"가있는 nginx-extras입니다
Tjunkie

1
기존 Server : value를 재정의하려면 "Server :"접두사가 필요합니다.
elBradford

25

특별한 모듈이 있습니다 : http://wiki.nginx.org/NginxHttpHeadersMoreModule

이 모듈을 사용하면 지정한 출력 또는 입력 헤더를 추가, 설정 또는 지울 수 있습니다.

이 표준의 향상된 버전이다 헤더 가 같은 "헤더 내장"리셋 또는 소거와 같은 유틸리티를 더 제공하기 때문에 모듈 Content-Type, Content-LengthServer.

또한 more_set_headersmore_clear_headers 지시문으로 출력 헤더를 수정하는 동안 옵션을 -s사용하여 선택적 HTTP 상태 코드 기준을 지정하고 옵션을 사용하여 선택적 컨텐츠 유형 기준 을 지정할 수 있습니다 ...-t


3
--add-module=/path-to-headers-more-nginx-module
mate64로

OpenResty로 이동 한 것 같습니다 : github.com/openresty/headers-more-nginx-module#readme
Ben Creasy

Centos 7의 소스에서 nginx를 다시 컴파일하지 않고도이 모듈을 얻는 방법이 있습니까?
Prachi

19

Nginx Extras 설치

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

nginx.conf (http 섹션 아래)에 다음 두 줄을 추가하여 서버 세부 정보를 응답에서 제거 할 수 있습니다.

more_clear_headers Server;
server_tokens off;

하나, 이것은 @jamescampbell이 위에서 언급 한 것입니다. 둘째, 이것은 소스에서 Nginx를 컴파일해야합니다 ( yum install nginx-extras작동하지 않습니다-Debia / Ubuntu 등에서 작동한다고 가정 apt-get합니다)
Khom Nazid

소스에서 nginx를 컴파일하지 않고도 작동합니다. 당신은 모듈을로드해야합니다 nginx.conf에서 ngx_http_headers_more_filter_module
creekorful

"apt-get install nginx-extras"를 실행 한 후, 내 nginx 버전을 1.16에서 1.14로 다운 그레이드했습니다.
grayaii

15

헤더를 5 자 이하의 다른 문자열로 변경해도 괜찮다면 바이너리를 패치하면됩니다.

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

솔루션으로서 몇 가지 주목할만한 장점이 있습니다. 즉, 배포판에 nginx-extras를 사용할 수 없어도 패키지 관리자가 nginx 버전 관리를 처리 할 수 ​​있으므로 소스에서 컴파일하지 않아도되며 추가 사항에 대해 걱정할 필요가 없습니다. nginx-extras와 같은 코드가 취약합니다.

물론 옵션을 설정 server_tokens off하거나 버전 번호를 숨기거나 해당 형식 문자열도 패치하려고합니다.

물론 "5 글자 이하"라고 말하면 언제든지 바꿀 수 있습니다.

nginx \ r \ 0

밥 \ r \ 0 \ r \ 0

마지막 두 바이트는 변경하지 않고 그대로 둡니다.

실제로 5 자 이상을 원한다면 server_tokens를 그대로두고 (약간 더 긴) 형식 문자열을 바꾸고 싶지만 형식 문자열의 길이에 의해 부과되는 길이의 상한은 1이지만 캐리지 리턴).

... 위의 내용 중 어느 것도 당신에게 의미가 없거나 이전에 바이너리를 패치 한 적이 없다면이 접근법을 멀리하고 싶을 수도 있습니다.


1
@PKHunter 흠? 이것의 장점은 처음부터 컴파일 할 필요없이 작동한다는 것 입니다. 소스 코드가 없습니다. 컴파일 된 바이너리를 직접 패치하고 있습니다.
Parthian Shot

1
그것은 파일 형식을 전혀 알지 못합니다-바이트 시퀀스를 다른 바이트 시퀀스로 바꾸는 것입니다. 따라서 실제로 바꾸려는 바이트 시퀀스가 ​​실제로 바꾸려는 문자열인지 확인하는 것이 좋습니다. 예를 들어, 서브 루틴의 실행 코드 (아마 가능성은 없지만 여전히).
Parthian Shot

1
따라서 sed위의 명령을 실행 하면 `which nginx`부품이 이진 경로를 반환하고 sed명령은 바이트 교체를 수행합니다.
파르티아 샷

1
대답의 뒷부분에 나오는 null 바이트는 null 바이트로 대체를 끝내는 한 문자열의 전체 길이보다 짧은 헤더를 사용할 수 있다는 사실을 나타냅니다. en.wikipedia.org/wiki/Null-terminated_string
Parthian Shot

1
아 예, 실행 파일입니다. 또한 파일에 대한 쓰기 권한이있는 사용자 여야합니다. nginx변경 사항을 적용하기 위해 다시 시작해야하더라도 놀라지 않을 것 입니다. 그게 다야? 다른 답변 중 하나를 사용하지 말 것을 촉구합니다. 내가 말하는 모든 것이 이미 익숙하지 않고 /etc디렉토리가 무엇인지 모르는 경우 이와 같은 해킹은 위험합니다.
Parthian Shot

2

유일한 방법은 src / http / ngx_http_header_filter_module.c 파일을 수정하는 것입니다. 48 번째 줄의 nginx를 다른 문자열로 변경했습니다.

nginx 설정 파일에서 할 수있는 일은 server_tokens 를 off 로 설정 하는 것입니다. 이것은 nginx가 버전 번호를 인쇄하지 못하게합니다.

내용을 확인하려면 curl -I http://vurbu.com/ | grep 서버

돌아와야한다

Server: Hai

3
글쎄, 그게 유일한 방법은 아닙니다. 다른 대안들에 다른 대안들이 제시되어있다.
Radko Dinev

1

Parthian Shot의 답변을 읽은 후 /usr/sbin/nginx바이너리 파일을 파헤칩니다 . 그런 다음 파일 에이 세 줄이 포함되어 있음을 알았습니다.

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

기본적으로 처음 두 개는 server_tokens on;지시문 (서버 버전 포함)을위한 것입니다. 그런 다음 이진 파일 내의 해당 줄과 일치하도록 검색 기준을 변경합니다.

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

더 멀리 파고 난 후 nginx에 의해 생성 된 오류 메시지 가이 파일에 포함되어 있음을 알았습니다.

<hr><center>nginx</center>

버전이없는 3 개가 있고 그 중 2 개에는 버전이 포함되어 있습니다. 따라서 오류 메시지 내에서 nginx 문자열을 바꾸려면 다음 명령을 실행하십시오.

sed -i 's/center>nginx/center>thing/' `which nginx`

고마워 그러나 내부에서 실행되는 첫 번째 명령 /usr/sbin폴더는이 산출 :sed: can't read is: No such file or directory
Khom Nazid에게

1

nginx 문서 에 따르면 사용자 정의 값 또는 제외를 지원합니다.

Syntax: server_tokens on | off | build | string;

그러나 슬프게도 상업적 구독으로 만 :

또한 상용 구독의 일부로 버전 1.9.13부터 오류 페이지의 서명 및 "서버"응답 헤더 필드 값을 변수가있는 문자열을 사용하여 명시 적으로 설정할 수 있습니다. 빈 문자열은 "서버"필드의 방출을 비활성화합니다.


0

게시물이 다소 오래되었다는 것을 알고 있지만 소스에서 nginx를 컴파일하지 않고 데비안 기반 배포판에서 작동하는 쉬운 솔루션을 찾았습니다.

먼저 nginx-extras 패키지 설치

sudo apt 설치 nginx-extras

그런 다음 nginx.conf를 편집하고 서버 블록 안에 다음 줄을 추가하여 nginx http 헤더 더 많은 모듈을로드하십시오.

load_module 모듈 /ngx_http_headers_more_filter_module.so;

완료되면 more_set_headers 및 more_clear_headers 지시문에 모두 액세스 할 수 있습니다.


0

Nginx-extra 패키지는 더 이상 사용되지 않습니다.

따라서 다양한 패키지를 설치하려고 시도했을 때 다음이 이제 작동했습니다. more_set_headers 'Server : My Very Own Server';

다음을 수행하면 서버 또는 버전 정보가 다시 전송되지 않습니다.

    server_tokens '';

버전 번호를 제거하려는 경우 작동합니다.

   server_tokens off;

-4

응답에서 서버 헤더 값에 대해 묻고 있습니까? add_header 지시문으로 변경해 볼 수 있지만 작동하는지 확실하지 않습니다. http://wiki.codemongers.com/NginxHttpHeadersModule


1
예, 서버 헤더 하지만 예를 들어 server.tag = "whatever"가있는 곳과 같이 lighttpd와 같은 더 깨끗한 방법이 있습니까? add_header는 서버가 어떻게 든 500을한다면 그래서 것, 응답 코드 200, 204, 301, 302 또는 304를위한뿐만 아니라 작업을 작동
다니엘스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.