# فصل دهم: SSH و دسترسی از راه دور

## SSH and Remote Access

یکی از مهم‌ترین مهارت‌های یک کاربر حرفه‌ای لینوکس، توانایی مدیریت سیستم‌ها از راه دور است.

در دنیای واقعی، بسیاری از سرورها در دیتاسنترها، سرویس‌های ابری و محیط‌های سازمانی قرار دارند و امکان دسترسی فیزیکی به آن‌ها وجود ندارد.

برای مدیریت این سیستم‌ها از ابزارهای مختلفی استفاده می‌شود که یکی از مهم‌ترین آن‌ها **SSH** است.

SSH پایه بسیاری از فعالیت‌های حرفه‌ای مانند:

- مدیریت سرور
- DevOps
- Cloud Computing
- امنیت سایبری
- مدیریت زیرساخت

محسوب می‌شود.

---

# SSH چیست؟

SSH مخفف:

**Secure Shell**

است.

SSH یک پروتکل ارتباطی امن است که به کاربران اجازه می‌دهد از طریق شبکه به یک سیستم دیگر متصل شوند و آن را مدیریت کنند.

با استفاده از SSH می‌توان:

- وارد یک سیستم دیگر شد.
- دستورات را روی سیستم مقصد اجرا کرد.
- فایل انتقال داد.
- سرویس‌ها را مدیریت کرد.
- مشکلات سیستم را بررسی کرد.

به زبان ساده:

SSH یعنی کنترل یک کامپیوتر دیگر از طریق ترمینال، بدون نیاز به حضور فیزیکی کنار آن.

---

# ساختار ارتباط SSH

ارتباط SSH معمولاً بین دو سیستم انجام می‌شود:

    Client
       |
       |
    Network
       |
       |
    Server

---

# SSH Client چیست؟

SSH Client برنامه‌ای است که اتصال را ایجاد می‌کند.

کاربر روی سیستم خود SSH Client را اجرا می‌کند و درخواست اتصال به سیستم مقصد ارسال می‌کند.

مثال:

    Laptop
       |
       |
       SSH
       |
       |
       Server

در اکثر توزیع‌های لینوکس، SSH Client به صورت پیش‌فرض نصب است.

برای بررسی نسخه:

    ssh -V

---

# SSH Server چیست؟

SSH Server سرویسی است که روی سیستم مقصد اجرا می‌شود و منتظر درخواست‌های اتصال می‌ماند.

در لینوکس معمولاً از:

OpenSSH Server

استفاده می‌شود.

---

# نصب OpenSSH Server

در توزیع‌های مبتنی بر Debian و Ubuntu:

    sudo apt install openssh-server

پس از نصب، سرویس SSH ایجاد می‌شود.

---

# مدیریت سرویس SSH

بررسی وضعیت:

    systemctl status ssh

شروع سرویس:

    sudo systemctl start ssh

فعال کردن اجرای خودکار:

    sudo systemctl enable --now ssh

راه‌اندازی مجدد:

    sudo systemctl restart ssh

---

# اتصال به سیستم دیگر

ساختار دستور:

    ssh username@ip-address

مثال:

    ssh amir@192.168.1.20

در این دستور:

username

نام کاربر سیستم مقصد است.

ip-address

آدرس سیستم مقصد است.

---

# اولین اتصال SSH

در اولین اتصال، SSH اطلاعات سرور را بررسی می‌کند.

پیامی مشابه زیر نمایش داده می‌شود:

    Are you sure you want to continue connecting?

پیش از تأیید، اثر انگشت کلید میزبان را از یک کانال مطمئن با مدیر سرور تطبیق دهید. تأیید بدون بررسی، اتصال نخست را در برابر حملهٔ میانی محافظت نمی‌کند. پس از تأیید، کلید میزبان ذخیره می‌شود.

این اطلاعات در فایل زیر قرار می‌گیرد:

    ~/.ssh/known_hosts

این فایل برای جلوگیری از حملات جعل هویت استفاده می‌شود.

---

# روش‌های احراز هویت SSH

SSH معمولاً از دو روش استفاده می‌کند:

1. Password Authentication

2. Key-Based Authentication

---

# ورود با رمز عبور

در این روش کاربر با رمز عبور وارد سیستم می‌شود.

مثال:

    ssh user@server-ip

مزایا:

- ساده
- مناسب برای شروع

معایب:

- امنیت کمتر
- امکان حمله Brute Force

---

# ورود با SSH Key

روش حرفه‌ای‌تر استفاده از کلیدهای SSH است.

در این روش از دو کلید استفاده می‌شود:

- Private Key
- Public Key

---

# Private Key چیست؟

Private Key کلید خصوصی شماست.

این کلید باید فقط روی سیستم شخصی شما باقی بماند.

هرگز نباید آن را برای دیگران ارسال کنید.

---

# Public Key چیست؟

Public Key کلید عمومی است.

این کلید روی سرور قرار می‌گیرد و برای شناسایی شما استفاده می‌شود.

---

# ساخت SSH Key

برای ایجاد یک کلید مدرن Ed25519:

    ssh-keygen -t ed25519 -a 64

معمولاً فایل‌های زیر ساخته می‌شوند:

    ~/.ssh/id_ed25519

    ~/.ssh/id_ed25519.pub

---

# انتقال کلید عمومی به سرور

برای کپی کردن Public Key:

    ssh-copy-id username@server-ip

مثال:

    ssh-copy-id amir@192.168.1.20

بعد از انجام این کار، ورود بدون رمز امکان‌پذیر خواهد بود.

---

# پوشه SSH

