บันทึกยังโตแต่สร้างใหม่ไม่ได้: ตรวจสอบ ACL ของไดเรกทอรี
การเพิ่มข้อมูลในไฟล์ไม่ต้องใช้ชื่อใหม่ในไดเรกทอรี แต่การสร้างไฟล์ต้องใช้ เปรียบเทียบ ACL การเข้าถึงกับค่าเริ่มต้นที่สืบทอดมาก่อนจะขยายสิ่งใด
บันทึกที่โตขึ้นเรื่อยๆ จะหยุดโตในทันทีที่มีบางสิ่งสร้างมันขึ้นมาใหม่ และข้อผิดพลาดบอกว่าถูกปฏิเสธการอนุญาต ข้อสรุปที่ชวนให้เชื่อคือตัวไฟล์บันทึกเองต้องการสิทธิ์เพิ่มขึ้น แต่ไฟล์อาจเขียนได้อยู่แล้วโดยบัญชีเดียวกัน การเพิ่มต่อท้ายชื่อที่มีอยู่กับการสร้างชื่อใหม่เป็นการตรวจสอบที่ต่างกัน และมีเพียงอย่างหลังเท่านั้นที่ถามไดเรกทอรี
การเพิ่มต่อท้ายและการสร้างเป็นการตรวจสอบที่ต่างกัน
การเปิดไฟล์ที่มีอยู่เพื่อเพิ่มต่อท้ายต้องมีสิทธิ์เขียนบนไฟล์นั้นและสิทธิ์ค้นหาตามไดเรกทอรีทุกชั้นในเส้นทาง การสร้างไฟล์ต้องมีสิทธิ์เขียนและค้นหาในไดเรกทอรีที่บรรจุมัน เพราะการดำเนินการเพิ่มชื่อเข้าไป การแทนที่ไฟล์ด้วยการเปลี่ยนชื่อก็แตะต้องทั้งสองไดเรกทอรีและกฎ sticky bit ของทั้งคู่ด้วย
| Operation | What must permit it | Typical failure message |
|---|---|---|
| Append to an existing log | File write access, path traversal | Permission denied on the file |
| Create a missing log | Directory write and search access | Permission denied on the path |
| Rename a replacement into place | Both directories, plus sticky restrictions | Permission denied or operation not permitted |
ตัวอธิบายที่เปิดอยู่แล้วเพิ่มกรณีที่สี่ กระบวนการสามารถถือแฮนเดิลเขียนที่เปิดไว้ก่อนสละสิทธิ์พิเศษ และยังล้มเหลวในการเปิดเส้นทางเดิมซ้ำภายใต้ตัวตนใหม่ของมัน การเพิ่มต่อท้ายที่สำเร็จและการสร้างที่ล้มเหลวอาจเป็นจริงทั้งคู่ในขณะเดียวกัน สำหรับกระบวนการเดียวกัน
ACL เริ่มต้นสืบทอดมา มันไม่ได้ให้สิทธิ์
รายการที่ขึ้นต้นด้วยคำนำหน้าเริ่มต้นอธิบายสิ่งที่วัตถุใหม่สืบทอดจากไดเรกทอรี มันไม่ได้ให้สิ่งใดแก่ไดเรกทอรีเอง และไม่ได้ซ่อมแซม ACL ของไฟล์ที่มีอยู่แล้ว
namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log
อ่านรายการการเข้าถึงแยกจากรายการเริ่มต้น และอ่านมาสก์ รายการที่ระบุชื่อและแสดงสิทธิ์เต็มยังอาจถูกจำกัดด้วยมาสก์ นั่นคือเหตุผลที่คอมเมนต์ประสิทธิผลสำคัญกว่าตัวอักษรในบรรทัดแรก
ใช้เส้นทางที่แก้ไขแล้วแทนเส้นทางในคอนฟิกูเรชัน ลิงก์สัญลักษณ์ จุดเมานต์ หรือไดเรกทอรีที่หมุนแล้วอาจวางไฟล์จริงไว้ที่ที่สิทธิ์ที่คุณให้ไปไม่เคยไปถึง เดินเส้นทางด้วยเครื่องมือชื่อก่อน แล้วเปรียบเทียบแต่ละระดับกับบัญชีที่เกี่ยวข้อง การเดาไดเรกทอรีระดับบนคือวิธีที่การแก้ไขลงเอยสูงเกินไปหนึ่งระดับ
ระบุว่าใครเขียนในขณะนั้น
ตรวจสอบยูนิตบริการ drop-in ของมัน และการตั้งค่าบัญชีของเดมอนเองก่อนเปลี่ยนแปลงสิ่งใด กระบวนการที่เพิ่มต่อท้ายและกระบวนการที่สร้างใหม่อาจต่างกัน ผู้ช่วยหมุนเวียน ผู้เขียนสถานะ และผู้อ่านเว็บแทบไม่เคยแบ่งปันตัวตนเดียวกัน
การทดสอบที่รันจากเชลล์ root ไม่จำลองบริการที่ถูกจำกัด และมันจะสำเร็จในขณะที่บริการยังล้มเหลวต่อเนื่อง ทำการดำเนินการที่ล้มเหลวซ้ำภายใต้ยูนิตเดียวกัน ด้วยบัญชีเดียวกันและการตั้งค่าแซนด์บ็อกซ์เดียวกัน หากทำไม่ได้ ให้เริ่มยูนิตด้วยเชลล์ชั่วคราวและตรวจสอบตัวตนที่มันรายงาน สิ่งอื่นใดวัดเทอร์มินัลของคุณ ไม่ใช่บริการ
หากจำเป็นต้องสร้างจริงๆ ให้สิทธิ์ผู้เขียนเข้าถึงไดเรกทอรีบันทึกเฉพาะ และแยกสิทธิ์อ่านสำหรับผู้บริโภคไว้ต่างหาก การทำให้บัญชีที่ใช้ร่วมกันหรือทั้งทรีแอปพลิเคชันเขียนได้เพื่อตอบสนองการเรียกบันทึกเพียงครั้งเดียวคือการแลกปัญหาเล็กกับปัญหาใหญ่
หมุนเวียนโดยไม่นำปัญหากลับมา
ผู้ที่สร้างไฟล์ใหม่เป็นผู้กำหนดเจ้าของและโหมดสำหรับรอบถัดไป ดังนั้นประสานการแก้ไขกับคอนฟิกูเรชันการหมุนเวียน ไฟล์แทนที่ที่สร้างภายใต้บัญชีอื่นหรือด้วย ACL ใหม่จะนำความล้มเหลวกลับมาหลังการแก้ไขสำเร็จ
กำหนดโหมดและกลุ่มตอนสร้าง ไม่ใช่ภายหลัง และตรวจสอบการหมุนเวียนถัดไปไม่ใช่การเพิ่มต่อท้ายครั้งถัดไป การเพิ่มต่อท้ายเพียงทำการทดสอบที่ผ่านแล้วซ้ำ หากเครื่องมือหมุนเวียนมีค่าตั้งโหมดการสร้าง ให้ใช้ค่านั้นแทน chmod หลังการสร้าง ช่องว่างระหว่างการสร้างกับ chmod คือช่วงเวลาที่การเขียนครั้งถัดไปอาจล้มเหลว
เมื่อการตัดทอนยังล้มเหลว ให้หยุดเพิ่มสิทธิ์
ความล้มเหลวในการตัดทอนไฟล์ที่คุณเขียนได้ไม่ได้อธิบายด้วยสิทธิ์ของไดเรกทอรี และการเพิ่มสิทธิ์เหล่านั้นมากขึ้นจะไม่ช่วย มองที่แอตทริบิวต์และการจำกัดแทน แอตทริบิวต์ append-only อนุญาตการเขียนเฉพาะในโหมดเพิ่มต่อท้าย และการเมานต์แบบอ่านอย่างเดียวหรือแซนด์บ็อกซ์ของบริการอาจปฏิเสธการดำเนินการที่ ACL อนุญาต
ตรวจสอบข้อจำกัดระบบไฟล์ของยูนิตและตัวเลือกการเมานต์ของเส้นทาง แล้วจำลองการดำเนินการที่ล้มเหลวอย่างแม่นยำ การขยายสิทธิ์ที่ไม่เคยถูกสอบถามเพียงซ่อนว่าข้อจำกัดใดเป็นของจริง ลบข้อจำกัดทีละอย่างในยูนิตที่ใช้แล้วทิ้ง และคืนค่าก่อนเปลี่ยนแปลงสิ่งใดอย่างถาวร