เคล็ดลับสำหรับการรักษาความปลอดภัยเซิร์ฟเวอร์ LAMP


คำตอบ:


107

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

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

The L
มีคำแนะนำที่ดีมากมายที่พร้อมช่วยเหลือคุณ รายการนี้อาจช่วยได้หรือไม่ขึ้นอยู่กับการกระจายของคุณ

A
Apache สามารถสนุกได้อย่างปลอดภัย ฉันพบว่ามันยากที่จะทำให้ระบบปฏิบัติการแข็งตัวและรักษาความสะดวกในการใช้งานมากกว่า Apache หรือ PHP

เดอะเอ็ม

P
สิ่งนี้วิ่งเข้าไปในความคิดทั้งหมดของ Secure Programming Practices ซึ่งเป็นระเบียบวินัยทั้งหมดของตัวเอง SANS และ OWASP มีข้อมูลจำนวนมากในหัวเรื่องดังนั้นฉันจะไม่พยายามทำซ้ำที่นี่ ฉันจะมุ่งเน้นไปที่การกำหนดค่ารันไทม์และให้นักพัฒนาของคุณกังวลเกี่ยวกับส่วนที่เหลือ บางครั้ง 'P' ใน LAMP หมายถึง Perl แต่โดยปกติแล้ว PHP ฉันกำลังสมมติว่าหลัง

  • Hardening PHP - การสนทนาเล็กน้อยเช่นกันบนเว็บไซต์ IT Security SE
  • Hardened PHP Project - โครงการหลักที่ผลิตSuhosinซึ่งเป็นความพยายามในการแก้ไขแอปพลิเคชั่น PHP เพื่อโปรเจ็กต์ต่อต้านการโจมตีบางประเภท
  • การชุบแข็ง PHP ด้วย Suhosin - วิธีสั้น ๆ สำหรับ Suhosin โดยเฉพาะ
  • การแข็งตัวของ PHP จาก php.ini - สั้น แต่ไม่ใช่การพูดคุยที่ไม่ดีในบางส่วนของตัวเลือกรันไทม์ที่เกี่ยวข้องกับความปลอดภัย

1
ฉันต้องการโหวตคำตอบนี้อย่างน้อย 10 ครั้ง
user58859

10
Silent N - ด้วย IPTables หรือไฟร์วอลล์ภายนอกบล็อกการเชื่อมต่อเครือข่ายกับสิ่งที่จำเป็นสำหรับสาธารณะในการเข้าถึง
แมตต์

นี่ควรเป็นวิกิชุมชน
Brian Adkins

1
ง่ายมากที่จะลืมไฟร์วอลล์ ฉันได้ยินคนที่สร้างเว็บเซิร์ฟเวอร์สำหรับเว็บไซต์และไปไกลเท่าที่แฮ็คสแต็ค TCP / IP เพื่อทิ้งทราฟฟิกที่ไม่ใช่พอร์ต 80 อีกสิ่งหนึ่งที่ถูกมองข้ามก็คือบริการที่ไม่จำเป็น - หากไม่ต้องการ หากต้องการเปิดใช้งานให้ปิด
Aaron Mason

4
@AaronMason: ขอแสดงความยินดี! คุณมีเรื่องเล็ก ๆ น้อยที่ประสบความสำเร็จ โปรดจำไว้ว่าสถานการณ์เฉพาะของคุณทำได้ดี แต่หวังว่าผู้อ่านในอนาคตจะเข้าใจสภาพแวดล้อมที่ผิดปกติของคุณ ในกรณีทั่วไปคำแนะนำนี้ค่อนข้างอันตราย
Scott Pack

14

