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

แยกสิ่งที่โหลดไว้แต่แรกออกจากสิ่งที่เปิดภายหลัง

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

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

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

ระบุการอ่านรันไทม์สามอย่างและเวลาเกิดของแต่ละอย่าง

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

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

Path reopened laterWhat triggers the openFirst sign when it fails
Client configuration fileA connection for that client identityOne client rejected while others connect
Revocation dataPeer authentication, including after replacementRevoked and valid peers both refused
Script or plugin temporary directoryA helper needs to create a fileThe helper exits with a path error

persist-key ตอบคำถามที่แคบกว่าที่คนส่วนใหญ่คิด มัน เก็บไฟล์คีย์ให้เปิดอยู่ตลอดการรีเซ็ต SIGUSR1 และ ping-restart ที่มีเอกสาร และไม่ทำอะไรให้ไฟล์ CCD ข้อมูลการเพิกถอน ไฟล์เรียกทำงานช่วยเหลือ หรือการเริ่มโพรเซสใหม่ทั้งหมด สิ่งเหล่านั้นยังเดินตามเส้นทางเปิดของตัวเอง ภายใต้บัญชีใดก็ตามที่ทำงานอยู่ในขณะนั้น

ยืนยันบัญชีและมุมมองที่มันมีจริง

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

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

ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/alice

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

ให้การเขียนรันไทม์มีไดเรกทอรีของตัวเอง

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

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

ตัดสินใจจากเหตุการณ์ที่คุณทำซ้ำได้

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

สำหรับการรีเซ็ตแบบนุ่ม สัญญาณหนึ่งและบันทึกของ unit แสดงว่าคีย์ถูกอ่านใหม่หรือไม่ ส่งสัญญาณ แล้วอ่านบรรทัดสุดท้ายที่ unit เขียน:

systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pager

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

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