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

จับคู่ไคลเอนต์กับสามชั้นที่เขียนสคริปต์ได้

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

What the client exposesWhat to scriptWhat still bites
OS-native connection entryrasdial, scutil --nc, nmcliTunnel is up before DNS and routes settle
Vendor CLI reading stdinCLI wrapped by the scheduler, secret from the credential storePrompt text changes between releases
GUI onlyPinned version plus a state assertionLocale and DPI break the click targets

เส้นทางที่หนึ่ง: ระบบปฏิบัติการเป็นเจ้าของโปรไฟล์อยู่แล้ว

นี่คือเส้นทางที่ถูกที่สุดและเป็นเส้นทางที่คนส่วนใหญ่มองข้าม บน Windows rasdial "Office" เชื่อมต่อ และ rasdial "Office" /disconnect ปิดการเชื่อมต่อ rasphone -d "Office" ขับเคลื่อนรายการเดียวกันผ่านอินเทอร์เฟซการหมุนหมายเลข macOS แสดงบริการที่บันทึกไว้ด้วย scutil --nc list และเริ่มหนึ่งรายการด้วย scutil --nc start ส่วน Linux มอบงานให้ NetworkManager

rasdial "Office" user *
scutil --nc start "Office"
nmcli connection up id Office
nmcli -t -f GENERAL.STATE connection show Office

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

เส้นทางที่สอง: ผู้จำหน่ายมีบรรทัดคำสั่งให้

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

printf '%s\n' "$VPN_PASS" | openconnect --protocol=anyconnect \
  --user "$VPN_USER" --passwd-on-stdin vpn.example.com

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

เส้นทางที่สาม: ระบบอัตโนมัติแบบ GUI และทำไมจึงมาสุดท้าย

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

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

อะไรพังหลังจากอุโมงค์ขึ้นแล้ว

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

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

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

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