حمیدرضا حسین‌خانی
حمیدرضا حسین‌خانی
خواندن ۸ دقیقه·۵ سال پیش

اتصال به سرور به کمک SSH

مقدمه

معمولا سرور ها از لحاظ جفرافیایی دور از دسترس ما اند مثلا ممکن است در یک Data Center در کشوری دیگر مستقر شده باشند،‌ بنابراین نصب سرویس های مختلف و اعمال تنظیمات بر روی آنها عموما از راه دور انجام می‌شود. اتصال به سرور از راه دور در سالهای اول با استفاده از پروتکل ها و ابزارهای ساده ای مثل Telnet صورت می گرفت. این روش ها اطلاعات رد و بدل شده را رمز نمی‌کردند و به همین دلیل از امنیت بسیار پایینی برخوردار بودند. این روز ها مرسوم ترین و امن ترین روش اتصال به سرور از راه دور، استفاده از پروتکل SSH است.

پروتکل SSH با رمزنگاری محتوای رد و بدل شده در شبکه (مثل Password و ...) از آنها در مقابل خوانده شدن توسط افراد غیر مجاز در شبکه محافظت می‌کند. اگر چه اسناد افشا شده توسط Edward Snowden در سال ۲۰۱۳ نشان داد که این پروتکل آنقدر ها هم امن نیست و آژانس امنیت ملی آمریکا بارها توانسته اطلاعات رمز شده در این پروتکل را رمزگشایی کند.
پروتکل SSH امنیت محتوای رد و بدل شده در یک شبکه ناامن مثل اینترنت را تامین می‌کند.
پروتکل SSH امنیت محتوای رد و بدل شده در یک شبکه ناامن مثل اینترنت را تامین می‌کند.


معمولا سرویسی به نام ssh (در سیستم عامل های مبتنی بر Debian مثل Ubuntu) یا sshd (در سیستم عامل های مبتنی بر Redhat مثل CentOS) روی سرور فعال و در حال گوش کردن به پورت ۲۲ است. با نصب یک SSH Client مانند OpenSSH یا PuTTY روی کامپیوتر شخصی می‌توان از راه دور به سرویس مذکور روی سرور وصل شد و کنترل سرور را در دست گرفت.

پکیج نرم‌افزاری OpenSSH به صورت پیش‌فرض بر روی سیستم عامل های MacOS و Linux نصب شده است. اما اگر سیستم عامل کامپیوتر شخصی شما Windows است می‌توانید نرم افزار PuTTY را دانلود و نصب کنید تا از راه دور به سرور خود SSH کنید.
پکیج نرم‌افزاری OpenSSH شامل چندین ابزار کاربردی مثل scp و sftp و ssh و ssh-keygen و ... است که جلوتر به معرفی بعضی از آنها خواهیم پرداخت.


اتصال به سرور با استفاده از Username و Password

همانطور که پیشتر گفته شد، پکیج نرم‌افزاری OpenSSH به صورت پیشفرض در بیشتر سیستم عامل ها نصب شده است. بنابراین کافی است وارد یک شبیه‌ساز ترمینال در کامپیوتر شخصی خود (مثلا iTerm2 در MacOS یا Tilix در Linux) شده و دستور ssh USER_NAME@HOST را وارد کرده و کلید Enter را بزنید. دقت کنید که به جای HOST، آدرس IP یا Domain سرور و به جای USER_NAME نام یک کاربر تعریف شده روی سرور را وارد کنید.

بار اولی که قصد SSH کردن به یک سرور خاص را دارید، احتمالا با پیغام زیر مواجه خواهید شد که می‌گوید این سرور برای کامپیوتر شما ناشناخته است.

The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)?

با تایپ کردن yes و زدن کلید Enter روی کیبورد، سرور مذکور به لیست Host های شناخته شده در کامپیوتر شما (به آدرس ssh/known_hosts./~) اضافه شده و در دفعات بعد با این پیام مواجه نخواهید شد. سپس کلمه عبور کاربر از شما پرسیده می شود که در صورت درست وارد کردن آن، یک Terminal Session متصل به سرور برای آن کاربر باز می‌شود و می‌توانید هر کاری که کاربر تعریف شده روی سرور مجاز به انجام آن است را از طریق این ترمینال انجام دهید.

اتصال به سرور با استفاده از Username و Password به هیچ عنوان روش خوبی نیست و سرور شما را در معرض حمله Brute-force قرار می‌دهد. در واقع اگر این روش اتصال روی سرور شما فعال باشد، هکر ها با تولید و امتحان تعداد زیادی رمز عبور به صورت خودکار، سعی در ورود به سرور شما خواهند کرد.
روش جایگزین، استفاده از SSH Key برای اتصال به سرور است.


