একটি OpenVPN ক্লায়েন্ট বিরত রাখা: প্রত্যাহার কেন ভুল লিভার
সেশন হত্যা করা প্রত্যাবর্তনযোগ্য; সার্টিফিকেট প্রত্যাহার নয়। মামলার কোন লিভার দরকার তা ঠিক করুন, তারপর যখন মানায় তখনই CRL পুনর্গঠন করুন।
একটি ক্লায়েন্টের প্রবেশাধিকার সাময়িকভাবে থামানো আর চিরতরে সরিয়ে ফেলা একই কাজ বলে মনে হয়, যতক্ষণ না আপনি দুটির একটি ফেরাতে চেষ্টা করেন। সার্টিফিকেট প্রত্যাহার এমন একটি রেকর্ড লেখে যা সার্ভার চূড়ান্ত হিসেবে ধরে, আর তা ফেরানো মানে ইস্যুকারীর ডেটাবেস হাতে সম্পাদনা করা। জীবন্ত টানেল ফেলে দেওয়া একটি ব্যবস্থাপনা নির্দেশ, যা বিশ্বাসে কিছুই বদলায় না। লিভার বাছুন এই প্রশ্নে যে চাবিটি এখনও বিশ্বাসযোগ্য কি না, অনুরোধটি কত জরুরি মনে হচ্ছে তা নয়।
বিশ্বাস: প্রত্যাহৃত আর স্থগিত একই জিনিস
একজন ঠিকাদারকে এক সপ্তাহের জন্য থামানো হয় আর প্রতিক্রিয়া হয় প্রত্যাহার, কারণ প্রত্যাহার শুনতে কিছু বন্ধ করার মতো শোনায়। এটি পরিচ্ছন্ন দেখায়, দশ সেকেন্ড লাগে, আর ফেরার একমাত্র পথ হিসেবে ডেটাবেস সম্পাদনা রেখে যায়। প্রতিক্রিয়াটি বোধগম্য এবং এটি দরজা বন্ধ করার চেয়ে পাসপোর্ট পুড়িয়ে ফেলার বেশি কাছাকাছি। বিরত রাখা ডিভাইস আর আপসকৃত চাবির ভিন্ন আচরণ দরকার, আর দুটির মধ্যে কেবল একটিই সস্তায় ফেরানো যায়।
পার্থক্যটি ব্যক্তির নয়, প্রমাণপত্রের। যে চাবি এখনও সঠিক হাতে আছে তা কোনো বিশ্বাসের ক্ষতি ছাড়াই থামানো ও আবার চালু করা যায়। যে চাবি কপি হয়ে থাকতে পারে তা কখনও পুনরুদ্ধার করা উচিত নয়, কারণ পুনরুদ্ধার দাবি করে যে কপিটির অস্তিত্ব নেই।
দুটি সিস্টেমের কোনোটিই স্পর্শ করার আগে উত্তরটি লিখে ফেলুন। চাবিটি প্রকাশিত হয়েছে কি না আপনি বলতে না পারলে রক্ষণশীল উত্তর হলো প্রতিস্থাপন।
ব্যবস্থাপনা ইন্টারফেস দিয়ে জীবন্ত সেশনটি ফেলে দিন
OpenVPN একটি ব্যবস্থাপনা ইন্টারফেস দেয় যা সেশন তালিকাভুক্ত করতে পারে এবং সাধারণ নাম দিয়ে একটি হত্যা করতে পারে। এটি localhost-এ চালু করুন, পাবলিক ইন্টারফেস থেকে দূরে রাখুন, আর কোনো সেশন এখনই উধাও হতে হলে হত্যার নির্দেশ পাঠান। নির্দেশটি কেবল সেই টানেল বন্ধ করে, আর প্রতিটি অন্য ক্লায়েন্ট কাজ করতে থাকে।
এটি সক্রিয় সমস্যার প্রতিক্রিয়া, স্থগিতকরণ নীতি নয়। একই প্রোফাইল এক মিনিটেই আবার সংযুক্ত হতে পারে, কারণ তার প্রমাণপত্রে কিছুই বদলায়নি। সেশনটি সরতেই হবে আর স্থায়ী সিদ্ধান্ত এখনও নেওয়া হচ্ছে, এমন সময়ে এটি ব্যবহার করুন।
হত্যা করার আগে সেশনটি সংযুক্ত ছিল কি না নিশ্চিত করুন, যাতে কখনও সংযুক্ত হয়নি এমন ক্লায়েন্ট খুঁজতে না হয়। নিচের স্ট্যাটাস নির্দেশটি এখন কী সংযুক্ত আছে তা ছাপে।
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506হত্যার নির্দেশ যদি বলে এমন ক্লায়েন্ট নেই, তবে সার্টিফিকেটের সাধারণ নামটি আপনি যেটি টাইপ করেছেন সেটি নয়। প্রোফাইল ফাইলের নামের বদলে স্ট্যাটাস আউটপুট পড়ুন।
CRL আসলে কী নিয়ন্ত্রণ করে
সার্ভার সার্টিফিকেটে সংরক্ষিত কোনো প্রত্যাহার পতাকা দেখে না। এটি crl-verify-তে নাম দেওয়া সার্টিফিকেট প্রত্যাহার তালিকা প্রতিটি নতুন সংযোগে পড়ে এবং এমন সার্টিফিকেট প্রত্যাখ্যান করে যার ক্রমিক নম্বর ওই তালিকায় আছে। এর দুটি পরিণতি আছে, আর দুটিই পরিচালনাগতভাবে গুরুত্বপূর্ণ। ফাইলটি যে অ্যাকাউন্টে সার্ভার বিশেষাধিকার নামায় তার কাছে পঠনযোগ্য হতে হবে, আর ইতিমধ্যে সংযুক্ত ক্লায়েন্ট আবার সংযুক্ত হওয়ার আগ পর্যন্ত চলতে থাকে।
দ্বিতীয় পরিণতিটি ঘটনার সময় মানুষকে অবাক করে। সার্টিফিকেট প্রত্যাহার বর্তমানে এটি ব্যবহার করা টানেল বন্ধ করে না। সেশনটি সঙ্গে সঙ্গে শেষ হতে হলে প্রত্যাহারের সঙ্গে ব্যবস্থাপনা হত্যা জুড়ে দিন, আর দুটি কাজকে রানবুকে আলাদা ধাপ হিসেবে ধরুন।
সর্বশেষ যে ফাইলটি কপি করেছেন তার সময়চিহ্নে ভরসা না করে তালিকাটি পরীক্ষা করুন, সার্ভার আসলে কী প্রয়োগ করবে তা দেখতে। ক্রমিক সংখ্যার গণনাই গুরুত্বপূর্ণ অংশ।
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemকোনো এন্ট্রি নেই এমন তালিকা আর সঠিক এন্ট্রি আছে এমন তালিকা ডিরেক্টরি তালিকায় একই দেখায়, তাই ক্রমিক সংখ্যার গণনা ছাপানো সার্থক। অনুমতির লাইনটিও সমান গুরুত্বপূর্ণ, কারণ ডেমন যে ফাইল পড়তে পারে না তা প্রত্যাখ্যাত ক্লায়েন্টের মতো দেখতে ব্যর্থতা তৈরি করে।
একটি রেকর্ড পুনরুদ্ধার, সাবধানে
সার্টিফিকেট পুনরুদ্ধার মানে ইস্যু ডেটাবেসে একটি রেকর্ড উল্টে দেওয়া এবং নতুন তালিকা প্রকাশ করা। easy-rsa 3 ওই ডেটাবেসটি PKI ডিরেক্টরির নিচে index.txt হিসেবে রাখে, আর পুরোনো বিন্যাস ভিন্ন ব্যবস্থা ব্যবহার করত। একটি সারি শুরু হয় অবস্থা-বর্ণ আর মেয়াদ শেষের তারিখ দিয়ে। প্রত্যাহৃত সারি ক্রমিক নম্বর, সার্টিফিকেট ফাইলের নাম আর বিশিষ্ট নাম নিয়ে এগোনোর আগে প্রত্যাহারের জন্য একটি সময়চিহ্ন ঢোকায়। সারিটি ফিরিয়ে রাখতে হলে ওই সময়চিহ্ন মুছে বর্ণটি উল্টে দিতে হয়, আর বাকি সবকিছু অপরিবর্তিত রাখতে হয়।
আগে ফাইলটির ব্যাকআপ নিন, আর টেক্সট এডিটরে টাইপ না করে স্ক্রিপ্টে সম্পাদনাটি লিখুন। যে টাইপো একটি সারি কতগুলো ক্ষেত্র বহন করে তা বদলে দেয়, তা পরে যোগ করা প্রতিটি সার্টিফিকেটের ইস্যু নষ্ট করে। এ কারণেই পরিবর্তনটি স্বয়ংক্রিয় করা এবং স্পর্শ করার আগে ফাইলটি কপি করা দরকার।
একই নামের দ্বিতীয় প্রত্যাহারও প্রায়ই ব্যর্থ হয়, কারণ প্রথম চালানাটি ওই সার্টিফিকেট ও তার চাবি যেসব ডিরেক্টরিতে টুলটি তাদের খুঁজে পেতে আশা করে সেখান থেকে সরিয়ে ফেলেছিল। তখন টুলটি যা প্রত্যাহার করতে বলা হয়েছিল তা খুঁজে পায় না, আর ত্রুটির বার্তা কেন তা সবসময় স্পষ্ট বলে না।
cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crlনতুন তালিকাটি প্রকাশ করুন, তার মালিকানা ঠিক করুন, আর সার্ভারকে তা পড়তে দিন। বেশিরভাগ ইনস্টলেশনে একটি রিলোডই যথেষ্ট, কিন্তু নিশ্চিতকরণ নতুন সংযোগ থেকেই আসতে হবে, কারণ বিদ্যমান সেশনটি কিছুই আবার যাচাই করেনি।
মামলাটি কোন লিভারের যোগ্য তা যাচাই করুন
পুরো রানবুক নির্ধারণ করে দেয় এমন একটি প্রশ্ন করুন: প্রাইভেট চাবিটি কি এখনও কেবল যেখানে থাকা উচিত সেখানেই আছে। যদি থাকে, তবে সেশন হত্যা আর নথিভুক্ত বিরতি মামলাটি ঢেকে দেয় এবং কোনো স্থায়ী রেকর্ড রেখে যায় না। যদি না থাকে, তবে একমাত্র নিরাপদ উত্তর হলো নতুন চাবি, আর পুরোনো সার্টিফিকেট প্রত্যাহৃত অবস্থায় থাকে।
তারপর কনফিগারেশন পার্থক্য নয়, সংযোগের চেষ্টা দিয়ে ফলাফল যাচাই করুন। পার্থক্য আপনাকে বলে আপনি কী চেয়েছিলেন, আর সংযোগ বলে সার্ভার কী প্রয়োগ করে।
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506পুনরুদ্ধার করা ক্লায়েন্ট সংযুক্ত হয়ে স্ট্যাটাস আউটপুটে দেখা গেলে রেকর্ড সম্পাদনা কাজ করেছে। প্রত্যাহৃত ক্লায়েন্ট প্রত্যাখ্যাত হয়ে লগে CRL-এর নাম এলে প্রত্যাহার কাজ করেছে। এর মাঝের যেকোনো কিছু অনুমতি বা রিলোডের সমস্যা, আর পরবর্তী অনুরোধ আসার আগে তা ঠিক করা সার্থক।