การป้องกันแอ็พพลิเคชันอื่นจากการเชื่อมกับพอร์ต 80 และ 443


16

สัปดาห์ที่แล้วฉันได้รับโทรศัพท์จากลูกค้าที่กลัวเพราะเขาคิดว่าเว็บไซต์ของเขาถูกแฮ็ก เมื่อฉันค้นหาเว็บไซต์ของเขาฉันเห็นapache2หน้าเริ่มต้น คืนนั้นเซิร์ฟเวอร์ของฉัน ( Ubuntu 16.04 LTS) อัพเกรดและรีบูตแล้ว โดยปกติเมื่อมีสิ่งผิดปกติฉันจะได้รับการแจ้งเตือนในช่วงกลางคืน เวลานี้ไม่ได้เนื่องจากระบบการตรวจสอบจะตรวจสอบรหัสสถานะ HTTP 200 และapache2หน้าเริ่มต้นจะมาพร้อมกับรหัสสถานะ 200

สิ่งที่เกิดขึ้นคือในระหว่างการเริ่มต้นapache2เร็วกว่าที่จะผูกกับพอร์ต 80 และ 443 กว่าเว็บเซิร์ฟเวอร์จริงของฉัน nginx ฉันไม่ได้ติดตั้ง apache2 ด้วยตนเอง ผ่านaptitude why apache2ฉันพบ php7.0 แพ็คเกจต้องการมัน

การเอาออกเพียงอย่างเดียวapache2จะไม่ทำงานเพราะ php7.0 นั้นต้องการมัน เป็นไปได้หรือไม่ที่จะสร้างข้อ จำกัด เพื่ออนุญาตให้ nginx เท่านั้นที่เชื่อมโยงกับพอร์ต 80 และ 443

โซลูชันอื่น ๆ ก็ยินดีต้อนรับเช่นกัน


15
และนี่คือเหตุผลที่คุณควรกำหนดค่าเซิร์ฟเวอร์ที่ใช้งานจริงของคุณให้อัปเดตเฉพาะเมื่อคุณร้องขอการอัปเดตอย่างชัดเจนดังนั้นคุณสามารถทดสอบการอัปเดตของคุณบนเครื่องพัฒนา
Nzall

2
ฉันไม่ได้ทดสอบการอัพเกรดบนเครื่องทดสอบก่อน แต่อย่าทำการตรวจสอบการเปลี่ยนแปลงก่อนที่จะทำการตั้งเวลาการอัพเกรดด้วยตนเอง นอกจากนี้ยังดูเหมือนว่า apache2 จะลื่นไหลในระหว่างการอัพเกรดก่อนหน้านี้ เพียงแค่ว่าเวลานี้มันรีบูต apache2 เป็นคนแรกที่ผูกกับพอร์ต http และ https
บอยด์

9
ตามบันทึกข้าง This time not, because the monitoring system checks for HTTP status code 200- คุณสามารถปรับปรุงระบบการตรวจสอบโดยการทำให้มันตรวจสอบเนื้อหาจริงของหน้าเว็บ (บางสตริงเฉพาะในส่วนของร่างกายหรือส่วนหัว) ซึ่งจะมีความน่าเชื่อถือมากขึ้น
VL-80

2
@Boyd ฉันไม่ได้ทดสอบการอัพเกรดบนเครื่องทดสอบก่อน แต่ทำการตรวจสอบการเปลี่ยนแปลงเสมอแต่คุณเพิ่งพบว่าวิธีการที่ไม่น่าเชื่อถือนั้นเป็นอย่างไร การอ่านการเปลี่ยนแปลงไม่สามารถบอกคุณได้ว่าผลกระทบต่อระบบที่ถูกปรับใช้จะเป็นอย่างไรและจะไม่บอกคุณเกี่ยวกับข้อบกพร่องหรือความเข้ากันไม่ได้ที่เกิดขึ้น
Andrew Henle

5
@Nzall ยุติธรรมดูเหมือนว่าปัญหาประเภทนี้อาจไม่ปรากฏในเครื่องทดสอบ ... เขามีสภาพการแข่งขันอย่างมีประสิทธิภาพว่า apache2 หรือ nginx จะผูกพอร์ตและเครื่องทดสอบอาจจบลงด้วยเหตุผล nginx win (โดยบังเอิญ) ในช่วงระยะเวลาของการทดสอบดังนั้นปัญหาจะไม่ถูกค้นพบ
Doktor J

คำตอบ:


29

คุณไม่สามารถป้องกันพอร์ตไม่ให้เชื่อมโยงกับบริการที่ไม่ถูกต้อง ในกรณีของคุณเพียงลบ apache จาก autostart และคุณควรจะดี

สำหรับ 16.04 และใหม่กว่า:

sudo systemctl disable apache2

สำหรับ Ubuntu รุ่นเก่า:

sudo update-rc.d apache2 disable

2
ฉันจะทำเช่นนี้ แต่ฉันหวังว่าฉันจะสามารถป้องกันตัวเองจากสถานการณ์ในอนาคตที่มีแพ็คเกจอื่นที่เชื่อมต่อกับพอร์ต 80 และ 443 ติดตั้งบนระบบของฉันโดยไม่รู้ตัวเนื่องจากเป็นแพ็กเกจอื่น
บอยด์

1
เนื่องจากนี่คือ 16.04 เช่นกัน:systemctl disable apache2
muru

12
@Boyd: ทำไมคุณติดตั้งแพคเกจ "ไม่รู้" ทำไมสุ่มสี่สุ่มห้า ทำไมบนเซิร์ฟเวอร์ที่ใช้งานโดยลูกค้าของคุณคุณยังไม่ได้อ่านแพคเกจและการอ้างอิงที่กำลังติดตั้งอยู่ แล้วทำไมคุณไม่ทดสอบทุกอย่างบนเซิร์ฟเวอร์มิเรอร์ก่อนดำเนินการ นี่เป็นหลักการทำงานพื้นฐานและจะแก้ปัญหาทั้งหมดของคุณ
การแข่งขัน Lightness กับโมนิก้า

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

