VPN-ში შესვლის ავტომატიზაცია, როცა კლიენტს API ან CLI არ აქვს
აირჩიე სკრიპტის გზა იმის მიხედვით, თუ რას ამჟღავნებს კლიენტი: ოპერაციული სისტემის საკუთრებაში არსებული პროფილი, მომწოდებლის CLI, რომელიც საიდუმლოს stdin-იდან კითხულობს, ან GUI ავტომატიზაცია ბოლო საშუალებად.
სამი კითხვა წყვეტს ამას და მხოლოდ სამი. ქმნის კლიენტი ოპერაციულ სისტემაში კავშირის ჩანაწერს, რომელიც გადატვირთვას გადაურჩება? გვაძლევს ის ბრძანების ხაზს, რომელსაც საიდუმლოს აღება შეუძლია არა მხოლოდ არგუმენტების სიიდან? აიძულებს მისი იდენტურობის მოთხოვნა ადამიანს ბრაუზერის შეტყობინებაზე პასუხის გაცემას? უპასუხე ამ თანმიმდევრობით და არჩევანი წყვეტს გემოვნების საკითხი იყოს, რადგან დაგეგმილი დავალება მხოლოდ იმდენად შეიძლება იყოს თავისუფალი, რამდენსაც სამი პასუხიდან ყველაზე სუსტი იძლევა.
შეუსაბამე კლიენტი სამ სკრიპტირებად ფენას
OS-ის მშობლიური პროფილი, მომწოდებლის CLI, მხოლოდ GUI-ის კლიენტი და ბრაუზერის SSO-ს კლიენტი ოთხ სხვადასხვა მიდგომას მოითხოვს. პირველი ორი უმეთვალყურეო გადატვირთვებს უძლებს და უმეთვალყურეო გადატვირთვა მთელი არსია. დანარჩენ ორს სკრიპტამდე დიზაინის გადაწყვეტილება სჭირდება.
| What the client exposes | What to script | What still bites |
|---|---|---|
| OS-native connection entry | rasdial, scutil --nc, nmcli | Tunnel is up before DNS and routes settle |
| Vendor CLI reading stdin | CLI wrapped by the scheduler, secret from the credential store | Prompt text changes between releases |
| GUI only | Pinned version plus a state assertion | Locale 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ეს ინტერფეისები მხოლოდ OS-ის საკუთრებაში არსებულ პროფილებს იცნობენ, ამიტომ თვითნებურ მესამე მხარის კლიენტს ვერ ამოძრავებენ. როცა პროფილი აკლია, შექმენი ერთხელ და მიეცი სკრიპტს მისი შემოწმების საშუალება, ნაცვლად ყოველ გაშვებაზე ხელახლა შექმნისა. გახადე სკრიპტი იდემპოტენტური: წაიკითხე მიმდინარე მდგომარეობა, დაუკავშირდი მხოლოდ გათიშვისას, შემდეგ შეამოწმე ის კერძო სახელი, რომელიც დავალებას ნამდვილად სჭირდება.
მეორე გზა: მომწოდებელი ბრძანების ხაზს გვაძლევს
ზოგი კლიენტი საკმარის ბრძანების ხაზს ამჟღავნებს, რომ შესაძლებელი იყოს მისი გახვევა: Cisco AnyConnect-ს წლების განმავლობაში აქვს მხოლოდ დაკავშირების დამხმარე, ხოლო OpenConnect ერთი ბინარიდან საუბრობს AnyConnect, GlobalProtect და Pulse პროტოკოლებზე. მთავარი მოთხოვნა არა დროშების სიაა, არამედ ის, საიდან მოდის საიდუმლო, რადგან არგუმენტების სიაში მყოფი პაროლი ნებისმიერს შეუძლია წაიკითხოს, ვისაც პროცესების ჩამოთვლა შეუძლია.
printf '%s\n' "$VPN_PASS" | openconnect --protocol=anyconnect \
--user "$VPN_USER" --passwd-on-stdin vpn.example.comFortiClient-ს და GlobalProtect-ის ზოგიერთ აწყობას საერთოდ არ აქვს მხარდაჭერილი CLI, ხოლო საზოგადო კლიენტი ან მომწოდებლის მიერ ლიცენზირებული შემცვლელი შესყიდვის გადაწყვეტილებაა და არა გვერდის ავლა. CI-ში მიეცი სერვისის ანგარიშს უფლებები სწორედ იმ ბინარზე და არა shell-ზე, რომ ინექციური არგუმენტი root-ბრძანებად ვერ იქცეს.
მესამე გზა: GUI ავტომატიზაცია და რატომ არის ბოლო
როცა ოფიციალურ კლიენტს ინტერფეისი არ აქვს, სკრიპტები ღილაკებს აჭერენ ფანჯრის შეტყობინებებით ან SendKeys-ით. ეს მყიფეა ვერსიისა და ენის მიმართ, შეიძლება ნახევრად დაკავშირებული სესია დატოვოს და ჩუმად ვარდება, როცა დიალოგი არასწორ ენაზე ჩნდება. თუ ამ გზას აირჩევ, დაამაგრე კლიენტის ვერსია, შემდეგ დაადასტურე მიღებული კავშირის მდგომარეობა და სკრიპტის გვერდით შეინახე დოკუმენტირებული ხელით სარეზერვო გეგმა.
იგივე სიფრთხილე ეხება კლიენტის იძულებით გათიშვას მისი პროცესის მოკვლით. გვირაბმა შეიძლება პროცესს გადაურჩეს, ან ზედამხედველმა ის ხელახლა გაუშვას, ამიტომ მოკალი-და-გაუშვი არც საიმედო გადატვირთვაა.
რა ფუჭდება გვირაბის აწევის შემდეგ
წარმატებული აკრეფა მხოლოდ ავთენტიფიკაციას ამტკიცებს და მეტს არაფერს. შეამოწმე ის რესურსი, რომლისთვისაც დავალება არსებობს, მისივე პროტოკოლით და მოკლე ვადით, და წარუმატებლობის შეტყობინებაში დაასახელე ეტაპი. შენს სამუშაო მაგიდაზე ხილული პროფილები, სერტიფიკატები და შენახული მონაცემები შეიძლება სერვისის სესიისთვის უხილავი იყოს, ამიტომ დავალება ერთხელ გაუშვი თავად დამგეგმავის ანგარიშით, სანამ ენდობი.
შეზღუდე ხელახალი ცდები. უარყოფილი მონაცემების გამეორება ანგარიშებს ბლოკავს, ხოლო MFA-ს შეტყობინებას თავისუფალი დავალება რეგისტრაციის დიზაინის გარეშე ვერ უპასუხებს; ბრაუზერის SSO ნაკადის წინააღმდეგ სკრიპტული ხელახალი ცდები მხოლოდ ცდებს წვავს. უპირატესობა მიეცი MDM-ით მიწოდებულ VPN დატვირთვას ან კონფიგურაციის პროფილს ფლოტისთვის, სადაც პლატფორმა ფლობს მონაცემების სასიცოცხლო ციკლს, და შეინახე სკრიპტები იმ კლიენტებისთვის, რომელთა მართვაც ასე შეუძლებელია.
ჩაწერე გასვლის კოდი და პირველი წარუმატებელი რესურსი და არა ის ფაქტი, რომ სკრიპტი გაეშვა. სწორედ ეს ერთი სტრიქონი აქცევს დამგეგმავის გაფრთხილებას ხუთწუთიან დიაგნოზად.