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

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

พรอมต์ไม่ได้มาจาก stdin

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

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

เส้นทางแรก ไฟล์ข้อมูลรับรองสองบรรทัด

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

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

เส้นทางที่สอง askpass สำหรับวลีรหัสผ่านของกุญแจ

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

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

เส้นทางที่สาม CLI ของไคลเอนต์พอร์ทัลเอง

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

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

เมื่อโฟลว์ต้องการเทอร์มินัลจำลอง

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

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

ความลับที่รั่วไหล และที่ซ่อนอยู่

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

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

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