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

เริ่มจากความหมายที่แท้จริงของตัวแปรการตัดการเชื่อมต่อ เมื่อนั้นการเลือกตัวระบุจึงสมเหตุสมผล

สิ่งที่ hook การตัดการเชื่อมต่อบรรจุจริง

ใน Community OpenVPN 2.6 เอกสารอ้างอิง hook time_unix กำหนดให้เป็นเวลาที่ไคลเอนต์เชื่อมต่อ ค่านี้ถูกตั้งก่อนที่ hook การเชื่อมต่อจะทำงาน และไม่ถูกกำหนดใหม่เมื่อ hook การตัดการเชื่อมต่อทำงานในภายหลัง time_duration ให้ความยาวของเซสชันนั้นเป็นวินาที ดังนั้นจุดสิ้นสุดจึงประมาณเวลาเชื่อมต่อบวกกับระยะเวลา ทั้งสองเป็นวินาทีเต็ม และไม่ใช่เวลาที่ฐานข้อมูลของคุณประมวลผลเหตุการณ์ การแยกเวลาทั้งสามนี้ออกจากกันคือสิ่งที่ทำให้ความสัมพันธ์คงอยู่ แทนที่จะดูถูกต้องเฉพาะตอนทดสอบ

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

ทำไมคู่ที่ดูชัดเจนจึงไม่ใช่ค่าเฉพาะ

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

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

ตัวตนที่มั่นคงมาจากไหน

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

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

ทำให้การปลดระวางมีเงื่อนไขและทำซ้ำได้อย่างปลอดภัย

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

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

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

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

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