คุณได้ถามคำถามที่ค่อนข้างตรงไปตรงมาและคุ้มค่ากับหนังสือสองสามเล่มในหัวข้อนี้ แต่มีหลักเกณฑ์พื้นฐานทั่วไปบางอย่างที่ทำงานได้ดี:

  1. อัปเดตอยู่เสมอ ซึ่งหมายความว่าระบบปฏิบัติการบริการทั้งหมดและเว็บแอปพลิเคชันทั้งหมดที่คุณใช้งานโดยเฉพาะ
  2. ปิดการใช้งานบริการที่ไม่จำเป็นใด ๆ จำกัด ผู้ที่จำเป็นต้องเปิดเผยน้อยที่สุด (หากคุณไม่ได้เชื่อมต่อกับ MySQL จากระยะไกลจากนั้นไม่ต้องฟัง TCP) และเรียกใช้ไฟร์วอลล์ที่ใช้โฮสต์ (หากเป็นหลอดไฟอย่างเคร่งครัดคุณควรใช้ 80 และ 443 แต่อาจเป็น SSH สำหรับการบริหาร)
  3. ใช้รหัสผ่านที่คาดเดายาก ดีกว่าถ้าคุณใช้ SSH ให้ใช้การรับรองความถูกต้องโดยใช้คีย์เท่านั้น
  4. ตรวจสอบให้แน่ใจว่าคุณไม่ได้ลงชื่อเข้าใช้ในฐานะรูท เข้าสู่ระบบในฐานะผู้ใช้และใช้งาน su & sudo
  5. แม้ว่ามันจะไม่ทำให้สิ่งต่าง ๆ ปลอดภัยขึ้น แต่คุณควรเรียกใช้เครื่องมือเช่น logwatch เพื่อให้คุณทราบว่าเกิดอะไรขึ้นบนเซิร์ฟเวอร์ของคุณ

หวังว่าจะช่วยให้คุณเริ่มต้น


1
ฉันจะแนะนำให้อ่าน "คำแนะนำเกี่ยวกับการกำหนดค่าความปลอดภัยของ Red Hat Enterprise Linux 5" เขียนโดย NSA
ALex_hha

1
ไปงานปาร์ตี้สาย แต่ฉันได้อ่านเมื่อเร็ว ๆ นี้ว่า "ไม่ได้เข้าสู่ระบบในฐานะที่เป็นราก" ไม่ได้เป็นเรื่องใหญ่อีกต่อไปโดยเฉพาะอย่างยิ่งถ้าคุณใช้การรับรองความถูกต้อง SSH ตามคีย์สาธารณะ / ส่วนตัว
the0ther

8

นี่คือรายการตรวจสอบที่ดีที่ฉันต้องการเริ่มต้นด้วย

ไฟร์วอลล์

  • แนวทางที่ดีคือไม่อนุญาตให้มีการรับส่งข้อมูลเริ่มต้นจากนั้นเปิดเฉพาะสิ่งที่คุณต้องการตามที่คุณต้องการ ผลลัพธ์นี้ในการเปิดพอร์ต / ips ขั้นต่ำเพื่อให้สิ่งต่าง ๆ ทำงานและลดการแสดงผลของคุณ
  • สำหรับเซิร์ฟเวอร์ LAMP คุณอาจต้องเปิดพอร์ตสำหรับ http / https สู่โลกและ ssh สำหรับ sysadmins เท่านั้น
  • ตรวจสอบให้แน่ใจว่ามีการปิดกั้นการจราจร ipv6 หากไม่ได้ใช้
  • AWS ให้กลุ่มรักษาความปลอดภัย linux มี iptables รวมถึงแพ็คเกจมากมายให้เลือก

SSH & ผู้ใช้

  • ไม่มีรหัสผ่านสำหรับการเข้าถึง ssh (ใช้รหัสส่วนตัว)
  • ไม่อนุญาตให้รูทไปยัง ssh (ผู้ใช้ที่เหมาะสมควรใช้ ssh, su หรือ sudo)
  • ใช้ sudo สำหรับผู้ใช้เพื่อให้คำสั่งถูกบันทึก
  • เข้าสู่ระบบพยายามเข้าสู่ระบบไม่ได้รับอนุญาต (และพิจารณาซอฟต์แวร์เพื่อบล็อก / แบนผู้ใช้ที่พยายามเข้าถึงเซิร์ฟเวอร์ของคุณหลายครั้งเกินไปเช่น fail2ban)
  • ssh บนพอร์ตที่ไม่ได้มาตรฐาน (สิ่งนี้มีประโยชน์ในการทำให้แน่ใจว่าคุณไม่ได้แขวนผลไม้ต่ำและป้องกันการจราจรที่น่ารำคาญมากมาย แต่จะไม่ทำอะไรมากเพื่อความปลอดภัยโดยเฉพาะอย่างยิ่ง)
  • ล็อค ssh เฉพาะช่วง ip ที่คุณต้องการ (ช่วงใหญ่ดีกว่าไม่มีช่วง)

