สมมติว่า 'เว็บแอปพลิเคชัน' ทำงานบนเซิร์ฟเวอร์ (เช่น apache, nginx เป็นต้น) และเขียนด้วยภาษาสคริปต์แบบไดนามิกบางภาษา (เช่น PHP, Ruby, ฯลฯ ) คุณมีความเข้าใจผิดว่าผู้ใช้คือใคร
ผู้ใช้ไม่ใช่บุคคลที่ล็อกอินเข้าสู่แอปพลิเคชันของคุณ - และบทบาทของพวกเขาในแอปพลิเคชัน (ผู้ดูแลระบบ ฯลฯ ) นั้นไม่เกี่ยวข้องกับสถานการณ์โดยสิ้นเชิง ผู้ใช้คือผู้ใช้ระบบ linux ที่กระบวนการทำงานภายใต้ รหัสของเว็บไซต์ของคุณทำงานเป็นผู้ใช้เพียงคนเดียว - อาจเป็นผู้ใช้เว็บเซิร์ฟเวอร์ของคุณ (ซึ่งไม่ใช่สิ่งที่ดีจริงๆ) หรืออาจเป็นผู้ใช้เฉพาะสำหรับเว็บไซต์ของคุณ (ซึ่งดีกว่ามาก)
บน linux ผู้ใช้อยู่ในกลุ่ม - เราสามารถเพิ่มผู้ใช้ไปยังกลุ่มอื่นและกำหนดสิทธิ์ให้กับกลุ่มนั้น
การตั้งค่าที่ดีจะทำให้เซิร์ฟเวอร์ของคุณทำงานในฐานะผู้ใช้รายหนึ่ง (ลองเรียกผู้ใช้นี้ว่า 'เว็บเซิร์ฟเวอร์') และการใช้ภาษาสคริปต์แบบไดนามิกของคุณ (เช่นผ่าน FastCGI) ในฐานะผู้ใช้ของตนเอง (ผู้ใช้หนึ่งคนต่อเว็บไซต์ .
ในการให้บริการไฟล์เว็บเซิร์ฟเวอร์จำเป็นต้องเข้าถึงไฟล์เหล่านั้นและภาษาสคริปต์จะต้องเข้าถึงไฟล์เหล่านั้น ซึ่งหมายความว่า: 'site1' และ 'webserver' จะต้องสามารถอ่านไฟล์ของคุณได้ มีเพียงหนึ่งในนั้นเท่านั้นที่สามารถ 'เป็นเจ้าของ' ไฟล์ได้ เจ้าของคือ 'ผู้ใช้' (ในผู้ใช้กลุ่มอื่น ๆ ) เราต้องการภาษาสคริปต์ของเราเพื่อให้สามารถเขียนไปยังไดเรกทอรี (และอ่านไฟล์ที่เขียน) ดังนั้นผู้ใช้ 'site1' จึงจำเป็นต้องมีสิทธิ์ในการอ่านและเขียน เนื่องจากเราต้องการให้กลุ่มและสิทธิ์อื่น ๆ มีข้อ จำกัด มากที่สุด 'เจ้าของ' ของเราจะเป็น 'ไซต์ 1' และสิทธิ์ผู้ใช้ที่เกี่ยวข้องจะถูกอ่านและเขียน
เนื่องจากเราไม่สามารถระบุการอนุญาตสำหรับ webserver ของเราเป็น 'ผู้ใช้' คนอื่นเราจะเพิ่ม 'webserver' ไปยังกลุ่ม 'site1' (แน่นอนคุณสามารถสร้างกลุ่มอื่นที่มีทั้ง 'site1' และ 'webserver' ทั้งหมด สมาชิกของกลุ่มนี้จะได้รับสิทธิ์แบบเดียวกันสิทธิ์แบบหละหลวมมากที่สุด (ของผู้ใช้กลุ่มชุดอื่น ๆ ) จะถูกนำไปใช้กับผู้ใช้ที่ได้รับเพื่อกำหนดสิทธิ์ของพวกเขา
เป็นที่น่าสังเกตว่าการตั้งค่าที่ดีไม่ควรต้องการไฟล์ที่จะมีการอนุญาตให้ใช้งานสำหรับภาษาแบบไดนามิก ไฟล์ไม่ได้ถูกเรียกใช้โดยตรง แต่จะถูกอ่านเป็นล่าม - ต้องใช้สิทธิ์การอ่านเท่านั้นเพื่อเรียกใช้สคริปต์ทั่วไป (ไฟล์ที่ไม่ได้เขียนอะไร)
การอนุญาต 'เรียกใช้' ในไดเรกทอรีมีความหมายแตกต่างกัน - อนุญาตการแวะผ่านโดยไม่สามารถอ่านเนื้อหาได้ เพื่อให้สามารถอ่านไฟล์ในไดเรกทอรีผู้ใช้จะต้องมีสิทธิ์ 'ดำเนินการ' ในทุก ๆ ไดเรกทอรีข้างต้น
สำหรับเว็บแอปพลิเคชันทุกไฟล์ต้องมีสิทธิ์อ่านจากเจ้าของ - มิฉะนั้นจะเป็นไฟล์ที่ไม่มีจุดหมาย ไม่ว่าผู้ใช้หรือผู้ดูแลระบบจะอัพโหลดไฟล์ (ผ่านเว็บแอปพลิเคชันของคุณ) 'เจ้าของ' (เช่นภาษาแบบไดนามิก) จำเป็นต้องมีสิทธิ์ในการเขียน การตั้งค่าที่มีประสิทธิภาพจะพยายามให้บริการไฟล์คงที่โดยตรงผ่านเว็บเซิร์ฟเวอร์เนื่องจากภาษาแบบไดนามิกมีแนวโน้มที่จะช้าในการอ่านในไฟล์ขนาดใหญ่และสะท้อนเนื้อหา เว็บเซิร์ฟเวอร์จึงจำเป็นต้องมีการเข้าถึงเพื่ออ่านไฟล์สแตติกของคุณ
ดังนั้นการอนุญาตไฟล์ขั้นต่ำอาจเป็น:
- ไฟล์ในไดเร็กทอรีที่ผู้ใช้อัพโหลดไฟล์สแตติก (ไฟล์ images / swf / js) จะอยู่: 640
- ไฟล์ในไดเรกทอรีที่ผู้ดูแลระบบอัพโหลดไฟล์สแตติก (ไฟล์ images / swf / js) จะอยู่: 640
- ไฟล์ในไดเรกทอรีที่มีไลบรารีที่ใช้ในแอปพลิเคชันอยู่: 400 (หรือ 440)
- ไฟล์ในไดเรกทอรีที่สคริปต์ด้านเซิร์ฟเวอร์ที่เรียกทำงาน / เรียกดูได้จะอยู่: 400 (หรือ 440)
- ไฟล์ในไดเรกทอรีที่ไฟล์ที่มีอยู่แล้ว (txt หรือ xml) จะถูกแก้ไขด้วยรหัสทางฝั่งเซิร์ฟเวอร์: 640 หรือ 600
- (ขึ้นอยู่กับว่าเว็บเซิร์ฟเวอร์จะแสดงสิ่งเหล่านี้หรือไม่แก้ไขในบางครั้ง)
ในขณะที่สิทธิ์ไดเรกทอรีน้อยที่สุดอาจเป็น:
- ไดเร็กทอรีที่ผู้ใช้อัพโหลดไฟล์สแตติก (ไฟล์อิมเมจ / swf / js) จะอยู่: 750
- ไดเรกทอรีที่ผู้ดูแลระบบอัปโหลดไฟล์คงที่ (ไฟล์รูปภาพ / swf / js) จะอยู่: 750
- ไดเรกทอรีที่มีไลบรารีที่ใช้ในแอปพลิเคชันอยู่: 500 (หรือ 550) [ควรมีอย่างน้อย 510]
- ไดเรกทอรีที่สคริปต์ด้านเซิร์ฟเวอร์ที่เรียกทำงาน / เรียกดูได้จะอยู่: 500 (หรือ 550) [ควรมีอย่างน้อย 510]
- ไดเรกทอรีที่ไฟล์ที่มีอยู่แล้ว (txt หรือ xml) จะถูกแก้ไขด้วยรหัสทางฝั่งเซิร์ฟเวอร์: 750 หรือ 700
- (ขึ้นอยู่กับว่าเว็บเซิร์ฟเวอร์จะให้บริการไฟล์จากที่นี่หรือไม่แก้ไขในบางครั้ง)
อีกครั้ง - เว็บเซิร์ฟเวอร์ของคุณต้องมีสิทธิ์ 'ดำเนินการ' ในทุกไดเรกทอรีข้างต้นที่จำเป็นต้องเข้าถึง - ดังนั้นแม้ว่าเว็บเซิร์ฟเวอร์จะไม่ให้บริการไฟล์จากไดเรกทอรีที่กำหนดเราควรให้สิทธิ์ดำเนินการ
เป็นเรื่องปกติที่จะให้เว็บเซิร์ฟเวอร์สามารถอ่านไฟล์ส่วนใหญ่ได้ (ดังนั้นควรเปลี่ยนไฟล์ 500 เป็น 550) ค่าเริ่มต้น 'ค่อนข้างปลอดภัย' คือ 755 สำหรับไดเรกทอรีและ 644 สำหรับไฟล์ - ไม่มีสิทธิ์ดำเนินการทุกคนสามารถอ่านและมีเพียงผู้ใช้เท่านั้นที่สามารถเขียนได้ - คุณจะทราบว่าไฟล์ส่วนใหญ่ในระบบลินุกซ์มีสิทธิ์เหล่านี้
โปรดทราบว่าสิทธิ์ 'อื่น ๆ ' อ้างถึงผู้ใช้ระบบที่ไม่ใช่เจ้าของหรือในกลุ่ม (เช่นผู้ใช้ระบบที่เหลืออยู่ทั้งหมด) การ จำกัด สิทธิ์ 'อื่น ๆ ' ของคุณนั้นทำได้ดีเพราะผู้ใช้เหล่านี้ไม่เป็นที่รู้จัก - คุณยังไม่ได้ให้สิทธิ์อย่างชัดเจน สิทธิ์อื่น ๆ มักเป็นวิธีที่ง่ายที่สุดในการใช้ประโยชน์จากระบบที่ถูกบุกรุก (เช่นหนึ่งในเหตุผลที่ / tmp เป็นเป้าหมายทั่วไป)
ในบริบทข้างต้นฉันไม่คิดว่าคำถามสองข้อสุดท้ายของคุณนั้นเกี่ยวข้องกัน ตั้งค่าการอนุญาตให้ใช้ไดเรกทอรีเป็น 550 (และสิทธิ์การใช้งานไฟล์เป็น 440) จากนั้นให้สิทธิ์การเขียนแก่ผู้ใช้สำหรับไดเรกทอรีใดก็ตามที่แอปพลิเคชันของคุณกำลังเขียนอยู่ (เช่นไดเรกทอรี: 750; ไฟล์: 640)
(แน่นอนคุณจะต้องมีสิทธิ์ในการเขียนเพื่ออัปโหลดไฟล์ - แต่ถ้าคุณต้องการคุณสามารถลบไฟล์เหล่านั้นออกมาได้แม้ว่าจะมีใครบางคนกำลังเขียนไปยังไดเรกทอรีที่มีเพียงเจ้าของเท่านั้นที่สามารถเขียนได้ - บัญชีของคุณถูกบุกรุก ของเหตุผลในการรักษาสิทธิ์ที่ จำกัด )