could not read Auth username from stdin ดูเหมือนปัญหาเรื่องการรับรองความถูกต้อง แต่ไม่ใช่. OpenVPN พยายามขอชื่อผู้ใช้จากอินพุตมาตรฐาน ไม่พบสิ่งใดที่อ่านได้ และหยุดก่อนที่จะติดต่อเซิร์ฟเวอร์ด้วยซ้ำ บัญชีอาจถูกต้องสมบูรณ์ก็ได้ เพียงแต่กระบวนการไม่มีใครให้ถาม

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

อ่านข้อผิดพลาดเป็นความล้มเหลวของอินพุตภายในเครื่อง

เมื่อ auth-user-pass ปรากฏโดยไม่มีอาร์กิวเมนต์ไฟล์ ไคลเอนต์คาดว่าจะถาม ในเชลล์แบบโต้ตอบพรอมต์นั้นทำงานได้เพราะโพรเซสมีเทอร์มินัล ภายใต้ systemd งาน cron หรือคอนเทนเนอร์ อินพุตมาตรฐานมักว่างเปล่า และการอ่านจะกลับมาทันทีพร้อมข้อผิดพลาดที่คุณเห็น

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

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

ให้บริการมีแหล่งข้อมูลรับรองที่รองรับ

แหล่งที่รองรับสำหรับการทำงานแบบไม่มีผู้ดูแลคือไฟล์ข้อมูลรับรองที่ส่งเป็นอาร์กิวเมนต์ให้ auth-user-pass. ไฟล์ถูกอ่านเป็นข้อความธรรมดา บรรทัดแรกคือชื่อผู้ใช้ บรรทัดที่สองคือรหัสผ่าน ชี้ไปที่มันด้วยพาธสัมบูรณ์ เช่น /etc/openvpn/client/creds เพื่อให้ไดเรกทอรีทำงานของบัญชีบริการเปลี่ยนความหมายของคำสั่งไม่ได้

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

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

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

ทำไม script-security จึงไม่ช่วย

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

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

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

ตรวจสอบขั้นถัดไปหลังจากไคลเอนต์อ่านไฟล์แล้ว

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

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

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

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

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