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-বোঝা ক্লায়েন্টে হাতে আবার লিখে দেওয়া যায়, তবে ফাইলটি সর্বজনীন আমদানি নয় এবং যেকোনো নন-ডিফল্ট পোর্ট বা টানেলিং মোড সাধারণত স্থানান্তরে হারিয়ে যায়।

গেটওয়ে আসলে কী দেয় তা দিয়ে শুরু করুন, তারপর সেই প্রোটোকল বোঝে এমন ক্লায়েন্ট বেছে নিন। অন্য সাইট থেকে প্রোফাইল কপি করাই সেই পথ যেখানে মানুষ এমন ক্রেডেনশিয়াল ডিবাগ করতে বসে যা কখনও সমস্যাই ছিল না।

সম্পর্কিত নিবন্ধ