Skip to Content

SSH

SSH (Secure Shell) হলো remote server-এ securely connect করার protocol। তুমি যখন SSH দিয়ে connect করো, তখন তোমার সব data encrypted হয়ে যায় — কেউ network-এ sniff করলেও শুধু gibberish দেখবে। Cybersecurity-তে SSH বোঝা অত্যন্ত গুরুত্বপূর্ণ।

How SSH Works

SSH একটা client-server model follow করে। তোমার নিজের computer হলো client, আর যে computer-এ তুমি connect করতে চাও সেটা হলো server

তোমার computer (LOCAL / Client) │ Encrypted SSH connection (port 22) Remote server (SERVER) └── তুমি এখন server-এর terminal-এ কাজ করছ

Connection-এর সময় দুইটা জিনিস ঘটে:

  1. Server authentication — তুমি নিশ্চিত হও যে তুমি সঠিক server-এ connect করছ (MITM attack থেকে রক্ষা)
  2. User authentication — server নিশ্চিত হয় যে তুমি authorized user

দুইভাবে authenticate করা যায়:

Methodকীভাবে কাজ করেকোনটা ভালো
PasswordUsername + password দাওসহজ কিন্তু brute force-এর ঝুঁকি আছে
SSH KeyCryptographic key pair ব্যবহার করেRecommended — অনেক বেশি secure

Connecting

LOCAL — Terminal
# Basic connection ssh username@server-ip # নির্দিষ্ট port দিয়ে (default 22) ssh -p 2222 username@server-ip # নির্দিষ্ট key file দিয়ে ssh -i ~/.ssh/id_rsa username@server-ip # Example ssh omar@192.168.1.10 ssh ubuntu@ec2-54-123-456.compute.amazonaws.com

প্রথমবার connect করলে কী হয়?

প্রথমবার কোনো server-এ connect করলে এই message আসবে:

The authenticity of host '192.168.1.10' can't be established. ED25519 key fingerprint is SHA256:abc123xyz... Are you sure you want to continue connecting (yes/no)? yes

এই message টা আসে কারণ SSH নিশ্চিত হতে চায় যে তুমি সঠিক server-এ connect করছ — imposter server নয়। yes type করলে server-এর fingerprint তোমার local machine-এর ~/.ssh/known_hosts file-এ save হয়। পরেরবার connect করলে এই warning আর আসবে না।

যদি কোনো server-এ আগে connect করেছিলে এবং পরে হঠাৎ এই warning আসে — সেটা suspicious। এর মানে হতে পারে server বদলে গেছে অথবা কেউ MITM attack করছে।

SSH Keys

Password দিয়ে login করলে কেউ সেই password brute force করতে পারে। SSH key-এ এই সমস্যা নেই কারণ এটা cryptographic — randomly generated, অনেক long, এবং mathematically linked।

How Keys Work

SSH key pair-এ দুটো file থাকে:

Fileনামকোথায় যায়কী করে
id_ed25519Private keyশুধু তোমার LOCAL machine-এএটাই তোমার identity — কাউকে দেবে না
id_ed25519.pubPublic keyVPS server-এ, অথবা GitHub Settings-এServer বা GitHub এটা দিয়ে তোমাকে verify করে

সহজ analogy: Public key হলো তালা, Private key হলো চাবি। Server-এ তালা লাগানো থাকে, চাবি তোমার কাছে।

SSH Key Setup

তুমি কোথায় connect করছ তার উপর নির্ভর করে workflow আলাদা। তোমার situation অনুযায়ী tab বেছে নাও।

AWS বা অন্য cloud provider (GCP, Lightsail) instance তৈরির সময় নিজেই একটি .pem file তৈরি করে দেয় — এটাই তোমার Private Key। Public key AWS সার্ভারে আগে থেকেই configured থাকে। তোমাকে শুধু file-টা সঠিক জায়গায় রেখে permission দিতে হবে।

Step 1: Download the Key

AWS console থেকে instance তৈরির সময় .pem file download করো। এই file download করার সুযোগ মাত্র একবার — পরে আর পাওয়া যায় না।

Step 2: Move and Set Permission

