모든 서버 / OS 정보를 숨길 수 있습니까?


80

인터넷에서 NGINX 또는 Ubuntu를 사용하고 있음을 누군가가 감지하지 못하게하고 싶습니다. 서버를 스캔하여 사용중인 도구를 감지하는 도구 (예 : BuiltWith)가 있습니다. 또한, 일부 크래킹 도구는 제거에 도움이 될 수 있습니다. 이 모든 정보를 외부에서 숨길 수있는 가장 좋은 방법은 무엇입니까?

답변:


115

추가하여 Nginx 및 OS 버전 출력을 중지 할 수 있습니다

server_tokens off;

A와 http, server또는 location상황.

또는 서버 헤더를 완전히 제거하려면 헤더가 Nginx 소스에 하드 코딩되어 있으며이 모듈을 사용하면 http 헤더를 변경할 수 있으므로 Headers More 모듈을 사용하여 Nginx를 컴파일해야합니다.

 more_clear_headers Server;

그러나 서버가 구현을 통해 실수로 시스템을 식별하는 데 도움이되는 숨겨진 방법이 많이 있습니다. 예 : 잘못된 SSL 요청에 응답하는 방법 이것을 막는 실용적인 방법은 보이지 않습니다.

내가 제안 할 수있는 것 중 일부 :

  • 오류 템플릿 변경
  • 필요한 서비스를 제외한 모든 포트를 차단

15
동의했다. 예를 들어 nmap의 OS 감지를 살펴보십시오. 이는 IP / TCP 요청에 대한 대상 호스트의 응답을보고 해당 방식으로 OS를 결정할 수 있습니다. 노력을 기울일 가치가 없습니다.
EEAA

6
ErikA의 조언에 +1. 모호성을 통해 보안에 의존하는 것보다 서버를 최대한 안전하게 보호하는 것이 좋습니다.
Andy Smith

4
서버 토큰은 버전 번호 만 끕니다. Nginx는 헤더를 완전히 제거 할 수 없습니다.
Martin Fjordvald

45
"버전 번호 없음"및 아마도 "서버 공급 업체 이름 없음"과 같은 중요한 보안 요소를 무시하는 것은 완전히 초보자 실수입니다. 물론 무명을 통해 보안이 보안 자체에 대한 아무것도 안 하지만, 그것은 적어도 가장 평범한, 단순한 공격에 대해 보호 할 지옥으로 확인 - 무명을 통해 보안이입니다 필요한 단계는 첫 번째 일 수 있고,해야 결코 마지막으로 보안 할 수 없습니다 측정-완전히 건너 뛰는 것은 매우 나쁜 실수이며, 버전 별 공격 경로가 알려진 경우 가장 안전한 웹 서버조차도 크랙 될 수 있습니다.
specializt

1
301 경로 재 지정 응답의 본문에 여전히 성가신 서버 이름 "Nginx"가 리턴되었으며이를 피할 수있는 방법을 찾지 못했습니다. 사용자 정의 html 템플리트를 사용하는 규칙은 301에서 작동하지 않습니다.
Guillaume Perrot

31

데비안 또는 우분투에서 apt-get을 사용하여 nginx를 설치 한 경우 nginx-extras 패키지를 설치하여 "서버"헤더를 설정하거나 지우십시오.

이 작업이 완료되면 nginx.conf (보통 /etc/nginx/nginx.conf)에 아래 줄을 추가 할 수 있습니다.

"서버"헤더를 모두 지우려면 :

more_clear_headers Server; 

사용자 정의 문자열을 "서버"로 설정하려면

more_set_headers 'Server: some-string-here';

1
확인 된 more_clear_headers Server;작품뿐만 아니라 데비안 제시 8.5의 nginx 버전 : nginx를 / 1.6.2
브랜든

이 답변에는 더 많은 투표가 필요합니다. 비록 지시어는 conf 파일의 http 블록 안에 위치해야한다는 점을 명심해야 할 것입니다 (제 생각에)
Andy

2
이 작품 http, server, location, 및 location if상황. 출처 : ngx_headers_more documentation
Kelvin

1
우분투 사용자 : sudo apt-get install nginx-extras 헤더 설정
jchnxu

나를 위해 이것은 실패했습니다 unknown directive "more_set_headers". 에서 모듈을 명시 적으로 활성화하여 해결했습니다 /etc/nginx/nginx.conf. load_module modules/ngx_http_headers_more_filter_module.so;구성 파일의 시작 부분에 추가하기 만하면 됩니다.
랩 스택

18

@Martin F. 그렇습니다. 소스에서 컴파일하고 소스를 컴파일하기 전에 필요한 것을 변경해야합니다.

압축을 푼 마지막 안정적인 버전을 다운로드했다고 가정하고 파일의 위치를 ​​알고 있습니다. 이 경우 다음을 수행하십시오.

nano src/http/ngx_http_header_filter_module.c

그런 다음 올바르게 기억하면 48 행을 찾으십시오.

static char ngx_http_server_string[] = "Server: nginx" CRLF;

