একটি ডেস্কটপ ক্লায়েন্টে প্রোফাইল ইমপোর্ট করুন, আর প্রথম ব্যর্থতা প্রায়ই এমন একটি লাইন যা ক্লায়েন্ট মানতে অস্বীকার করে: একটি স্ক্রিপ্ট হুক যা সে চালাবে না, বা একটি script-security মান যা সে খুব বেশি অনুমোদনমূলক মনে করে। সংখ্যাটা বাড়ালে ডায়ালগটা চলে যায়। কিন্তু এটি সেই প্রোফাইল আপনার মেশিনে কী চালাতে পারবে তার পরিধিও বাড়ায়, আর শুধু একটি সতর্কবার্তা সরানোর জন্য এটা দেওয়া অদ্ভুত ব্যাপার। ইমপোর্ট থেকে নির্দেশনা পর্যন্ত অনুসরণ করলে সিদ্ধান্তটা বাস্তব হয়ে ওঠে।

ইমপোর্ট ডায়ালগ থেকে নির্দেশনা পর্যন্ত

প্রোফাইলটি নির্দেশনাযুক্ত একটি টেক্সট ফাইল, এবং কোনো টানেল তৈরির আগেই ক্লায়েন্ট সেগুলো পড়ে। up, down বা tls-verify-এর মতো নির্দেশনা একটি বাহ্যিক প্রোগ্রামের নাম দেয় যা OpenVPN নির্দিষ্ট মুহূর্তে চালাবে। OpenVPN সেটি চালাতে রাজি কি না তা script-security নামের আলাদা সেটিং, আর প্রোফাইল সাধারণত সেটিও ঠিক করে দেয়।

তাহলে সতর্কবার্তাটি ক্রিপ্টোগ্রাফি বা সার্টিফিকেট নিয়ে নয়। এটি নিয়ে যে একটি কনফিগারেশন ফাইল ক্লায়েন্টকে হোস্টে কিছু চালাতে বলছে, আর ক্লায়েন্ট দেখছে তার বর্তমান অনুমতি স্তর সেই অনুরোধ অনুমোদন করে কি না।

এই পর্যায়ে দুটি ভিন্ন ব্যর্থতা একই রকম দেখায়। যে প্রোফাইল এমন স্তর চায় যা ক্লায়েন্ট দেবে না, সেটি প্রত্যাখ্যান তৈরি করে। যে প্রোফাইল এমন স্তর চায় যা ক্লায়েন্ট দেয় কিন্তু স্ক্রিপ্ট অনুপস্থিত, সেটি বরং চলার সময় ব্যর্থতা তৈরি করে, আর সাপোর্ট থ্রেডে দুটোকে গুলিয়ে ফেলা হয়। একটি অনুমতির প্রশ্ন, অন্যটি প্যাকেজিংয়ের প্রশ্ন।

প্রতিটি স্তর আসলে কী খোলে

স্তর 0 বাহ্যিক প্রোগ্রাম কল সম্পূর্ণ নিষিদ্ধ করে, যা এমন ক্লায়েন্টের জন্য সঙ্গতিপূর্ণ যে সাহায্য ছাড়াই নিজের ইন্টারফেস কনফিগার করে, আর অসঙ্গতিপূর্ণ তার জন্য যে অপারেটিং সিস্টেমকে ডাকে। স্তর 1, ডিফল্ট, ইন্টারফেস ও রুট কনফিগারেশনের প্রয়োজনীয় অন্তর্নির্মিত এক্সিকিউটেবল অনুমোদন করে। কোনোটিই ব্যবহারকারীর দেওয়া কিছু চালায় না।

LevelWhat OpenVPN may executeWhat it exposes
0No external programs at allInterface and route setup must not depend on helpers
1 (default)Built-in helpers such as ip, ifconfig, route or netshPrivileged commands the platform already ships
2Built-in helpers plus user-defined scriptsWhatever the named script does with the client's privileges
3Everything above, plus passwords in environment variablesCredentials visible to child processes and their logs

স্তর 2 হলো আকর্ষণীয় সীমারেখা, কারণ এটি ব্যবহারকারী-সংজ্ঞায়িত স্ক্রিপ্ট গ্রহণ করে। সেই বিন্দু থেকে ক্লায়েন্টের বিশেষাধিকার এমন কোডে প্রযোজ্য যা আপনি হয়তো কখনও পড়েননি, এমন মুহূর্তে ডাকা হয় যা আপনি বেছে নেননি, এমন এনভায়রনমেন্টে যা সংযোগের বিবরণ ধারণ করে। স্তর 3 আরও এগিয়ে যায় এবং এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে পাসওয়ার্ড পাঠানোর অনুমতি দেয়, তাই ম্যানুয়াল এটি সম্ভাব্য অনিরাপদ বলে বর্ণনা করে।