اتصال به سرور با استفاده از SSH Key

در این روش اتصال، به جای Username و Password از کلید خصوصی (Private Key) و کلید عمومی (Public Key) تولید شده توسط الگوریتم رمزنگاری RSA استفاده می‌شود.

در روش رمزنگاری RSA، برای رمز کردن اطلاعات و ارسال آنها در شبکه، یک جفت کلید (دو کلید)، یکی برای رمزنگاری (Encryption Key) و دیگری برای رمزگشایی (Decryption Key) ساخته می‌شوند. اگر داده ای با یک Encryption Key خاص رمز شده باشد، فقط و فقط با Decryption Key معادل آن رمزگشایی می‌شود. بنابراین اگر سیستمی به نام Alice بخواهد پیامی را به سیستمی به نام Bob بفرستد، باید Encryption Key مربوط به Bob را داشته باشد و پیام را با آن رمز کند و برای Bob بفرستد. با فرض اینکه Decryption Key متعلق به Bob را هیچ کس جز خودش ندارد، می‌توان مطمین بود که فقط Bob می‌تواند پیام را رمزگشایی کند. بنابراین Decryption Key یک کلید خصوصی (Private Key) است و هیچ کس جز مالک اصلی آن نباید آن را داشته باشد اما Encryption Key توسط سایر فرستندگان برای رمز کردن داده ها استفاده می‌شود و از این رو یک کلید عمومی (Public Key) است که می‌توان آن را به راحتی در اختیار بقیه قرار داد.

برای داشتن یک ارتباط امن در اتصال یک Client به یک Server،‌ لازم است هر دو ی آنها یک جفت کلید خصوصی و عمومی داشته باشند و کلید عمومی خود را برای رمزنگاری در اختیار یکدیگر قرار دهند و از کلید خصوصی خود نهایت محافظت را داشته باشند. نرم افزار OpenSSH به صورت خودکار از Server کلید عمومی را میپرسد اما کلید عمومی Client باید توسط خود شما به Server داده شود.

نرم افزار SSH Client به صورت خودکار کلید عمومی (کلید سبز) را از سرور میگیرد و پیام خود را با آن رمز می‌کند و در شبکه اینترنت با پروتکل SSH منتقل می‌کند. سرور می‌تواند پیام رمز شده را با کلید خصوصی خود باز کند.
نرم افزار SSH Client به صورت خودکار کلید عمومی (کلید سبز) را از سرور میگیرد و پیام خود را با آن رمز می‌کند و در شبکه اینترنت با پروتکل SSH منتقل می‌کند. سرور می‌تواند پیام رمز شده را با کلید خصوصی خود باز کند.


کلید خصوصی و عمومی متعلق به سرور (ID متعلق به سرور)، هنگام ساختن User روی سرور ایجاد شده اند و در مسیر /ssh./~ به ترتیب با نام های id_rsa و id_rsa.pub ذخیره شده اند. برای ساختن جفت کلید RSA روی کامپیوتر شخصی خود (Client) می‌توانید از ابزار ssh-keygen در مجموعه نرم‌افزاری OpenSSH استفاده کنید. برای این منظور دستور زیر را در ترمینال اجرا کنید:

$ ssh-keygen

اجرای این دستور، یک جفت کلید ۲۰۴۸ بیتی (ID متعلق به کلاینت) در مسیر /ssh./~ به نام های id_rsa و id_rsa.pub می‌سازد که برای بیشتر امور به اندازه کافی امن است اما برای اطمینان بیشتر می‌توان از یک کلید بزرگتر (مثلا ۴۰۹۶ بیتی) استفاده کرد:

$ ssh-keygen -t rsa -b 4096 -C &quotyour_email@example.com&quot

لازم به ذکر است که مسیر ذخیره شدن ID در هنگام ساخته شدن آن از شما پرسیده می‌شود که با زدن کلید Enter روی کیبورد مقدار پیشفرض آن (/ssh./~) در نظر گرفته می‌شود. همینطور هنگام ساخته شدن ID، یک Passphrase از شما پرسیده می‌شود که می‌توانید آن را خالی بگذارید اما به شدت توصیه می‌کنیم که یک رمز عبور قوی برای این بخش وارد کنید. وارد کردن رمز عبور در این قسمت باعث می‌شود تا در صورت لو رفتن Private Key مربوط به کامپیوتر شما کسی نتواند به راحتی از آن سواستفاده کند.

