শূন্য থেকে VPS security: SSH key, firewall ও Fail2ban

4 মিনিট পড়া
Tropic
শূন্য থেকে VPS security: SSH key, firewall ও Fail2ban

শূন্য থেকে VPS security: SSH key, firewall ও Fail2ban

Ubuntu install করার পরেই নতুন VPS-কে secure ধরে নেওয়া ঠিক নয়। Access configure করার আগেই server scanner-এর কাছে দৃশ্যমান: তারা SSH password চেষ্টা করে, exposed control panel খোঁজে এবং সাধারণ vulnerability পরীক্ষা করে। এই guide-এ VPS শূন্য থেকে secure করার মূল ধাপ দেখব: আলাদা user তৈরি, SSH key authentication configure, UFW দিয়ে network port সীমিত এবং Fail2ban যোগ করা। sudo privilege-সহ user দিয়ে command চালালে সব ধাপ Ubuntu 22.04 ও 24.04-এ কাজ করবে।

শুরু করার আগে: port-এর তালিকা তৈরি করুন

“যদি দরকার হয়” ভেবে port খুলবেন না। একটি সাধারণ web server-এর প্রয়োজন:

  • 22/tcp — SSH; আদর্শভাবে IP দিয়ে সীমিত করুন বা শুধু অতিরিক্ত ব্যবস্থা হিসেবে অন্য port-এ সরান;
  • 80/tcp — HTTP; HTTPS-এ redirect এবং certificate validate করতে সাধারণত দরকার;
  • 443/tcp — HTTPS।

Nginx বা Caddy সামনে চললে 3000, 8080 বা 9000-এর মতো application port internet থেকে accessible হওয়া উচিত নয়। Application-কে 127.0.0.1-এ bind করুন অথবা internal network-এ শুধু তার port allow করুন। প্রথমে server-এ কী listen করছে দেখুন:

sudo ss -tulpn

Docker install করার পরে তার iptables rule আলাদাভাবে check করুন: -p 3000:3000 publish করলে প্রত্যাশিত setup-এর বাইরে port expose হতে পারে। Public service-এর জন্য HTTPS proxy ব্যবহার করে internal port hidden রাখা নিরাপদ।

Step 1. System update করে administrator তৈরি করুন

প্রদত্ত credential দিয়ে VPS-এ connect করে update install করুন:

sudo apt update
sudo apt full-upgrade -y
sudo apt install -y ufw fail2ban unattended-upgrades

Personal user তৈরি করুন। alex-এর বদলে নিজের নাম দিন:

sudo adduser alex
sudo usermod -aG sudo alex

আলাদা terminal window-তে নতুন account test না করা পর্যন্ত original access remove করবেন না। এটি গুরুত্বপূর্ণ: বর্তমান session খোলা থাকলে SSH ভুল ঠিক করা সহজ।

Step 2. SSH key তৈরি করে server-এ install করুন

নিজের Linux, macOS বা Windows PowerShell computer-এ চালান:

ssh-keygen -t ed25519 -C "alex@my-computer"

Key default file-এ save করতে Enter চাপুন, তারপর passphrase সেট করুন। Private key chat-এ পাঠাবেন না, repository-তে রাখবেন না বা VPS-এ copy করবেন না। শুধু .pub extension-সহ file server-এ পাঠানো উচিত:

ssh-copy-id alex@SERVER_IP

ssh-copy-id না থাকলে PowerShell-এ Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub দিয়ে public key দেখান, তারপর server-এ যোগ করুন:

sudo install -d -m 700 -o alex -g alex /home/alex/.ssh
sudo nano /home/alex/.ssh/authorized_keys
sudo chown alex:alex /home/alex/.ssh/authorized_keys
sudo chmod 600 /home/alex/.ssh/authorized_keys

Key-টি এক লাইনে paste করে password disable করার আগে login test করুন:

ssh alex@SERVER_IP
sudo whoami

শেষ command-এর প্রত্যাশিত ফল হলো root। SSH client key খুঁজে না পেলে সরাসরি নির্দিষ্ট করুন: ssh -i ~/.ssh/id_ed25519 alex@SERVER_IP

Step 3. Root login ও password authentication বন্ধ করুন

