რწმენა ისაა, რომ ოთხსტრიქონიანი here-document სრულყოფილი არაინტერაქტიული შესვლაა, და ის გრძელდება ზუსტად მანამ, სანამ კარიბჭე ორ ჯგუფს შემოგვთავაზებს, ბანერს დაბეჭდავს ან პაროლის შემდეგ ტოკენს მოითხოვს. მაშინ იგივე სკრიპტი პაროლს ჩაწერს მენიუში, რომელიც რიცხვს ელოდა. Linux-ის ბრძანების ხაზის კლიენტი სკრიპტიზაციას ექვემდებარება, მაგრამ მხოლოდ მაშინ, თუ მას აძლევთ იმას, რასაც ის რეალურად ელოდება, და არა იმას, რაც სახელმძღვანელომ ჩათვალა.

ფიქსირებული here-document მითია

Cisco-ს Linux კლიენტი ამონტაჟებს პატარა პროგრამას /opt/cisco/anyconnect/bin/vpn-ზე, და Secure Client 5 კვლავ აწვდის მას. როცა vpnagentd სერვისი მუშაობს, -s დროშა პასუხებს სტანდარტული შეყვანიდან კითხულობს იმ თანმიმდევრობით, რომლითაც კლიენტი ითხოვს მათ. ეს თანმიმდევრობა სერვერებს შორის ფიქსირებული არ არის.

ჯგუფური მენიუ ერთ სტრიქონს ამატებს. შესვლის ბანერი კიდევ ერთს. პაროლის შემდეგ ტოკენის მოთხოვნა ოთხსტრიქონიან სკრიპტს სრულად ამსხვრევს, რადგან მეხუთე სტრიქონი არასდროს უნდა ყოფილიყო ტოკენი. მარცხი ჩუმია: კლიენტი იღებს არასწორ სტრიქონს, კავშირის მცდელობა მთავრდება და სკრიპტი არაფერს აცნობებს სასარგებლოს.

გაუშვით კლიენტი ხელით ერთხელ იმავე კარიბჭისა და ვერსიის წინააღმდეგ და ჩაწერეთ მოთხოვნები იმ თანმიმდევრობით, რომლითაც ისინი მოდიან. ეს ჩანაწერი არის სპეციფიკაცია, რომელიც თქვენმა სკრიპტმა უნდა შეასრულოს.

რას ელოდება კლიენტი

ჩვეულებრივ ერთჯგუფიან შემთხვევაში თანმიმდევრობაა მომხმარებლის სახელი, პაროლი და ზოგჯერ ბანერის დადასტურება. here-document-ის პირველი სტრიქონი მენიუს ინდექსად მხოლოდ მაშინ იქცევა, როცა სერვერი ნამდვილად აჩვენებს მენიუს, და ამიტომ ერთი და იგივე სკრიპტი ერთ ადგილზე მუშაობს, ხოლო შემდეგზე მარცხდება.

/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF

წაიკითხეთ ეს როგორც ოთხი პასუხი ოთხ შესაძლო კითხვაზე, და არა როგორც ფიქსირებული პროტოკოლი. ნული მენიუს არჩევანია, არა პაროლი, და ბოლო y იღებს ბანერს, რომელსაც მრავალი კარიბჭე არასდროს აგზავნის.

გამოიყენეთ expect, როცა თანმიმდევრობა მოსალოდნელი არ არის

როცა მოთხოვნების თანმიმდევრობა იცვლება, შეწყვიტეთ სტრიქონების დათვლა და დაელოდეთ მოთხოვნას. expect სკრიპტი უშვებს connect ბრძანებას, ელოდება მომხმარებლის სახელის მოთხოვნას, აგზავნის, ელოდება პაროლის მოთხოვნას, აგზავნის და შემდეგ ელოდება დაკავშირებულ მდგომარეობას. თითოეულ ლოდინს საკუთარი ვადა აქვს.

ვადის ამოწურვას მარცხად მოეპყარით და გადით. სკრიპტი, რომელიც მოულოდნელი მოთხოვნის შემდეგ აგრძელებს შეყვანის გაგზავნას, სიამოვნებით ჩაწერს პაროლს გარსში, მენიუში ან ნებისმიერ სხვაგან, რაც იმ მომენტში კითხულობს. ასე იქცევა შესვლის სკრიპტი ინციდენტად.

expect ასევე გაძლევთ ჩანაწერს, რომლის შენახვაც საიდუმლოს მოცილებით შეიძლება, და ეს გამოსვლის კოდზე მეტად ღირებულია, როცა კარიბჭე განახლების შემდეგ საკუთარ მოთხოვნებს ცვლის.

საიდუმლო სადღაც უნდა ცხოვრობდეს

ამ პრობლემის ყველა ვერსიას ერთი სისუსტე აქვს: პაროლი უნდა არსებობდეს იმ ფორმით, რომლის წაკითხვაც კლიენტს შეუძლია. არგუმენტად გადაცემა მას პროცესების ცხრილში ამჟღავნებს. მილის გავლით გაჟღერება ხშირად გარსის ისტორიაში აყენებს. ორივეს კითხულობენ სხვა ლოკალური მომხმარებლები საერთო გადასახტომ ჰოსტზე.

install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net

ანგარიშის საკუთრებაში არსებული 600 რეჟიმის ფაილი მინიმუმია, და ის კვლავ ღია ტექსტის საიდუმლოა დისკზე. secret-tool lookup კითხულობს Linux-ის გასაღებების რგოლიდან, ხოლო macOS-ზე იგივე საქმეს security find-generic-password -w აკეთებს. სადაც ორგანიზაცია მხარს უჭერს სერტიფიკატით ან SAML ავთენტიფიკაციას, უპირატესობა მას მიეცით, რადგან შენახული პაროლი და MFA ერთადაც ვერ ასრულებენ შესვლას ადამიანის გარეშე.

დაადასტურეთ გვირაბი და შემდეგ აიღეთ დახურვა

ნუ დაეყრდნობით შეცდომის ტექსტის არარსებობას. ჰკითხეთ კლიენტს მისი მდგომარეობა და ინტერფეისი ცალკე შეამოწმეთ:

/opt/cisco/anyconnect/bin/vpn state
ip -brief address

მდგომარეობა უნდა აჩვენებდეს Connected-ს, და გვირაბის ინტერფეისს უნდა ჰქონდეს მისამართი. შემდეგ მოითხოვეთ ერთი რესურსი, რომელზეც გვირაბი უნდა მივიდეს, რადგან მარშრუტის გარეშე დაკავშირებული მდგომარეობა რეალური შედეგია და ადვილად გამოსატარებელი.

გათიშეთ vpn disconnect-ით და მიეცით გვირაბის გამშვებ სკრიპტს დახურვის პასუხისმგებლობა. წარუმატებელი სამუშაო, რომელიც სესიას ღიად ტოვებს, ლიცენზიის ადგილს ხარჯავს და შემდეგისთვის ავთენტიფიკაციის პრობლემად გამოიყურება.

სამუშაოს რიგი: დაადასტურეთ vpnagentd, დააფიქსირეთ მოთხოვნების რეალური თანმიმდევრობა, აირჩიეთ here-document ან expect, დაიცავით საიდუმლო argv-ისა და ისტორიისგან მოშორებით, შეამოწმეთ მდგომარეობა და ერთი რესურსი, შემდეგ კი გათიშეთ იმავე სკრიპტში.

დაკავშირებული სტატიები