สิทธิ์ unix ที่สมบูรณ์แบบสำหรับไดเรกทอรีโครงการเว็บปกติคืออะไร


12

อะไรคือสิทธิ์น้อยที่สุดที่สมบูรณ์แบบในรูปแบบฐานแปดสำหรับสิ่งต่อไปนี้ในเว็บแอปพลิเคชันที่เขียน?

  1. ไดเร็กทอรีที่ผู้ใช้อัพโหลดไฟล์สแตติก (ไฟล์อิมเมจ / swf / js) จะอยู่
  2. ไดเรกทอรีที่ผู้ดูแลระบบอัปโหลดไฟล์คงที่ (ไฟล์รูปภาพ / swf / js) จะอยู่
  3. ไดเรกทอรีที่ใช้ไลบรารีในแอปพลิเคชัน
  4. ไดเรกทอรีที่สคริปต์ด้านเซิร์ฟเวอร์ที่เรียกทำงาน / เรียกดูได้จะอยู่
  5. ไดเรกทอรีที่ไฟล์ที่มีอยู่แล้ว (txt หรือ xml) จะถูกแก้ไขโดยรหัสทางฝั่งเซิร์ฟเวอร์

นี่คือคำแนะนำและเหตุผลของฉัน

  1. 555 ทุกคนสามารถอ่านและเขียนได้ไม่มีใครสามารถดำเนินการได้
  2. 544 เจ้าของคนเดียวเท่านั้นที่สามารถเขียนได้ทุกคนสามารถอ่านได้เท่านั้นไม่มีใครสามารถดำเนินการได้
  3. 000 ไม่มีใครต้องการอ่านเขียนหรือดำเนินการจะถูกใช้โดยเว็บเซิร์ฟเวอร์เท่านั้น
  4. 661 เจ้าของสามารถอ่านเขียนทุกคนเท่านั้นที่สามารถดำเนินการได้
  5. 600 เจ้าของสามารถอ่านเขียน (อาจไม่จำเป็น) ไม่มีใครสามารถทำอะไรได้

ตอนนี้ฉันสนใจสองสิ่ง:

  1. มีบางสิ่งที่ใช้กันทั่วไปในแอปพลิเคชันที่ทำงานบนเว็บที่ฉันพลาดในรายการแรกหรือไม่?
  2. มีอะไรที่คุณไม่เห็นด้วยในรายการที่สองทางเลือกของคุณคืออะไรและทำไมมันถึงดีกว่า

1
ฉันไม่เข้าใจว่าทำไมคนจะไม่ใช้ ACL ของวันนี้ ...
PFO

คำตอบ:


20

สมมติว่า 'เว็บแอปพลิเคชัน' ทำงานบนเซิร์ฟเวอร์ (เช่น 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)

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


@Iain: แน่นอน - กำลังคิดว่าการอนุญาตให้ใช้ไฟล์ในทันทีนั้น - จะแก้ไขให้ดีขึ้น - ขอบคุณ
cyberx86

1

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

  1. 555 ไม่ได้r-xr-xr-x rw-rw-rwเนื่องจากเป็นไดเรกทอรีในการสร้าง / ลบไฟล์คุณจำเป็นต้องxตั้งค่าดังนั้น 750 rwxr-x---จะเป็นจุดเริ่มต้นที่ดี สิ่งนี้อนุญาตให้ผู้ใช้ที่เป็นเจ้าของไดเรกทอรีสามารถเพิ่ม / ลบไฟล์และทุกคนในกลุ่มทั่วไปสามารถเข้าถึงได้
  2. เช่นเดียวกับ 1. ด้านบน
  3. หากพวกเขาเป็นไฟล์คงที่อย่างแท้จริงมากกว่า 050 จะให้การเข้าถึงเว็บเซิร์ฟเวอร์ แต่เพื่อสร้างไฟล์ในสถานที่แรก 750 จะเป็นขั้นต่ำ
  4. เช่นเดียวกับ 3 ด้านบน
  5. 070 จะเป็นค่าต่ำสุดที่อนุญาตให้เว็บเซิร์ฟเวอร์อ่านและเปลี่ยนแปลงไฟล์ แต่จำเป็นต้องสร้างไฟล์ดังนั้น 770 อาจสมจริงกว่านี้

เว็บเซิร์ฟเวอร์ไม่ต้องการสิทธิ์ดำเนินการในไดเรกทอรีเพื่ออ่านไฟล์ (คะแนน # 1 (740?), 3, 5) หรือไม่
cyberx86

Doh! แน่นอนว่า x จะต้องเข้าถึงไฟล์ r เพียงแค่อนุญาตให้คุณแสดงรายการ ... ซุ่มโจมตีกาแฟมากขึ้น
user9517

0

โดยทั่วไปจะใช้โหมด 0755, 0775 หรือ 2775 ในไดเรกทอรี (บิต SGID บนไดเรกทอรีสำหรับ BSD และสำหรับ Linux หากระบบไฟล์ติดตั้งด้วยความหมาย BSD จะทำให้การเชื่อมโยงกลุ่มของไฟล์ใหม่ตรงกับการตั้งค่าไดเรกทอรีหลักแทน GID เริ่มต้นของผู้สร้างไฟล์) สิ่งนี้อนุญาตให้ผู้ใช้ทั้งหมดสำรวจ (chdir เข้าและผ่าน) และอ่าน (รันคำสั่ง ls หรือทำการเรียกระบบ readdir / read) ไดเรกทอรีที่เป็นปัญหา ทางเลือกเพิ่มตัวเลือกกลุ่ม / เขียนและตามที่ระบุไว้บิต SGID ในไดเรกทอรีสามารถช่วยรักษาไฟล์และไดเรกทอรีย่อยทั้งหมดที่เกี่ยวข้องกับกลุ่มที่เหมาะสม

สำหรับไฟล์หนึ่งปกติจะใช้ 0644 หรืออาจเป็น 0664 (โลกอ่านได้และทั้งกลุ่มสามารถเขียนได้หรือไม่) เห็นได้ชัดว่าสคริปต์ CGI และไบนารีต้องเพิ่ม x-bit และสำหรับบางสถานการณ์พิเศษด้วยไบนารีที่ผ่านการทดสอบอย่างดีมากหนึ่งอาจเพิ่มบิต SUID หรือ SGID โดยปกติแล้ว UNIX และ Linux จะเพิกเฉยบิต SUID / SGID บนสคริปต์และให้เกียรติความหมายของมันสำหรับไบนารีที่คอมไพล์แล้วเท่านั้น อย่างไรก็ตามคุณอาจใช้งานเว็บไซต์ของคุณภายใต้บางสิ่งเช่น Apache กับโมดูลบางอย่างเช่น "setuidhack" ซึ่งสามารถใช้เพื่อทำให้เว็บเซิร์ฟเวอร์ให้เกียรติบิต SUID / SGID แม้ในสคริปต์ที่ตีความแล้ว (ซึ่งทำได้โดย HTTP daemon stat () ในแต่ละไฟล์และใช้โค้ด fork ที่กำหนดเอง () / execve () ของตัวเองสอดแทรกสตริงล่ามที่ถูกต้องลงในเวกเตอร์ execve () แทนที่จะส่งไฟล์ที่เรียกใช้ '

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

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