Skip to Content

Secure the Server

App deploy করার আগে server secure করা বাধ্যতামূলক। এই page-এ SSH key দিয়ে login সেট করবেন, password ও root login বন্ধ করবেন, firewall চালু করবেন — এবং team-এ কেউ যোগ দিলে তাকে access দেওয়ার নিয়ম শিখবেন।

The Purpose

একটি নতুন server শুধু একটি login দেয় — root, যার হাতে সব ক্ষমতা।

সবাইকে root-এর password দিয়ে দিলে যা হয়:

  • কে কী করেছে জানার উপায় থাকে না — log-এ সবাই একই root
  • কেউ চলে গেলে password বদলে বাকি সবাইকে নতুন password জানাতে হয়
  • একজনের একটি ভুল command পুরো server মুছে দিতে পারে
  • একজনের laptop hack হলে attacker সরাসরি root পেয়ে যায়

তাই নিয়ম একটাই:

প্রত্যেক মানুষের নিজের user, নিজের SSH key। Root login সম্পূর্ণ বন্ধ।

Before You Start

আপনার server-এ ইতিমধ্যে কোন user আছে তার উপর প্রথম ধাপটি নির্ভর করে:

ProviderDefault userনতুন user বানাতে হবে?
AWS EC2ubuntu (sudo আছে)না — এটিই ব্যবহার করুন
Contabo, DigitalOceanশুধু rootহ্যাঁ — নিচে দেখানো আছে

Login to the Server

AWS EC2.pem key দিয়ে, user হলো ubuntu:

LOCAL — Terminal
ssh -i ~/.ssh/myapp-key.pem ubuntu@YOUR_EC2_IP

Contabo বা সাধারণ VPS — root password দিয়ে:

LOCAL — Terminal
ssh root@YOUR_SERVER_IP

Update the System

একটি নতুন server-এর image প্রায়ই কয়েক মাসের পুরনো এবং তাতে known vulnerability থাকে। যেকোনো কিছু করার আগে update করে নিন:

SERVER — Terminal
sudo apt update && sudo apt upgrade -y

Create a Non-Root User

AWS ব্যবহার করলে এই ধাপ skip করুনubuntu user ইতিমধ্যে আছে এবং তার sudo access আছে।

Contabo বা যেসব server-এ শুধু root আছে, সেখানে একটি user বানাতেই হবে — নাহলে পরের ধাপে root login বন্ধ করার পর আর কেউ ঢুকতে পারবে না।

SERVER — Terminal
adduser omar usermod -aG sudo omar

omar-এর জায়গায় আপনার নিজের নাম দিন। usermod -aG sudo এই user-কে দরকারের সময় admin কাজ করার অনুমতি দেয়।

Generate an SSH Key

এই ধাপটি আপনার নিজের কম্পিউটারে, server-এ নয়।

LOCAL — Terminal
ssh-keygen -t ed25519 -C "omar@example.com" -f ~/.ssh/myserver

-f দিয়ে key-এর একটি নিজস্ব নাম দিচ্ছি। এতে ~/.ssh/ folder-এ দুটি ফাইল তৈরি হবে:

  • myserver — Private Key, শুধু আপনার কম্পিউটারে থাকবে
  • myserver.pub — Public Key, server-এ যাবে

আলাদা নাম কেন? -f না দিলে সব key-এর নাম id_ed25519 হয় এবং নতুন key পুরনোটি overwrite করে দিতে পারে।

প্রতি server-এর জন্য আলাদা নামের key রাখলে — myserver, client-a, client-b — একটি key ফাঁস হলে শুধু ওই server-এর access যায়, বাকিগুলো নিরাপদ থাকে।

Copy the Key to the Server

LOCAL — Terminal
ssh-copy-id -i ~/.ssh/myserver.pub omar@YOUR_SERVER_IP

AWS-এ আপনি .pem key দিয়ে connect আছেন, তাই কোন key দিয়ে ঢুকবে সেটি বলে দিতে হবে:

LOCAL — Terminal
ssh-copy-id -i ~/.ssh/myserver.pub -o IdentityFile=~/.ssh/myapp-key.pem ubuntu@YOUR_EC2_IP

-o IdentityFile=-এ সমান চিহ্ন (=) বাধ্যতামূলক। space দিলে garbage at end of line error দেবে।

Verify Before Locking Down

পরের ধাপে password login বন্ধ হয়ে যাবে। তার আগে নিশ্চিত করুন key দিয়ে login কাজ করছে:

LOCAL — Terminal
ssh -i ~/.ssh/myserver omar@YOUR_SERVER_IP

