پروتکل Secure Shell یا SSH
(SSH essentials)
استاندارد صنعت برای مدیریت امن سیستمهای از راه دور است. هنگام اتصال به سرور، اولین و مهمترین مرحله احراز هویت است. در حالی که رمز عبور رایج است، در برابر حملات brute-force آسیبپذیر است و امنیت سرور شما را تهدید میکند. برای دفاعی قویتر و مطمئنتر، باید از کلیدهای SSH استفاده کنید. این روش مبتنی بر رمزنگاری کلید عمومی است و راهی امن و راحت برای دسترسی به سرور فراهم میکند که بهعنوان یکی از اصول امنیتی برای هر مدیر سیستم ضروری است.
خلاصه نکات کلیدی
- SSH (راهنمای SSH) یک پروتکل پایه برای مدیریت امن از راه دور است. بهجای رمز عبور، استفاده از کلیدهای SSH امنیت، سهولت و قابلاتوماتیکسازی بیشتری فراهم میکند.
- کلیدهای SSH زوجی از کلیدهای رمزنگاری هستند: یک کلید خصوصی که باید محرمانه بماند و یک کلید عمومی که روی سرور قرار میگیرد.
- الگوریتم پیشنهادی کنونی Ed25519 است؛ اگر نیاز به سازگاری با سیستمهای قدیمی دارید از RSA 4096 استفاده کنید.
مبانی کلیدهای SSH و مزایا
کلیدهای SSH زوجی از کلیدهای رمزنگاری نامتقارن هستند که جایگزینی برای ورود با رمز عبور فراهم میکنند. روند کار به این صورت است که سرور از کلید عمومی شما برای ساختن یک پیام چالشی استفاده میکند و کلاینت شما با کلید خصوصی پاسخ مناسب را ایجاد میکند؛ بدین ترتیب هویت اثبات میشود بدون آنکه کلید خصوصی هرگز ارسال شود.
استفاده از کلیدهای SSH در مقایسه با رمز عبور چند مزیت عمده دارد:
- افزایش امنیت: کلیدها طولانی و مقاوم در برابر حملات brute-force هستند (مثلاً Ed25519 یا RSA 4096).
- سهولت: بعد از راهاندازی، ورود بدون نیاز به وارد کردن رمز عبور انجام میشود. در صورت استفاده از passphrase، میتوانید از ssh-agent برای مدیریت آن بهره ببرید.
- خودکارسازی: ابزارهای CI/CD، مدیریت پیکربندی (مثل Ansible) و اسکریپتهای بکاپ نیازمند احراز هویت بدون دخالت انسان هستند؛ کلیدهای SSH این امکان را فراهم میکنند.
الگوریتمهای کلید
الگوریتمهای رایج شامل RSA، ECDSA و Ed25519 هستند. برای اغلب موارد Ed25519 توصیه میشود زیرا ترکیب بهتری از امنیت و عملکرد را ارائه میدهد. در صورت نیاز به اتصال به سیستمهای بسیار قدیمی که از Ed25519 پشتیبانی نمیکنند، از RSA 4096 استفاده کنید.
پیشنیازها
قبل از شروع، مطمئن شوید شرایط زیر برقرار است:
- در سرور اوبونتو، سرویس SSH که توسط
openssh-serverمدیریت میشود نصب و در حال اجرا باشد. وضعیت سرویس را بررسی کنید. اگر نصب نیست، با نصبopenssh-serverوopenssh-clientآن را فعال کنید. - پس از نصب، سرویس SSH بطور خودکار شروع خواهد شد.
تولید کلید SSH در ماشین محلی
اولین قدم تولید جفت کلید در ماشین کلاینت محلی است (یک کلید خصوصی محرمانه و یک کلید عمومی برای به اشتراکگذاری).
برای تولید کلید از ابزار ssh-keygen استفاده کنید. استاندارد مدرن Ed25519 است.
در ترمینال محلی خود دستور زیر را اجرا کنید:
ssh-keygen -t ed25519
پس از اجرا، از شما خواسته میشود مسیر فایل را بپذیرید (با ENTER مسیر پیشفرض ~/.ssh انتخاب میشود). در صورت وجود کلید قبلی در مسیر انتخابی، از شما پرسیده میشود که آیا مایل به بازنویسی هستید یا خیر؛ بازنویسی کلید قدیمی را غیرقابل استفاده میکند.
سپس از شما خواسته میشود یک passphrase وارد کنید:
اضافه کردن passphrase لایه امنیتی بیشتری برای کلید خصوصی ایجاد میکند. اگر کلید خصوصی به سرقت برود، بدون passphrase غیرقابل استفاده خواهد بود.
توصیه: برای استفاده تعاملی همیشه از passphrase قوی استفاده کنید و ناراحتی آن را با ssh-agent جبران کنید. برای سیستمهای خودکار که کاربر برای وارد کردن passphrase حضور ندارد، ممکن است passphrase حذف شود اما در این صورت محدودیتهای دسترسی را سختگیرانهتر اعمال کنید.
پس از تکمیل، فایلهای جدید در ~/.ssh ظاهر میشوند، از جمله فایل کلید خصوصی و فایل کلید عمومی (id_ed25519 و id_ed25519.pub).
انتشار کلید عمومی روی سرور
برای فعال کردن احراز هویت مبتنی بر کلید، باید کلید عمومی خود را به سرور هدف کپی کنید و آن را به حساب کاربری مقصد اضافه نمایید. سرور کلید عمومی را با آن حساب مرتبط میکند.
سادهترین و توصیهشدهترین روش استفاده از ابزار ssh-copy-id است. این ابزار روی بیشتر توزیعهای لینوکس، macOS و ویندوز (از طریق WSL) موجود است و نیاز دارد دسترسی موقت مبتنی بر رمز عبور به سرور داشته باشید.
نمونه دستور:
ssh-copy-id username@remote_host
در اولین اتصال ممکن است هشداری درباره صحت میزبان (host authenticity) ببینید؛ yes تایپ کنید و ENTER بزنید. سپس از شما رمز عبور کاربر درخواست میشود؛ پس از وارد کردن آن، ssh-copy-id کلید عمومی را به ~/.ssh/authorized_keys اضافه میکند و مجوزها را تنظیم میکند.
اگر ssh-copy-id در دسترس نباشد یا احراز هویت با رمز عبور از قبل غیرفعال شده باشد، باید بهصورت دستی کلید را اضافه کنید:
- محتوای کلید عمومی را نمایش دهید:
cat ~/.ssh/id_ed25519.pub - خروجی را کپی کنید (رشتهای که با
ssh-ed25519 AAAA...شروع میشود). - با روش موجود وارد سرور شوید (مثلاً از طریق کنسول وب) و محتوا را به
~/.ssh/authorized_keysاضافه کنید. هنگام افزودن از>>(append) استفاده کنید تا کلیدهای موجود حذف نشوند.
تأیید ورود با کلید
پس از انتشار کلید، از ماشین محلی خود سعی کنید وارد سرور شوید:
ssh username@remote_host
اگر ورود موفقیتآمیز بود، تنظیمات شما درست است و میتوانید برای افزایش امنیت سرور اقدام به سختسازی کنید.
مدیریت چندین کلید و ssh-agent
با افزایش تعداد سرورها و سرویسها (مثل GitHub یا GitLab)، ممکن است نیاز به مدیریت چندین جفت کلید داشته باشید. فایل پیکربندی SSH و ssh-agent میتوانند فرایند را بسیار ساده کنند.
فایل پیکربندی کلاینت SSH
برای مشخص کردن کلیدهای متفاوت برای میزبانهای مختلف، فایل ~/.ssh/config را ایجاد یا ویرایش کنید و برای هر میزبان ورودی تعریف کنید، مثلاً hostname، user و مسیر کلید خصوصی.
با این کار نیازی به یادآوری آدرسهای IP یا استفاده از فلگ -i برای هر اتصال نیست.
ssh-agent
اگر کلیدهای خصوصی خود را با passphrase ایمن کردهاید، ssh-agent برای سهولت ضروری است. این برنامه در پسزمینه کلیدهای رمزگشاییشده را در حافظه نگه میدارد تا تنها یکبار در هر جلسه passphrase را وارد کنید.
برای شروع agent در نشست فعلی ترمینال:
eval "$(ssh-agent -s)"
سپس کلید را به agent اضافه کنید:
ssh-add ~/.ssh/id_ed25519
بعد از وارد کردن passphrase، agent کلید را در حافظه نگه میدارد و اتصالات بعدی بدون درخواست مجدد passphrase برقرار میشوند.
سختسازی سرور: غیرفعالسازی رمز عبور و جلوگیری از ورود مستقیم root
بعد از تأیید عملکرد ورود با کلید، باید پیکربندی SSH سرور را برای افزایش امنیت تغییر دهید. دو اقدام مهم عبارتند از: غیرفعال کردن احراز هویت مبتنی بر رمز عبور و غیرفعال کردن ورود مستقیم root.
این تغییرات در فایل پیکربندی دیمن SSH یعنی /etc/ssh/sshd_config انجام میشوند. برای ویرایش با امتیازات sudo:
sudo nano /etc/ssh/sshd_config
مهم: قبل از اعمال این تغییرات، مطمئن شوید یک اتصال کلید-محور کار میکند و با یک کاربر غیر-root که دسترسی sudo دارد میتوانید وارد شوید؛ در غیر این صورت ممکن است خود را از سرور بیرون بیندازید.
غیرفعال کردن احراز هویت مبتنی بر رمز عبور:
- مقدار
PasswordAuthenticationرا پیدا کنید، علامت # را بردارید و مقدار را بهnoتغییر دهید:
PasswordAuthentication no
اطمینان حاصل کنید که PubkeyAuthentication روی yes تنظیم شده باشد تا ورود با کلیدها مجاز باشد.
جلوگیری از ورود مستقیم root:
PermitRootLogin no
بعد از ذخیره فایل، دیمن SSH را ریاستارت کنید:
sudo systemctl restart ssh
برای جلوگیری از قفلشدن، قبل از بستن جلسه فعلی، در یک پنجره ترمینال جدید اتصال با کلید را آزمایش کنید. همچنین از ماشینی که کلید شما را ندارد سعی کنید ورود کنید یا با ssh root@remote_host بررسی کنید که ورود با رمز عبور یا root غیرفعال شده است.
ویژگیها و تکنیکهای پیشرفته
فراتر از تنظیمات پایه، SSH امکانات قدرتمندی برای افزایش امنیت و کنترل دقیق استفاده از کلیدها ارائه میدهد.
کلیدهای سختافزاری (مانند YubiKey)
برای بالاترین سطح امنیت، میتوانید از کلید سختافزاری مانند YubiKey یا هر دستگاه سازگار با FIDO2/U2F استفاده کنید. در این روش کلید خصوصی هرگز روی دیسک قرار نمیگیرد و یک اقدام فیزیکی (لمس دستگاه) برای احراز هویت لازم است.
تولید کلید با کلید سختافزاری:
ssh-keygen -t ed25519-sk
در فرآیند از شما خواسته میشود که دستگاه سختافزاری را لمس کنید. خروجی شامل فایل id_ed25519_sk.pub (کلید عمومی) و یک handle خصوصی خواهد بود.
پس از کپی کلید عمومی به ~/.ssh/authorized_keys سرور، هنگام اتصال از شما خواسته میشود دستگاه را لمس کنید تا جلسه احراز شود.
محدودسازی دسترسی کلیدها با گزینهها در authorized_keys
میتوانید محدودیتهای دقیق برای هر کلید با قرار دادن گزینهها قبل از رشته کلید در فایل ~/.ssh/authorized_keys اعمال کنید. قالب کلی:
options public-key-string
برخی گزینههای عملی شامل from="IP"، command="..."، no-pty و no-agent-forwarding هستند. مثال عملی:
from="198.51.100.5",command="/usr/local/bin/backup.sh",no-agent-forwarding,no-port-forwarding,no-pty ssh-ed25519 AAAA...
این تنظیم باعث میشود کلید فقط از IP مشخص قابل استفاده باشد و تنها اجرای یک اسکریپت بکاپ خاص را مجاز بدارد.
Agent Forwarding و ریسکهای آن
Agent forwarding به شما اجازه میدهد از کلید محلی خود موقعی که از ماشین A به bastion-host و سپس به سرور داخلی C متصل هستید، برای احراز هویت استفاده کنید بدون آنکه کلید خصوصی را روی سرور میانی کپی کنید.
برای فعال کردن forwarding برای یک اتصال واحد از فلگ -A استفاده کنید:
ssh -A user@bastion-host
اما اگر سرور میانی (bastion-host) تحت کنترل مهاجم قرار گیرد، او میتواند به socket مربوط به agent دسترسی پیدا کند و از اعتبارنامههای شما سوءاستفاده کند. تنها از agent forwarding هنگام اتصال به سرورهایی که کاملاً به آنها اعتماد دارید استفاده کنید. جایگزین امنتر استفاده از ProxyJump در ~/.ssh/config است.
تونلزنی SSH (Port Forwarding)
تونلزنی SSH یا port forwarding کانالی رمزنگاریشده برای مسیریابی ترافیک بین دستگاه محلی و سرور از راه دور ایجاد میکند. این برای دسترسی به سرویسهایی که در اینترنت باز نیستند یا برای رمزنگاری ترافیک برنامههای قدیمی مفید است.
Local Port Forwarding (-L)
با این روش میتوانید سرویسی روی شبکه از راه دور را همانند اینکه روی ماشین محلی اجرا میشود در دسترس قرار دهید.
مثال: دسترسی به پایگاه داده MySQL روی سرور از راه دور که فقط به localhost اجازه اتصال میدهد. نگاشت پورت 3306 روی سرور راه دور به پورت محلی 8888:
ssh -L 8888:localhost:3306 user@remote_server
پس از اتصال میتوانید با تنظیم کلاینت دیتابیس محلی به localhost:8888 به دیتابیس راه دور متصل شوید.
Remote Port Forwarding (-R)
این روش سرویس محلی شما را در شبکه سرویسدهنده از راه دور در دسترس قرار میدهد. مثال: نمایش موقت اپ وب محلی localhost:3000 به همکاران از طریق پورت 9999 روی سرور راه دور:
ssh -R 9999:localhost:3000 user@remote_server
هشدار: این ویژگی میتواند سرویسهای محلی را در معرض شبکه راه دور قرار دهد؛ احتیاط لازم است.
بهترین شیوهها برای نگهداری و امنیت مداوم
پس از راهاندازی اولیه، نگهداری پیکربندی امن از اهمیت بالایی برخوردار است. رعایت مجوزهای صحیح، گردش کلید (key rotation) و پشتیبانگیری از کلیدها از ضروریات است.
مجوزهای فایلها
هر دو سمت کلاینت و سرور بررسیهای سختگیرانهای روی مجوز فایلها انجام میدهند. مجوزهای اشتباه یکی از رایجترین دلایل عدم موفقیت احراز هویت است. مجوزهای پیشنهادی:
- فایلهای کلید خصوصی:
chmod 600 ~/.ssh/id_ed25519 - دایرکتوری .ssh:
chmod 700 ~/.ssh - فایل authorized_keys روی سرور:
chmod 600 ~/.ssh/authorized_keys
گردش کلید (Key Rotation)
گردش کلید روند منظم بازنشسته کردن کلیدهای قدیمی و جایگزین کردن آنهاست. این کار در صورت لو رفتن کلید، دسترسی نامحدود مهاجم را محدود میکند. یک سیاست رایج گردش سالانه است؛ برای زیرساختهای حساستر ممکن است این بازه سهماهه یا کمتر شود.
فرآیند گردش شامل تولید کلید جدید، انتشار کلید عمومی جدید روی سرورها و حذف کلید قدیمی از فایلهای authorized_keys است.
پشتیبانگیری امن از کلیدها
از دست دادن کلید خصوصی به معنای از دست رفتن دسترسی به همه سرورهایی است که با آن کلید پیکربندی شدهاند. برای جلوگیری از این حالت، استراتژی پشتیبانگیری امن ضروری است (مثلاً نگهداری نسخه رمزنگاریشده در محل امن).
خطاها و رفع مشکلات رایج
با وجود تنظیمات درست، ممکن است خطاهایی رخ دهد که معمولاً از دستهبندیهای زیر هستند: مجوزها، اتصال شبکه یا ناسازگاری کلیدها.
“Permissions are too open”
این خطا معمولاً به دلیل مجوزهای نادرست فایلها یا دایرکتوریها است. پیام خطا ممکن است شبیه این باشد:
Permissions 0644 for '/home/user/.ssh/id_ed25519' are too open.
برای رفع، مجوزها را به شکل زیر تنظیم کنید:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
روی سرور نیز مجوزهای زیر را اعمال کنید:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Connection refused یا Time out
این خطاها معمولاً مرتبط با شبکه یا سرویس SSH هستند:
- فایروال پورت را مسدود کرده است — در اوبونتو وضعیت UFW را چک کنید و پورت SSH (پیشفرض 22) را باز کنید.
- دیمن SSH فعال نیست — وضعیت سرویس را بررسی و در صورت نیاز آن را راهاندازی کنید.
- IP یا پورت نادرست است — اگر SSH روی پورت غیراستاندارد (مثلاً 2222) اجرا میشود، از فلگ
-pاستفاده کنید.
استفاده از حالت verbose برای دیباگ
قویترین ابزار برای تشخیص مشکل، حالت verbose است: با فلگ -v اطلاعات دیباگ مفصلتری نمایش داده میشود. افزایش آن تا -vv یا -vvv جزئیات بیشتری ارائه میدهد و معمولاً نقطه شکست را مشخص میکند.
کاربرد SSH در پردازش ابری و جریانهای کاری AI
SSH اغلب بهعنوان یک ابزار خط فرمان ساده دیده میشود، اما برای متخصصان هوش مصنوعی و یادگیری ماشین یکی از ابزارهای پایهای است که جریانهای کاری امن و خودکار را ممکن میسازد. از اجرای Jupyter Notebook روی سرورهای GPU تا اتوماتیکسازی پایپلاینهای آموزش مدل و اعطای دسترسیهای محدود به عاملهای هوش مصنوعی، SSH ستون فقرات امن بسیاری از این فرایندها است.
برای توسعه AI معمولاً به منابع محاسباتی قویتر نیاز است. اجرای محیطهای توسعهای مانند Jupyter Notebook یا VS Code روی سرورهای پرقدرت رایج است. دسترسی امن به این ابزارها از طریق تونل SSH انجام میشود تا اپلیکیشنهای وب یا سرویسهای داخلی بدون نمایان بودن در اینترنت قابل استفاده باشند.
تونل SSH برای Jupyter
فرض کنید Jupyter Notebook روی سرور از راه دور روی پورت 8888 اجرا شده است. با ایجاد تونل محلی میتوانید به آن مانند سرویس محلی دسترسی داشته باشید:
ssh -L 8888:localhost:8888 user@remote_server
سپس در مرورگر محلی به http://localhost:8888 مراجعه کنید و با توکن Jupyter احراز هویت نمایید.
برای ابزارهای مدرن مانند VS Code، افزونه Remote – SSH اتصال امن را خودکار میکند اما برای اپلیکیشنهای وب مانند Jupyter یا Streamlit ممکن است نیاز به پورت فورواردینگ دستی یا ویژگی Port Forwarding داخل VS Code باشد.
اتوماتیکسازی پایپلاینهای AI با SSH
اسکریپتنویسی سه مرحله اصلی را خودکار میکند: آپلود کد و دادهها، اجرای آموزش یا استنتاج و دانلود نتایج. برای همگامسازی دایرکتوریها rsync عملکرد بهتری نسبت به scp دارد:
rsync -avz --progress /local/dir/ user@remote_server:/remote/dir/
برای مجموعه دادههای بسیار بزرگ از ابزارهایی مانند Rclone یا DVC استفاده کنید.
اجرای دستور از راه دور بدون باز کردن شل تعاملی:
ssh user@remote_server "python3 train.py"
برای دانلود نتایج مجدداً از scp یا rsync بهره ببرید.
عاملهای هوش مصنوعی و SSH
یکی از کاربردهای آیندهنگر SSH، اعطای دسترسی به عاملهای هوش مصنوعی برای انجام وظایف زیرساختی است. عاملها میتوانند به عنوان ابزاری SSH برای مدیریت منابع پیچیده به کار روند. با این حال در محیطهای تولیدی معمول است که عاملها با APIهای سطح بالاتر (مثل API کلاستر کوبرنتیس، SDKهای فراهمکننده ابر یا زمانبندیکنندههای شغلی مثل Slurm) سروکار داشته باشند، زیرا این روش امنتر و قابلپیگیریتر است.
نمونههای کاربردی:
- مدیریت پویا منابع برای اجرای آموزش: عامل میتواند وضعیت صف را بررسی، پلنهای پردازشی جدید راهاندازی، دادهها را همگامسازی و تمرین را روی گرههای مناسب اجرا کند.
- استقرار خودکار مدلها: عامل میتواند مدل جدید را بررسی، تست کند، کانتینر را بسازد و آن را در محیط تولید راهاندازی نماید، ضمن اینکه بهروزرسانی ترافیک و rollback را مدیریت کند.
هشدار امنیتی: هرگز به عامل هوش مصنوعی دسترسی root ندهید و اصل حداقل امتیاز را رعایت کنید. برای آزمایش میتوان SSH محدود را داد، اما در تولید از APIهای سطح بالاتر و مکانیزمهای کنترلی استفاده کنید.
خلاصه عملی و دستورهای کلیدی
تولید جفت کلید با ssh-keygen (الگوریتم پیشنهادی Ed25519):
ssh-keygen -t ed25519
محلی که SSH معمولاً فایلها و پیکربندی را نگهداری میکند ~/.ssh است. دو فایل اصلی برای هر جفت کلید عبارتند از کلید خصوصی و کلید عمومی (id_ed25519 و id_ed25519.pub).
استفاده از ssh-copy-id برای کپی کلید عمومی به سرور:
ssh-copy-id username@remote_host
برای همه کلیدهای جدید از Ed25519 استفاده کنید مگر آنکه به سازگاری با سیستمهای قدیمی نیاز داشته باشید.
بعد از تأیید عملکرد ورود با کلید، برای افزایش امنیت رمز عبور را در سرور غیرفعال کنید: در فایل /etc/ssh/sshd_config مقدار PasswordAuthentication را به no تغییر دهید و PubkeyAuthentication را yes قرار دهید. سپس سرویس SSH را ریاستارت کنید.
رفع خطای رایج مجوزها
خطای مربوط به مجوزها معمولاً بدین معناست که فایل کلید یا دایرکتوری آن دسترسی خیلی باز دارد. برای رفع:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 600 ~/.ssh/authorized_keys
سؤالات متداول کوتاه
- آیا میتوان از یک کلید SSH برای چند سرور استفاده کرد؟ بله، رایج است اما برای امنیت بهتر در محیطهای تولیدی از کلیدهای متفاوت برای نقشها یا محیطهای مختلف استفاده کنید.
نتیجهگیری
شما اکنون کلیدهای SSH را روی سرور اوبونتو 22.04 پیکربندی کردهاید. با تولید یک جفت کلید امن و غیرفعال کردن ورود مبتنی بر رمز عبور، امنیت سرور خود را در برابر حملات brute-force بهطور قابلتوجهی افزایش داده و روند مدیریت از راه دور را ساده کردهاید. دسترسی مبتنی بر کلید یکی از مهارتهای بنیادین برای مدیریت سیستمها و خودکارسازی وظایف است.
برای گسترش دانش خود، از ویژگیهای پیشرفتهتر SSH مانند فایل پیکربندی ~/.ssh/config و ssh-agent استفاده کنید. برای مطالعه عمیقتر به راهنماهای مرتبط مراجعه نمایید.
از اینکه همراه ParminCloud یاد گرفتید سپاسگزاریم. محصولات ما در حوزه محاسبات، ذخیرهسازی و شبکه مدیریتشده را ببینید.






نظرات کاربران