LOCAL — Terminal
# ~/.ssh/ ফোল্ডারে move করো mv ~/Downloads/my-server-key.pem ~/.ssh/ # Permission ঠিক করো — এটা না করলে SSH connect করতে দেবে না chmod 400 ~/.ssh/my-server-key.pem

Step 3: Connect

LOCAL — Terminal
# -i দিয়ে .pem file চিনিয়ে দাও ssh -i ~/.ssh/my-server-key.pem ubuntu@your-server-ip

অথবা ~/.ssh/config-এ shortcut বানিয়ে নাও:

~/.ssh/config
Host my-aws-server HostName your-server-ip User ubuntu IdentityFile ~/.ssh/my-server-key.pem

এরপর শুধু ssh my-aws-server লিখলেই হবে।

Multiple Keys

সহজ চাক্ষুষ উদাহরণ: তোমার বাসার চাবি আর অফিসের চাবি কি একই? নিশ্চয়ই না। একইভাবে ব্যক্তিগত কাজ (GitHub) আর প্রফেশনাল বা ল্যাব কাজের (VPS) জন্য আলাদা আলাদা কি ব্যবহার করা সিকিউর। একে বলে Context Isolation

Custom Names

ডিফল্ট নাম (id_ed25519) বদলে -f (file) ফ্ল্যাগ দিয়ে কাস্টম নাম দেওয়া যায়। সেই সাথে -C দিয়ে একটি কমেন্ট বা লেবেল (যেমন: ইমেইল) যোগ করা বেস্ট প্র্যাকটিস, যাতে পরে চাবিটি চিনতে সুবিধা হয়।

LOCAL — Terminal
# GitHub-এর জন্য ssh-keygen -t ed25519 -f ~/.ssh/id_github_personal -C "your-github-email@example.com" # অফিসের VPS-এর জন্য ssh-keygen -t ed25519 -f ~/.ssh/id_vps_office -C "any-email@example.com"

কাস্টম নাম দিলে সার্ভার একা চাবি খুঁজে পায় না। তাই ~/.ssh/config ফাইলে চাবিটি চিনিয়ে দিতে হয়।

~/.ssh/config
Host github.com HostName github.com User git IdentityFile ~/.ssh/id_github_personal Host office-server HostName 1.2.3.4 User root IdentityFile ~/.ssh/id_vps_office

GitHub একই পাবলিক কি (Public Key) একাধিক অ্যাকাউন্টে ব্যবহার করতে দেয় না। তোমার যদি ২টা গিটহাব অ্যাকাউন্ট থাকে, তবে ২টা আলাদা কি জেনারেট করা বাধ্যতামূলক।

Multiple Servers

বারবার IP এবং username টাইপ করা ক্লান্তিকর। Config file দিয়ে তুমি সব সার্ভারের একটি “Address Book” বানিয়ে ফেলতে পারো।

এই file শুধু LOCAL machine-এ থাকে। তুমি যত খুশি Host entry যোগ করতে পারো।

LOCAL — Terminal
nano ~/.ssh/config
~/.ssh/config
# ১. নিজের VPS Host myserver HostName 192.168.1.10 User omar IdentityFile ~/.ssh/id_ed25519 # ২. AWS Production Server (PEM key) Host aws-prod HostName ec2-54-123-456.compute.amazonaws.com User ubuntu IdentityFile ~/.ssh/aws-key.pem # ৩. Lab Server (Custom Port) Host homelab HostName 10.0.0.50 User admin Port 2222

প্রতিটি ফিচারের কাজ:

  • Host: শর্টকাট নাম (যেমন: ssh homelab)।
  • HostName: সার্ভারের একদম সঠিক IP বা domain।
  • User: রিমোট সার্ভারের ইউজারনেম।
  • IdentityFile: ঐ সার্ভারের নির্দিষ্ট Private key-এর পথ।
  • Port: সার্ভার যদি standard 22 বাদে অন্য কোনো পোর্টে চলে।

এখন তুমি সরাসরি shortcut দিয়ে কানেক্ট করতে পারবে:

