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-Length및 Server.

또한 more_set_headers 및 more_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.