ฐานข้อมูล

  • ฆ่าเชื้อข้อมูลผู้ใช้
  • ตั้งค่าพารามิเตอร์แบบสอบถาม
  • พิจารณาการทำให้ฐานข้อมูลเป็นนามธรรมด้วยเครื่องของตัวเอง การแยกนี้สามารถทำให้ผู้โจมตีเข้าสู่เว็บสแต็กได้ยากขึ้นและกลับกันได้ยากขึ้น
  • เช่นเดียวกับซอฟต์แวร์ใด ๆที่ทันสมัยเป็นสิ่งสำคัญ
  • ผู้ใช้เพื่อวัตถุประสงค์ในแต่ละ เมื่อสร้างผู้ใช้เริ่มต้นด้วยสิทธิพิเศษและเพิ่มเฉพาะผู้ที่พวกเขาต้องการ preform บทบาทของพวกเขา การมีผู้ใช้แยกต่างหากสำหรับแอปพลิเคชั่นที่แตกต่างกัน (หรือบางครั้งเป็นส่วนที่แตกต่างกันของแอปพลิเคชัน) จะช่วยลดผลประโยชน์ที่ผู้โจมตีจะได้รับหากพวกเขาประนีประนอมบัญชีใดบัญชีหนึ่ง ระวังด้วยสิทธิพิเศษเช่น GRANT ซึ่งไม่ควรกำหนดให้เบา
  • การมีนโยบายในการเปลี่ยนรหัสผ่านเป็นระยะเป็นความคิดที่ดี หากคุณกังวลเกี่ยวกับจำนวนของความพยายามที่ต้องจำไว้ว่าบ่อยครั้งน้อยกว่าดีกว่าไม่เคย
  • ทำความเข้าใจกับการเข้ารหัสรหัสผ่าน รหัสผ่านเกลือ อย่าใช้ md5!