এই সংখ্যাগুলোর কোনোটিই শক্তির সেটিং নয়। স্তর 3-এ থাকা প্রোফাইলের এনক্রিপশন স্তর 1-এর চেয়ে ভালো নয়; এতে শুধু চালানোর পৃষ্ঠতল বড়, আর টানেল অভিন্ন।

প্রোফাইলটি কী পাওয়ার যোগ্য তা ঠিক করুন

স্ক্রিপ্টটি কী কাজে লাগে তা জিজ্ঞাসা করুন, তার আগে নয় যে এটির কোন স্তর দরকার। যে হুক DNS সেটিংস ঠেলে দেয় বা সংযোগের পর রুট মেরামত করে কিছু চালানোর বৈধ কারণ। যে হুক কোনো অস্থায়ী ফোল্ডারে অপরিচিত বাইনারি ডাকে, সেটি থামার কারণ।

স্ক্রিপ্টের পথ স্ক্রিপ্টের মতোই গুরুত্বপূর্ণ। আপেক্ষিক পথ ক্লায়েন্ট যে ফোল্ডার ব্যবহার করে তার সাপেক্ষে নির্ধারিত হয়, আর লেখার উপযোগী ফোল্ডার এককালীন ইমপোর্টকে স্থায়ী সম্পাদন স্লটে পরিণত করে। ব্যবহারকারী যে ফোল্ডার বদলাতে পারেন না সেখানে পরম পথই পছন্দনীয় রূপ।

স্ক্রিপ্টগুলো ক্লায়েন্টের এনভায়রনমেন্টও উত্তরাধিকার পায়, যেখানে ক্রেডেনশিয়াল ও সংযোগের মেটাডেটা থাকে। এই উত্তরাধিকারই স্তর 3-কে বিপজ্জনক করে তোলে এমন স্ক্রিপ্টের সঙ্গে যা নিজের এনভায়রনমেন্ট লগ করে, আর এজন্যই স্ক্রিপ্ট-সক্রিয় ক্লায়েন্টের ডায়াগনস্টিক ডাম্প টিকিটে পেস্ট করার আগে দ্বিতীয়বার দেখা দরকার। শেয়ার করার আগে এনভায়রনমেন্টটা ছেঁটে ফেলুন।

grep -nE 'script-security|^up |^down |tls-verify' client.ovpn

একটি জিনিস বদলান, তারপর বিচ্ছিন্ন হওয়াও খেয়াল করুন

প্রোফাইলের সত্যিই স্ক্রিপ্ট দরকার হলে শুধু স্তরটাই বদলান, আর শুধু সেই প্রোফাইলের জন্য। ক্লায়েন্টটি ফোরগ্রাউন্ডে বিস্তারিত আউটপুটসহ চালান যাতে স্ক্রিপ্টের নিজের ত্রুটিগুলো দেখা যায়, সার্ভিস ম্যানেজার তা গিলে না ফেলে।

openvpn --config client.ovpn --script-security 2 --verb 3
ip route show default

পুরো জীবনচক্র পরীক্ষা করুন, শুধু সংযোগ নয়। ব্যর্থ ডাউন হুক রুটগুলোকে একটি মৃত টানেলের দিকে রেখে যায়, ফলে মেশিনটি সংযুক্ত দেখায় অথচ কোথাও পৌঁছায় না। পরিবর্তনটি শেষ ঘোষণা করার আগে একবার পুনঃসংযোগ ও একবার বিচ্ছিন্ন করুন, আর প্রতিবারের পরে রাউটিং টেবিল দেখুন।

মূল প্রোফাইলের একটি কপি রাখুন। প্ল্যাটফর্ম ক্লায়েন্ট যদি একই স্ক্রিপ্টিং মডেল প্রয়োগ না করে, তবে ইমপোর্ট সফল হওয়া পর্যন্ত নির্দেশনা মুছে ফেলা টানেলের প্রয়োজনীয় DNS বা রুট ইন্টিগ্রেশন সরিয়ে দিতে পারে, আর ফলাফল সংযোগ নিখুঁতভাবে প্রমাণীকরণ করবে কিন্তু কিছুই রিজলভ করবে না।

যে সিদ্ধান্ত লিপিবদ্ধ করতে হবে তা সংকীর্ণ: কোন স্ক্রিপ্ট, কোন পথে, কোন স্তরে অনুমোদিত, কোন প্রোফাইলের জন্য। প্রোফাইলের বাকি সবকিছু অপরিবর্তিত থাকে, আর এটি এমন একটি বাক্য যা একজন পর্যালোচক যাচাই করতে পারেন।

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