প্রথম লগইন ও SSH হার্ডেনিং
একটা কী জেনারেট করুন, পাসওয়ার্ড লগইন বন্ধ করুন, sshd লক ডাউন করুন, আর সামনে fail2ban বসান। একটা VPS-এ আপনি যত ঘণ্টা কাটাবেন তার মধ্যে সবচেয়ে গুরুত্বপূর্ণ এক ঘণ্টা।
বাস্তব জীবনের উপমা
SSH হার্ডেনিং অনেকটা একটা সস্তা তালা বদলে একটা ডেডবোল্ট লাগানো আর ম্যাটের নিচ থেকে বাড়তি চাবিটা সরিয়ে ফেলার মতো — দরজা এখনো খোলে, শুধু সঠিক মানুষদের জন্য।
গল্পে বুঝি
ফাতিমা আল-ফিহরি সবে শহরের ধারে একটা নতুন বাড়ি ভাড়া নিলেন। বাড়িটার সামনের দরজায় লাগানো আছে ফ্যাক্টরির সেই সস্তা ডিফল্ট তালা — যে তালার চাবি একটু আন্দাজ করলেই যে কেউ বানিয়ে ফেলতে পারে। রাত নামতেই টের পেলেন, গলির মাথায় দাঁড়িয়ে অচেনা লোকজন একের পর এক ঘরে গিয়ে হাজারটা চাবি ঢুকিয়ে দেখছে কোনটা খুলে যায়। ফাতিমা ভাবলেন, এই তালা রাখা মানে বিপদ ডেকে আনা।
তাই তিনি প্রথমেই সেই আন্দাজ-করা-চাবির তালাটা খুলে ফেলে দিলেন, আর বসালেন এমন এক তালা যা কেবল তাঁর হাতে থাকা একটামাত্র বিশেষ চাবিতেই খোলে — সেই চাবির নকল কারও পক্ষে বানানো অসম্ভব। এরপর খেয়াল করলেন, বাড়িওয়ালার কাছে একটা মাস্টার-চাবি আছে যা দিয়ে সে সোজা ভেতরের সিন্দুক-ঘরে ঢুকে পড়তে পারত; সেই মাস্টার-চাবির সুবিধাটাও তিনি বন্ধ করে দিলেন — এখন ভেতরে ঢুকতে হলে আগে সাধারণ দরজা দিয়ে ঢুকে তবেই সিন্দুক-ঘরে যেতে হবে। শেষে, রাস্তার ঘরে-ঘরে চাবি পরখ করা চোরদের চোখ এড়াতে তিনি সামনের দরজাটাই সরিয়ে নিলেন পাশের নির্জন গলিতে — এলোমেলো চোর আর দরজাটা খুঁজেই পায় না।
এই গল্পটাই আসলে SSH hardening। আন্দাজ-করা-চাবির তালা ফেলে একমাত্র বিশেষ চাবির তালা বসানো মানে password auth বন্ধ করে শুধু SSH key দিয়ে লগইন করা; বাড়িওয়ালার মাস্টার-চাবি বাতিল করা মানে সরাসরি root login বন্ধ করা (আগে সাধারণ ইউজারে ঢুকে তারপর sudo); আর দরজা পাশের গলিতে সরানো মানে ডিফল্ট পোর্ট 22 থেকে সরে অন্য পোর্টে যাওয়া, যাতে অটোমেটেড স্ক্যানারের নজরে না পড়ে। বাস্তবে এটা নিছক গল্প নয় — একটা পাবলিক IP-তে SSH সার্ভার চালু হওয়ার কয়েক মিনিটের মধ্যেই দুনিয়াজুড়ে brute-force বট নাগাড়ে হাজারো password চেষ্টা করতে শুরু করে, ঠিক গলির মাথার সেই চোরদের মতোই।
SSH-ই কেন আপনার একমাত্র আসল রিস্ক সারফেস
একটা তরতাজা VPS প্রভিশন করার সঙ্গে সঙ্গেই পোর্ট 22 গোটা ইন্টারনেটের কাছে খোলা। একটা নতুন IP অ্যাসাইন হওয়ার কয়েক মিনিটের মধ্যেই অটোমেটেড স্ক্যানাররা তাতে টোকা দিতে থাকে, root/123456, admin/admin, আর গত দশকের প্রতিটা ফাঁস হওয়া ক্রেডেনশিয়াল ডাম্প চেষ্টা করে। এটা প্যারানয়া নয় — এটাই পাবলিক IP-এর ডিফল্ট অবস্থা।
আর কিছু না করলেও, আগে SSH লক ডাউন করুন। বাকি সবকিছু অপেক্ষা করতে পারে।
এই চ্যাপ্টারের অ্যাকশনগুলো ঐচ্ছিক নয়। পাসওয়ার্ড auth আর root SSH চালু থাকা একটা VPS কম্প্রোমাইজড হবেই। “হতে পারে” নয় — হবেই।
পরিকল্পনা
- আপনার ল্যাপটপে একটা SSH কী পেয়ার জেনারেট করুন (যদি আগে থেকে না থাকে)।
- পাবলিক কী VPS-এ কপি করুন।
sudo-সহ একটা non-root ইউজার বানান।- পাসওয়ার্ড অথেন্টিকেশন বন্ধ করুন।
- root SSH বন্ধ করুন।
- SSH-কে একটা non-standard পোর্টে সরান (ঐচ্ছিক, নয়েজ কমায়)।
- যেসব IP অনেকবার চেষ্টা করে সেগুলো ব্যান করতে
fail2banইনস্টল করুন।
ধাপ 1 — আপনার ল্যাপটপে একটা কী জেনারেট করুন
এটা VPS-এ নয়, আপনার লোকাল মেশিনে চালান:
ssh-keygen -t ed25519 -C "you@laptop" যখন জিজ্ঞেস করবে:
- File — ডিফল্ট
~/.ssh/id_ed25519মেনে নিন। - Passphrase — একটা সেট করুন। প্যাসফ্রেজ ছাড়া একটা কীফাইল হলো এমন একটা ক্রেডেনশিয়াল যা যে কেউ কপি করতে পারে। প্যাসফ্রেজ থাকলে, একটা চুরি হওয়া ল্যাপটপও আরেকটা দেয়াল।
এখন আপনার কাছে দুটো ফাইল আছে:
~/.ssh/id_ed25519— private key। এটা কখনো কোথাও কপি করবেন না। কখনো চ্যাটে পেস্ট করবেন না। এটা ফাঁস হলে, যে-ই এটা পড়বে সে-ই আপনি।~/.ssh/id_ed25519.pub— public key। শেয়ার করা নিরাপদ।
RSA-এর বদলে ed25519 কেন?
ছোট, দ্রুত, আধুনিক। RSA-2048 ঠিকঠাক কিন্তু অপ্রয়োজনীয়ভাবে বড়। RSA-1024 ভাঙা। নতুন কী-র জন্য ed25519 এখনকার ডিফল্ট।
ধাপ 2 — পাবলিক কী VPS-এ কপি করুন
প্রভিশনিংয়ের সময় কী যোগ করে থাকলে এটা স্কিপ করুন। নাহলে:
ssh-copy-id root@49.13.123.45 অথবা হাতে হাতে:
cat ~/.ssh/id_ed25519.pub | ssh root@49.13.123.45 \
'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys' এখন কী দিয়ে লগইন করুন:
ssh root@49.13.123.45 এটার পাসওয়ার্ড চাওয়া উচিত নয় (আপনার লোকাল কী প্যাসফ্রেজ ছাড়া)।
ধাপ 3 — একটা non-root ইউজার বানান
root হিসেবে কাজ করা এমন একটা অভ্যাস যা আপনার তাড়াতাড়ি ভাঙা উচিত। একটা রিয়েল ইউজার বানান:
adduser deploy
usermod -aG sudo deploy adduser একটা পাসওয়ার্ড চাইবে — একটা লম্বা র্যান্ডম পাসওয়ার্ড সেট করুন আর সেটা আপনার পাসওয়ার্ড ম্যানেজারে রাখুন। আপনি এটা খুব কমই ব্যবহার করবেন; আপনার কী ফাইল কখনো অ্যাক্সেস করা না গেলে এটাই ফলব্যাক।
আপনার authorized_keys নতুন ইউজারে কপি করুন:
mkdir -p /home/deploy/.ssh
cp /root/.ssh/authorized_keys /home/deploy/.ssh/
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys একটা নতুন টার্মিনাল খুলুন (নিরাপত্তা জাল হিসেবে আপনার root সেশন খোলা রাখুন) আর যাচাই করুন:
ssh deploy@49.13.123.45
sudo whoami
# expected: root এটা কাজ করলে, আপনি root SSH বন্ধ করতে প্রস্তুত।
ধাপ 4 — sshd_config এডিট করুন
sudo nano /etc/ssh/sshd_config এই পরিবর্তনগুলো করুন (বেশিরভাগ লাইন কমেন্ট করা অবস্থায় থাকে — আনকমেন্ট করে এডিট করুন):
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
PrintMotd no
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
LoginGraceTime 30
AllowUsers deploy প্রতিটা যা করে:
- PermitRootLogin no — root সরাসরি SSH করতে পারবে না। আপনাকে
deployহিসেবে লগইন করেsudoব্যবহার করতে বাধ্য করে। - PasswordAuthentication no — শুধু কী-ভিত্তিক auth। ব্রুট-ফোর্স সারফেস উধাও।
- MaxAuthTries 3 — তিনবার ভুল চেষ্টা করলে কানেকশন কেটে যায়।
- ClientAliveInterval / Max — ~১০ মিনিট পর আইডল সেশন বের করে দেয়।
- AllowUsers deploy — শুধু এই একজন ইউজারই SSH করতে পারবে।
সেভ করুন, তারপর রিলোড করুন:
sudo systemctl reload ssh আপনার বিদ্যমান root সেশন এখনো বন্ধ করবেন না।
একদম নতুন একটা টার্মিনাল খুলে ssh deploy@49.13.123.45 চেষ্টা করুন। কাজ করলে, আপনি নিরাপদ। ফেইল করলে, আপনার পুরনো সেশনে এখনো root আছে আর আপনি sshd_config ঠিক করতে পারবেন। পরীক্ষা করার আগেই দুটো বন্ধ করাই হলো মানুষ কীভাবে নিজেকে বাইরে আটকে ফেলে।
ধাপ 5 — SSH-কে একটা non-standard পোর্টে সরান (ঐচ্ছিক)
এটা গভীর কোনো অর্থে সিকিউরিটি বাড়ায় না — পোর্ট স্ক্যান যেকোনো কিছু খুঁজে পায় — কিন্তু এটা আপনার লগে নয়েজ নাটকীয়ভাবে কমায়। 1024 আর 65535-এর মধ্যে এমন একটা পোর্ট বাছুন যা আপনি মনে রাখতে পারবেন:
Port 2222 ssh রিলোড করুন। এখন এভাবে কানেক্ট করুন:
ssh -p 2222 deploy@49.13.123.45 প্রতিবার -p 2222 টাইপ করতে না হয় বলে আপনার ল্যাপটপে ~/.ssh/config-এ এটা যোগ করুন:
Host web-01
HostName 49.13.123.45
Port 2222
User deploy
IdentityFile ~/.ssh/id_ed25519 তারপর শুধু: ssh web-01।
ধাপ 6 — fail2ban ইনস্টল করুন
কী-অনলি auth থাকলেও, SSH লগ আবর্জনায় ভরে যায়। fail2ban লগে নজর রাখে আর যেসব IP অনেকবার আঘাত হানে সেগুলো ব্যান করে।
sudo apt update
sudo apt install -y fail2ban একটা লোকাল ওভাররাইড বানান যাতে প্যাকেজ আপগ্রেড আপনার সেটিংস মাড়িয়ে না যায়:
sudo nano /etc/fail2ban/jail.local [DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = 2222 রিলোড করুন:
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd ধাপ 7 — দ্রুত যাচাই
আপনার ল্যাপটপ থেকে, একটা ভুল পাসওয়ার্ড চেষ্টা করে নিশ্চিত করুন এটা ব্লক করা:
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no deploy@web-01
# Should fail immediately with "Permission denied (publickey)" root হিসেবে কানেক্ট করার চেষ্টা করুন:
ssh -p 2222 root@49.13.123.45
# Should fail fail2ban ট্রিপ করাতে কয়েকবার ভুল চেষ্টা করুন:
for i in 1 2 3 4 5 6; do
ssh -p 2222 -o BatchMode=yes -i /tmp/wrong_key.pem deploy@49.13.123.45
done
# After ~5, your laptop's IP is banned for an hour রিক্যাপ
- পাসওয়ার্ড নয়, কী। প্যাসফ্রেজসহ ed25519।
sudo-সহ non-root ইউজার। root SSH বন্ধ।MaxAuthTries 3,AllowUsers deploy, কোনো PAM চ্যালেঞ্জের ঝামেলা নয়।- লগ পরিষ্কার রাখতে
fail2ban। - ভবিষ্যতের কমান্ড ছোট রাখতে আপনার ল্যাপটপের
~/.ssh/configহোস্ট alias সেভ করুন।
চ্যাপ্টার 3-এ, আপনি সবেমাত্র যে ফাইলসিস্টেমে নামলেন সেটা আমরা এক্সপ্লোর করি।