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

การเพิ่มต่อท้ายและการสร้างเป็นการตรวจสอบที่ต่างกัน

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

OperationWhat must permit itTypical failure message
Append to an existing logFile write access, path traversalPermission denied on the file
Create a missing logDirectory write and search accessPermission denied on the path
Rename a replacement into placeBoth directories, plus sticky restrictionsPermission 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 อนุญาต

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

บทความที่เกี่ยวข้อง