3
@Boyd: "แต่น่าเสียดายที่เราไม่สามารถทดสอบการดำเนินการทุกครั้งบนเซิร์ฟเวอร์จำลองก่อน"ทำไมล่ะ? ลูกค้าของคุณทราบหรือไม่ว่าคุณข้ามขั้นตอนนี้
การแข่งขัน Lightness กับโมนิก้า

27

หากคุณไม่ได้ใช้จริงๆapache2และเป็น PHP 7.0 ที่ต้องการมันก็ดูเหมือนว่าคุณได้libapache2-mod-php7.0ติดตั้งแล้ว แพ็คเกจนั้นไม่มีประโยชน์หากไม่มี Apache เนื่องจากคุณใช้ nginx คุณอาจจะมีphp7.0-fpmหรือphp7.0-cgiติดตั้งซึ่งทั้งสองอย่างนั้นเพียงพอสำหรับความphp7.0ต้องการด้านการพึ่งพา:

$ apt-cache depends php7.0
php7.0
 |Depends: php7.0-fpm
 |Depends: libapache2-mod-php7.0
  Depends: php7.0-cgi
  Depends: php7.0-common
  Conflicts: <php5>

หากคุณphp7.0-{fpm,cgi}ติดตั้งอย่างใดอย่างหนึ่งคุณสามารถไปข้างหน้าและถอนการติดตั้ง Apache


6
ฉันเรียนรู้วันนี้จริง ๆ แล้วว่าในสถานการณ์ของฉันฉันดีกว่าด้วยการติดตั้งphp7.0-fpmไม่ใช่php7.0แพ็คเกจ นี้ยังให้คำแนะนำโดยOndřej Sury github.com/oerdnj/deb.sury.org/wiki/...
บอยด์

5
นี่คือทางออกที่แท้จริงของปัญหาจริง: วิธีการติดตั้ง nginx และ PHP บน Ubuntu โดยไม่ต้องติดตั้ง Apache
David Cullen

2

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

/server//a/257056/392230

ในคำตอบนั้น wzzrd ดูเหมือนจะแสดงวิธีการอนุญาตเฉพาะแอปพลิเคชัน (foo) เพื่อผูกเข้ากับพอร์ตเฉพาะ (803) คุณเพียงแค่ต้องมีการตั้งค่านโยบายเพื่อให้เฉพาะแอปพลิเคชันของคุณ (nginx) ได้รับอนุญาตพอร์ตที่คุณระบุ (80 และ 443)

การอ้างอิงตัวเองตามคำตอบของ wzzrd อาจเป็นเรื่องง่ายเหมือนการเพิ่มสิ่งนี้ในนโยบาย

allow nginx_t nginx_port_t:tcp_socket name_bind;

และเรียกใช้สิ่งนี้

semanage port -a -t nginx_port_t -p tcp 80
semanage port -a -t nginx_port_t -p tcp 443

แม้ว่าฉันคิดว่าคุณจะต้องมีบรรทัดในนโยบายที่ระบุว่าไม่มีโปรแกรมอื่นใดที่สามารถเชื่อมโยงกับพอร์ตเหล่านั้นได้

ในท้ายที่สุดฉันแค่คาดเดาว่าการกำหนดค่าที่เหมาะสมคืออะไร

อย่างไรก็ตามฉันไม่คิดว่าจะมี Ubuntu ที่ติดตั้งและเปิดใช้งาน SElinux เป็นค่าเริ่มต้น เนื่องจากฉันเชื่อว่ามันต้องใช้การปะแก้บางอย่างกับยูทิลิตี้ต่าง ๆ และตัวเลือกเคอร์เนลมันอาจจะง่ายกว่าที่จะใช้ Centos ที่ติดตั้ง SElinux และเปิดใช้งานจาก get-go

ขออภัยฉันไม่ได้ช่วยอะไรมาก บางทีเวลาอื่นฉันจะดาวน์โหลดรูปภาพของ Centos และลองสิ่งนี้; มันจะเป็นขั้นตอนการเรียนรู้ที่ดี ฉันจะอัปเดตคำตอบนี้ถ้าฉันทำ


2
lol @ "มันอาจจะง่ายกว่าที่จะใช้ Centos"
David Cullen

2

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

เปลี่ยนการกำหนดค่า Apache เพื่อฟังพอร์ตอื่นในกรณี คุณสามารถทำได้โดยเปิดไฟล์ Apache config และเปลี่ยนบรรทัดที่มีListen 80ไปยังพอร์ตอื่น


ว่า "แก้ปัญหา" เช่นเดียวกับคำตอบที่ได้รับการยอมรับ แต่มีปัญหาเพิ่มเติมจากนั้นต้องอธิบาย / บันทึกการเปลี่ยนแปลงของคุณ นอกจากนี้ในขณะที่มันแก้ปัญหาไม่แก้ปัญหาทั้งหมด หาก apache ถูกปิดใช้งาน แต่ในครั้งถัดไปที่รีบูตแอ็พพลิเคชัน X จะเชื่อมโยงกับพอร์ต 80 คุณจะมีความผิดปกติเดิมอีกครั้ง
Darren H

0

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


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

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

1
แม้ว่าฉันจะเห็นด้วยกับคุณว่ามันไม่เหมาะสมที่จะทำสิ่งนั้น distro ฉันคิดว่ามันจะเหมาะสมกว่าเป็นการแสดงความคิดเห็นเพราะมันไม่ได้ตอบคำถาม
JoL

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