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

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

สามสถานะที่ฮุกสามารถคืนได้

auth-user-pass-verify นั้น คู่มือ OpenVPN 2.6 กำหนดรหัสออก 0 เป็นการยอมรับ 1 เป็นการปฏิเสธ และ 2 เป็นการพิสูจน์ตัวตนแบบเลื่อนออกไป นี่คือสามคำตอบเดียวที่เซิร์ฟเวอร์เข้าใจ และแต่ละอย่างมีผลต่อการเชื่อมต่อต่างกัน สคริปต์ที่ออกด้วยสถานะของคำสั่งสุดท้ายเท่ากับปล่อยให้การเรียกบันทึกหรือขั้นตอนทำความสะอาดเป็นผู้ออกเสียง เขียนสถานะอย่างชัดเจนในทุกสาขา รวมถึงสาขาที่ไม่เคยไปถึงผู้ตรวจสอบ

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

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

อ่านไฟล์ข้อมูลรับรองตามที่เขียนไว้จริง ๆ

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

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

ตัดสินใจว่าคำตอบที่ไม่สามารถจำแนกได้หมายความว่าอย่างไร

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

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

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

ตรวจสอบคำตัดสิน ไม่ใช่บรรทัดที่พิมพ์ออกมา

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

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

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

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