LOCAL — Terminal
ssh myserver ssh aws-prod ssh homelab

File Permissions

SSH নিজেই check করে যে file permissions সঠিক আছে কিনা। Wrong permission থাকলে SSH connection করতে অস্বীকার করে।

LOCAL machine-এ এই permissions থাকা দরকার:

LOCAL — Terminal
# .ssh folder chmod 700 ~/.ssh/ # Private key — শুধু তুমি read করতে পারবে chmod 600 ~/.ssh/id_ed25519 # Public key chmod 644 ~/.ssh/id_ed25519.pub # Config file chmod 600 ~/.ssh/config

SERVER-এ এই permissions থাকা দরকার:

SERVER — Terminal
# .ssh folder chmod 700 ~/.ssh/ # authorized_keys chmod 600 ~/.ssh/authorized_keys

SCP

এক কম্পিউটার থেকে অন্য কোনো রিমোট সার্ভার বা কম্পিউটারে ফাইল আদান-প্রদান করার জন্য SCP (Secure Copy) ব্যবহার করা হয়। এটি SSH প্রোটোকল ব্যবহার করে অত্যন্ত সুরক্ষিতভাবে ফাইল ট্রান্সফার করে। SCP-এর মূল মন্ত্র হলো: scp [উৎস] [গন্তব্য]

নিচের সব কমান্ড তোমার LOCAL Machine-এর টার্মিনালে চালাবে।

LOCAL — Terminal
# Single file upload scp localfile.txt omar@server:/home/omar/ # Folder upload scp -r local-folder/ omar@server:/home/omar/ # Config-এর alias দিয়ে scp file.txt myserver:/tmp/

CyberSec Note

SSH CTF-এ আর Pentesting-এ:

Private Key Found:

Target machine-এ যদি কোনো user-এর private key পাও (.ssh/id_rsa বা id_ed25519), সেটা দিয়ে সরাসরি login করা যায়।

LOCAL — Terminal
# Key download করার পর permission ঠিক করো chmod 600 id_rsa # সেই key দিয়ে connect করো ssh -i id_rsa user@target-ip

SSH Brute Force:

Kali Linux-এ hydra pre-installed। Ubuntu-তে sudo apt install hydra দিয়ে install করো।

LOCAL — Terminal (Kali/Attack Machine)
# Hydra দিয়ে SSH brute force hydra -l admin -P /usr/share/wordlists/rockyou.txt ssh://target-ip

Kali-তে rockyou.txt /usr/share/wordlists/ এ থাকে। Ubuntu-তে sudo apt install wordlists দিয়ে install করতে হবে।

Weak Configuration খোঁজো:

এই commands SERVER-এ (বা target-এ shell পেলে) চালাও:

SERVER — Terminal
# SSH server config দেখো (root বা sudo লাগবে) sudo cat /etc/ssh/sshd_config # Root login allowed? grep "PermitRootLogin" /etc/ssh/sshd_config # Password auth allowed? grep "PasswordAuthentication" /etc/ssh/sshd_config

যদি PasswordAuthentication yes থাকে — brute force possible। যদি PermitRootLogin yes থাকে — root directly brute force করা যাবে।

Quick Check

  • Key pair তৈরি করার command কোথায় চালাতে হয় — LOCAL নাকি SERVER?
  • Public key আর Private key — কোনটা server-এ রাখে, কোনটা local-এ?
  • AWS-এ connect করতে কোন file লাগে এবং কেন ssh-keygen করতে হয় না?
  • GitHub-এ SSH setup করলে Public key কোথায় দিতে হয়?
  • ssh-copy-id command কী করে এবং এটা কোন scenario-তে কাজে লাগে?
  • ~/.ssh/config কোন machine-এ থাকে এবং এটার কাজ কী?
  • SSH কেন password-এর চেয়ে key authentication বেশি secure?

এই section শেষ।

পরবর্তী → Processes

Search Keywords: linux SSH, ssh-keygen, SSH key pair, scp file transfer, ~/.ssh/config, SSH brute force, PermitRootLogin, SSH cybersecurity, local machine server, ssh-copy-id, passphrase, known_hosts

Last updated on