หลังลดสิทธิ์: ไฟล์ OpenVPN ใดยังทำงานอยู่?
ตัวอธิบายที่เปิดก่อนการลดสิทธิ์ยังทำงานต่อ ส่วนเส้นทางที่เปิดใหม่ภายหลังไม่ทำงาน ตัดสินใจว่าการตั้งค่าของคุณต้องเปิดไฟล์รันไทม์ใดในสามไฟล์ใหม่
ระยะเวลาทำงานที่นานพิสูจน์เพียงว่าเริ่มต้นสำเร็จด้วยสิทธิ์ที่เดมอนมีในขณะนั้น ความล้มเหลวที่สำคัญตรงนี้มาภายหลัง: ไคลเอนต์ใหม่เชื่อมต่อ รายการเพิกถอนถูกแทนที่ สคริปต์ช่วยเหลือต้องเขียนไฟล์ แต่ละอย่างเป็นการเปิดใหม่ที่ทำโดยบัญชีไร้สิทธิ์ พร้อมคำถามเรื่องสิทธิ์ของตัวเองและข้อความผิดพลาดของตัวเอง สามการตัดสินใจแยกการตั้งค่าที่ยังทำงานต่อออกจากสิ่งที่ล้มเหลวในเหตุการณ์ถัดไป
แยกสิ่งที่โหลดไว้แต่แรกออกจากสิ่งที่เปิดภายหลัง
ตัวอธิบายคือที่จับบนคำอธิบายไฟล์ที่เปิดอยู่ และโหมดการเข้าถึงถูกกำหนดไว้ตั้งแต่สร้างคำอธิบายนั้น การเปลี่ยนผู้ใช้ของโพรเซสภายหลังไม่ได้ปิดที่จับ เพราะเหตุนี้ไฟล์คีย์ที่อ่านในฐานะ root จึงยังทำงานหลังการลดสิทธิ์ โหมดก็ไม่เปลี่ยนเช่นกัน ที่จับที่เปิดเพื่ออ่านไม่กลายเป็นเขียนได้ และที่จับที่เขียนได้ไม่ถูกเพิกถอนเพียงเพราะบัญชีสูญเสียสิทธิ์บนเส้นทาง สองข้อเท็จจริงนี้อธิบายพฤติกรรมที่น่าประหลาดใจส่วนใหญ่ในรายงานเหล่านี้
อีกครึ่งหนึ่งคือหน่วยความจำ เดมอนสามารถวิเคราะห์ใบรับรอง เก็บวัสดุที่วิเคราะห์แล้วและปิดไฟล์ สิ่งที่ยังใช้งานอยู่คือข้อมูล ไม่ใช่ไฟล์ที่เปิดอยู่ ดังนั้นทราฟฟิกที่ต่อเนื่องจึงไม่ได้พิสูจน์ว่าตัวอธิบายเปิดอยู่หรือชื่อเส้นทางเข้าถึงได้ มันพิสูจน์เพียงว่าวัสดุที่จำเป็นสำหรับเซสชันปัจจุบันได้มาจากก่อนหน้านี้
การเปิดภายหลังเป็นธุรกรรมอีกแบบหนึ่ง มันทำงานภายใต้ข้อมูลรับรองปัจจุบัน บริบทความปลอดภัยปัจจุบัน และมุมมองการเมานต์ปัจจุบัน เส้นทางที่อ่านได้ตอนเริ่มต้นจึงอาจถูกปฏิเสธในการเชื่อมต่อครั้งถัดไป การหมุนเวียนเพิ่มกับดัก: การเขียนไฟล์ใหม่ทับชื่อเส้นทางเดิมทิ้งตัวอธิบายที่มีอยู่ให้ผูกกับวัตถุเก่า การโหลดใหม่จึงอาจดูเหมือนสำเร็จในขณะที่เดมอนยังใช้เนื้อหาเดิม เปรียบเทียบ inode ที่โพรเซสถืออยู่กับในดิสก์ก่อนเชื่อว่าการหมุนเวียนมีผล
ระบุการอ่านรันไทม์สามอย่างและเวลาเกิดของแต่ละอย่าง
ทรัพยากรสามอย่างมักถูกเปิดหลังจากเริ่มต้นไปมาก และล้มเหลวในเวลาต่างกัน ไฟล์กำหนดค่าของไคลเอนต์เฉพาะจะอ่านเมื่อไคลเอนต์นั้นเชื่อมต่อ จึงอาจเสียสำหรับผู้ใช้คนหนึ่งในขณะที่คนอื่นทำงานต่อ ข้อมูลการเพิกถอนถูกตรวจระหว่างการยืนยันตัวตนของคู่และอีกครั้งเมื่อไฟล์ถูกแทนที่ ไดเรกทอรีชั่วคราวถูกแตะเฉพาะเมื่อสคริปต์หรือปลั๊กอินเขียนอะไรบางอย่าง
ไม่มีสักอย่างในสามอย่างนี้อยู่ในเส้นทางเริ่มต้น เพราะเหตุนี้เซิร์ฟเวอร์ที่แข็งแรงหลายสัปดาห์จึงล้มเหลวในการเชื่อมต่อครั้งถัดไปได้ หมวดหมู่นี้ยังระบุเจ้าของการแก้ไข: สองอย่างแรกคือสิทธิ์อ่านบนการกำหนดค่าภายใต้บัญชีเดมอน และอย่างที่สามคือตำแหน่งที่เขียนได้ซึ่งมีจุดประสงค์แคบ
| Path reopened later | What triggers the open | First sign when it fails |
|---|---|---|
| Client configuration file | A connection for that client identity | One client rejected while others connect |
| Revocation data | Peer authentication, including after replacement | Revoked and valid peers both refused |
| Script or plugin temporary directory | A helper needs to create a file | The 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อย่าสรุปว่าเดมอนที่ถูกบุกรุกไม่สามารถแก้ไขไฟล์ได้อีกเพียงเพราะสิทธิ์ถูกลด สิ่งที่มันยังทำได้ขึ้นอยู่กับข้อมูลรับรองที่เหลือ ความสามารถของมัน ไดเรกทอรีที่มันเขียนได้ และตัวอธิบายที่เขียนได้ซึ่งมันยังถืออยู่ การลดสิทธิ์ทำให้อำนาจแคบลง และรายการการเปิดรันไทม์คือสิ่งที่แสดงว่าแคบเพียงใด เขียนขอบเขตนั้นไว้ข้างการกำหนดค่าเพื่อให้คนถัดไปไม่ต้องค้นพบใหม่