ซอฟต์แวร์

  • อัปเดตซอฟต์แวร์ให้ทันสมัยอยู่เสมอ (ระบบปฏิบัติการ, เว็บเซิร์ฟเวอร์, ภาษาสคริปต์, CMS) ผู้คนจำนวนมากออกไปที่นั่นจะสแกนหาช่องโหว่ที่รู้จักในเวอร์ชันเก่า (ไม่ได้เปรียบเทียบ)
  • ลบซอฟต์แวร์ใด ๆ ที่คุณไม่ต้องการ (ไม่ควรเก็บแพคเกจที่จำเป็นในการรวบรวมซอฟต์แวร์บนเซิร์ฟเวอร์ที่ผลิตได้ดีกว่าในการรวบรวมซอฟต์แวร์ล่วงหน้าและทำให้พร้อมใช้งานเป็นแพ็คเกจสำหรับเครื่องที่ใช้งานของคุณ)
  • ตรวจสอบให้แน่ใจว่าการอนุญาตไฟล์ถูกล็อค (โดยเฉพาะอย่างยิ่งสิ่งต่าง ๆ เช่นผู้ใช้อัพโหลดและกำหนดค่าไฟล์)
  • รหัสผ่านป้องกันพื้นที่ผู้ดูแลระบบสำหรับ CMS ที่ระดับเว็บเซิร์ฟเวอร์ (การตรวจสอบความถูกต้องของ httpสามารถอยู่ด้านหน้าของช่องโหว่ CMS และช่วยบล็อกการเข้าถึงซึ่งเป็นวิธีที่ดีในการป้องกันการโจมตี)
  • ใช้ SSLสำหรับพื้นที่ของผู้ดูแลระบบและข้อมูลที่สำคัญอื่น ๆ
  • ทำการจัดการเซิร์ฟเวอร์และโครงสร้างพื้นฐานของคุณโดยอัตโนมัติ (บางอย่างเช่น Puppet, Chef หรือ SaltStack หากใช้ AWS CloudFormation ด้วย) สิ่งนี้จะช่วยคุณแก้ไขสิ่งต่าง ๆ บนเซิร์ฟเวอร์จำนวนมากและลดสถานการณ์ต่างๆเช่นการแก้ไขสิทธิ์บนเซิร์ฟเวอร์ A แต่ลืมที่จะทำบนเซิร์ฟเวอร์ B
  • หากเป็นไปได้อย่าแจก CMS, PHP หรือเว็บเซิร์ฟเวอร์ของคุณโดยเฉพาะ ในขณะที่การปิดบังข้อมูลนี้ไม่ใช่ความปลอดภัยมีหลายคนกำลังออกไปค้นหาซอฟต์แวร์รุ่นต่าง ๆ โดยเฉพาะและข้อมูลที่น้อยลงที่คุณให้อิสระแก่ผู้โจมตียิ่งทำงานได้มากขึ้น นี่เป็นวิธีที่ดีในการทำให้แน่ใจว่าคุณไม่ได้เป็นหนึ่งในผลไม้ที่แขวนอยู่ในระดับต่ำ ของหลักสูตรนี้จะไม่ทำอะไรกับคนที่ต้องการใช้ความพยายามอีกเล็กน้อยในการเข้า
  • จำกัด บุคคลที่สามารถเข้าถึงเซิร์ฟเวอร์

5

การเพิ่มสิ่งที่ David แนะนำให้ยิ่งการติดตั้งของคุณเป็นแบบแยกส่วนโดยที่ฉันหมายถึงการ จำกัด การเข้าถึงผู้ใช้ / กลุ่มที่สร้างขึ้นเป็นพิเศษสำหรับงานเดียวและ จำกัด ขอบเขตของพวกเขายิ่งกองไฟ LAMP ของคุณปลอดภัยมากขึ้น: สำหรับไฟล์ / โฟลเดอร์ Apache ที่มีการตั้งค่าการอนุญาตให้เหมาะสมและไม่อยู่ในกลุ่มใด ๆ ที่สามารถเข้าถึงไฟล์ / โฟลเดอร์ระบบที่สำคัญ ผู้ใช้ที่สามารถเข้าถึงตาราง MySql ที่เชื่อมโยงกับเว็บไซต์ของคุณที่คุณจะให้บริการและมีเพียงตารางเหล่านั้น นอกจากนี้คุณสามารถ จำกัด การเข้าถึงเพื่อให้จำนวนการเข้าถึงขั้นต่ำจากการโทรด้วย PHP นอกจากนี้ตรวจสอบให้แน่ใจว่าชื่อผู้ใช้ MySQL ที่ใช้ / เปิดเผยผ่านไฟล์ PHP นั้นไม่ใช่ชื่อผู้ใช้หรือรหัสผ่านเดียวกันกับผู้ใช้รายอื่น

สิ่งนี้หมายความว่า: หากผู้ใช้ apache หรือผู้ใช้ MySql ถูกโจมตีพวกเขาไม่สามารถทำอันตรายใด ๆ นอกขอบเขตของโฟลเดอร์ apache มีการเข้าถึง (ในกรณีของผู้ใช้ apache) และนอกตาราง ( s) / ฐานข้อมูล (ในกรณีของผู้ใช้สำหรับฐานข้อมูล MySQL)

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

