নিরাপদ যোগাযোগ

একটি কম্পিউটারকে দূরবর্তী আরেকটি কম্পিউটার দিয়ে নিয়ন্ত্রণ করা ইউনিক্স সিস্টেমের জন্য নতুন কোনো ব্যাপার না। আগে এই কাজে rlogin বা telnet ব্যবহৃত হত। কিন্তু সমস্যা হচ্ছে যে, এগুলো এফটিপির মত প্লেইনটেক্সটে ডাটা ট্রান্সফার করত। যার ফলে এগুলো ইন্টারনেটের ভিতরে ব্যবহার করা অনিরাপদ হয়ে উঠল।

ssh

এই সমস্যা থেকে সমাধান দিল ssh বা secure shell। এই প্রযুক্তির দুটো অংশ। একটি হল ssh server অন্যটি ssh client।

ssh সার্ভার তৈরী

এর জন্য আমরা প্রথমে openssh-server প্যাকেজটি ইন্সটল করবো। এবার আমরা কনফিগার করবো। কনফিগার করতে আমাদের /etc/ssh/sshd_config ফাইলটি এডিট করতে হবে।। এর জন্য আমরা এর একটি ব্যাকআপ রাখবো এভাবে:

# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.factory-defaults

এবার ন্যানো, ভিম বা ইম্যাকস্ দিয়ে ফাইলটি রুটমোডে খুলবো:

# emacs -nw cp /etc/ssh/ssh_config

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

Port 22

এটি ssh এর ডিফল্ট পোর্ট। এজন্য ব্যবহার করাও অনিরাপদ। আমরা এটিকে 365 তে পরিবর্তিত করতে এডিট করে এটি লিখবো:

Port 365

এবার আমরা সেভ করে বন্ধ করতে পারি।

এরপর আমরা ssh সার্ভার রিস্টার্ট দেবো এভাবে:

# /etc/init.d/ssh restart

ssh লগইন

লগইন করতে আপনাকে সার্ভারের হোস্টনেম জানতে হবে। আপনার কম্পিউটারে আপনি নিজে localhost ব্যবহার করে ঢুকতে পারেন। লোক্যাল নেটওয়ার্কের অন্য কম্পিউটারের হোস্টনেম ব্যবহার করে ঢুকতে পারেন। ইন্টারনেটের ক্ষেত্রে হয় আপনাকে তার ওয়েব এড্রেস অথবা আইপি এড্রেস জানতে হবে।

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

curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

আপনি এটি alias করে রাখতে পারেন।

এখন আমি আমার কম্পিউটারে যুক্ত হবো। me নামের একজন ইউজার হিসেবে। আমরা যেহেতু ডিফল্ট পোর্টটি ব্যবহার না করে 365 ব্যবহার করছি তাই আমাদের কমান্ড হবে:

me@howtocode-pc:~$ ssh -p 365 me@localhost

আমরা -p অপশন দিয়ে port লিখেছি। তারপর me@localhost দিয়ে localhost এর me এর সাথে যোগাযোগ করছি। এরপর আমরা এমনকিছু দেখতে পাবো:

The authenticity of host '[localhost]:365 ([127.0.0.1]:365)' can't be established.
ECDSA key fingerprint is 22:a4:cf:1a:e3:d9:3f:ae:fa:ca:ab:8b:5a:8e:64:01.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:365' (ECDSA) to the list of known hosts.
me@localhost's password: 
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-48-generic x86_64)

 * Documentation:  https://help.ubuntu.com/


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

me@howtocode-pc:~$ exit
logout
Connection to localhost closed.

প্রথমবার লগিনের সময় অথেনটিকেট করা সম্ভব হয়না। তারবদলে একটি ফিঙ্গারপ্রিন্ট দেখায়। এটি যদি ঠিক থাকে তাহলে আপনি yes লিখে এন্টার দেবেন। ফিঙ্গারপ্রিন্ট আপনাকে সার্ভারের এডমিনিস্ট্রেটর সরবরাহ করবে। তারপর আপনাকে me ইউজারের পাসওয়ার্ড দিতে হবে। সঠিকভাবে দিলে আপনাকে প্রম্পট দিবে। তখন আপনি সাধারণ টার্মিনালের মতই কাজ করতে পারবেন। সেশন বন্ধ করতে exit লিখে এন্টার দেবেন।

ssh-key এর মাধ্যমে লগইন

লগইনের আরেকটি উপায় হল ssh key তৈরী করা। এর দুটি অংশ। একটি পাবলিক কী, অন্যটি প্রাইভেট। ইউজার তথ্য প্রাইভেট কী দিয়ে এনক্রিপ্ট করে দিলে সেটি পাবলিক কী দিয়ে ডিক্রিপ্ট করা যায়। কিন্তু তার পরিবর্তন করা যায় না। এজন্য এটি বহুলব্যবহৃত একটি ব্যবস্থা। এজন্য আপনাকে একজোড়া কী জেনারেট করতে হবে। কী জেনারেট করতে পারেন এভাবে:

