ฉันสามารถซ่อนข้อมูลเซิร์ฟเวอร์ / ระบบปฏิบัติการทั้งหมดได้หรือไม่


80

ฉันไม่ต้องการให้ใครตรวจพบว่าฉันกำลังใช้ NGINX หรือ Ubuntu จากอินเทอร์เน็ต มีเครื่องมือออกมา (เช่น BuiltWith) ซึ่งจะสแกนเซิร์ฟเวอร์เพื่อตรวจสอบว่ามีเครื่องมือใดบ้างที่ใช้อยู่ นอกจากนี้เครื่องมือถอดรหัสบางตัวอาจช่วยในการตรวจจับ อะไรคือสิ่งที่ดีที่สุด / ใกล้เคียงที่สุดที่ฉันสามารถซ่อนข้อมูลทั้งหมดนี้จากข้างนอก?

คำตอบ:


115

คุณสามารถหยุดการแสดงผลเวอร์ชันของ Nginx และ OS โดยการเพิ่ม

server_tokens off;

ไปhttp, serverหรือlocationบริบท

หรือถ้าคุณต้องการลบส่วนหัวของเซิร์ฟเวอร์โดยสมบูรณ์คุณจะต้องรวบรวม Nginx ด้วยส่วนหัว More โมดูลในเนื่องจากส่วนหัวนั้นได้รับการเข้ารหัสอย่างหนักในแหล่ง Nginx และโมดูลนี้อนุญาตให้เปลี่ยนส่วนหัว http ใด ๆ

 more_clear_headers Server;

อย่างไรก็ตามมีเซิร์ฟเวอร์หลายวิธีซ่อนเร้นโดยไม่ตั้งใจผ่านการใช้งานซึ่งอาจช่วยระบุระบบ เช่นมันตอบสนองต่อคำขอ SSL ที่ไม่ดีได้อย่างไร ฉันไม่เห็นวิธีที่เป็นประโยชน์ในการป้องกันปัญหานี้

บางสิ่งที่ฉันอาจแนะนำ:

  • เปลี่ยนแม่แบบข้อผิดพลาด
  • บล็อกพอร์ตทั้งหมดยกเว้นบริการที่จำเป็น

15
ตกลง ดูตัวอย่างการตรวจจับ OS ของ nmap - ซึ่งจะดูการตอบสนองของโฮสต์เป้าหมายต่อคำขอ IP / TCP และสามารถกำหนดระบบปฏิบัติการได้ มันไม่คุ้มที่จะลงมือทำสิ่งนี้
EEAA

6
+1 ตามคำแนะนำของ ErikA ดีกว่าที่จะรักษาความปลอดภัยเซิร์ฟเวอร์ของคุณให้ดีที่สุดเท่าที่จะทำได้แทนที่จะพึ่งพาความปลอดภัยผ่านความสับสน
Andy Smith

4
โทเค็นเซิร์ฟเวอร์ปิดหมายเลขรุ่นเท่านั้น Nginx ไม่อนุญาตให้ถอดส่วนหัวออกอย่างสมบูรณ์
Martin Fjordvald

45
การไม่คำนึงถึงปัจจัยด้านความปลอดภัยที่สำคัญเช่น "ไม่มีหมายเลขรุ่น" และอาจเป็นไปได้ว่า "ไม่มีชื่อผู้จำหน่ายเซิร์ฟเวอร์" เป็นเพียงแค่ ... ความผิดพลาดเริ่มต้น ของหลักสูตรการรักษาความปลอดภัยผ่านความสับสนไม่ทำอะไรเลยเพื่อความปลอดภัยของคุณเองแต่ก็แน่ใจว่าเป็นนรกอย่างน้อยจะป้องกันโลกมากที่สุดเวกเตอร์โจมตีง่าย - การรักษาความปลอดภัยผ่านความสับสนเป็นสิ่งจำเป็นขั้นตอนที่มันอาจจะเป็นครั้งแรกหนึ่งและควรไม่เคยได้รับการรักษาความปลอดภัยที่ผ่านมา การวัด - การข้ามโดยสมบูรณ์นั้นเป็นความผิดพลาดที่เลวร้ายมากแม้แต่เว็บเซิร์ฟเวอร์ที่ปลอดภัยที่สุดก็สามารถถอดรหัสได้หากทราบว่ามีการโจมตีเวกเตอร์เฉพาะรุ่น
specializt

