Linux শেল থেকে Cisco Secure Client-এ লগইন, GUI ছাড়াই
here-document কোনো লগইন প্রোটোকল নয়। প্রকৃত প্রম্পট ক্রম লিখে রাখুন, তা বদলালে expect ব্যবহার করুন, আর পাসওয়ার্ড argv ও হিস্টরি থেকে দূরে রাখুন।
ধারণাটি হলো চার লাইনের একটি 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 আপনাকে এমন একটি ট্রান্সক্রিপ্টও দেয় যা গোপন অংশ বাদ দিয়ে লগ করা যায়, আর কোনো আপগ্রেডের পরে গেটওয়ে প্রম্পট বদলালে তা exit কোডের চেয়ে বেশি কাজে লাগে।
গোপন তথ্যকে কোথাও থাকতেই হবে
এই সমস্যার প্রতিটি সংস্করণে একটিই দুর্বলতা: পাসওয়ার্ডটিকে ক্লায়েন্ট যে আকারে পড়তে পারে সেই আকারে থাকতেই হবে। আর্গুমেন্ট হিসেবে পাঠালে তা প্রসেস টেবিলে প্রকাশ পায়। পাইপের মধ্য দিয়ে echo করলে তা প্রায়ই শেল হিস্টরিতে ঢুকে পড়ে। ভাগ করা জাম্প হোস্টে অন্য স্থানীয় ব্যবহারকারীরাও দুটোই পড়তে পারে।
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 ও হিস্টরি থেকে দূরে রাখুন, অবস্থা ও একটি রিসোর্স যাচাই করুন, তারপর একই স্ক্রিপ্টেই বিচ্ছিন্ন হন।