นอกจากนี้หากพบชื่อผู้ใช้และรหัสผ่านของบัญชีผู้ดูแลระบบของคุณสำหรับ MySQL ถ้าคุณใช้ชื่อผู้ใช้ที่แตกต่างจากชื่อผู้ใช้ในระบบของคุณพวกเขาจะต้องทำลายความปลอดภัยของระบบก่อนที่จะเข้าไปในฐานข้อมูลของคุณ เช่นเดียวกันถือเป็นจริงเกี่ยวกับผู้ใช้ apache และการเข้าถึงไฟล์

เวลาตัวอย่าง! ฉันจะยกตัวอย่างระบบเพื่อทำให้แนวคิดง่ายขึ้น

บอกว่าคุณมีผู้ใช้ในระบบของคุณ (ควรปิดการใช้งานรูทเพื่อความปลอดภัยผ่านสิ่งต่างๆเช่น umod -l หรือ passwd -l เป็นต้น): john, barney, terence และ lisa

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

ตอนนี้คุณสร้างกลุ่ม apache หรือผู้ใช้แล้วเราจะเรียกมันว่า apweb2 Appweb2 ไม่ได้เป็นสมาชิกของกลุ่มอื่น ๆ และไฟล์ / โฟลเดอร์ทั้งหมดสำหรับ apache จะถูกเก็บไว้ใน / home / apweb2 / แต่ละโฮสต์เสมือนจะมีโฟลเดอร์ย่อยของตัวเองและแต่ละโฮสต์เหล่านี้จะมีการตั้งค่ารูทเอกสารเป็นโฟลเดอร์ย่อยนั้น Symlinks จะถูกปิดการใช้งานเพื่อไม่ให้บังเอิญเข้าถึงส่วนที่เหลือของระบบ

นอกจากนี้คุณสามารถ จำกัด การเข้าถึง ssh เฉพาะผู้ใช้บางคนเท่านั้น (หรือบางกลุ่มฉันต้องการให้พวกเขาอยู่ในกลุ่ม ssh และทำให้สิ่งเดียวที่สามารถใช้ ssh ได้)

นอกจากนี้คุณสามารถเลือกผู้ใช้ที่มีสิทธิ์ sudo เพื่อ จำกัด สิ่งเพิ่มเติม อีกขั้นตอนที่คุณสามารถดำเนินการต่อไปคือการทำให้ผู้ใช้ ssh ไม่สามารถ sudo ใด ๆ คุณสามารถสร้างผู้ใช้พิเศษที่สามารถใช้ sudo ที่ไม่สามารถใช้ ssh ได้ดังนั้นเมื่อคุณ ssh คุณต้องลงชื่อเข้าใช้ผู้ใช้อื่นเพื่อให้มี เข้าถึง sudo

ดังนั้นโดยการทำให้เป็นโมดูล่าร์ของแต่ละเซกเมนต์ถ้ามีใครถูกโจมตีทั้งกองจะไม่ถูกบุกรุกและคุณสามารถแก้ไขปัญหา 1 แทนที่จะต้องเริ่มต้นใหม่ทั้งหมดตั้งแต่ต้น


3

ฉันพบเอกสารนี้จาก SANS.org ที่เป็นประโยชน์จริง ๆhttp://www.sans.org/score/checklists/linuxchecklist.pdf


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

1

ในเวลาปัจจุบันอย่าละเลยการจำลองเสมือนของคอนเทนเนอร์นั่นคือ Docker, systemd-nspawn และกลไกของการจำลองเสมือนของคอนเทนเนอร์ที่สร้างขึ้น (เนมสเปซ, cgroups) การใช้การจำลองเสมือนของคอนเทนเนอร์ช่วยให้คุณสามารถแยกกระบวนการได้ตัวอย่างเช่นหากบริการใดบริการหนึ่งถูกบุกรุกผู้โจมตีจะไม่สามารถเข้าถึงบริการอื่น ๆ ได้

ในกรณีของหลอดไฟมันเป็นไปได้ที่จะใช้ตัวอย่างเช่นสี่ Docker container ที่มี SSH-server, Apache, MySQL, PHP-FPM / Python / Perl / etc

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