SSH configuration-এর backup নিন:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

File-এ এই parameter-গুলো আছে নিশ্চিত করুন:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
MaxAuthTries 3

Ubuntu-এ setting /etc/ssh/sshd_config.d/*.conf-এ থাকতে পারে, তাই effective configuration check করুন:

sudo sshd -t
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries'

sshd -t error দিলে syntax ঠিক না করা পর্যন্ত service restart করবেন না। Check সফল হলে setting apply করুন:

sudo systemctl reload ssh

পুরোনো SSH connection খোলা রেখে নতুন window-তে key-based login test করুন। যাচাই করা key ছাড়া password disable করা server access হারানোর সবচেয়ে সাধারণ কারণ।

Step 4. SSH block না করে UFW configure করুন

UFW Linux network rule-এর সুবিধাজনক wrapper। প্রথমে secure default সেট করুন, তারপর SSH ও web port allow করুন:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable

SSH rule যোগ করার পরেই activation নিশ্চিত করুন। ফলাফল review করুন:

sudo ufw status verbose
sudo ufw status numbered

Permanent office IP থাকলে SSH সেই address-এ সীমিত করতে পারেন:

sudo ufw delete allow 22/tcp
sudo ufw allow from YOUR.PUBLIC.IP to any port 22 proto tcp comment 'SSH office'

এই option শুধু permanent IP ও provider console access থাকলেই ব্যবহার করুন: address বদলালে নিজেকেই lock out করতে পারেন।

সাময়িকভাবে application port খোলার উপায়

কোনো service সরাসরি check করতে হলে restricted source-সহ rule তৈরি করুন:

sudo ufw allow from YOUR.PUBLIC.IP to any port 8080 proto tcp

Test-এর পরে ufw status numbered-এ দেখা number ব্যবহার করে delete করুন:

sudo ufw delete RULE_NUMBER

sudo ufw allow 1:65535/tcp ব্যবহার করবেন না: এমন rule firewall-কে শুধু আনুষ্ঠানিকতায় পরিণত করে।

Step 5. SSH-এর জন্য Fail2ban চালু করুন

Fail2ban log বিশ্লেষণ করে এবং একাধিক failed login-এর পরে সাময়িক blocking rule যোগ করে। এটি SSH key বা firewall-এর বিকল্প নয়, তবে automated brute-force attempt-এর noise কমায়।

Package update যেন setting overwrite না করে, তাই local configuration তৈরি করুন:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

[DEFAULT] section-এ যুক্তিসঙ্গত value সেট করুন:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
banaction = ufw

[sshd]
enabled = true
port = 22

Service চালু করে jail check করুন:

sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

sshd output-এ failed attempt ও blocked address-এর সংখ্যা দেখুন। নিজের IP ban list-এ যোগ করবেন না। Permanent exception-এর জন্য [DEFAULT]-এ ignoreip = 127.0.0.1/8 YOUR.PUBLIC.IP ব্যবহার করুন।

Step 6. Automatic update চালু করুন

Security package-এর জন্য automatic update উপকারী, কিন্তু kernel reboot এখনও manage করতে হবে:

sudo dpkg-reconfigure -plow unattended-upgrades
sudo systemctl status unattended-upgrades

সপ্তাহে একবার reboot দরকার কি না দেখুন:

test -f /var/run/reboot-required && echo 'Требуется перезапуск'

Manually reboot করার আগে working key ও VPS console access আছে নিশ্চিত করুন। Reboot-এর পরে application service, Nginx, UFW ও Fail2ban check করুন।

Step 7. বাইরে থেকে ফলাফল পরীক্ষা করুন

শুধু configuration পড়ে নয়, অন্য computer থেকে protection check করুন:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no alex@SERVER_IP

Command denial দিয়ে শেষ হওয়া উচিত। Working key-based login আলাদাভাবে test করুন:

ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 alex@SERVER_IP

VPS-এ listening address ও rule check করুন:

sudo ss -lntup
sudo ufw status numbered
sudo fail2ban-client status sshd

Direct access-এর জন্য intended না হলে application port 127.0.0.1-এ listen করা উচিত। External host থেকে nmap SERVER_IP ব্যবহার করতে পারেন, কিন্তু শুধু নিজের server scan করুন: অনুমতি ছাড়া অন্যের infrastructure check করা আইন ও provider rule লঙ্ঘন করতে পারে।

Backup ও recovery

SSH protection deleted data, administrator-এর ভুল বা compromised application থেকে সুরক্ষা দেয় না। Database, configuration ও user file-এর copy VPS থেকে আলাদা করে রাখুন। Minimum setup হলো daily backup, আগের দিনের কয়েকটি version এবং নিয়মিত recovery test।

Password বা token plain-text script-এ লিখবেন না। Secret প্রকাশ পেলে সঙ্গে সঙ্গে revoke করে নতুনটি তৈরি করুন।

Secure project-এর জন্য VPS কীভাবে বেছে নেবেন

Infrastructure-এর ওপর control থেকেই security শুরু হয়। VPS-এ operating system, firewall rule, access method, backup ও service placement নিজে বেছে নিতে পারেন। ছোট website বা API-এর জন্য অতিরিক্ত virtual core-এর চেয়ে stable network, SSD storage ও recovery console বেশি গুরুত্বপূর্ণ।

tropic.host-এর VPS-এ project চালু করার সময় public entry point আগে ঠিক করুন: বেশিরভাগ ক্ষেত্রে SSH, HTTP ও HTTPS যথেষ্ট। Database ও control panel internal network-এর মধ্যে রাখুন। Project বড় হলে application, database ও monitoring-এর জন্য আলাদা VPS instance failure domain আলাদা করতে সাহায্য করে।

সাধারণ ভুল

  • Key-based login test করার আগে password disable করা। Current session খোলা রেখে নতুন login আলাদাভাবে test করুন।
  • Trusted address থেকে allow করা সম্ভব হলেও 22/tcp পুরো world-এর জন্য খোলা রাখা।
  • Docker port সরাসরি publish করা। আগে Docker ও UFW rule check করুন।
  • Fail2ban install করে আর log check না করা। Change-এর পরে journalctl -u ssh ও jail status review করুন।

উপসংহার

সঠিক ক্রমে কাজ করলে basic VPS protection বেশি সময় নেয় না: আলাদা user তৈরি, SSH key install, access verify, root login ও password বন্ধ, UFW চালু, Fail2ban configure এবং automatic update সেট করা। এরপর backup, logging ও external monitoring যোগ করুন।

এসব ধাপ server-কে invulnerable করে না, কিন্তু initial configuration-এর সবচেয়ে সাধারণ ভুল দূর করে। পরের কাজ হলো নির্দিষ্ট application অনুযায়ী security profile মানিয়ে নেওয়া: dependency update, service permission সীমিত, admin panel সুরক্ষিত এবং open port নিয়মিত check করা।

FAQ

Default SSH port কি বদলাতে হবে?

অবশ্যই নয়। Port সরালে automated noise কমে, কিন্তু key, disabled password, UFW বা Fail2ban-এর বিকল্প হয় না। Port বদলালে firewall rule ও Fail2ban jail-এর port parameter-ও update করুন।

UFW configure করার পরে access হারালে কী করব?

Provider-এর web বা rescue console ব্যবহার করে SSH rule ও sshd configuration check করুন। নতুন login নিশ্চিত না হওয়া পর্যন্ত পুরোনো working session বন্ধ করবেন না।

SSH সুরক্ষায় কি Fail2ban যথেষ্ট?

না। Fail2ban ইতিমধ্যে ঘটে যাওয়া login failure-এর পরে প্রতিক্রিয়া জানায়। ভিত্তি হওয়া উচিত SSH key, disabled password authentication, minimal user permission এবং restricted firewall।

শুধু একটি IP address থেকে SSH allow করা যায়?

হ্যাঁ, address permanent হলে: সেই IP-এর জন্য UFW allow from rule যোগ করুন। আগে provider console access বা অন্য fallback রাখুন, কারণ IP বদলালে connection block হবে।

কত ঘন ঘন VPS security check করা উচিত?

SSH, firewall বা Docker port publishing-এর প্রতিটি change-এর পরে port check ও login test চালান। Routine maintenance হিসেবে অন্তত সপ্তাহে একবার update ও log review করুন এবং নিয়মিত backup recovery test করুন।