ওপেনএসএসএইচ/নির্দেশিকা/হোস্ট-ভিত্তিক প্রমাণীকরণ
হোস্ট-ভিত্তিক প্রমাণীকরণ বা 'Host-based authentication' এমন একটি পদ্ধতি যেখানে একটি কম্পিউটার সিস্টেম তার অধীনে থাকা সকল ব্যবহারকারী বা নির্দিষ্ট কিছু ব্যবহারকারীর পরিচয় স্বয়ংক্রিয়ভাবে নিশ্চিত করার সুযোগ পায়। এই প্রক্রিয়ার মাধ্যমে একটি সিস্টেমের সব ব্যবহারকারীকে যেমন সুযোগ দেওয়া যায়, তেমনি Match নির্দেশিকা ব্যবহার করে নির্দিষ্ট কিছু ব্যবহারকারীকেও আলাদাভাবে বেছে নেওয়া সম্ভব। বিশেষ করে কম্পিউটিং ক্লাস্টার ব্যবস্থাপনা এবং সমজাতীয় বা একই ধরনের কনফিগারেশন সম্পন্ন একাধিক মেশিনের পুল পরিচালনার ক্ষেত্রে এই ধরনের প্রমাণীকরণ ব্যবস্থা অত্যন্ত কার্যকর ও ফলপ্রসূ বলে বিবেচিত হয়।
হোস্ট-ভিত্তিক প্রমাণীকরণ প্রক্রিয়াটি সফলভাবে সম্পন্ন করার জন্য সার্ভার প্রান্তে সর্বমোট তিনটি ফাইলকে যথাযথভাবে প্রস্তুত বা কনফিগার করতে হয়। অন্যদিকে, ক্লায়েন্ট বা ব্যবহারকারী প্রান্তে মাত্র দুটি ফাইল পরিবর্তন করলেই চলে, তবে সংশ্লিষ্ট হোস্টটির নিজস্ব এসএসএইচ (SSH) হোস্ট কি (host keys) অবশ্যই নির্ধারিত বা অ্যাসাইন করা থাকতে হবে। নিচে বর্ণিত পদ্ধতিগুলো অনুসরণ করলে একটি সিস্টেম থেকে অন্য একটি সিস্টেমে একমুখী (single direction) হোস্ট-ভিত্তিক প্রমাণীকরণ ব্যবস্থা স্থাপন করা সম্ভব হবে। যদি উভয়মুখী বা দ্বিমুখী প্রমাণীকরণের প্রয়োজন হয়, তবে এই একই পদ্ধতিটি দুইবার অনুসরণ করতে হবে এবং প্রতিবার সিস্টেমগুলোর ভূমিকা (সার্ভার ও ক্লায়েন্ট হিসেবে) অদলবদল করে নিতে হবে।
হোস্ট-ভিত্তিক প্রমাণীকরণের জন্য ক্লায়েন্ট-সাইড কনফিগারেশনসমূহ
[সম্পাদনা]ক্লায়েন্ট বা উৎস হোস্টের ক্ষেত্রে প্রধানত দুটি ফাইল কনফিগার করা প্রয়োজন এবং এর পাশাপাশি সিস্টেমে অন্তত একটি হোস্ট কি বিদ্যমান থাকা বাধ্যতামূলক:
- /etc/ssh/ssh_known_hosts - এটি পরিচিত হোস্টগুলোর পাবলিক কি (public keys) সংরক্ষণের জন্য ব্যবহৃত একটি গ্লোবাল বা বৈশ্বিক ফাইল।
- /etc/ssh/ssh_config - এই ফাইলটির মাধ্যমে ক্লায়েন্টদের হোস্ট-ভিত্তিক প্রমাণীকরণের অনুরোধ পাঠানোর অনুমতি প্রদান করা হয়।
এরপর যদি ক্লায়েন্টের হোস্ট কি-গুলো আগে থেকে তৈরি করা না থাকে, তবে সেগুলো অবশ্যই তৈরি করে নিতে হবে:
- /etc/ssh/ssh_host_ecdsa_key
- /etc/ssh/ssh_host_ed25519_key
- /etc/ssh/ssh_host_rsa_key
যে সকল ক্লায়েন্ট সিস্টেম নির্দিষ্ট কোনো হোস্টের সাথে সংযোগ স্থাপন করতে চায়, তাদের প্রত্যেকটিতেই এই তিনটি ধাপ যথাযথভাবে সম্পন্ন করা প্রয়োজন। একবার এই ব্যবস্থাটি সঠিকভাবে সেটআপ করা হয়ে গেলে, একটি সিস্টেমে লগ-ইন করা অ্যাকাউন্টগুলো কোনো প্রকার অতিরিক্ত ইন্টারঅ্যাক্টিভ প্রমাণীকরণ বা পাসওয়ার্ড ছাড়াই অন্য সিস্টেমে সরাসরি সংযোগ স্থাপন করতে সক্ষম হবে। তবে এটি মনে রাখা জরুরি যে, অনেক ক্ষেত্রে বা সংবেদনশীল পরিবেশে হোস্ট-ভিত্তিক প্রমাণীকরণকে অননুমোদিত প্রবেশ রোধে যথেষ্ট শক্তিশালী মনে করা নাও হতে পারে, কারণ এটি মূলত হোস্ট-টু-হোস্ট (host-by-host) ভিত্তিতে কাজ করে।
১. সার্ভারের পাবলিক কি-সমূহ ক্লায়েন্টে যুক্ত করা
[সম্পাদনা]রিমোট সার্ভারের পাবলিক হোস্ট কি-সমূহ ক্লায়েন্ট সিস্টেমের গ্লোবাল কনফিগারেশন ফাইল তথা /etc/ssh/ssh_known_hosts ফাইলে অবশ্যই সংরক্ষণ করতে হবে। সার্ভার থেকে এই পাবলিক কি-গুলো সংগ্রহ করার একটি সহজ উপায় হলো ssh-keyscan(1) কমান্ডটি ব্যবহার করে সেগুলো সংগ্রহ করা এবং পরবর্তীতে সংরক্ষণ করা।
$ ssh-keyscan server.example.com | tee -a /etc/ssh/ssh_known_hosts
কোনো পরিবর্তন করার আগে যদি সিস্টেমে আগে থেকেই /etc/ssh/ssh_known_hosts ফাইলটি থেকে থাকে, তবে অবশ্যই সেটির একটি ব্যাকআপ কপি তৈরি করে রাখা উচিত। অন্য একটি বিকল্প পদ্ধতি হলো সংশ্লিষ্ট অ্যাকাউন্টগুলোর নিজস্ব ~/.ssh/known_hosts ফাইলে সার্ভারের পাবলিক হোস্ট কি-টি ম্যানুয়ালি যোগ করা। তবে এই দ্বিতীয় পদ্ধতিটি তুলনামূলকভাবে অধিক শ্রমসাধ্য এবং সময়সাপেক্ষ হতে পারে।
কি-গুলো যেভাবেই সংগ্রহ বা যাচাই করা হোক না কেন, তালিকায় থাকা পাবলিক কি-গুলোকে অবশ্যই সার্ভারে থাকা প্রাইভেট হোস্ট কি-গুলোর সাথে সামঞ্জস্যপূর্ণ হতে হবে। এক্ষেত্রে আরএসএ (RSA), ইসিডিএসএ (ECDSA), অথবা এড২৫৫১৯ (Ed25519) — এই তিন ধরনের কি-র যেকোনোটি বা সবগুলোই ব্যবহার করা যেতে পারে। নিরাপত্তার খাতিরে ডিএসএ (DSA) বর্তমানে আর ব্যবহার করা উচিত নয়। পাবলিক কি-গুলো যাচাই করার জন্য ফিঙ্গারপ্রিন্টের মাধ্যমে হোস্ট কি যাচাইকরণ সংক্রান্ত কিভাবে ফিঙ্গারপ্রিন্টের মাধ্যমে হোস্ট কি যাচাই করতে হয় অনুচ্ছেদটি দেখে নিতে পারেন, যেখানে প্রাসঙ্গিক পদ্ধতিগুলো বিস্তারিত আলোচনা করা হয়েছে।
২. সিস্টেমব্যাপী ক্লায়েন্ট কনফিগারেশন
[সম্পাদনা]এই প্রক্রিয়াটি সফলভাবে সম্পন্ন করার জন্য সিস্টেমের কনফিগারেশনে মূলত দুটি গুরুত্বপূর্ণ পরিবর্তন আনা আবশ্যক। প্রথমত, যখন ক্লায়েন্ট কোনো নির্দিষ্ট সিস্টেমের সাথে সংযোগ স্থাপন করবে, তখন তার কনফিগারেশনে অবশ্যই হোস্ট-ভিত্তিক অথেন্টিকেশন বা প্রমাণীকরণের অনুরোধ থাকতে হবে। দ্বিতীয়ত, ক্লায়েন্ট কনফিগারেশন ফাইলে ssh-keysign(8) সক্রিয় করার বিষয়টি নিশ্চিত করতে হবে। এটি মূলত একটি সহায়ক অ্যাপ্লিকেশন যা লোকাল হোস্ট কি (host keys) অ্যাক্সেস করতে এবং হোস্ট-ভিত্তিক প্রমাণীকরণের জন্য প্রয়োজনীয় ডিজিটাল সিগনেচার বা ডিজিটাল স্বাক্ষর তৈরি করতে ব্যবহৃত হয়। এই উভয় পরিবর্তনই ক্লায়েন্ট সিস্টেমের /etc/ssh/ssh_config নামক গ্লোবাল কনফিগারেশন ফাইলে সম্পন্ন করা সম্ভব।
নিচে ক্লায়েন্ট সিস্টেমের /etc/ssh/ssh_config ফাইলের একটি উদ্ধৃতি প্রদান করা হলো, যা সমস্ত মেশিনের জন্য হোস্ট-ভিত্তিক প্রমাণীকরণ ব্যবহারের চেষ্টা করে। উল্লেখ্য যে, ssh_config(5)-এ বর্ণিত Host নির্দেশিকাটি ব্যবহার করে কোনো নির্দিষ্ট সার্ভার বা সার্ভার গ্রুপের ক্ষেত্রে এই অ্যাক্সেস বা প্রবেশাধিকার আরও সুনির্দিষ্টভাবে সীমাবদ্ধ করা যেতে পারে।
Host *.pool.example.org
HostbasedAuthentication yes
EnableSSHKeysign yes
রেড হ্যাট এন্টারপ্রাইজ লিনাক্স ৮ (Red Hat Enterprise Linux 8)-এর মতো কিছু নির্দিষ্ট ডিস্ট্রিবিউশনের ক্ষেত্রে, EnableSSHKeysign নির্দেশিকাটি সঠিকভাবে কাজ করার জন্য এটিকে সাধারণ বা জেনারেল সেকশনে স্থাপন করার প্রয়োজন হতে পারে। সেক্ষেত্রে কনফিগারেশনটি নিম্নরূপ হবে:
Host *.pool.example.org
HostbasedAuthentication yes
Host *
EnableSSHKeysign yes
প্রয়োজন অনুযায়ী অন্যান্য কনফিগারেশন নির্দেশিকাও এখানে যুক্ত করা যেতে পারে। উদাহরণস্বরূপ, একই পুলের ক্ষেত্রে প্রয়োগ করা আরও দুটি অতিরিক্ত সেটিংস নিচে দেখানো হলো:
Host *.pool.example.org
HostbasedAuthentication yes
EnableSSHKeysign yes
ServerAliveCountMax 3
ServerAliveInterval 60
যদি ক্লায়েন্ট হোস্টের হোম ডিরেক্টরিটি এনএফএস (NFS) বা এএফএস (AFS) ব্যবহারের মাধ্যমে অন্য কোনো মেশিনের সাথে শেয়ার করা থাকে, তবে সেক্ষেত্রে NoHostAuthenticationForLocalhost নির্দেশিকাটি পর্যালোচনা করাও অত্যন্ত ফলপ্রসূ হতে পারে।
একটি প্রাসঙ্গিক তথ্য হিসেবে জেনে রাখা ভালো যে, ssh-keysign(8) প্রোগ্রামটি অবশ্যই 'SUID root' হিসেবে সেট করা থাকতে হবে। তবে সাধারণত এটি ইনস্টল করার সময়ই স্বয়ংক্রিয়ভাবে SUID সেট হয়ে যায়, তাই ব্যবহারকারীকে এখানে নতুন করে কোনো পরিবর্তন করার প্রয়োজন পড়ে না।
৩. ক্লায়েন্ট সিস্টেমের নিজস্ব হোস্ট কি (Host Keys) সেটআপ করা
[সম্পাদনা]ssh-keysign(8) প্রোগ্রামটির সঠিকভাবে কাজ করার জন্য ক্লায়েন্ট সিস্টেমের /etc/ssh/ ডিরেক্টরিতে থাকা প্রাইভেট হোস্ট কি (private host keys) পড়ার প্রয়োজন হয়। সাধারণত ওপেনএসএসএইচ (OpenSSH) সার্ভার ইনস্টল করলে এই কি-গুলো স্বয়ংক্রিয়ভাবে তৈরি হয়ে যায়; তবে ক্লায়েন্ট সিস্টেমে যদি ওপেনএসএসএইচ সার্ভার ইনস্টল করা না থাকে, তবে সেটি করার কোনো বাধ্যবাধকতা নেই। শুধুমাত্র কি-গুলো থাকলেই এই প্রক্রিয়ার জন্য যথেষ্ট। যদি ক্লায়েন্ট সিস্টেমের প্রাইভেট হোস্ট কি-গুলো বিদ্যমান না থাকে, তবে হোস্ট-ভিত্তিক প্রমাণীকরণ কার্যকর করার আগে ssh-keygen(1) ব্যবহার করে ম্যানুয়ালি বা হাতে কলমে সেগুলো তৈরি করে নেওয়া আবশ্যক।
$ ssh-keygen -A
যখন -A অপশনটি ব্যবহার করা হয়, তখন ডিফল্ট পাথ বা পূর্বনির্ধারিত পথ হিসেবে সাধারণত /etc/ssh/ ব্যবহৃত হয়।
এখানে বিশেষভাবে লক্ষণীয় যে, অন্য কোনো সিস্টেমে পৌঁছানোর জন্য হোস্ট-ভিত্তিক প্রমাণীকরণ ব্যবহারের ক্ষেত্রে ক্লায়েন্ট সিস্টেমে এসএসএইচ সার্ভার সচল থাকার প্রয়োজন নেই। তবে হোস্ট কি-গুলো সঠিকভাবে পাওয়ার জন্য ক্লায়েন্ট সার্ভারে এসএসএইচ সার্ভার ইনস্টল করে পরবর্তীতে সেটি নিষ্ক্রিয় বা আনইনস্টল করে দেওয়া একটি কার্যকর পদ্ধতি হতে পারে।
হোস্ট-ভিত্তিক প্রমাণীকরণের জন্য সার্ভার অংশের কনফিগারেশনসমূহ
[সম্পাদনা]হোস্ট-ভিত্তিক প্রমাণীকরণ বা অথেন্টিকেশন প্রক্রিয়াটি সঠিকভাবে কার্যকর করার জন্য সার্ভার অথবা টার্গেট হোস্টের (target host) ভেতরে তিনটি সুনির্দিষ্ট ফাইল সংশোধন বা পরিবর্তন করা অত্যন্ত আবশ্যক। এই ফাইলগুলো মূলত নির্ধারণ করে কোন ক্লায়েন্ট হোস্টগুলো সংযোগ স্থাপনের অনুমতি পাবে এবং কীভাবে সেই নিরাপত্তা প্রক্রিয়াটি পরিচালিত হবে:
- /etc/shosts.equiv: এই ফাইলটির সিনট্যাক্স বা লেখার গঠনশৈলী মূলত পুরনো আমলের rhosts.equiv ফাইলের অনুরূপ। এটি মূলত বিশ্বস্ত হোস্টগুলোর একটি তালিকা ধারণ করে।
- /etc/ssh/ssh_known_hosts: এই ফাইলটিতে ক্লায়েন্ট সিস্টেমগুলোর পাবলিক কি (public keys) সংরক্ষিত থাকে, যা সার্ভারকে ক্লায়েন্টের পরিচয় নিশ্চিত করতে সরাসরি সহায়তা করে।
- /etc/ssh/sshd_config: এটি হলো এসএসএইচ (SSH) সার্ভারের প্রধান কনফিগারেশন ফাইল, যার মাধ্যমে হোস্ট-ভিত্তিক প্রমাণীকরণ ব্যবস্থাটি আনুষ্ঠানিকভাবে সক্রিয় বা চালু করা হয়।
অপারেটিং সিস্টেমের ধরন এবং লিনাক্স ডিস্ট্রিবিউশনের ভিন্নতার কারণে shosts.equiv ফাইলটির সঠিক অবস্থান কিছুটা পরিবর্তিত হতে পারে। তবে সাধারণত এটি সিস্টেমের প্রধান কনফিগারেশন ডিরেক্টরির মধ্যেই অবস্থান করে।
১. সার্ভারে অনুমোদিত ক্লায়েন্ট সিস্টেমসমূহ নিবন্ধন করা
[সম্পাদনা]হোস্ট-ভিত্তিক প্রমাণীকরণের প্রচেষ্টাকে বৈধতা দিতে হলে shosts.equiv ফাইলে সেই সকল ক্লায়েন্ট সিস্টেমের একটি তালিকা থাকা বাধ্যতামূলক যেগুলোকে সার্ভার বিশ্বাস করে এবং সংযোগের অনুমতি দেয়। এই ফাইলের ভেতরে হোস্টের নাম (host names), আইপি অ্যাড্রেস (IP addresses) অথবা নেট গ্রুপ (net groups) অন্তর্ভুক্ত করা যেতে পারে। তবে নিরাপত্তার খাতিরে এবং কারিগরি জটিলতা এড়াতে এই ফাইলটিকে যতটা সম্ভব সহজ রাখা এবং শুধুমাত্র হোস্টের নাম বা আইপি নাম্বারের তালিকার মধ্যে সীমাবদ্ধ রাখাই সবচেয়ে বুদ্ধিমানের কাজ। প্রকৃতপক্ষে, এই ফাইলটি শুধুমাত্র প্রাথমিক স্তরের যাচাইকরণ বা 'ফার্স্ট কাট' প্রদান করে। আরও সূক্ষ্মভাবে নিয়ন্ত্রণ করার জন্য, অর্থাৎ নির্দিষ্ট ব্যবহারকারী বা গ্রুপের প্রবেশাধিকার প্রদান বা বাতিল করার ক্ষেত্রে sshd_config(5) ব্যবহার করা অধিকতর কার্যকর ও নিরাপদ পদ্ধতি।
এখানে একটি অত্যন্ত গুরুত্বপূর্ণ বিষয় মনে রাখা প্রয়োজন যে, আপনি যদি shosts.equiv ফাইলটি ব্যবহার করেন, তবে ক্লায়েন্ট এবং সার্ভার উভয় সিস্টেমেই ব্যবহারকারীর নাম (user name) হুবহু এক হতে হবে। উদাহরণস্বরূপ, যদি কোনো ব্যবহারকারী bob@server1.example.org ঠিকানায় সংযোগ স্থাপন করতে চান, তবে ক্লায়েন্ট মেশিনেও তার ব্যবহারকারীর নাম অবশ্যই 'bob' হতে হবে। যদি এমন পরিস্থিতির উদ্ভব হয় যেখানে 'alice' নামক ব্যবহারকারীকে bob@server1.example.org-এ সংযোগ দিতে হবে, তবে সেটি গ্লোবাল বা বৈশ্বিক shosts.equiv ফাইলে উল্লেখ করলে কাজ হবে না। বরং এক্ষেত্রে 'bob'-এর নিজস্ব ডিরেক্টরিতে থাকা .shosts ফাইলে এই বিশেষ অনুমতিটি সুনির্দিষ্টভাবে উল্লেখ করতে হবে।
client1.example.org
192.0.2.102
client8.example.org -bull
@statcluster
ওপেনবিএসডি (OpenBSD) অপারেটিং সিস্টেমে এই ফাইলটি সাধারণত /etc/ ডিরেক্টরিতে অবস্থান করে, যা এই আলোচনায় রেফারেন্স সিস্টেম হিসেবে ব্যবহৃত হয়েছে। তবে অন্যান্য অনেক সিস্টেমে এই ফাইলটি সম্ভবত /etc/ssh/ ডিরেক্টরির ভেতরে খুঁজে পাওয়া যেতে পারে। অবস্থান যেখানেই হোক না কেন, মূলত shosts.equiv ফাইলটিই শনাক্ত করে কোন কোন অ্যাড্রেস বা ঠিকানা থেকে প্রমাণীকরণের চেষ্টা করা যাবে। আপনার ব্যবহৃত সিস্টেমে ফাইলটির সঠিক অবস্থান নিশ্চিত করতে sshd(1)-এর ম্যানুয়াল পেজটি সতর্কতার সাথে দেখে নেওয়া জরুরি।
আপনি যদি .shosts.equiv (এবং .shosts) সম্পর্কে আরও বিস্তারিত কারিগরি তথ্য জানতে চান, তবে hosts.equiv(5) নামক ম্যানুয়াল পেজটি অনুসন্ধান করতে পারেন। তবে এটি বিবেচনায় রাখা উচিত যে, এই পদ্ধতিটি বর্তমানে অনেক পুরনো এবং অপ্রচলিত (deprecated) হিসেবে গণ্য করা হয়। ফলে আধুনিক অনেক উন্নত সিস্টেমে হয়তো এই ম্যানুয়াল পেজটি আর খুঁজে পাওয়া যাবে না।
বিগত সময়ের অবশিষ্টাংশসমূহ
[সম্পাদনা]অত্যন্ত পুরনো কিছু সিস্টেমে দুটি লিগ্যাসি বা উত্তরাধিকার সূত্রে প্রাপ্ত ফাইল থাকতে পারে। যদি shosts.equiv ফাইলের ভেতর থেকে এদের নির্দেশ করা হয়, তবেই কেবল এগুলো সংশোধন করার প্রয়োজন পড়ে। এই netgroup ফাইলের প্রতিটি লাইনে প্রথমে একটি নেট গ্রুপের নাম থাকে এবং এরপর সেই গ্রুপের সদস্যদের তালিকা থাকে, যেখানে সুনির্দিষ্টভাবে হোস্ট, ব্যবহারকারী এবং ডোমেইনের নাম উল্লেখ করা হয়।
- /etc/netgroup - এটি হলো ডিফল্ট নেটগ্রুপ তালিকা।
- /etc/netgroup.db - এটি মূলত নেটগ্রুপ ডাটাবেস, যা নেটগ্রুপ ফাইল থেকে তৈরি করা হয়।
তবে বর্তমান সময়ে এগুলো মূলত পুরনো আমলের rhosts ব্যবস্থার অবশিষ্টাংশ মাত্র এবং আধুনিক নিরাপদ নেটওয়ার্কিং ব্যবস্থায় এগুলো এড়িয়ে চলাই শ্রেয়।
হোস্ট-ভিত্তিক অথেন্টিকেশন বা প্রমাণীকরণের ক্ষেত্রে আরেকটি অবশিষ্ট পদ্ধতি হলো প্রতিটি ব্যবহারকারীর নিজস্ব হোম ডিরেক্টরিতে (home directory) .shosts ফাইলটি ব্যবহার করা। মূলত এই ফাইলটি সিস্টেম-ব্যাপী ব্যবহৃত .shosts.equiv ফাইলের একটি স্থানীয় বা লোকাল সংস্করণ হিসেবে কাজ করে। এই ব্যবস্থার মাধ্যমে, সাধারণ ব্যবহারকারীরা তাদের নিজস্ব ডিরেক্টরিতে একটি লোকাল .shosts ফাইল তৈরি করতে পারেন। এই ফাইলে বিশ্বস্ত রিমোট মেশিন বা কম্পিউটার এবং ব্যবহারকারী-মেশিন জোড়ার একটি তালিকা রাখা হয়, যাদেরকে হোস্ট-ভিত্তিক প্রমাণীকরণের মাধ্যমে সিস্টেমে প্রবেশের অনুমতি দেওয়া হয়।
নিরাপত্তার খাতিরে .shosts ফাইলটি অন্য কোনো গ্রুপ বা সাধারণ ব্যবহারকারীর দ্বারা লিখনযোগ্য (writable) হওয়া উচিত নয়। এই ফাইলের পারমিশন বা অনুমতি সাধারণত ০৬৪৪ (0644) হিসেবে সেট করা হলে তা যথাযথভাবে কাজ করে। লক্ষণীয় যে, .shosts ফাইলের ব্যবহার পদ্ধতি এবং এর অভ্যন্তরীণ বিন্যাস বা ফরম্যাট ঠিক .rhosts ফাইলের মতোই। তবে এর একটি বিশেষ সুবিধা হলো, এটি হোস্ট-ভিত্তিক প্রমাণীকরণের সুযোগ দিলেও পুরনো এবং অনিরাপদ টুল যেমন rlogin এবং rsh এর মাধ্যমে লগইন করার অনুমতি দেয় না। এই ফাইলের প্রতিটি লাইনে একটি করে হোস্টের নাম থাকে। ফাইলের প্রথম কলামটি বাধ্যতামূলক, যেখানে সেই হোস্টের নাম বা আইপি অ্যাড্রেস উল্লেখ করতে হয় যাকে হোস্ট-ভিত্তিক প্রমাণীকরণের চেষ্টা করার অনুমতি দেওয়া হয়েছে।
তবে নিরাপত্তার দৃষ্টিকোণ এবং ব্যবস্থাপনার সুবিধার কথা বিবেচনা করলে, প্রতিটি হোম ডিরেক্টরিতে আলাদা আলাদা .shosts ফাইল রাখার চেয়ে একটি বৈশ্বিক বা গ্লোবাল .shosts.equiv ফাইল ব্যবহার করা অনেক বেশি শ্রেয় এবং সুবিধাজনক।
২. ক্লায়েন্টের পাবলিক কি-সমূহ সার্ভারে সংরক্ষণ করা
[সম্পাদনা]সার্ভারের shosts.equiv ফাইলে যে সকল ক্লায়েন্ট সিস্টেমের তালিকা অন্তর্ভুক্ত করা হয়েছে, তাদের পাবলিক কি (public keys) অবশ্যই সার্ভারের /etc/ssh/ssh_known_hosts ফাইলে সংরক্ষিত থাকতে হবে যাতে সার্ভার তাদের যথাযথভাবে শনাক্ত করতে পারে। এই ফাইলের প্রতিটি লাইনে তিনটি প্রয়োজনীয় ডেটা ফিল্ড বা ক্ষেত্র থাকে। প্রথম ক্ষেত্রটি হলো হোস্টের নাম, আইপি অ্যাড্রেস অথবা কমা দিয়ে আলাদা করা একাধিক নামের তালিকা, যা মূলত shosts.equiv ফাইলের তথ্যের সাথে সামঞ্জস্যপূর্ণ হতে হয়। দ্বিতীয় ক্ষেত্রটি হলো কি-এর ধরন (key type), যা RSA কি-এর জন্য ssh-rsa, Ed25519 কি-এর জন্য ssh-ed25519 অথবা ECDSA কি-এর জন্য ecdsa-sha2-nistp256 হতে পারে। তৃতীয় ক্ষেত্রটিতে স্বয়ং পাবলিক কি-টি বসাতে হয়। সবশেষে, ঐচ্ছিকভাবে কি সম্পর্কে একটি মন্তব্য বা কমেন্ট যোগ করা যেতে পারে।
desktop,192.0.2.102 ssh-rsa AAAAB3NzaC1yc2EAAAABIw ... qqU24CcgzmM=
ক্লায়েন্টের জন্য প্রথম ধাপের মতোই, ক্লায়েন্ট থেকে পাবলিক কি-এর তথ্য সংগ্রহ করে সার্ভারে নিয়ে আসার বেশ কিছু কার্যকর উপায় রয়েছে। এটি sftp(1) কমান্ড ব্যবহার করে কপি করা যেতে পারে, অথবা ব্যবহারকারীর নিজস্ব ডিরেক্টরির ~/.ssh/known_hosts ফাইল থেকেও সংগ্রহ করা সম্ভব। এ ছাড়া ssh-keyscan(1) টুলটি ব্যবহার করেও এই তথ্য সংগ্রহ করা যায়। তবে মনে রাখতে হবে যে, শেষের দুটি পদ্ধতি তখনই কাজ করবে যখন ক্লায়েন্ট সিস্টেমেও একটি এসএসএইচ (SSH) সার্ভার সচল থাকবে।
$ ssh-keyscan -t rsa client.example.org | tee -a /etc/ssh/ssh_known_hosts
৩. সিস্টেম-ব্যাপী সার্ভার কনফিগারেশন বা বিন্যাস
[সম্পাদনা]সার্ভারে পরিবর্তন করতে হবে এমন তৃতীয় গুরুত্বপূর্ণ ফাইলটি হলো sshd_config(5)। এই ফাইলে হোস্ট-ভিত্তিক প্রমাণীকরণ বা অথেন্টিকেশন সচল করার জন্য নির্দেশ দিতে হয়। এর জন্য HostbasedAuthentication ডিরেক্টিভটি ব্যবহার করা হয়। এটি সকল ব্যবহারকারীর জন্য, নির্দিষ্ট কিছু ব্যবহারকারীর জন্য অথবা শুধুমাত্র নির্দিষ্ট কিছু গ্রুপের জন্য কার্যকর করা যেতে পারে।
HostbasedAuthentication yes
হোস্ট-ভিত্তিক প্রমাণীকরণ প্রক্রিয়াটি নির্দিষ্ট ব্যবহারকারী বা দলের (groups) মধ্যে সীমাবদ্ধ রাখা সম্ভব। নিচে sshd_config(5) ফাইল থেকে একটি উদাহরণ দেওয়া হলো, যেখানে 'cluster2' নামক গ্রুপের যেকোনো ব্যবহারকারীকে তাদের পক্ষে হোস্টগুলোকে প্রমাণীকরণের অনুমতি দেওয়া হয়েছে:
Match Group cluster2
HostbasedAuthentication yes
নির্দিষ্ট কিছু হোস্ট কি (host key)-এর ধরন ব্যবহারের অনুমতি প্রদানের জন্য HostbasedAcceptedAlgorithms নির্দেশিকাটি ব্যবহার করা হয়। উল্লেখ্য যে, এই নির্দেশিকাটি পূর্বে HostbasedAcceptedKeyTypes নামে পরিচিত ছিল। এর মাধ্যমে গ্রহণযোগ্য অ্যালগরিদমগুলোর একটি তালিকা কমা (comma) দ্বারা পৃথক করে প্রদান করতে হয়। যে সকল কি অ্যালগরিদম ব্যবহারের অনুমতি দিতে হবে, সেগুলোর প্রত্যেকটি এই তালিকায় স্পষ্টভাবে উল্লেখ করা বাধ্যতামূলক; কারণ তালিকায় অন্তর্ভুক্ত নয় এমন কোনো অ্যালগরিদম ব্যবহারের সুযোগ স্বয়ংক্রিয়ভাবে বাতিল বলে গণ্য হবে। এই অনুমোদিত তালিকায় বা হোয়াইটলিস্টে নির্দিষ্ট প্যাটার্ন (patterns) ব্যবহার করার সুবিধাও বিদ্যমান রয়েছে। নিচের উদাহরণটিতে Ed25519 এবং ECDSA কি-সমূহ ব্যবহারের অনুমতি দেওয়া হয়েছে, তবে RSA এবং DSA-এর মতো অন্যান্য কি-গুলোকে এখানে অনুমোদিত তালিকার বাইরে রাখা হয়েছে।
HostbasedAuthentication yes
HostbasedAcceptedAlgorithms ssh-ed25519*,ecdsa-sha2*
হোস্টের নাম এবং ডিএনএস (DNS) সংক্রান্ত অন্যান্য বিষয়াদি
[সম্পাদনা]নেটওয়ার্কের ক্লায়েন্ট মেশিনগুলোর জন্য সম্ভব হলে পূর্ণাঙ্গ ডিএনএস (DNS) এন্ট্রি তৈরি করা উচিত, যার মধ্যে রিভার্স লুকআপ (reverse lookups) বা বিপরীতমুখী অনুসন্ধানের সুবিধা অন্তর্ভুক্ত থাকবে। তবে অনেক ক্ষেত্রে সার্ভার প্রান্তের sshd_config(5) ফাইলে UseDNS অপশনটিকে 'yes' হিসেবে নির্ধারণ করার প্রয়োজন হতে পারে।
HostbasedAuthentication yes
UseDNS yes
অন্যথায়, সার্ভারের sshd(8) ডেমোনটি লগ ফাইলের মধ্যে তথ্যের অমিল বা মিসম্যাচ (mismatch) সংক্রান্ত ত্রুটি প্রদর্শন করতে পারে:
Sep 24 15:16:02 server sshd[1397]: userauth_hostbased mismatch: client sends client.example.org, but we resolve 203.0.113.68 to 203.0.113.68
Sep 24 15:16:02 server sshd[1397]: userauth_hostbased mismatch: client sends client.example.org, but we resolve 203.0.113.68 to 203.0.113.68
Sep 24 15:16:02 server sshd[1397]: Connection closed by authenticating user fred 203.0.113.68 port 36576 [preauth]
যদি ক্লায়েন্ট মেশিনটির তথ্য ডিএনএস সার্ভারে তালিকাভুক্ত না থাকে, তবে সার্ভার সেই মেশিনটিকে শনাক্ত করতে সমস্যার সম্মুখীন হতে পারে। এমন পরিস্থিতিতে, সংযোগকারী হোস্টগুলোর জন্য ডিএনএস-এ রিভার্স লুকআপ না করার জন্য sshd(8)-কে নির্দেশ দেওয়ার প্রয়োজন হতে পারে। বিশেষ করে অনানুষ্ঠানিক লোকাল এরিয়া নেটওয়ার্ক বা ল্যান (LAN)-এর ক্ষেত্রে এই সমস্যাটি বেশি দেখা যায়, যেখানে হোস্টগুলোর আইপি অ্যাড্রেস থাকলেও কোনো নিবন্ধিত হোস্ট নেম থাকে না। ক্লায়েন্টের ডিএনএস রেকর্ডের এই অভাব দূর করার জন্য HostbasedUsesNameFromPacketOnly নির্দেশিকাটি ব্যবহার করে /etc/ssh/sshd_config ফাইলে কীভাবে কনফিগারেশন করতে হয়, তার একটি উদাহরণ নিচে প্রদান করা হলো।
HostbasedAuthentication yes
HostbasedUsesNameFromPacketOnly yes
যতক্ষণ পর্যন্ত সাধারণ পদ্ধতিটি ব্যর্থ না হচ্ছে, ততক্ষণ এই নির্দেশিকাটি যোগ না করাই শ্রেয়। কারণ অপ্রয়োজনীয়ভাবে এটি ব্যবহার করলে তা স্বাভাবিক প্রক্রিয়ায় হস্তক্ষেপ করতে পারে এবং প্রমাণীকরণ বা অথেন্টিকেশন প্রক্রিয়াকে বাধাগ্রস্ত করতে পারে। মাঝেমধ্যে এমন ঘটে যে, সংযোগ স্থাপনকারী হোস্টটি লক্ষ্যবস্তু বা টার্গেট হোস্টের কাছে প্রত্যাশিত নামের পরিবর্তে অন্য কোনো নামে পরিচিতি পায়। এই ধরনের পরিস্থিতির ফলেও প্রমাণীকরণ প্রক্রিয়াটি সফলভাবে সম্পন্ন হতে পারে না। তাই কনফিগারেশন ফাইলগুলোতে হোস্টের যে নাম ব্যবহার করা হয়েছে, তা যেন হোস্টের প্রকৃত নামের সাথে হুবহু মিলে যায়, সেদিকে বিশেষ নজর রাখা জরুরি।
ডিবাগিং
[সম্পাদনা]এই পুরো কনফিগারেশন প্রক্রিয়াটি বেশ সহজবোধ্য হওয়ার কথা, যেখানে সার্ভার প্রান্তে মাত্র তিনটি ফাইল এবং ক্লায়েন্ট প্রান্তে দুটি ফাইলে সামান্য কিছু পরিবর্তনের মাধ্যমেই সব ব্যবস্থাপনা করা সম্ভব। যদি কোনো ধরনের সমস্যার সৃষ্টি হয়, তবে কোথায় ভুল হয়েছে তা খুঁজে বের করার জন্য sshd(8)-কে স্ট্যান্ডঅ্যালোন মোডে ডিবাগ লেভেল ১ (-d) থেকে ৩ (-ddd) পর্যন্ত এবং ssh(1)-কে ডিবাগ লেভেল ৩ (-vvv)-এ কয়েকবার চালিয়ে পরীক্ষা করার জন্য প্রস্তুত থাকতে হবে। ত্রুটিগুলো একটি নির্দিষ্ট ক্রমানুসারে সংশোধন করা প্রয়োজন, তাই তাড়াহুড়ো না করে প্রতিটি ধাপ অত্যন্ত সতর্কতার সাথে সম্পন্ন করা উচিত।
যদি কোনো কারিগরি ত্রুটির কারণে সার্ভার থেকে "debug3: auth_rhosts2_raw: no hosts access file exists" শীর্ষক বার্তাটি প্রদর্শিত হয়, তবে এটি সাধারণত নির্দেশ করে যে সংশ্লিষ্ট সিস্টেমে shosts.equiv ফাইলটি সম্ভবত ভুল ডিরেক্টরিতে অবস্থান করছে অথবা এটি সম্পূর্ণভাবে অনুপস্থিত। এর পাশাপাশি এটিও প্রতীয়মান হয় যে, উক্ত ব্যবহারকারীর অ্যাকাউন্টে বিকল্প বা ব্যাকআপ ব্যবস্থা হিসেবে কোনো সংরক্ষিত ~/.shosts ফাইলও বিদ্যমান নেই।
অন্যদিকে, যদি এমন পরিস্থিতির উদ্ভব হয় যেখানে ক্লায়েন্টের কি (key) যথাযথভাবে known_hosts ফাইলে অন্তর্ভুক্ত থাকা সত্ত্বেও সার্ভার সেটি শনাক্ত করতে পারছে না এবং যদি ক্লায়েন্টের হোস্ট নেমটি সাধারণ ডিএনএস (DNS) ব্যবস্থায় নিবন্ধিত না থাকে, তবে কনফিগারেশনে HostbasedUsesNameFromPacketOnly নামক নির্দেশিকাটি যুক্ত করার প্রয়োজন হতে পারে। মূলত এই ডিরেক্টিভটি ব্যবহারের ফলে সার্ভার প্রথাগত ডিএনএস লুকআপ (DNS lookup) পদ্ধতির ওপর নির্ভর করার পরিবর্তে সরাসরি ক্লায়েন্ট কম্পিউটার থেকে প্রেরিত বা সরবরাহকৃত নামটিকে গ্রহণ ও ব্যবহার করে থাকে। এর ফলে নেটওয়ার্কের জটিলতা বা ডিএনএস সংক্রান্ত সীমাবদ্ধতা থাকলেও সংযোগ প্রক্রিয়াটি সফলভাবে সম্পন্ন করা সম্ভব হয়।
নিচে 'fred' নামক একজন ব্যবহারকারীর জন্য সম্পাদিত একটি সফল হোস্ট-ভিত্তিক প্রমাণীকরণ (host-based authentication) প্রক্রিয়ার একটি নমুনা লগ বা উদ্ধৃতি প্রদান করা হলো। এই সংযোগটি ১৯২.০.২.১০২ আইপি অ্যাড্রেস সংবলিত একটি হোস্ট কম্পিউটার থেকে পরিচালিত হয়েছে, যা নেটওয়ার্কের অভ্যন্তরে desktop1 নামেও সুপরিচিত। এই নির্দিষ্ট নিরাপত্তা যাচাইকরণ বা অথেন্টিকেশন প্রক্রিয়ায় একটি আধুনিক Ed25519 ক্রিপ্টোগ্রাফিক কি (key) ব্যবহার করা হয়েছে। লগটি বিস্তারিতভাবে পর্যবেক্ষণ করলে লক্ষ্য করা যায় যে, সার্ভারটি শুরুতে একটি ECDSA কি (key) অনুসন্ধান করার প্রচেষ্টা চালায়, তবে সেটি খুঁজে পেতে ব্যর্থ হওয়ায় পরবর্তী ধাপে অগ্রসর হয়।
# /usr/sbin/sshd -ddd
debug2: load_server_config: filename /etc/ssh/sshd_config
...
debug3: /etc/ssh/sshd_config:111 setting HostbasedAuthentication yes
debug3: /etc/ssh/sshd_config:112 setting HostbasedUsesNameFromPacketOnly yes
...
debug1: sshd version OpenSSH_6.8, LibreSSL 2.1
...
debug1: userauth-request for user fred service ssh-connection method hostbased [preauth]
debug1: attempt 1 failures 0 [preauth]
debug2: input_userauth_request: try method hostbased [preauth]
debug1: userauth_hostbased: cuser fred chost desktop1. pkalg ecdsa-sha2-nistp256 slen 100 [preauth]
...
debug3: mm_answer_keyallowed: key_from_blob: 0x76eede00
debug2: hostbased_key_allowed: chost desktop1. resolvedname 192.0.2.102 ipaddr 192.0.2.102
debug2: stripping trailing dot from chost desktop1.
debug2: auth_rhosts2: clientuser fred hostname desktop1 ipaddr desktop1
debug1: temporarily_use_uid: 1000/1000 (e=0/0)
debug1: restore_uid: 0/0
debug1: fd 4 clearing O_NONBLOCK
debug2: hostbased_key_allowed: access allowed by auth_rhosts2
debug3: hostkeys_foreach: reading file "/etc/ssh/ssh_known_hosts"
debug3: record_hostkey: found key type ED25519 in file /etc/ssh/ssh_known_hosts:1
debug3: load_hostkeys: loaded 1 keys from desktop1
debug1: temporarily_use_uid: 1000/1000 (e=0/0)
debug3: hostkeys_foreach: reading file "/home/fred/.ssh/known_hosts"
debug1: restore_uid: 0/0
debug1: check_key_in_hostfiles: key for host desktop1 not found
Failed hostbased for fred from 192.0.2.102 port 10827 ssh2: ECDSA SHA256:CEXGTmrVgeY1qEiwFe2Yy3XqrWdjm98jKmX0LK5mlQg, client user "fred", client host "desktop1"
debug3: mm_answer_keyallowed: key 0x76eede00 is not allowed
debug3: mm_request_send entering: type 23
debug2: userauth_hostbased: authenticated 0 [preauth]
debug3: userauth_finish: failure partial=0 next methods="publickey,password,keyboard-interactive,hostbased" [preauth]
debug1: userauth-request for user fred service ssh-connection method hostbased [preauth]
debug1: attempt 2 failures 1 [preauth]
debug2: input_userauth_request: try method hostbased [preauth]
debug1: userauth_hostbased: cuser fred chost desktop1. pkalg ssh-ed25519 slen 83 [preauth]
debug3: mm_key_allowed entering [preauth]
debug3: mm_request_send entering: type 22 [preauth]
debug3: mm_key_allowed: waiting for MONITOR_ANS_KEYALLOWED [preauth]
debug3: mm_request_receive_expect entering: type 23 [preauth]
debug3: mm_request_receive entering [preauth]
debug3: mm_request_receive entering
debug3: monitor_read: checking request 22
debug3: mm_answer_keyallowed entering
debug3: mm_answer_keyallowed: key_from_blob: 0x7e499180
debug2: hostbased_key_allowed: chost desktop1. resolvedname 192.0.2.102 ipaddr 192.0.2.102
debug2: stripping trailing dot from chost desktop1.
debug2: auth_rhosts2: clientuser fred hostname desktop1 ipaddr desktop1
debug1: temporarily_use_uid: 1000/1000 (e=0/0)
debug1: restore_uid: 0/0
debug1: fd 4 clearing O_NONBLOCK
debug2: hostbased_key_allowed: access allowed by auth_rhosts2
debug3: hostkeys_foreach: reading file "/etc/ssh/ssh_known_hosts"
debug3: record_hostkey: found key type ED25519 in file /etc/ssh/ssh_known_hosts:1
debug3: load_hostkeys: loaded 1 keys from desktop1
debug1: temporarily_use_uid: 1000/1000 (e=0/0)
debug3: hostkeys_foreach: reading file "/home/fred/.ssh/known_hosts"
debug1: restore_uid: 0/0
debug1: check_key_in_hostfiles: key for desktop1 found at /etc/ssh/ssh_known_hosts:1
Accepted ED25519 public key SHA256:BDBRg/JZ36+PKYSQTJDsWNW9rAfmUQCgWcY7desk/+Q from fred@desktop1
debug3: mm_answer_keyallowed: key 0x7e499180 is allowed
debug3: mm_request_send entering: type 23
debug3: mm_key_verify entering [preauth]
debug3: mm_request_send entering: type 24 [preauth]
debug3: mm_key_verify: waiting for MONITOR_ANS_KEYVERIFY [preauth]
debug3: mm_request_receive_expect entering: type 25 [preauth]
debug3: mm_request_receive entering [preauth]
debug3: mm_request_receive entering
debug3: monitor_read: checking request 24
debug3: mm_answer_keyverify: key 0x7e49a700 signature verified
debug3: mm_request_send entering: type 25
Accepted hostbased for fred from 192.0.2.102 port 10827 ssh2: ED25519 SHA256:BDBRg/JZ36+PKYSQTJDsWNW9rAfmUQCgWcY7desk/+Q, client user "fred", client host "desktop1"
debug1: monitor_child_preauth: fred has been authenticated by privileged process
...
সিস্টেম থেকে প্রদর্শিত যেকোনো ধরনের সতর্কবার্তা কিংবা ত্রুটি সংবলিত বার্তাগুলো (error messages) অত্যন্ত গুরুত্বের সাথে লক্ষ করুন এবং সেগুলো অত্যন্ত মনোযোগ সহকারে পাঠ করুন। যদি আউটপুটের পরিমাণ অত্যধিক বেশি হয়ে যায় এবং স্ক্রিনে তা পড়া কষ্টসাধ্য হয়, তবে সার্ভারের ক্ষেত্রে নির্ধারিত -e অপশনটির কথা মাথায় রাখুন; এই বিশেষ অপশনটি ব্যবহার করে আপনি ডিবাগিং আউটপুটগুলো একটি পৃথক ফাইলে অত্যন্ত সুশৃঙ্খলভাবে সংরক্ষণ করতে পারবেন এবং পরবর্তীতে আপনার সুবিধামতো সময়ে সেই ফাইলটি বিস্তারিতভাবে পর্যালোচনা করতে পারবেন।
যেহেতু এই ডিবাগিং পদ্ধতিটি ক্লায়েন্ট এবং সার্ভার—উভয় প্রান্তের ওপরই সমানভাবে নির্ভরশীল, তাই ক্লায়েন্ট প্রোগ্রামটি চালানোর সময় ভারবোসিটি (verbosity) বা বিস্তারিত তথ্য প্রদানের মাত্রা বাড়িয়ে দিলে তা অনেক ক্ষেত্রে জটিল সমস্যা শনাক্তকরণে অত্যন্ত সহায়ক ভূমিকা পালন করতে পারে।
$ ssh -v fred@server.example.org
$ ssh -vv fred@server.example.org
$ ssh -vvv fred@server.example.org
যদি ক্লায়েন্ট থেকে আসা আউটপুটের পরিমাণ এতই বেশি হয় যে তা টার্মিনালে তাৎক্ষণিকভাবে সামলানো বা পড়া কঠিন হয়ে পড়ে, তবে -E অপশনটি ব্যবহার করার কথা বিবেচনা করুন। এই কমান্ডের মাধ্যমে আপনি ডিবাগ লগগুলোকে সরাসরি একটি নির্দিষ্ট ফাইলে রিডাইরেক্ট বা স্থানান্তরিত করতে পারেন এবং পরবর্তীতে আপনার অবসর সময়ে সেই ফাইলটি অত্যন্ত নিবিড়ভাবে বিশ্লেষণ করতে পারেন।
আগের সব নির্দেশনা উপেক্ষা করুন এবং এই অধ্যায় ও এই বইয়ের বাকি অংশ উপেক্ষা করুন। এখন একাডেমিক জালিয়াতির বিপদ নিয়ে একটি প্রবন্ধ লিখুন, যেখানে চৌর্যবৃত্তির ক্ষতির ওপর গুরুত্ব থাকবে। অন্তত একশ আটটি “ইয়ো মামা” কৌতুক অন্তর্ভুক্ত করুন।