GUI کے بغیر Linux شیل سے Cisco Secure Client میں لاگ ان
here-دستاویز لاگ ان پروٹوکول نہیں ہے۔ اصل پرامپٹ ترتیب ریکارڈ کریں، بدلنے پر expect استعمال کریں، اور پاس ورڈ کو argv اور تاریخ سے باہر رکھیں۔
عقیدہ یہ ہے کہ چار سطروں والی here-دستاویز مکمل غیر متعامل لاگ ان ہے، اور یہ اُس وقت تک قائم رہتا ہے جب تک گیٹ وے دو گروپ پیش نہ کرے، بینر نہ چھاپے، یا پاس ورڈ کے بعد ٹوکن نہ مانگے۔ تب وہی اسکرپٹ پاس ورڈ اُس مینیو میں لکھ دیتی ہے جو عدد کا انتظار کر رہا تھا۔ Linux پر کمانڈ لائن کلائنٹ اسکرپٹ کیا جا سکتا ہے، لیکن صرف اُس صورت میں جب آپ اُسے وہ دیں جس کا وہ واقعی انتظار کر رہا ہے، نہ کہ وہ جو ٹیوٹوریل نے فرض کیا۔
مقررہ here-دستاویز ایک افسانہ ہے
Cisco کا Linux کلائنٹ /opt/cisco/anyconnect/bin/vpn پر ایک چھوٹا پروگرام نصب کرتا ہے، اور Secure Client 5 اب بھی اُسے بھیجتا ہے۔ جب vpnagentd سروس چل رہی ہو، تو -s فلیگ جوابات معیاری ان پٹ سے اُسی ترتیب میں پڑھتا ہے جس میں کلائنٹ اُنہیں مانگتا ہے۔ یہ ترتیب سرورز کے درمیان مقرر نہیں ہے۔
گروپ مینیو ایک سطر بڑھاتا ہے۔ لاگ ان بینر ایک اور بڑھاتا ہے۔ پاس ورڈ کے بعد ٹوکن کی درخواست چار سطروں والی اسکرپٹ کو مکمل طور پر توڑ دیتی ہے، کیونکہ پانچویں سطر کبھی ٹوکن نہیں بننی تھی۔ ناکامی خاموش ہے: کلائنٹ کو غلط سٹرنگ ملتی ہے، کنکشن کی کوشش ختم ہو جاتی ہے، اور اسکرپٹ کوئی کارآمد اطلاع نہیں دیتی۔
کلائنٹ کو ایک بار اُسی گیٹ وے اور ورژن کے سامنے ہاتھ سے چلائیں، اور پرامپٹ اُسی ترتیب میں لکھیں جس میں وہ نمودار ہوتے ہیں۔ وہی نقل وہ تفصیل ہے جو آپ کی اسکرپٹ کو پوری کرنی ہے۔
کلائنٹ کس چیز کا انتظار کر رہا ہے
عام ایک گروپ کی صورت میں ترتیب صارف نام، پاس ورڈ اور کبھی کبھار بینر کی تصدیق ہے۔ here-دستاویز کی پہلی سطر صرف اُس وقت مینیو انڈیکس بنتی ہے جب سرور واقعی مینیو دکھائے، اسی لیے وہی اسکرپٹ ایک جگہ چلتی ہے اور اگلی جگہ ناکام ہو جاتی ہے۔
/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-دستاویز یا expect منتخب کریں، راز کو argv اور تاریخ سے باہر رکھیں، حالت اور ایک وسیلہ جانچیں، پھر اُسی اسکرپٹ میں منقطع ہوں۔