پس از ساخته شدن ID توسط ابزار ssh-keygen یک Randomart (شبیه تصویر) برای سهولت در بررسی چشمی ایجاد می‌شود.
پس از ساخته شدن ID توسط ابزار ssh-keygen یک Randomart (شبیه تصویر) برای سهولت در بررسی چشمی ایجاد می‌شود.


حال که جفت کلید مربوط به کلاینت ساخته شده، باید کلید عمومی آن را به سرور بدهیم. برای این منظور فایل ssh/id_rsa.pub./~ روی کلاینت که شامل کلید عمومی است را باز کرده و محتوای آن (که با ssh-rsa AAAA شروع می‌شود) را در انتهای فایل ssh/authorized_keys./~ روی سرور کپی می‌کنیم. اگر فایل ssh/authorized_keys./~ روی سرور وجود نداشت می‌توانید با دستورات زیر آن را بسازید:

mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys

البته که ابزاری به نام ssh-copy-id در پکیج نرم‌افزاری OpenSSH وجود دارد که کار انتقال کلید عمومی به سرور را به صورت خودکار انجام می‌دهد و می‌توانید برای سادگی از آن بر روی کامپیوتر خود استفاده کنید:

ssh-copy-id USER_NAME@HOST

به جای HOST از IP یا Domain سرور و به جای USER_NAME از نام یک کاربر مجاز بر روی سرور استفاده کنید. واضح است که پس از اجرای دستور بالا، رمز عبور کاربر سرور پرسیده می‌شود بنابراین قابلیت اتصال به سرور با نام کاربری و رمز عبور باید هنگام استفاده از این ابزار فعال باشد. در صورت وارد کردن رمز عبور صحیح، کلید عمومی کامپیوتر به سرور منتقل می‌شود و ازین پس می‌توانید به راحتی و بدون وارد کردن رمز عبور به سرور متصل شوید.

غیر فعال کردن قابلیت اتصال به سرور با استفاده از Username و Password

در بالا گفتیم که فعال بودن این روش اتصال، امنیت سرور را به خطر می اندازد. از طرفی هنگام استفاده از ابزار ssh-copy-id برای انتقال کلید عمومی به سرور، نیاز به فعال بودن این قابلیت داریم. بنابراین پس از انتقال کلید عمومی و اطمینان از اینکه اتصال به سرور با استفاده از SSH Key به درستی کار می‌کند، بهتر است قابلیت اتصال به سرور با استفاده از Username و Password را غیر فعال کنیم. برای این منظور فایل etc/ssh/sshd_config/ را به کمک یک Text Editor مانند vim ویرایش کنید:

در صفحه باز شده، خط PasswordAuthentication را یافته و با پاک کردن کاراکتر # آن را از حالت Comment خارج کرده و عبارت no را مقابل آن درج کنید. سپس تغییرات را ذخیره کرده و از محیط vim خارج شوید. (wq:)

از نظر امنیتی بهتر است ورود به سرور با کاربر root غیر فعال باشد بنابراین پیشنهاد می‌شود خط PermitRootLogin را نیز در فایل مذکور یافته و عبارت no را در مقابل آن درج کنید تا ورود با کاربر root نیز در همین جا غیر فعال شود.

پس از اعمال تغییرات مذکور، لازم است تا سرویس ssh (یا sshd) مجددا راه اندازی شود:

$ sudo systemctl restart ssh

اگر همه مراحل بالا را درست طی کرده باشید با اجرای دستور ssh USERNAME@HOST روی کامپیوتر خود، بدون رمز عبور به سرور متصل می‌شوید و البته با اجرای این دستور روی کامپیوتر های دیگر (به دلیل عدم تعریف کلید عمومی و غیر فعال بودن ورود به کمک رمز عبور) اتصال امکان پذیر نخواهد بود.



اگر تعداد زیادی سرور و کاربر دارید و به خاطر سپردن IP و Username همه آنها برای شما سخت است می‌توانید نام های ساده تری را به آنها اختصاص دهید. برای این کار فایل ssh/config./~ را ساخته و محتوایی شبیه به محتوای زیر را به آن اضافه کنید:

Host production1 HostName 172.217.169.238 User hamidreza

حال به جای دستور ssh hamidreza@172.217.169.238 می‌توانید از دستور ssh production1 استفاده کنید.

sshrsassh keyputtytelnet
در اینجا تجربیاتم رو در زمینه های مختلف با دوستانم به اشتراک میذارم...
شاید از این پست‌ها خوشتان بیاید