me@howtocode-pc:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/me/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/me/.ssh/id_rsa.
Your public key has been saved in /home/me/.ssh/id_rsa.pub.
The key fingerprint is:
be:eb:32:90:38:74:1a:65:b8:83:3a:64:7d:b1:84:33 me@howtocode-pc
The key's randomart image is:
+--[ RSA 2048]----+
|   ..            |
|  .Eoo           |
| ..++ o          |
|.o=..o           |
|+. *..  S        |
|o + o  .         |
| . . .  .        |
|      o  .       |
|       ++.       |
+-----------------+

আপনি ssh-keygen কমান্ডটি দিলে প্রথমে জিজ্ঞাসা করবে কোন ফাইলে সেভ করবে। আপনি ডিফল্টটি সিলেক্ট করতে এন্টার চাপুন। এরপর পাসফ্রেজ/পাসওয়ার্ড দিতে বলবে আপনি নতুন একটি পাসফ্রেজ দুবার দিলে কী তৈরী হবে।

এবার আপনি নতুন তৈরী কী সিস্টেমে যোগ করবেন এভাবে:

me@howtocode-pc:~$ ssh-add
Enter passphrase for /home/me/.ssh/id_rsa: 
Identity added: /home/me/.ssh/id_rsa (/home/me/.ssh/id_rsa)

ssh-add কমান্ডটি দেওয়ার পর পাসফ্রেজ জানতে চাইবে। সঠিক পাসফ্রেজ দিলে কীটি যুক্ত হবে।

এবার আপনার পাবলিক কীটি সার্ভারে পাঠানোর পালা। এটি করবেন এভাবে:

me@howtocode-pc:~$ ssh-copy-id -p 365 -i me@localhost

এরপর আপনি যে ইউজার হিসেবে লগিন করছেন তার পাসওয়ার্ড জিজ্ঞাসা করবে। সঠিক পাসওয়ার্ড দুলে কীটি যুক্ত হবে। এরপর থেকে লগিনের সময় আর কোনোরকমের অথেটিকেশনের দরকার হবে না।

কখনো কখনো এমনও হতে পারে যে আপনি মাত্র একটা কমান্ড দিতে চাচ্ছেন রিমোটলি। তার জন্য পুরো লগইন এর প্রয়োজন নেই। যেমন আমরা যদি রিমোট কম্পিউটারের র‍্যাম ও সোয়াপ সম্পর্কিত তথ্য জানতে `free কমান্ডটি ব্যবহার করতে চাই তাহলে সেটি করতে পারি এভাবে:

me@howtocode-pc:~$ ssh -p 365 me@localhost free
             total       used       free     shared    buffers     cached
Mem:       3915316    1607456    2307860     182148     150292     670024
-/+ buffers/cache:     787140    3128176
Swap:      2097148          0    2097148

আবার আমরা যদি চাই এই কমান্ডের আউটপুট আমাদের লোকাল কম্পিউটারে memlog.txt ফাইলে রিডিরেক্ট করতে চাই তাজলে লিখবো:

me@howtocode-pc:~$ ssh -p 365 me@localhost 'free' > memlog.txt

এখানে free কে '' আবদ্ধ করা জরুরি। এরকমক্ষেত্রে আবদ্ধ অংশটুকু রিমোট কম্পিউটারে এবং আবদ্ধ নয় এমন অংশ লোকাল কম্পিউটারে কাজ করবে। অতএব আমরা যদি memlog.txt কে 'memlog.txt' লিখতাম তাহলে টেক্সটফাইলটি রিমোট কম্পিউটারে তৈরী হত।

scp ও sftp

scp অনেকটা cp কমান্ডের মতই তবে এটি রিমোটলি কাজ করতে পারে। অর্থাৎ আপনি যদি লোকাল কম্পিউটারের সাথে রিমোট কম্পিউটারে তথ্য আদানপ্রদান করতে চান তাহলে এটি ব্যবহার করতে পারেন। নীচে দুটি উদাহরণ দেওয়া হল:

me@howtocode-pc:~$ scp -P 365 to_remote.txt me@localhost:./
to_remote.txt                                   100%  331     0.3KB/s   00:00
me@howtocode-pc:~$ scp -P 365 me@localhost:from_remote.txt ./
from_remote.txt                                 100%  331     0.3KB/s   00:00

প্রথম উদাহরণে আমরা লোকাল কম্পিউটারের হোম থেকে to_remote.txt ফাইলটি রিমোট কম্পিউটারের হোমে কপি করেছি। দ্বিতীয় উদাহরণে from_remote.txt ফাইলটি রিমোট থেকে লোকাল কম্পিউটারে। রিমোট কম্পিউটারের ফাইল বোঝাতে আমরা me@localhost: প্রেফিক্স ব্যবহার করছি।

ssh এর আরেকটি ফিচার হচ্ছে sftp অর্থাৎ সিকিউর এফটিপি। এটি এফটিপির মতই তবে নিরাপদ। আমরা রিমোট কম্পিউটারে sftp দিয়ে যোগাযোগ করতে পারি এভাবে:

me@howtocode-pc:~$ sftp -P 365 utsargo@localhost 
Connected to localhost.
sftp>

Last updated