এই ধাপ skip করবেন না। Key কাজ না করা অবস্থায় password login বন্ধ করলে আপনি নিজের server থেকে স্থায়ীভাবে বের হয়ে যাবেন।

প্রতিবার -i লিখতে না চাইলে নিজের কম্পিউটারে ~/.ssh/config ফাইলে লিখে রাখুন:

LOCAL — ~/.ssh/config
Host myserver HostName YOUR_SERVER_IP User omar IdentityFile ~/.ssh/myserver

এরপর শুধু ssh myserver লিখলেই হবে।

Disable Password and Root Login

Ubuntu 24.04-এর /etc/ssh/sshd_config-এর শুরুতে থাকে Include /etc/ssh/sshd_config.d/*.conf, আর অধিকাংশ cloud server-এ 50-cloud-init.conf ফাইলে PasswordAuthentication yes লেখা থাকে।

SSH প্রথম যে setting পায় সেটিই মানে। তাই শুধু মূল ফাইলে no লিখলে include করা ফাইলটি জিতে যাবে এবং আপনার setting কাজ করবে না — অথচ আপনি ভাববেন server secure।

প্রথমে দেখুন কোথায় কী সেট করা আছে:

SERVER — Terminal
sudo grep -r "PasswordAuthentication" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

50-cloud-init.conf-এ yes দেখলে সেটি # দিয়ে comment করুন:

SERVER — Terminal
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf

এবার নিজের config ফাইল তৈরি করুন:

SERVER — Terminal
sudo nano /etc/ssh/sshd_config.d/99-hardening.conf
SERVER — /etc/ssh/sshd_config.d/99-hardening.conf
PasswordAuthentication no PermitRootLogin no

Config test করে restart দিন:

SERVER — Terminal
sudo sshd -t sudo systemctl restart ssh

current terminal বন্ধ করার আগে নতুন একটি terminal খুলে login করে দেখুন। ভুল হলে পুরনো terminal দিয়ে ঠিক করতে পারবেন।

Password login বন্ধ হয়েছে কিনা:

LOCAL — Terminal
ssh -o PubkeyAuthentication=no omar@YOUR_SERVER_IP

Permission denied (publickey) দেখলে সফল।

Turn On the Firewall

শুধু প্রয়োজনীয় port (22, 80, 443) খোলা রাখুন:

SERVER — Terminal
sudo ufw allow OpenSSH sudo ufw allow 80 sudo ufw allow 443 sudo ufw enable sudo ufw status

ufw allow OpenSSH সবার আগে দিন। এটি বাদ দিয়ে ufw enable করলে নিজের SSH connection কেটে যাবে।

AWS EC2-তে আরও একটি ধাপ — AWS Console-এ Security Group-এ port 22, 80, 443 allow আছে কিনা দেখে নিন।

Enable Automatic Security Updates

Ubuntu-কে নিজে থেকেই security update নিতে বলুন:

SERVER — Terminal
sudo apt install unattended-upgrades -y sudo dpkg-reconfigure --priority=low unattended-upgrades

প্রশ্ন এলে Yes বেছে নিন।

Adding a Team Member

Team-এ কেউ যোগ দিলে root বা নিজের key তাকে দেবেন না। তার জন্য আলাদা user বানান।

নিয়ম: private key কখনো এক কম্পিউটার থেকে আরেক কম্পিউটারে যায় না।

Member নিজের কম্পিউটারে key বানাবে এবং আপনাকে শুধু public key পাঠাবে। আপনি key বানিয়ে দিলে private key আপনার হাত ঘুরে যায় — তখন কিছু ঘটলে “ওটা আমি না, key তো তোমার কাছেও ছিল” — এই যুক্তি ভাঙা যায় না।

Member নিজের কম্পিউটারে key বানাবে

MEMBER'S COMPUTER — Terminal
ssh-keygen -t ed25519 -C "rakib@example.com" -f ~/.ssh/company_server cat ~/.ssh/company_server.pub

cat-এর output-টুকু সে আপনাকে পাঠাবে — এক লাইনের একটি লেখা, দেখতে এরকম:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... rakib@example.com

Public key গোপন নয়, তাই Slack বা email-এ পাঠানো নিরাপদ।

আপনি server-এ user বানিয়ে key বসাবেন

SERVER — Terminal
sudo adduser rakib sudo mkdir -p /home/rakib/.ssh echo "রাকিবের পাঠানো পুরো লাইনটি এখানে" | sudo tee /home/rakib/.ssh/authorized_keys sudo chown -R rakib:rakib /home/rakib/.ssh sudo chmod 700 /home/rakib/.ssh sudo chmod 600 /home/rakib/.ssh/authorized_keys

chmod 700600 না দিলে SSH key-টি সম্পূর্ণ উপেক্ষা করে — কোনো error ছাড়াই। “key কাজ করছে না” সমস্যার এটিই সবচেয়ে common কারণ।

পরে আরেকজনের key যোগ করতে tee-র বদলে tee -a ব্যবহার করবেন, নইলে আগেরটি মুছে যাবে।

দরকার হলে sudo দিন

SERVER — Terminal
sudo usermod -aG sudo rakib

সবাইকে sudo দেবেন না। যে শুধু log দেখবে বা code deploy করবে, তার admin ক্ষমতার দরকার নেই। একে বলে Principle of Least Privilege — যতটুকু দরকার ঠিক ততটুকুই।

Temporary Access

Contractor বা অস্থায়ী কারো জন্য user বানানোর সময়ই একটি expiry date দিয়ে দিন:

SERVER — Terminal
sudo adduser --expiredate 2026-12-31 contractor

ওই তারিখের পর account নিজে থেকেই বন্ধ হয়ে যাবে।

বিদ্যমান user-এ expiry বসানো, দেখা, বা তুলে নেওয়া:

SERVER — Terminal
sudo chage -E 2026-12-31 rakib # expiry বসানো sudo chage -l rakib # কবে শেষ হবে দেখা sudo chage -E -1 rakib # expiry তুলে নেওয়া

বাস্তবে সবচেয়ে বড় ঝুঁকি হলো ভুলে যাওয়া account — যে contractor ছয় মাস আগে কাজ শেষ করেছে, কিন্তু তার access এখনো খোলা। Expiry দিয়ে রাখলে এই সমস্যাটাই তৈরি হয় না।

Removing Access

কেউ চলে গেলে:

SERVER — Terminal
sudo deluser rakib # account বন্ধ sudo deluser --remove-home rakib # home folder সহ মুছে ফেলা sudo deluser rakib sudo # শুধু sudo সরানো, login থাকবে

Who Did What

Individual user রাখার ফল এখানেই দেখা যায়:

SERVER — Terminal
sudo grep "Accepted publickey" /var/log/auth.log | tail -20 # কে কখন ঢুকেছে sudo grep "sudo:" /var/log/auth.log | tail -20 # কে কী চালিয়েছে

Root share করা থাকলে এই দুটি command অর্থহীন হতো — সব লাইনে একই নাম থাকত।

Quick Check

  • SSH key দিয়ে পাসওয়ার্ড ছাড়াই login হচ্ছে?
  • sudo grep -r "PasswordAuthentication" /etc/ssh/sshd_config.d/ কোথাও yes দেখাচ্ছে না?
  • ssh -o PubkeyAuthentication=no USER@YOUR_SERVER_IP দিলে Permission denied (publickey)?
  • sudo ufw status দেখাচ্ছে port 22, 80, 443 open?
  • প্রত্যেক team member-এর আলাদা user আছে, কেউ user share করছে না?

Real-World Note

এই পেজে আপনি যা করলেন তাকে বলে Server Hardening — এবং এটিই CIS Benchmark-এর official সুপারিশ।

একটি নতুন server internet-এ আসার কয়েক মিনিটের মধ্যেই automated bot SSH port scan শুরু করে এবং root, admin জাতীয় common username দিয়ে হাজার হাজার password চেষ্টা করে। কতগুলো চেষ্টা হয়েছে দেখুন:

SERVER — Terminal
sudo grep "Failed password" /var/log/auth.log | wc -l

Password login বন্ধ করার পর এই আক্রমণগুলো অর্থহীন হয়ে যায় — অনুমান করার মতো কোনো password আর নেই।

Server ও মানুষের সংখ্যা অনেক বাড়লে বড় কোম্পানিগুলো পরের ধাপে যায় — Netflix, Uber বা Google-এ key-এর বদলে short-lived SSH certificate ব্যবহার হয়, কারণ ৫০০টি server-এ ২০০ জনের key হাতে manage করা অসম্ভব। তবে মূল নীতি একই — প্রত্যেকের আলাদা পরিচয়, যতটুকু দরকার ততটুকু ক্ষমতা।

পরবর্তী → Install Node.js

server hardening bangla, ssh key setup bangla, ufw firewall bangla, team server access bangla, add user server bangla, ssh keygen -f bangla, deluser bangla, sudo user bangla, root login disable bangla, sshd_config include bangla

Last updated on