เซสชันแรกชนะ: จำกัดการล็อกอิน OpenVPN ก่อนการขับออก
การปฏิเสธการล็อกอินภายหลังไม่เหมือนกับการแทนที่ของเดิม การตัดสินใจต้องเกิดก่อนการขับชื่อเดียวกันออก และการตรวจสอบช่องต้องเป็นแบบอะตอมมิก
นโยบายที่อนุญาตหนึ่งเซสชันต่อบัญชีดูเหมือนจะจบลงแล้วจนกว่าการล็อกอินครั้งที่สองจะมาถึง ผลลัพธ์เป็นไปได้สองทาง: ผู้มาใหม่แทนที่เซสชันที่กำลังทำงาน หรือเซสชันที่กำลังทำงานเก็บช่องไว้และผู้มาใหม่ถูกปฏิเสธ มีเพียงทางที่สองเท่านั้นที่เป็นนโยบายเซสชันแรกชนะ ตัวเลือกไคลเอนต์ที่คนส่วนใหญ่ใช้จะเปิดใช้งานการทำงานพร้อมกัน จึงไม่ได้ผลลัพธ์นี้
สัญญาสองฉบับซ่อนอยู่หลังการตั้งค่าเดียว
เมื่อปิดการทำงานพร้อมกัน การเชื่อมต่อที่สองซึ่งมีชื่อใบรับรองเดียวกันอาจขับเซสชันที่ทำงานอยู่แล้วออกไป การเปิดการทำงานพร้อมกันอนุญาตหลายเซสชันในเวลาเดียวกัน ซึ่งตรงข้ามกับขีดจำกัด ไม่มีสถานะใดเป็นนโยบายการปฏิเสธ ดังนั้นการตัดสินใจจึงต้องเกิดขึ้นที่อื่นโดยสิ้นเชิง
เขียนสัญญาก่อนที่จะลงมือทำอะไร: ใครถูกปฏิเสธ หลักฐานใดระบุเซสชันที่กำลังทำงาน และเกิดอะไรขึ้นเมื่อเซสชันตายโดยไม่มีการตัดการเชื่อมต่อที่สะอาด นโยบายที่ไม่มีใครระบุไว้เช่นนั้นไม่อาจทดสอบได้ในภายหลัง
การขับออกเกิดขึ้นก่อนฮุกเชื่อมต่อของคุณ
ในเส้นทางโค้ดเซิร์ฟเวอร์ 2.6 การเตรียมการช่วงแรกสำหรับไคลเอนต์ใหม่จะลบอินสแตนซ์ที่มีชื่อเดียวกันซึ่งมีอยู่แล้วเมื่อปิดการทำงานพร้อมกัน การลบนั้นเกิดขึ้นก่อนที่ห่วงโซ่ตัวจัดการการเชื่อมต่อจะทำงาน สคริปต์ที่สังเกตเห็นรายการซ้ำและคืนค่าความล้มเหลวจึงปฏิเสธผู้มาใหม่หลังจากเซสชันที่กำลังทำงานถูกทิ้งไปแล้ว ซึ่งเป็นผลลัพธ์ที่นโยบายต้องการป้องกันพอดี ลำดับการเรียกกลับในการใช้งาน upstream เป็นคำตอบเดียวที่เชื่อถือได้สำหรับบิลด์ของคุณ
| Stage | Who can still refuse | Effect on the incumbent |
|---|---|---|
| Certificate check | Server trust configuration | None |
| Authentication decision | The authentication controller | None, because establishment has not run |
| Connect handler | A profile script | Already evicted in the same-name case |
| Post-establishment | Status tooling, monitoring | Both sessions already exist or one is gone |
การสำรวจไฟล์สถานะก็ไม่ใช่ประตูเช่นกัน ความพยายามสองครั้งที่มาพร้อมกันอาจเห็นช่องว่างทั้งคู่ก่อนที่ฝ่ายใดจะยืนยัน และทั้งคู่ก็ดำเนินต่อไป
ย้ายการตัดสินใจไปที่การพิสูจน์ตัวตน
อินเทอร์เฟซการจัดการสามารถรับเอาการตัดสินใจพิสูจน์ตัวตนหลังการตรวจสอบใบรับรอง ในรูปแบบนั้นตัวควบคุมไม่ใช่ผู้เฝ้าดู: มันรับอินสแตนซ์ไคลเอนต์ที่เชื่อมต่อแต่ละรายและตอบว่าอินสแตนซ์นั้นไปต่อได้หรือไม่ เพราะคำตอบมาถึงก่อนการสร้างเซสชัน การปฏิเสธจึงไม่แตะเซสชันที่กำลังทำงาน ช่องทางเดียวกันรายงานการตัดการเชื่อมต่อ และนั่นคือวิธีที่ตัวควบคุมรู้ว่าช่องถูกปล่อยอย่างถูกต้อง
ทุกอินสแตนซ์ใหม่ต้องผ่านประตูนี้ รวมถึงการเชื่อมต่อใหม่และเส้นทางใดก็ตามที่พิสูจน์ตัวตนซ้ำโดยไม่มีการถาม ประตูที่บางอินสแตนซ์ไม่เคยไปถึงไม่ปกป้องอะไรเลย และการละเลยนั้นจะมองไม่เห็นจนกว่าจะมีคนลองทางอ้อม
โทเคนสามารถเดินผ่านประตูไปได้
เมื่อออกโทเคนแล้ว เซิร์ฟเวอร์สามารถตรวจสอบได้ภายในและข้ามการพิสูจน์ตัวตนภายนอกสำหรับการเชื่อมต่อนั้น. การเรียกการจัดการไม่เคยเกิดขึ้น การตรวจสอบช่องที่ติดตั้งไว้ที่นั่นเท่านั้นจึงไม่เคยเห็นอินสแตนซ์ใหม่ พฤติกรรมนี้เป็นความสะดวกสำหรับผู้ใช้และเป็นรูโหว่สำหรับนโยบายการทำงานพร้อมกัน ทำให้การเชื่อมต่อที่พิสูจน์ด้วยโทเคนผ่านการตรวจสอบที่มีอำนาจเทียบเท่า หรือปิดเส้นทางโทเคนเมื่อนโยบายต้องการการตัดสินใจในทุกการเชื่อมต่อ
อย่าชดเชยด้วยการยอมรับทุกโทเคนโดยไม่มีเงื่อนไข โทเคนที่หมดอายุหรือไม่ถูกต้องยังต้องล้มเหลว และต้องล้มเหลวผ่านจุดตัดสินใจเดียวกับสิ่งอื่นทั้งหมด
ผูกการจองกับอินสแตนซ์ ไม่ใช่กับที่อยู่
ที่อยู่เป็นตัวตนที่อ่อนแอ: การเชื่อมต่อใหม่จากแล็ปท็อปเดียวกันอาจมาจากที่อยู่อื่น และข้อมูลรับรองที่คัดลอกมาอาจมาจากที่อยู่เดียวกัน ผูกการจองกับอินสแตนซ์ไคลเอนต์ที่เซิร์ฟเวอร์กำหนด เพื่อให้การพิสูจน์ตัวตนซ้ำของอินสแตนซ์ที่ได้รับอนุญาตแล้วได้รับการยอมรับว่าเป็นเจ้าของ ตัวระบุอินสแตนซ์ใหม่ต้องได้ช่องของตัวเองผ่านการตัดสินใจผู้มาก่อนชนะ แม้จะแสดงโทเคนเดียวกัน
ปล่อยเฉพาะการจองที่เป็นของความพยายามที่ล้มเหลว เหตุการณ์ตัดการเชื่อมต่อที่ล่าช้าจากความพยายามเก่าต้องไม่ล้างช่องของเจ้าของใหม่ นั่นคือเหตุผลที่การปล่อยระบุอินสแตนซ์ไม่ใช่บัญชี หลังรีสตาร์ตตัวควบคุม ให้กระทบยอดเซสชันที่ยังมีชีวิตก่อนรับใครเข้ามา และใช้กฎเดียวกันกับทุกเกตเวย์ที่ให้บริการบัญชี
ตัดสินใจแยกต่างหากว่าช่องที่เก่าจริงจะถูกกู้คืนอย่างไร ผู้ดูแลระบบต้องการวิธีที่บันทึกไว้สำหรับล้างช่องนั้น และเส้นทางนั้นไม่ควรเข้าถึงได้โดยผู้ใช้ที่เพียงคลิกเชื่อมต่อใหม่
ทดสอบคู่ที่สำคัญ: การล็อกอินสองครั้งเกือบพร้อมกัน การเชื่อมต่อใหม่หลังการปิดที่สะอาด การพิสูจน์ตัวตนซ้ำของเซสชันที่กำลังทำงาน ผู้มาใหม่ที่ถูกปฏิเสธ และการรีสตาร์ตตัวควบคุม ในทุกกรณีเซสชันที่กำลังทำงานต้องยังใช้งานได้ และผู้มาใหม่ต้องถูกปฏิเสธโดยไม่สร้างความเสียหายให้บัญชีอื่น