การเขียนสคริปต์ไคลเอนต์ VPN: เลือกเลเยอร์ก่อนรหัสผ่าน
CLI ของผู้จำหน่าย rasdial เจตนาของแอป หรือระบบอัตโนมัติของ UI ต่างล้มเหลวคนละแบบ เลือกเลเยอร์ เก็บความลับให้พ้น argv และรอสถานะ ไม่ใช่รหัสออก
สคริปต์เริ่มไคลเอนต์ VPN ที่เลเยอร์ใดก็ตามที่ผู้เขียนเลือก และเลเยอร์นั้นแทบไม่ใช่เลเยอร์ที่งานต้องการ เส้นคำสั่งของผู้จำหน่าย ตัวหมุนของระบบปฏิบัติการ และเจตนาของแอปมือถือ ล้วนกลับมาที่จุดต่าง ๆ ในชีวิตของการเชื่อมต่อ พวกมันจัดการความลับต่างกัน และความต่างนั้นกำหนดว่ารหัสผ่านมองเห็นได้โดยผู้ใช้ทุกคนบนเครื่องหรือไม่ เลือกเลเยอร์ก่อนเขียนบรรทัดแรกของสคริปต์
เลเยอร์ 1: เส้นคำสั่งของผู้จำหน่าย
ไคลเอนต์เดสก์ท็อปส่วนใหญ่ให้เส้นคำสั่งที่รับชื่อโปรไฟล์และบ่อยเกินไปคือรหัสผ่าน ไคลเอนต์เก่าของ Cisco ยอมรับคำกริยา connect พร้อมอาร์กิวเมนต์ผู้ใช้และรหัสผ่าน macOS เปิดเผยบริการในตัวผ่าน networksetup NetworkManager ตอบสนองต่อ nmcli การเรียกเหล่านี้กลับมาเมื่อคำสั่งจบ ซึ่งไม่ใช่ช่วงเวลาที่อุโมงค์ใช้งานได้ อ่านเอกสารของผู้จำหน่ายสำหรับเวอร์ชันที่คุณติดตั้ง เพราะอินเทอร์เฟซเหล่านี้เปลี่ยนและบางส่วนถูกถอดออกทั้งหมด
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
ข้อดีคือผู้จำหน่ายรู้จักที่เก็บโปรไฟล์ของตนเอง การเรียกจึงใช้การกำหนดค่าเดียวกับที่ GUI ใช้ ข้อเสียคือผู้จำหน่ายแต่ละรายคิดคำกริยาของตนเอง และสคริปต์ที่เขียนสำหรับไคลเอนต์หนึ่งไม่ย้ายไปยังอีกรายหนึ่ง มองเลเยอร์นี้เป็นเส้นทางที่สั้นที่สุดเมื่อไคลเอนต์คงที่และเวอร์ชันถูกปักหมุด
เลเยอร์ 2: บริการของระบบปฏิบัติการเอง
บน Windows ตัวหมุนเป็นส่วนหนึ่งของระบบปฏิบัติการ และทำงานกับรายการสมุดโทรศัพท์แทนที่เก็บโปรไฟล์ของผู้จำหน่าย ทำให้พกพาได้มากกว่าระหว่างไคลเอนต์และเขียนสคริปต์จากบัญชีบริการได้ง่ายกว่า ยังหมายความว่าการเชื่อมต่ออาจมีอยู่ในที่หนึ่งแต่ไม่มีในอีกที่หนึ่ง ซึ่งทำให้ผู้ที่ดูผิดรายการสับสน
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
ใช้พื้นผิว PowerShell เมื่อต้องสร้างหรือลบรายการแทนการหมุน ชั้น WMI และ cmdlet เปิดเผยวัตถุเดียวกันในชื่อต่างกัน และการลบเป็นการดำเนินการแยกจากการตัดการเชื่อมต่อ สคริปต์ที่หมุนเท่านั้นจะทิ้งรายการเก่าไว้หลังการย้าย ตรวจสอบว่าระบบอัตโนมัติของคุณเขียนไปยังที่เก็บใดก่อนสัญญาว่าการล้างจะเกิดขึ้น
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
บน macOS สิ่งที่เทียบเท่าคือรายการบริการเครือข่าย ซึ่งบริการที่มีอยู่เชื่อมต่อด้วยชื่อแทนการสร้างขึ้นทันที
ข้อมูลรับรองรั่วในทุกเลเยอร์ ดังนั้นเลือกช่องทาง
ทุกสิ่งที่คุณส่งบนเส้นคำสั่งจะปรากฏในตารางโปรเซสสำหรับผู้ใช้ภายในทุกคน และมักอยู่รอดในประวัติของเชลล์ด้วย ทางเลือกที่ OpenVPN สนับสนุนคือ อ่านความลับจากไฟล์ ด้วย --askpass และไฟล์เองต้องมีสิทธิ์ที่ตรงกับความไว้วางใจที่คุณให้ ท่อมีชื่อหลีกเลี่ยงการเขียนความลับลงดิสก์ แต่ยอมให้โปรเซสใดก็ตามที่เปิดได้เขียนที่นั่น บน Windows เก็บความลับในตัวจัดการข้อมูลรับรอง หรือในไฟล์ที่เฉพาะบัญชีบริการอ่านได้ และอย่าเก็บเป็นข้อความตรงในไฟล์แบตช์
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
กฎเดียวกันใช้กับโทเค็นและรหัสใช้ครั้งเดียว หากระบบอัตโนมัติต้องการ ระบบอัตโนมัติต้องการช่องทางที่ไม่ใช่อาร์กิวเมนต์ของเส้นคำสั่ง หมุนความลับเมื่อเปลี่ยนกลไก เพราะค่าเก่าเคยอยู่ในบันทึกที่ไหนสักแห่ง สคริปต์ที่ทำงานและรั่วไม่ใช่สคริปต์ที่ทำงาน
รอสถานะ แล้วกำกับดูแลเจ้าของเพียงรายเดียว
การเรียกแต่ละครั้งกลับมาก่อนอุโมงค์พร้อม ดังนั้นสำรวจสถานะที่ไคลเอนต์เปิดเผย หรือทดสอบปลายทางภายในด้วยเวลาจำกัด การคัดลอกไฟล์หรือเปิดการเชื่อมต่อฐานข้อมูลทันทีหลังการเรียกเชื่อมต่อคือการแข่ง และล้มเหลวเป็นครั้งคราวในลักษณะที่ดูเหมือนความผิดพลาดของเครือข่าย
ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null
การตัดการเชื่อมต่อมีปัญหาเดียวกันในทางกลับกัน โปรเซสอาจออกก่อนเส้นทางหายไป ใช้ฮุกของไคลเอนต์ที่มีอยู่ เช่น OpenVPNสคริปต์ up และ down หรือ ExecStartPost ของยูนิต systemd เพราะมันทำงาน ณ จุดที่คุณสนใจจริง ๆ ฮุกรันด้วยสิทธิ์ของสิ่งที่เรียกมัน ดังนั้นฮุกที่รีสตาร์ตเครือข่ายต้องมีกฎที่ชัดเจนแทนการสันนิษฐาน เก็บเจ้าของไว้เพียงหนึ่งเดียวตลอดอายุของการเชื่อมต่อ
เมื่อผู้ดูแลสองคนเริ่มและหยุดโปรไฟล์เดียวกัน ผลลัพธ์คือลูปเชื่อมต่อใหม่ที่อ่านเหมือนผู้ให้บริการล่ม runbook จบเมื่อเลเยอร์ถูกบันทึก ความลับมีช่องทางที่ไม่ใช่ argv เงื่อนไขการรอคือการตรวจสอบสถานะที่มีเวลาจำกัด และโปรเซสเดียวเป็นเจ้าของวงจรชีวิต