1
ยังมีชื่อเซิร์ฟเวอร์ที่น่ารำคาญ "Nginx" ที่ส่งคืนในเนื้อความของการตอบสนองการเปลี่ยนเส้นทาง 301 และไม่พบวิธีการหลีกเลี่ยงกฎที่ใช้เทมเพลต html แบบกำหนดเองนั้นไม่ทำงานสำหรับ 301
Guillaume Perrot

31

หากคุณติดตั้ง nginx โดยใช้ apt-get ใน Debian หรือ Ubuntu คุณอาจต้องติดตั้งแพคเกจ nginx-extras เพื่อตั้งค่าหรือล้างส่วนหัว "เซิร์ฟเวอร์"

เมื่อเสร็จแล้วคุณสามารถเพิ่มบรรทัดด้านล่างใน nginx.conf (โดยปกติ /etc/nginx/nginx.conf):

หากต้องการล้างส่วนหัว "เซิร์ฟเวอร์" ทั้งหมด:

more_clear_headers Server; 

ในการตั้งค่าสตริงที่กำหนดเองเป็น "เซิร์ฟเวอร์"

more_set_headers 'Server: some-string-here';

1
ยืนยันแล้วmore_clear_headers Server;ใช้ได้กับ Debian Jessie รุ่น 8.5 nginx: nginx / 1.6.2
Brandon

คำตอบนี้ต้องการ upvotes เพิ่มเติม แม้ว่ามันอาจจะควรสังเกตว่าคำสั่งจะต้องอยู่ในบล็อก http ของไฟล์ conf (ฉันคิดว่า)
Andy

2
งานนี้ในhttp, server, locationและlocation ifบริบท ที่มา: เอกสารประกอบ ngx_headers_more
Kelvin

1
สำหรับผู้ใช้ Ubuntu: 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;ที่จุดเริ่มต้นของไฟล์กำหนดค่า
rapstacke

18

@ มาร์ตินเอฟใช่แล้วใช่ไหม คุณจะต้องรวบรวมจากแหล่งที่มาและเปลี่ยนแปลงสิ่งที่จำเป็นก่อนที่จะรวบรวมแหล่งที่มา

ฉันถือว่าคุณดาวน์โหลดรุ่นเสถียรล่าสุดที่คุณคลายมันและคุณรู้ว่าไฟล์อยู่ที่ไหน หากเป็นเช่นนั้นให้ทำดังนี้

nano src/http/ngx_http_header_filter_module.c

จากนั้นมองหาบรรทัดที่ 48 หากฉันจำได้ถูกต้อง

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

แทนที่ nginx ด้วย MyWhethingServerNameIWant เช่น

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

แล้วก็

nano src/core/nginx.h 

มองหาสาย

#define NGINX_VER          "nginx/" NGINX_VERSION

เปลี่ยน "nginx /" เป็น "MyWhethingServerNameIWant /" ดังนั้นมันจะอ่าน

#define NGINX_VER          "MyWhateverServerNameIWant" NGINX_VERSION

ในที่สุดหากคุณต้องการเปลี่ยนหมายเลขเวอร์ชันด้วย

ค้นหาบรรทัด #define NGINX_VERSION "1.0.4"

และเปลี่ยน "1.0.4" สำหรับเวอร์ชั่นที่คุณต้องการ ตัวอย่างเช่นมันจะอ่าน

#define NGINX_VERSION      "5.5.5"

