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 আছে তার উপর প্রথম ধাপটি নির্ভর করে:
| Provider | Default user | নতুন user বানাতে হবে? |
|---|---|---|
| AWS EC2 | ubuntu (sudo আছে) | না — এটিই ব্যবহার করুন |
| Contabo, DigitalOcean | শুধু root | হ্যাঁ — নিচে দেখানো আছে |
Login to the Server
AWS EC2 — .pem key দিয়ে, user হলো ubuntu:
ssh -i ~/.ssh/myapp-key.pem ubuntu@YOUR_EC2_IPContabo বা সাধারণ VPS — root password দিয়ে:
ssh root@YOUR_SERVER_IPUpdate the System
একটি নতুন server-এর image প্রায়ই কয়েক মাসের পুরনো এবং তাতে known vulnerability থাকে। যেকোনো কিছু করার আগে update করে নিন:
sudo apt update && sudo apt upgrade -yCreate a Non-Root User
AWS ব্যবহার করলে এই ধাপ skip করুন — ubuntu user ইতিমধ্যে আছে এবং তার sudo access আছে।
Contabo বা যেসব server-এ শুধু root আছে, সেখানে একটি user বানাতেই হবে — নাহলে পরের ধাপে root login বন্ধ করার পর আর কেউ ঢুকতে পারবে না।
adduser omar
usermod -aG sudo omaromar-এর জায়গায় আপনার নিজের নাম দিন। usermod -aG sudo এই user-কে দরকারের সময় admin কাজ করার অনুমতি দেয়।
Generate an SSH Key
এই ধাপটি আপনার নিজের কম্পিউটারে, server-এ নয়।
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
ssh-copy-id -i ~/.ssh/myserver.pub omar@YOUR_SERVER_IPAWS-এ আপনি .pem key দিয়ে connect আছেন, তাই কোন key দিয়ে ঢুকবে সেটি বলে দিতে হবে:
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 কাজ করছে:
ssh -i ~/.ssh/myserver omar@YOUR_SERVER_IPএই ধাপ skip করবেন না। Key কাজ না করা অবস্থায় password login বন্ধ করলে আপনি নিজের server থেকে স্থায়ীভাবে বের হয়ে যাবেন।
প্রতিবার -i লিখতে না চাইলে নিজের কম্পিউটারে ~/.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।
প্রথমে দেখুন কোথায় কী সেট করা আছে:
sudo grep -r "PasswordAuthentication" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/50-cloud-init.conf-এ yes দেখলে সেটি # দিয়ে comment করুন:
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.confএবার নিজের config ফাইল তৈরি করুন:
sudo nano /etc/ssh/sshd_config.d/99-hardening.confPasswordAuthentication no
PermitRootLogin noConfig test করে restart দিন:
sudo sshd -t
sudo systemctl restart sshcurrent terminal বন্ধ করার আগে নতুন একটি terminal খুলে login করে দেখুন। ভুল হলে পুরনো terminal দিয়ে ঠিক করতে পারবেন।
Password login বন্ধ হয়েছে কিনা:
ssh -o PubkeyAuthentication=no omar@YOUR_SERVER_IPPermission denied (publickey) দেখলে সফল।
Turn On the Firewall
শুধু প্রয়োজনীয় port (22, 80, 443) খোলা রাখুন:
sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
sudo ufw statusufw allow OpenSSH সবার আগে দিন। এটি বাদ দিয়ে ufw enable করলে নিজের SSH connection কেটে যাবে।
AWS EC2-তে আরও একটি ধাপ — AWS Console-এ Security Group-এ port 22, 80, 443 allow আছে কিনা দেখে নিন।
Enable Automatic Security Updates
Ubuntu-কে নিজে থেকেই security update নিতে বলুন:
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 বানাবে
ssh-keygen -t ed25519 -C "rakib@example.com" -f ~/.ssh/company_server
cat ~/.ssh/company_server.pubcat-এর output-টুকু সে আপনাকে পাঠাবে — এক লাইনের একটি লেখা, দেখতে এরকম:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... rakib@example.comPublic key গোপন নয়, তাই Slack বা email-এ পাঠানো নিরাপদ।
আপনি server-এ user বানিয়ে key বসাবেন
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_keyschmod 700 ও 600 না দিলে SSH key-টি সম্পূর্ণ উপেক্ষা করে — কোনো error ছাড়াই। “key কাজ করছে না” সমস্যার এটিই সবচেয়ে common কারণ।
পরে আরেকজনের key যোগ করতে tee-র বদলে tee -a ব্যবহার করবেন, নইলে আগেরটি মুছে যাবে।
দরকার হলে sudo দিন
sudo usermod -aG sudo rakibসবাইকে sudo দেবেন না। যে শুধু log দেখবে বা code deploy করবে, তার admin ক্ষমতার দরকার নেই। একে বলে Principle of Least Privilege — যতটুকু দরকার ঠিক ততটুকুই।
Temporary Access
Contractor বা অস্থায়ী কারো জন্য user বানানোর সময়ই একটি expiry date দিয়ে দিন:
sudo adduser --expiredate 2026-12-31 contractorওই তারিখের পর account নিজে থেকেই বন্ধ হয়ে যাবে।
বিদ্যমান user-এ expiry বসানো, দেখা, বা তুলে নেওয়া:
sudo chage -E 2026-12-31 rakib # expiry বসানো
sudo chage -l rakib # কবে শেষ হবে দেখা
sudo chage -E -1 rakib # expiry তুলে নেওয়াবাস্তবে সবচেয়ে বড় ঝুঁকি হলো ভুলে যাওয়া account — যে contractor ছয় মাস আগে কাজ শেষ করেছে, কিন্তু তার access এখনো খোলা। Expiry দিয়ে রাখলে এই সমস্যাটাই তৈরি হয় না।
Removing Access
কেউ চলে গেলে:
sudo deluser rakib # account বন্ধ
sudo deluser --remove-home rakib # home folder সহ মুছে ফেলা
sudo deluser rakib sudo # শুধু sudo সরানো, login থাকবেWho Did What
Individual user রাখার ফল এখানেই দেখা যায়:
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 চেষ্টা করে। কতগুলো চেষ্টা হয়েছে দেখুন:
sudo grep "Failed password" /var/log/auth.log | wc -lPassword login বন্ধ করার পর এই আক্রমণগুলো অর্থহীন হয়ে যায় — অনুমান করার মতো কোনো password আর নেই।
Server ও মানুষের সংখ্যা অনেক বাড়লে বড় কোম্পানিগুলো পরের ধাপে যায় — Netflix, Uber বা Google-এ key-এর বদলে short-lived SSH certificate ব্যবহার হয়, কারণ ৫০০টি server-এ ২০০ জনের key হাতে manage করা অসম্ভব। তবে মূল নীতি একই — প্রত্যেকের আলাদা পরিচয়, যতটুকু দরকার ততটুকু ক্ষমতা।
পরবর্তী → Install Node.js