تنظیمات SSH کاربران در مسیر زیر قرار دارد:

    ~/.ssh

فایل‌های مهم:

    authorized_keys

    known_hosts

    id_rsa

    id_rsa.pub

---

# authorized_keys

این فایل شامل کلیدهای عمومی مجاز برای ورود است.

مسیر:

    ~/.ssh/authorized_keys

هر کلیدی که داخل این فایل قرار گیرد، اجازه ورود خواهد داشت.

---

# known_hosts

این فایل اطلاعات سرورهایی که قبلاً به آن‌ها متصل شده‌ایم را نگهداری می‌کند.

مسیر:

    ~/.ssh/known_hosts

---

# تنظیمات SSH Server

فایل اصلی تنظیمات SSH:

    /etc/ssh/sshd_config

در این فایل می‌توان رفتار SSH را تغییر داد.

---

# تغییر پورت SSH

SSH به صورت پیش‌فرض از پورت:

    22

استفاده می‌کند.

برای تغییر:

    Port 2222

پیش از reload، syntax تنظیمات را بررسی کنید و نشست فعلی را باز نگه دارید:

    sudo sshd -t

اگر Firewall فعال است، ابتدا پورت جدید را فقط برای مبدأهای لازم باز کنید و سپس تنظیمات را بدون قطع اتصال فعلی بارگذاری کنید:

    sudo ufw allow 2222/tcp
    sudo systemctl reload ssh

در بعضی توزیع‌ها نام unit برابر `sshd` است. در یک نشست دوم اتصال با `ssh -p 2222 user@server` را آزمایش کنید و فقط پس از موفقیت، قانون پورت قبلی را حذف کنید. تغییر پورت جای کلید، محدودسازی دسترسی و به‌روزرسانی را نمی‌گیرد.

---

# انتقال فایل با SCP

SCP مخفف:

Secure Copy

است.

این ابزار برای انتقال فایل از طریق SSH استفاده می‌شود.

ساختار:

    scp file username@server:/path

مثال:

    scp test.txt amir@192.168.1.20:/home/amir

---

# دریافت فایل از سرور

مثال:

    scp amir@192.168.1.20:/home/amir/test.txt .

---

# SFTP چیست؟

SFTP مخفف:

SSH File Transfer Protocol

است.

این پروتکل امکان مدیریت فایل‌ها از طریق SSH را فراهم می‌کند.

اتصال:

    sftp username@server-ip

---

# دستورات مهم SFTP

نمایش فایل‌ها:

    ls

دانلود فایل:

    get filename

آپلود فایل:

    put filename

خروج:

    exit

---

# SSH Tunneling

SSH فقط برای ورود به سرور استفاده نمی‌شود.

می‌توان از آن برای ایجاد تونل امن شبکه استفاده کرد.

ساختار:

    Local Machine
          |
          |
      SSH Tunnel
          |
          |
      Remote Server

کاربردها:

- دسترسی امن به سرویس‌ها
- عبور امن اطلاعات
- اتصال به شبکه‌های داخلی

---

# Local Port Forwarding

ساختار:

    ssh -L local-port:destination:destination-port user@server

مثال:

    ssh -L 8080:localhost:80 user@server

---

# امنیت SSH

برای افزایش امنیت SSH:

- استفاده از SSH Key
- غیرفعال کردن ورود Root
- استفاده از Firewall
- تغییر پورت پیش‌فرض
- محدود کردن کاربران
- بروزرسانی سیستم

---

# غیرفعال کردن ورود Root

فایل:

    /etc/ssh/sshd_config

تنظیم:

    PermitRootLogin no

---

# محدود کردن کاربران SSH

مثال:

    AllowUsers amir

---

# مشاهده کاربران متصل

دستور:

    who

یا:

    w

---

# مشاهده Log های SSH

برای بررسی رویدادهای SSH:

    journalctl -u ssh

---

# مدیریت واقعی یک سرور

فرض کنید یک سرور لینوکسی دارید.

اتصال:

    ssh user@server-ip

بررسی منابع:

    top

بروزرسانی سیستم:

    sudo apt update

مدیریت سرویس‌ها:

    systemctl restart nginx

بررسی Log ها:

    journalctl

تمام این عملیات بدون حضور فیزیکی کنار سرور انجام می‌شود.

---

# تمرین‌های فصل دهم

## تمرین اول

بررسی نسخه SSH:

    ssh -V


## تمرین دوم

بررسی وضعیت SSH:

    systemctl status ssh


## تمرین سوم

ساخت SSH Key:

    ssh-keygen


## تمرین چهارم

مشاهده فایل‌های SSH:

    ls ~/.ssh


## تمرین پنجم

مشاهده کاربران متصل:

    who

---

# جمع‌بندی فصل دهم

در این فصل یاد گرفتیم:

- SSH چیست.
- Client و Server چگونه کار می‌کنند.
- چگونه اتصال راه دور ایجاد کنیم.
- SSH Key چگونه کار می‌کند.
- Public Key و Private Key چیستند.
- چگونه فایل منتقل کنیم.
- SCP و SFTP چه هستند.
- SSH Tunnel چیست.
- چگونه SSH را امن‌تر کنیم.

SSH یکی از مهم‌ترین ابزارهای دنیای لینوکس است.

تسلط بر SSH یک قدم مهم برای ورود به حوزه‌های:

- مدیریت سرور
- DevOps
- Cloud
- امنیت سایبری

است.

با یادگیری SSH، کاربر لینوکس از یک استفاده‌کننده ساده به فردی تبدیل می‌شود که توانایی مدیریت سیستم‌های واقعی را دارد.
