นี่เป็นคำถามที่ยอมรับได้เกี่ยวกับการรักษาความปลอดภัยของหลอดไฟ LAMP
อะไรคือแนวทางที่แน่นอนสำหรับการรักษาความปลอดภัยเซิร์ฟเวอร์ LAMP?
นี่เป็นคำถามที่ยอมรับได้เกี่ยวกับการรักษาความปลอดภัยของหลอดไฟ LAMP
อะไรคือแนวทางที่แน่นอนสำหรับการรักษาความปลอดภัยเซิร์ฟเวอร์ LAMP?
คำตอบ:
คำตอบของเดวิดเป็นพื้นฐานที่ดีของหลักการทั่วไปของการทำให้เซิร์ฟเวอร์แข็งตัว ตามที่เดวิดบอกมานี่เป็นคำถามที่ใหญ่มาก เทคนิคเฉพาะที่คุณใช้อาจขึ้นอยู่กับสภาพแวดล้อมของคุณและวิธีการใช้เซิร์ฟเวอร์ของคุณ คำเตือนนี่อาจใช้เวลามากในการทดสอบเพื่อสร้างและทำสิ่งที่ถูกต้อง ตามด้วยงานจำนวนมากเพื่อรวมเข้ากับสภาพแวดล้อมการผลิตของคุณและที่สำคัญกว่านั้นคือกระบวนการทางธุรกิจ
อย่างไรก็ตามอันดับแรกตรวจสอบเพื่อดูว่าองค์กรของคุณมีนโยบายการทำให้แข็งแกร่งขึ้นหรือไม่เนื่องจากอาจมีความเกี่ยวข้องโดยตรงที่สุด ถ้าไม่ขึ้นอยู่กับบทบาทของคุณอาจเป็นเวลาที่ดีในการสร้างพวกเขา ฉันจะแนะนำให้จัดการกับแต่ละองค์ประกอบแยกต่างหากจากล่างขึ้นบน
The L
มีคำแนะนำที่ดีมากมายที่พร้อมช่วยเหลือคุณ รายการนี้อาจช่วยได้หรือไม่ขึ้นอยู่กับการกระจายของคุณ
A
Apache สามารถสนุกได้อย่างปลอดภัย ฉันพบว่ามันยากที่จะทำให้ระบบปฏิบัติการแข็งตัวและรักษาความสะดวกในการใช้งานมากกว่า Apache หรือ PHP
เดอะเอ็ม
P
สิ่งนี้วิ่งเข้าไปในความคิดทั้งหมดของ Secure Programming Practices ซึ่งเป็นระเบียบวินัยทั้งหมดของตัวเอง SANS และ OWASP มีข้อมูลจำนวนมากในหัวเรื่องดังนั้นฉันจะไม่พยายามทำซ้ำที่นี่ ฉันจะมุ่งเน้นไปที่การกำหนดค่ารันไทม์และให้นักพัฒนาของคุณกังวลเกี่ยวกับส่วนที่เหลือ บางครั้ง 'P' ใน LAMP หมายถึง Perl แต่โดยปกติแล้ว PHP ฉันกำลังสมมติว่าหลัง
คุณได้ถามคำถามที่ค่อนข้างตรงไปตรงมาและคุ้มค่ากับหนังสือสองสามเล่มในหัวข้อนี้ แต่มีหลักเกณฑ์พื้นฐานทั่วไปบางอย่างที่ทำงานได้ดี:
หวังว่าจะช่วยให้คุณเริ่มต้น
นี่คือรายการตรวจสอบที่ดีที่ฉันต้องการเริ่มต้นด้วย
การเพิ่มสิ่งที่ 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 แทนที่จะต้องเริ่มต้นใหม่ทั้งหมดตั้งแต่ต้น
ฉันพบเอกสารนี้จาก SANS.org ที่เป็นประโยชน์จริง ๆhttp://www.sans.org/score/checklists/linuxchecklist.pdf
ในเวลาปัจจุบันอย่าละเลยการจำลองเสมือนของคอนเทนเนอร์นั่นคือ Docker, systemd-nspawn และกลไกของการจำลองเสมือนของคอนเทนเนอร์ที่สร้างขึ้น (เนมสเปซ, cgroups) การใช้การจำลองเสมือนของคอนเทนเนอร์ช่วยให้คุณสามารถแยกกระบวนการได้ตัวอย่างเช่นหากบริการใดบริการหนึ่งถูกบุกรุกผู้โจมตีจะไม่สามารถเข้าถึงบริการอื่น ๆ ได้
ในกรณีของหลอดไฟมันเป็นไปได้ที่จะใช้ตัวอย่างเช่นสี่ Docker container ที่มี SSH-server, Apache, MySQL, PHP-FPM / Python / Perl / etc