หวังว่ามันจะช่วย แต่ การรักษาความปลอดภัยเซิร์ฟเวอร์นั้นเกินกว่าจะไม่แสดงสิ่งที่กำลังทำงานอยู่ PHP นั้นไม่ปลอดภัยตามธรรมชาติและก็คือลินุกซ์ ลินุกซ์นอกหลักสูตรค่อนข้างปลอดภัยหากใช้มาตรการที่จำเป็นทั้งหมดเพื่อให้ได้ความปลอดภัยที่เหมาะสม เท่าที่มีความกังวลเกี่ยวกับ PHP ฉันขอแนะนำให้ใช้Suoshinเพื่อช่วยเพิ่มความปลอดภัยให้กับโค้ดของคุณ


4
+1 ขอบคุณ ฉันปล่อยให้ @ Andy's เป็นเจ้าหน้าที่เพียงเพราะวิธีการที่ง่ายขึ้น แต่นี่เป็นข้อมูลที่ยอดเยี่ยม
orokusaki

ฉันคิดว่าคุณหมายถึง Suhosin
ด้วง

7

หลังจากใช้เวลานานในการหาวิธีทำ nginx บนอูบุนตูฉันรู้ว่าคุณสามารถใช้โมดูล lua สำหรับสิ่งนี้ได้

บน Ubuntu 14.04 ถ้าคุณติดตั้งnginx-extrasแพคเกจคุณสามารถลบส่วนหัวของเซิร์ฟเวอร์โดยใช้:

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

ส่งต่อไปนี้ในบล็อก http และทุกคำขอจะไม่มีServerส่วนหัว

ถ้ามันไม่ทำงานnginx -Vเพื่อยืนยันว่าคุณมีโมดูล lua ที่คอมไพล์ลงในสำเนาของ 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ć

6

แทนที่จะใช้header_filter_by_luaขอแนะนำให้ใช้คำสั่งheader_filter_by_lua_blockใหม่ซึ่งอินไลน์แหล่ง Lua โดยตรงระหว่างเครื่องหมายปีกกา ( {}) ด้วยวิธีนี้มันไม่จำเป็นต้องหลบหนีตัวละครพิเศษ

header_filter_by_lua_block { ngx.header["server"] = nil }

https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block


1

ก่อนอื่น: ทำไมใช้โมดูลพิเศษเป็นส่วนหัว Nginx เพิ่มเติม? เพื่อซ่อนส่วนหัวของเซิร์ฟเวอร์เท่านั้น หากมีไม่กี่บรรทัดแพทช์ง่ายสามารถเข้าถึงโซลูชั่นเดียวกันสำหรับคุณ

การใช้โมดูลพิเศษอาจส่งผลให้เกิดความไม่เสถียร (มีการทดสอบกับสภาพแวดล้อมของคุณดีแค่ไหนกับโมดูลอื่น ๆ ของคุณเป็นต้น) หรือความไม่มั่นคง (โมดูลนี้มีการอัปเดตเป็นประจำพร้อมกับแก้ไขข้อบกพร่องและ /

ในประการที่สอง เธรดนี้อธิบายว่าเป็นการตอบกลับ 279389 วิธีที่คุณสามารถปรับรหัส Nginx เพื่อเปลี่ยนส่วนหัวของเซิร์ฟเวอร์ ปัญหาคือพวกเขาลืม HTTP / 2 ในระยะสั้นไม่มีอะไรเปลี่ยนแปลง ส่วนหัวของเซิร์ฟเวอร์จะยังคงมองเห็นได้

ยิ่งน้อยยิ่งดียิ่งดี ตกลงฉันยอมรับฉันยังได้มองหาทางออกที่ดีเป็นเวลานาน แต่ในที่สุดก็พบว่า:

แพทช์การลบส่วนหัวเซิร์ฟเวอร์ Nginx

ในที่สุดฉันก็แลกจากส่วนหัวของเซิร์ฟเวอร์ Nginx ที่น่ารำคาญ


0

เรียกใช้ฟังก์ชัน bash นี้ในโฟลเดอร์ซอร์สโค้ดของ nginx ในรุ่น nginx- $ ไม่ใช่ใน src /

ตามคำตอบนี้

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
}

-1

อ้างถึงส่วนสำคัญนี้ แน่นอนจะช่วยให้คุณ


9
ยินดีต้อนรับสู่ Server Fault! ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
เจอรัลด์ชไนเดอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.