OpenVPN টার্মিনাল থেকে পাসওয়ার্ড পড়ে, stdin থেকে নয়
OpenVPN আসলে কোথায় পাসওয়ার্ড পড়ে, stdin-এ ফাইল দিলে কেন ব্যর্থ হয়, এবং Linux ও macOS-এ স্ক্রিপ্টেড সাইন-ইনের তিনটি সমর্থিত পথ।
OpenVPN নিয়ন্ত্রণকারী টার্মিনালে ব্যবহারকারীর নাম ও পাসওয়ার্ড চায়, আর স্ট্যান্ডার্ড ইনপুটে পুনর্নির্দেশিত ফাইল সেই টার্মিনাল নয়। এই একটি খুঁটিনাটিই ব্যাখ্যা করে সেই স্ক্রিপ্ট, যা পাসওয়ার্ড পাইপে থাকা সত্ত্বেও আটকে যায়। প্রম্পট আঁকে ক্লায়েন্ট, আর পাঠ নেওয়া হয় টার্মিনাল ডিভাইস থেকে, তাই stdin পুনর্নির্দেশ করলে কিছুই বদলায় না। ক্লায়েন্টকে তার নথিভুক্ত ইনপুট পথগুলোর একটি দিয়ে খাওয়ান, আর একই স্ক্রিপ্ট প্রথম চেষ্টাতেই সংযোগ করবে।
তিনটি পথ প্রায় প্রতিটি ক্ষেত্রেই যথেষ্ট, আর প্রতিটি নিজের মতো ব্যর্থ হয়। ক্লায়েন্ট আসলে যে প্রম্পট দেখায় তার ভিত্তিতে বাছুন, যে অপশন স্ক্রিপ্ট করা সবচেয়ে সহজ তার ভিত্তিতে নয়।
প্রম্পট stdin থেকে আসে না
OpenVPN-এর শংসাপত্র দরকার হলে সে নিয়ন্ত্রণকারী টার্মিনাল খোলে এবং সেখান থেকেই পড়ে। এজন্যই ইন্টারঅ্যাকটিভ পরীক্ষা ঠিক দেখায়, আর cron বা unit ফাইলের অধীনে একই কমান্ড নিষ্ক্রিয় বসে থাকে, প্রম্পট লেখা হয় এমন লগে যা কেউ দেখছে না। কিছু বিল্ড টার্মিনাল না থাকলে স্ট্যান্ডার্ড ইনপুটে ফিরে যায়, আর এই অসঙ্গতি কঠিন ব্যর্থতার চেয়েও খারাপ, কারণ এটি মোতায়েনের আগ পর্যন্ত সমস্যাটি লুকিয়ে রাখে।
কোনো কোড লেখার আগে পরিবেশ যাচাই করুন: শিডিউলার বা সার্ভিস ম্যানেজার যে ব্যবহারকারী ও stdin দিয়ে চলবে, ঠিক সেটি দিয়েই ক্লায়েন্ট চালান। যদি প্রম্পট কখনো লগে না আসে এবং প্রসেস এগোয় না, তবে কিছু একটা অনুপস্থিত টার্মিনালের অপেক্ষায় আছে।
প্রথম পথ: দুই লাইনের শংসাপত্র ফাইল
প্রমাণীকরণ অপশনটি একটি পাথ নেয়, আর ফাইলে ঠিক দুই লাইন থাকে, প্রথমে ব্যবহারকারীর নাম তারপর পাসওয়ার্ড, আর কিছুই নয়। ডিফল্ট ফাইলনামের ওপর ভরসা না করে পাথটি স্পষ্টভাবে দিন, কারণ কাজের ডিরেক্টরিতে পড়ে থাকা শংসাপত্র ফাইলই ভুল অ্যাকাউন্ট ব্যবহারে আসার উপায়। মোড 0600 করুন এবং ক্লায়েন্ট চালানো অ্যাকাউন্টকে মালিকানা দিন।
ক্লায়েন্ট এই ফাইলটি চালুর সময় একবার পড়ে, তাই পাসওয়ার্ড ঘোরাতে হলে প্রসেস পুনরায় চালু করতে হবে। সাধারণত এটিই কাঙ্ক্ষিত আচরণ, আর এটি ঘোরানোর প্রক্রিয়ার পাশে রানবুকে থাকা উচিত।
দ্বিতীয় পথ: কী-এর পাসফ্রেজের জন্য askpass
পাসফ্রেজ-সুরক্ষিত প্রাইভেট কী দ্বিতীয়, ভিন্ন একটি প্রম্পট তোলে, আর তার নিজের ফাইলভিত্তিক উত্তর আছে: askpass অপশনটি ফাইলের প্রথম লাইন থেকে পাসফ্রেজ পড়ে। SSH-ভিত্তিক টানেলের জন্য সমতুল্য হলো এমন askpass প্রোগ্রাম যা ক্লায়েন্ট চালায়, আর তার স্ট্যান্ডার্ড আউটপুটই গোপন তথ্য হয়ে যায়।
কোনো রূপই গোপন তথ্য আর্গুমেন্ট তালিকায় রাখে না, আর দুটোই এটি ফাইল হিসেবে বা এটি ছাপানো এক্সিকিউটেবল হিসেবে রেখে দেয়। সুরক্ষা হলো ফাইল অনুমতি ও প্রসেস মালিকানা, গোপনীয়তা নয়। যে হেল্পার কোডে লিখিত স্ট্রিং প্রতিধ্বনি করে, সেটি বাড়তি ধাপে করা একটি গোপন তথ্য।
তৃতীয় পথ: পোর্টাল ক্লায়েন্টের নিজস্ব CLI
এন্টারপ্রাইজ ক্লায়েন্ট সাধারণত একটি কমান্ড-লাইন এন্ট্রি পয়েন্ট দেয় যা কোনো উইন্ডো ছাড়াই একটি নামকৃত পোর্টালে সংযোগ করে, এবং এটিই সমর্থিত পথ। Linux-এ GlobalProtect ক্লায়েন্ট তার CLI দিয়ে সংযোগ ও সার্টিফিকেট আমদানি অপারেশন দেয়, আর সার্টিফিকেট প্রমাণীকরণ ব্যবহার করা পোর্টালগুলোর স্বয়ংক্রিয় সংযোগ কাজ করার আগে আমদানি ধাপটি দরকার। কৃত্রিম কীস্ট্রোকের চেয়ে এটিকেই বেছে নিন: আপনি সত্যিকারের এক্সিট স্ট্যাটাস পান, উইন্ডো ফোকাসের ওপর নির্ভরতা থাকে না, আর লক করা স্ক্রিনেও এটি টেকে।
যদি প্রথম সংযোগে এখনো সার্টিফিকেট গ্রহণ করতে একজন মানুষের দরকার হয়, তবে অটোমেশন শেষ হয়নি। সেটআপের সময়ই আমদানি করুন এবং এটি পূর্বশর্ত হিসেবে লিখে রাখুন।
যখন প্রবাহের সিউডো-টার্মিনাল দরকার
যে ধারাবাহিকতা প্রথমে পাসওয়ার্ড তারপর এককালীন কোড চায়, তার পড়ার জন্য একটি ফাইল নেই। Expect-এর মতো টার্মিনাল ড্রাইভারই সঠিক যন্ত্র, কারণ এটি একে একে প্রতিটি প্যাটার্নের জন্য অপেক্ষা করে, আর কিছু মেলানোর আগেই তার প্রসেস চালু থাকা দরকার।
দুটি ব্যর্থতাই প্রধান। যে স্ক্রিপ্ট ক্লায়েন্ট চালু না করেই প্রম্পটের অপেক্ষা করে, সে চিরকাল অপেক্ষা করে, আর Tcl কোনো শেল নয়, তাই expect ব্লকের ভেতরে লেখা শেল অঙ্কন পড়ার মতো হিসাব হয় না। প্যাটার্ন বানানোর সময় ডিবাগ ফ্ল্যাগ চালু রাখুন, পরে বন্ধ করুন।
যে গোপন তথ্য ফাঁস হয়, আর কোথায় লুকায়
আর্গুমেন্ট হিসেবে পাঠানো যেকোনো কিছু প্রসেস তালিকায় দেখা যায়, তাই শংসাপত্রের জায়গা ফাইলে বা হেল্পারের পিছনে, কখনো কমান্ড লাইনে নয়। এককালীন কোড নকশা অনুযায়ী খরচ হয় এবং প্রতিটি চেষ্টার জন্য তৈরি করতে হয়। ব্যর্থতার লগে প্রায়ই ব্যবহারকারীর নাম আর মাঝে মাঝে আরও থাকে, তাই কোথাও পাঠানোর আগে তা লুকিয়ে নিন, আর গোপন তথ্য প্রোফাইলের বাইরে রাখুন, কারণ ভেতরে পাসওয়ার্ড বসানো কনফিগ ফাইল টিকিট ও রিপোজিটরিতে পেস্ট হয়। তখন অ্যাকাউন্ট ঘোরানো মানে প্রতিটি কপি খুঁজে বের করা, আর ঠিক এই খরচটাই এই বিন্যাস এড়ায়।
আপনি যে পথগুলো বেছেছেন সেগুলো নিরীক্ষা করুন, তারপর সেগুলো unit ফাইল বা শিডিউলারের সাথে যুক্ত করুন যা সত্যিই ক্লায়েন্ট চালাবে। টানেল ঠিক ততদিন বাঁচে যতদিন ওই প্রসেস বাঁচে।