Linux پر AnyConnect: لاگ اِن ترتیب کو محفوظ طریقے سے اسکرپٹ کرنا
Cisco AnyConnect کا vpn بائنری stdin سے جوابات پڑھتا ہے، اور دہرائے جانے والے لاگ اِن کے لیے یہی کافی ہے۔ ترتیب بنائیں، فائل کی حفاظت کریں، تصدیق کریں اور رکیں۔
Cisco AnyConnect کے ساتھ آنے والا vpn کلائنٹ گفتگو کی طرح برتاؤ کرتا ہے: ایک اشارہ چھاپتا ہے، ایک سطر کا انتظار کرتا ہے، پھر اگلا چھاپتا ہے۔ اگر وہ گفتگو کسی فائل یا پائپ سے اندر دی جائے تو وہی بائنری بغیر نگرانی چلتی ہے۔ تکنیک ایک ری ڈائریکٹ اور جوابات کی ترتیب شدہ فہرست ہے، اور اسکرپٹ قابلِ بھروسا ہے یا نہیں یہ ری ڈائریکٹ نہیں، وہی فہرست طے کرتی ہے۔
عملاً دو چیزیں اسے توڑتی ہیں۔ جب گیٹ وے کچھ اضافی پوچھتا ہے تو اشاروں کی ترتیب بدل جاتی ہے، اور محفوظ کردہ پاس ورڈ ایک ٹائپنگ غلطی کو اکاؤنٹ لاک آؤٹ میں بدل دیتا ہے۔ ترتیب کو نسخہ بند ڈیٹا کی طرح دیکھیں جسے گیٹ وے کی ہر تبدیلی کے بعد موازنہ کیا جا سکتا ہے۔ دوبارہ کوشش کرنے کے بجائے بلند آواز میں ناکام ہوں، کیونکہ لوپ ہی وہ راستہ ہے جس سے غلط ٹائپ شدہ پاس ورڈ لاک شدہ اکاؤنٹ بنتا ہے۔
ایک ترتیب، اسی ترتیب سے جس میں کلائنٹ پوچھتا ہے
کلائنٹ کو ایک بار انٹرایکٹو طریقے سے چلائیں اور ہر اشارہ اسی ترتیب سے لکھیں جس میں وہ ظاہر ہوتا ہے۔ وہی نقل جواب-فائل بن جاتی ہے۔ جب آپ فائل کو بائنری میں ری ڈائریکٹ کرتے ہیں تو پہلی سطر خود کنکشن کمانڈ ہونی چاہیے، اسی لیے ترتیب صارف نام کے بجائے ہوسٹ نام سے شروع ہوتی ہے۔
connect vpn.example.com
0
<username>
<password>
y
exit
ننگا 0 گیٹ وے کی فہرست پیش کرنے پر پہلا کنکشن پروفائل منتخب کرتا ہے؛ وہی انڈیکس استعمال کریں جو آپ کا گیٹ وے چھاپتا ہے۔ y لاگ اِن بینر قبول کرتا ہے، اس لیے بینر نہ ہونے پر وہ سطر حذف کریں اور جہاں آپ کا گیٹ وے اضافی سوال پوچھتا ہے وہاں ایک سطر شامل کریں۔ آخر میں exit ہی کلائنٹ کو آخری جواب استعمال ہونے کے بعد صاف طور پر ختم ہونے دیتا ہے۔
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
یہاں غیر انٹرایکٹو موڈ اختیاری نہیں ہے۔ -s کے بغیر کلائنٹ ٹرمینل پر قبضہ کر سکتا ہے اور ری ڈائریکٹ شدہ اِن پٹ نظر انداز کر سکتا ہے؛ اس کے ساتھ جوابات اسٹریم سے پڑھے جاتے ہیں اور عمل واپس آتا ہے۔ جہاں بائنری کو بلند مراعات درکار ہوں وہاں کال کو sudo -n میں لپیٹیں تاکہ اسکرپٹ پاس ورڈ کے اشارے پر اٹکنے کے بجائے فوراً ناکام ہو۔
جواب-فائل کہاں لیک ہوتی ہے
پاس ورڈ والی فائل ایک اسناد ہے، اس لیے اسے اسناد کی اجازتیں دیں: موڈ 600، کام چلانے والے اکاؤنٹ کی ملکیت میں، اور کبھی مشترکہ یا ہم آہنگ ڈائریکٹری میں نہیں۔ بعد میں ٹھیک کرنے کے بجائے موڈ پہلے سے لاگو کر کے بنائیں، کیونکہ لکھنے اور chmod کے درمیان فائل کچھ لمحے سب کے لیے پڑھنے کے قابل ہوتی ہے۔
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
دوسرا نصف argv ہے۔ بطور دلیل دیا گیا پاس ورڈ ہر اس مقامی صارف کو نظر آتا ہے جو عمل کی فہرست بناتا ہے، اور یہ شیل کی تاریخ میں بھی پہنچتا ہے۔ اس کے بجائے اسے فائل ڈسکرپٹر یا ماحول کے متغیر سے پڑھیں، اور پے لوڈ کو اقتباس میں رکھیں تاکہ شیل اندر کچھ بھی پھیلا نہ سکے۔
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
اقتباسات کا خیال رکھیں۔ دہرے اقتباس کے اندر ! والا پاس ورڈ کلائنٹ کے دیکھنے سے پہلے ہی انٹرایکٹو شیل پھیلا سکتا ہے، اور ناکامی پروٹوکول مسئلے جیسی دکھنے والی عام event-not-found خرابی کے طور پر آتی ہے۔
سرنگ ثابت کریں، پھر بند کریں
منسلک حالت صرف یہ ثابت کرتی ہے کہ کلائنٹ سمجھتا ہے اس کا سیشن ہے۔ ایسا ہوسٹ منتخب کریں جو صرف کارپوریٹ نیٹ ورک کے اندر سے جواب دے اور کوئی اور کام کرنے سے پہلے اسے ایک بار جانچیں۔ وہاں ناکامی روٹنگ یا پالیسی کی خرابی ہے، اور لاگ اِن دوبارہ چلانے سے وہ نہیں بدلے گی۔
/opt/cisco/anyconnect/bin/vpn state
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 https://<internal-host>/
/opt/cisco/anyconnect/bin/vpn disconnect
منقطع کرنے سے پہلے اور بعد میں حالت کی آؤٹ پٹ دیکھیں۔ پرانے سیشن کے ساتھ چھوڑا گیا کلائنٹ اگلا کنکشن رد کر سکتا ہے جبکہ اسکرپٹ اب بھی کامیابی رپورٹ کرتی ہے، اور صرف ایگزٹ کوڈ دیکھنے پر یہ ناکامی کی قسم نظر نہیں آتی۔ دوسری قرأت پر اکیلے بھروسا کرنے کے بجائے دونوں کا موازنہ کریں۔ شیل پروفائل میں عرفی نام روزمرہ استعمال کے لیے کافی ہیں، لیکن طے شدہ کوئی بھی کام کسی بھی دوسرے بغیر نگرانی کام کی طرح وہی اسناد اور شناخت کا جائزہ مستحق ہے۔
جب مقررہ فہرست محفوظ نہ رہے
جواب-فائل آج کے اشاروں کی ترتیب کو انکوڈ کرتی ہے۔ بدلا ہوا بینر، لازمی پاس ورڈ تبدیلی یا دوسرے عامل کا چیلنج اسے ایسے لوپ میں بدل دیتا ہے جو اکاؤنٹ لاک کر سکتا ہے، اس لیے اسکرپٹ کو دوبارہ شروع کرنے کے بجائے پہلے غیر متوقع جواب پر باہر نکلنا چاہیے۔
کلائنٹ نے جو چھاپا اسے قید کریں، غیر صفر حالت واپس کریں اور فیصلہ کال کرنے والے پر چھوڑ دیں۔ جہاں گیٹ وے دوسرے عامل کا مطالبہ کرتا ہے، ایماندار جواب یہ ہے کہ اس پروفائل کے لیے بغیر نگرانی لاگ اِن دستیاب نہیں، یہ نہیں کہ ترتیب کو ایک اور سطر چاہیے۔
گردش بھی اسی جائزے کا حصہ ہے۔ اگر اسناد محفوظ کی جاتی ہیں تو طے کریں کہ کون اسے پڑھ سکتا ہے، کب بدلتی ہیں اور میزبان کی تعمیرِ نو پر انہیں کیا ہٹاتا ہے۔ جو اسکرپٹ ایک سال چلتی ہے کیونکہ کسی نے پاس ورڈ کو نہیں چھیڑا وہ ڈیزائن نہیں، بلکہ گردش کی پالیسی کا انتظار کرنے والا حادثہ ہے۔
وہ پروفائل جو AnyConnect نہیں
Cisco کے دو پرانے اسناد کے انداز اس سے خلط ملط ہوتے ہیں۔ vpnc پروفائل IPSec ID مانگتا ہے، جو دراصل گروپ کا نام ہے، پھر گروپ راز، پھر آپ کی اپنی اسناد، اور تینوں اسی سے آتی ہیں جو گیٹ وے چلاتا ہے۔ پرانا Cisco IPsec AnyConnect سے مختلف پروٹوکول ہے، اس لیے vpnc صرف-AnyConnect سروس تک نہیں پہنچ سکتا؛ openconnect --protocol=anyconnect اس کام کے لیے کھلا کلائنٹ ہے۔
.pcf فائل پرانے کلائنٹ پروفائل کی وضاحت کرتی ہے۔ اس میں موجود میزبان، گروپ کا نام اور گروپ پاس ورڈ Cisco IPsec بولنے والے کلائنٹ میں ہاتھ سے دوبارہ درج کیے جا سکتے ہیں، تاہم فائل کوئی عالمگیر درآمد نہیں اور کوئی بھی غیر طے شدہ پورٹ یا ٹنلنگ موڈ عام طور پر منتقلی میں غائب ہو جاتا ہے۔
گیٹ وے واقعی کیا پیش کرتا ہے اس سے شروع کریں، پھر وہ کلائنٹ چنیں جو وہ پروٹوکول بولتا ہے۔ دوسری سائٹ سے پروفائل کاپی کرنا ہی وہ راستہ ہے جس سے لوگ ایسی اسناد ڈی بگ کرنے پہنچتے ہیں جو کبھی مسئلہ ہی نہیں تھیں۔