nginx를 MyWhateverServerNameIWant로 바꾸십시오. 예 :

static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF; 

그때

nano src/core/nginx.h 

줄을 찾으십시오

#define NGINX_VER          "nginx/" NGINX_VERSION

"nginx /"를 "MyWhateverServerNameIWant /"로 변경하십시오.

#define NGINX_VER          "MyWhateverServerNameIWant" NGINX_VERSION

마지막으로 버전 번호도 변경하려면

#define NGINX_VERSION "1.0.4"줄을 찾으십시오.

원하는 버전에 맞게 "1.0.4"를 변경하십시오. 예를 들어

#define NGINX_VERSION      "5.5.5"

도움이 되길 바랍니다. 그렇지만. 서버 보안은 실행중인 것을 보여주지 않습니다. PHP는 본질적으로 안전하지 않으며 Linux도 마찬가지입니다. 물론 리눅스는 적절한 보안을 달성하기 위해 필요한 모든 조치를 취하면 상당히 안전 할 수 있습니다. PHP에 관해서는 Suoshin 을 사용 하여 코드의 보안을 강화하는 것이 좋습니다 .


4
+1 감사합니다. 나는 쉬운 접근 방식 때문에 @Andy를 공식적으로 남겨두고 있지만 이것은 훌륭한 정보입니다.
orokusaki

수호신을 의미한다고 생각합니다.
Beetle

7

우분투에서 nginx의 사용자 정의 풍미를 수행하는 방법을 많은 시간을 들여서 연구 한 결과, lua 모듈을 사용할 수 있다는 것을 깨달았습니다.

우분투 14.04에서 nginx-extras패키지 를 설치하면 다음 을 사용하여 서버 헤더를 제거 할 수 있습니다.

header_filter_by_lua 'ngx.header["server"] = nil';

http 블록에 이것을 던지면 모든 요청에 Server헤더가 없습니다.

작동하지 않으면 nginx -Vlua 모듈이 nginx 사본에 컴파일되어 있는지 확인하십시오. 그렇지 않은 경우 다른 패키지를 사용할 수 있습니다.


이것이 Debian Jessie 8.5 nginx 버전에서 작동 함을 확인했습니다 : nginx / 1.6.2
Brandon

1
데비안 시험에서이 작동하지 않고 설치 nginx-extra만든 more_set_headers "Server: whatever";작품, 그래서 +1 : D
Shautieh

이 기능을 사용하려면 LUA 만 활성화하면됩니다. Tnx
glavić


1

가장 먼저 : 왜 추가 모듈을 Headers More Nginx로 사용합니까? 서버 헤더 만 숨 깁니다. 몇 줄이면 간단한 패치가 동일한 솔루션에 도달 할 수 있습니다.

추가 모듈을 사용하면 불안정성 (환경 테스트가 잘 되었습니까? 다른 모듈 등)이 불안정하거나 불안정 할 수 있습니다 (이 모듈은 버그 및 / 또는 보안 관련 수정 사항으로 정기적으로 업데이트됩니까?).

둘째로. 이 스레드는 Nginx 코드를 조정하여 서버 헤더를 변경하는 방법을 응답 279389로 설명합니다. 문제는 그들이 HTTP / 2를 잊었다는 것입니다. 요컨대, 아무것도 변하지 않을 것입니다. 서버 헤더는 여전히 보입니다.

더 적은 것이 좋습니다. 좋아, 나는 또한 좋은 해결책을 오랫동안 찾고 있었다. 그러나 마침내 발견 :

Nginx 서버 헤더 제거 패치

나는 그 성가신 Nginx 서버 헤더에서 마침내 사용되었습니다.


0

nginx 소스 코드 폴더에서이 bash 기능을 실행하십시오. src /가 아닌 nginx- $ version에서.

이 답변을 기반 으로합니다 .

hidengxver () {
read -r -p "Your own http_server_string for safety: " http_server_string
first_string="static char ngx_http_server_string\[\] = \"Server: nginx\" CRLF;"
second_string="static char ngx_http_server_string\[\] = \"$http_server_string\" CRLF;"
sed -ire "s/$first_string/$second_string/g" src/http/ngx_http_header_filter_module.c

read -r -p "Your own NGINX_VER const: " nginx_ver
third_string="\#define NGINX\_VER          \"nginx\/\" NGINX\_VERSION"
forth_string="\#define NGINX\_VER          \"$nginx_ver\" NGINX\_VERSION"
sed -ire "s/$third_string/$forth_string/g" src/core/nginx.h

real_nginx_version=$( grep '#define NGINX_VERSION' src/core/nginx.h | gawk -F'"' '{print $2}' )
read -r -p "Your own NGINX_VERSION const: " new_nginx_version
fifth_string="\#define NGINX\_VERSION      \"$real_nginx_version\""
sixth_string="\#define NGINX\_VERSION      \"$new_nginx_version\""
sed -ire "s/$fifth_string/$sixth_string/g" src/core/nginx.h
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.