نحوه تنظیم کلیدهای SSH در سرور مجازی اوبونتو Ubuntu
۲۸ دی ۱۴۰۳
مقدمه
SSH یا Secure Shell یک پروتکل رمزگذاریشده است که برای مدیریت و ارتباط با سرورها استفاده میشود. هنگام کار با یک سرور اوبونتو (Ubuntu)، احتمالاً بیشتر وقت خود را در یک ترمینال صرف خواهید کرد که از طریق SSH به سرور مجازی شما متصل است.
در این راهنما، ما روی تنظیم کلیدهای SSH در Ubuntu، تمرکز خواهیم کرد. کلیدهای SSH یا SSH Keys، روشی امن برای ورود به سرور شما فراهم میکنند و برای تمامی کاربران توصیه میشوند.
پیشنیازها
برای درک کامل مقاله، بهتر است با مفاهیم مقدماتی SSH آشنا باشید؛ در صورتی که با این مفاهیم، آشنایی ندارید؛ توصیه میشود در ابتدا، به مطالعه مقالههای زیر، بپردازید:
- SSH چیست؟ + نحوه استفاده از SSH برای اتصال به سرور مجازی (VPS)
- سرور مجازی یا VPS چیست؟ + انواع سروهای مجازی و کاربردهای آنها
در ادامه، بخوانید:
- مرحله اول – ایجاد جفت کلید
- مرحله دوم – کپی کردن کلید عمومی به سرور مجازی لینوکس
- مرحله سوم – احراز هویت در سرور اوبونتو با استفاده از کلیدهای SSH
- مرحله چهارم – غیرفعال کردن احراز هویت با رمز عبور روی سرور مجازی
- نتیجهگیری
مرحله اول – ایجاد جفت کلید (Key Pair)
اولین مرحله، ایجاد یک جفت کلید روی ماشین کلاینت (معمولاً کامپیوتر شما) است:
ssh-keygen
به طور پیشفرض، نسخههای جدید ssh-keygen یک جفت کلید RSA با طول 3072 بیت ایجاد میکنند که برای بیشتر استفادهها امن است (شما به طور اختیاری میتوانید با استفاده از فلگ -b 4096
یک کلید بزرگتر (4096 بیتی) ایجاد کنید). پس از وارد کردن دستور فوق، باید خروجی زیر را مشاهده کنید:
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):
برای ذخیره جفت کلید در داخل دایرکتوری .ssh/
در home directory خود، دکمه ENTER را فشار دهید یا یک مسیر دیگر، برای آن مشخص کنید. اگر قبلاً یک جفت کلید SSH ایجاد کرده باشید، ممکن است پیغام زیر را مشاهده کنید:
/home/your_home/.ssh/id_rsa already exists.
Overwrite (y/n)?
اگر تصمیم بگیرید که کلیدِ موجود روی دیسک را بازنویسی کنید، دیگر نمیتوانید با استفاده از کلید قبلی، وارد سرور مجازیتان شوید. زمان انتخاب گزینه yes بسیار دقت کنید، زیرا این عملیات، ممکن است یک فرایند مخرب باشد که قابل برگشت، نخواهد بود.
در ادامه، باید پیام زیر را مشاهده کنید:
Enter passphrase (empty for no passphrase):
در اینجا میتوانید به طور اختیاری، یک passphrase امن وارد کنید که بسیار توصیه میشود. passphrase، یک لایه امنیتی اضافی در سرور مجازی، برای جلوگیری از ورود کاربران غیرمجاز ایجاد میکند. در ادامه، باید خروجی مشابه زیر را دریافت کنید:
Your identification has been saved in /your_home/.ssh/id_rsa
Your public key has been saved in /your_home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host
The key's randomart image is:
+---[RSA 3072]----+
| .|
| + |
| + |
| . o . |
|o S . o |
| + o. .oo. .. .o|
|o = oooooEo+ ...o|
|.. o *o+=.*+o....|
| =+=ooB=o.... |
+----[SHA256]-----+
حالا، شما یک کلید عمومی و خصوصی دارید (که با هم یک جفت کلید محسوب میشوند)، که میتوانید از آن برای احراز هویت استفاده کنید. مرحله بعدی این است که کلید عمومی را روی سرور مجازی لینوکس (VPS) خود قرار دهید تا بتوانید از احراز هویت مبتنی بر SSH key برای ورود استفاده کنید.
مرحله دوم – کپی کردن کلید عمومی به سرور مجازی لینوکس
سریعترین روش برای کپی کردن کلید عمومی به سرور مجازیتان، استفاده از ابزاری به نام ssh-copy-id است. به دلیل سادگی این روش – اگر این ابزار در دسترس باشد – به شدت توصیه میشود. اگر ssh-copy-id در ماشین کلاینت شما موجود نباشد، میتوانید یکی از دو روش جایگزین در این بخش (کپی از طریق SSH مبتنی بر رمز عبور یا کپی دستی کلید) را استفاده کنید.
همچنین بخوانید: نحوه راهاندازی اولیه سرور مجازی با اوبونتو Ubuntu
کپی کردن کلید عمومی با استفاده از ssh-copy-id بر روی سرور مجازی
ابزار ssh-copy-id به طور پیشفرض در بسیاری از سیستمعاملها قرار دارد. بنابراین ممکن است آن را روی سیستم local خود داشته باشید. برای اینکه این روش، به درستی کار کند، باید دسترسی SSH مبتنی بر رمز عبور به سرور خود داشته باشید.
برای استفاده از این ابزار، باید سرور مجازی لینوکسی را که میخواهید به آن متصل شوید و حساب کاربری که دسترسی SSH مبتنی بر رمز عبور به آن دارید، مشخص کنید. این حساب کاربری، حسابی خواهد بود که کلید عمومی SSH شما به آن کپی خواهد شد. Syntax به این صورت است:
ssh-copy-id username@remote_host
در دستور فوق، به جای username
، نام کاربری را وارد کنید که به سرور مجازی، دسترسی SSH مبتنی بر رمز عبور دارد؛ به جای remote_host
نیز، آدرس دامنه سرور مجازیتان را وارد کنید؛ با اجرای دستور فوق، ممکن است پیام زیر را مشاهده کنید:
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
خروجی فوق میگوید که کامپیوتر local شما، سرور مجازی ریموتتان را، نمیشناسد. این اتفاق در اولین باری که به یک سرور مجازی جدید، متصل میشوید، رخ میدهد. عبارت “yes” را تایپ کرده و دکمه ENTER را فشار دهید تا عملیات ادامه پیدا کند.
در ادامه، ابزارِ ssh-copy-id، در حساب local شما، به جستجوی کلید id_rsa.pub که قبلاً ایجاد کردهایم، میپردازد. زمانی که کلید را پیدا کرد، از شما رمز عبور سرور مجازی ریموت را، درخواست میکند:
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
username@203.0.113.1's password:
رمز عبور را وارد کنید (به خاطر موارد امنیتی، آنچه تایپ میکنید نمایش داده نمیشود) و دکمه ENTER را فشار دهید. ابزار با استفاده از رمز عبوری که وارد کردهاید، به حساب کاربریتان در سرور مجازی، متصل میشود. سپس محتویات کلید ~/.ssh/id_rsa.pub شما را در فایلی در دایرکتوری ~/.ssh در home directory حساب سرور مجازیتان، به نام authorized_keys کپی خواهد کرد. پس از انجام این کار، شما باید خروجی زیر را مشاهده کنید:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'username@remote_host'"
and check to make sure that only the key(s) you wanted were added.
در این لحظه، فایل id_rsa.pub
تان در سرور مجازی، آپلود شده است و شما میتوانید وارد مرحله سوم شوید. در صورتی که این روش به درستی در سرور مجازی شما کار نکرد؛ روشهای دیگر را که در ادامه آمده است، امتحان کنید.
کپی کردن کلید عمومی با استفاده از SSH بر روی سرور مجازی
اگر ابزار ssh-copy-id در دسترس شما نیست، اما یک دسترسی SSH مبتنی بر رمز عبور به یک حساب کاربری روی سرور مجازی خود دارید، میتوانید کلیدهای خود را با استفاده از روش معمول، بارگذاری کنید.
برای این کار، کافیست از دستور cat برای خواندن مقدار کلید عمومی SSH روی کامپیوتر local خود استفاده کرده و آن را از طریق اتصال SSH به سرور ریموت ارسال کنیم. در سرور مجازی نیز، باید اطمینان حاصل کنیم که دایرکتوری ~/.ssh
وجود دارد و حساب کاربری مورد استفاده ما دارای دسترسیهای کافی است. سپس، میتوانیم خروجی دستور cat را در فایلی به نام authorized_keys در دایرکتوری ~/.ssh
قرار دهیم. از نماد >>
برای افزودن محتوا به یک فایل و نه بازنویسی آن فایل، استفاده میکنیم. این کار به ما این امکان را میدهد که کلیدهای جدید را بدون از بین بردن کلیدهای قبلی، به فایل اضافه کنیم. دستور کامل تمام توضیحاتی که داده شد، مشابه زیر است:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"
ممکن است با اجرای دستور فوق، پیام زیر را مشاهده کنید:
The authenticity of host 'remote_host (remote_host)' 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
خروجی فوق میگوید که کامپیوتر local شما، سرور مجازی ریموتتان را، نمیشناسد. این اتفاق در اولین باری که به یک سرور مجازی جدید، متصل میشوید، رخ میدهد. عبارت “yes” را تایپ کرده و دکمه ENTER را فشار دهید تا عملیات ادامه پیدا کند. پس از انجام این کار، از شما خواسته خواهد شد که رمز عبور حساب کاربری موجود در سرور مجازی ریموت را وارد کنید:
username@remote_host's password:
پس از وارد کردن رمز عبور، محتوای کلید id_rsa.pub شما به انتهای فایل authorized_keys حساب کاربری موجود در سرور مجازیتان، کپی خواهد شد. در صورتی که عملیات موفق بود. به مرحله سوم بروید.
کپی کردن کلید عمومی بر روی سرور مجازی به صورت دستی
اگر دسترسی SSH مبتنی بر رمز عبور به سرور خود ندارید، باید فرایند کپی کردن کلید عمومی به سرور مجازی لینوکس را به صورت دستی انجام دهید. ما محتوای فایل id_rsa.pub
را به فایل ~/.ssh/authorized_keys
در سرور ریموت، اضافه خواهیم کرد.
برای نمایش محتوای کلید id_rsa.pub
خود، دستور زیر را در کامپیوتر local خود وارد کنید:
cat ~/.ssh/id_rsa.pub
محتوای کلید شما باید شبیه به این باشد:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test
حالا باید به سرور از راه دور دسترسی پیدا کنید. هر روشی که میشناسید و در دسترس دارید، استفاده کنید. پس از دسترسی به حساب کاربری خود در سرور مجازی لینوکس، ابتدا مطمئن شوید که دایرکتوری ~/.ssh
وجود دارد. دستور زیر، دایرکتوری را در صورت نیاز ایجاد میکند (در صورت وجود دایرکتوری، این دستور، کاری انجام نمیدهد):
mkdir -p ~/.ssh
اکنون، میتوانید فایل authorized_keys
را در این دایرکتوری ایجاد یا ویرایش کنید. برای اضافه کردن محتوای id_rsa.pub
به انتهای فایل authorized_keys
از دستور زیر استفاده کنید. این دستور فایل را در صورت عدم وجود، ایجاد میکند:
echo public_key_string >> ~/.ssh/authorized_keys
در دستور فوق، مقدار public_key_string
را با محتوای خروجی دستور cat ~/.ssh/id_rsa.pub
که در سیستم local خود اجرا کردهبودید، جایگزین کنید. در نهایت، باید مطمئن شویم که دایرکتوری ~/.ssh
و فایل authorized_keys
دارای مجوزهای مناسب هستند. برای این کار از دستور زیر استفاده میکنیم:
chmod -R go= ~/.ssh
دستور فوق، به صورت recursive، همه مجوزهای سایر افراد برای دایرکتوری ~/.ssh/
را، حذف میکند. اگر از حساب کاربری root برای تنظیم کلیدها برای یک حساب کاربری دیگر استفاده میکنید، مهم است که دایرکتوری ~/.ssh
متعلق به کاربر و نه متعلق به root باشد. برای این کار از دستور زیر استفاده کنید:
chown -R lorem:lorem ~/.ssh
در دستور فوق، lorem را با نام کاربری مدنظر خود، جایگزین کنید. حالا میتوانید وارد مرحله سوم شوید.
مرحله سوم – احراز هویت در سرور اوبونتو با استفاده از کلیدهای SSH
پس از گذراندن مرحله دوم، اکنون باید بتوانید بدون وارد کردن رمز عبور حساب کاربری، وارد سرور مجازی لینوکستان شوید. فرایند اصلی به این صورت است:
ssh username@remote_host
اگر اولین بار باشد که به سرور مجازیتان متصل میشوید (مثلاً اگر که از روش آخر مرحله دوم، استفاده کردهباشید)، ممکن است پیامی شبیه به این را مشاهده کنید:
The authenticity of host 'remote_host (remote_host)' 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
خروجی فوق میگوید که کامپیوتر local شما، سرور مجازی ریموتتان را، نمیشناسد. عبارت “yes” را تایپ کرده و دکمه ENTER را فشار دهید تا عملیات ادامه پیدا کند.
اگر برای کلید خصوصی خود passphrase تنظیم نکرده باشید، بلافاصله وارد سرور مجازی میشوید. اگر برای کلید خصوصی خود passphrase تنظیم کرده باشید، از شما خواسته میشود تا آن را وارد کنید (توجه داشته باشید که هنگام وارد کردن passphrase، برای امنیت بیشتر، هیچ چیزی در ترمینال نمایش داده نمیشود). پس از احراز هویت، یک session جدید در ترمینال، با حساب کاربری تنظیمشده در سرور Ubuntu، برای شما باز میشود.
اگر احراز هویت با استفاده از کلید، برایتان موفقیتآمیز بود، میتوانید برای افزایش امنیت سرور مجازی خود، مرحله بعدی را برای غیرفعال کردن احراز هویت مبتنی بر رمز عبور، دنبال کنید.
مرحله چهارم – غیرفعال کردن احراز هویت با رمز عبور روی سرور مجازی
اگر توانستید بدون وارد کردن رمز عبور، وارد حساب کاربری خود شوید، شما با موفقیت، احراز هویت مبتنی بر کلید SSH را در سرور مجازی خود، پیکربندی کردهاید. با این حال، مکانیزم احراز هویت مبتنی بر رمز عبور، هنوز فعال است، به این معنی که سرور شما همچنان در معرض حملات brute-force قرار دارد.
قبل از انجام موارد این بخش، اطمینان حاصل کنید که احراز هویت با کلید SSH را برای حساب root یا یک حساب non-root با دسترسیهای sudo، فعال کردهاید. این مرحله، قابلیت احراز هویت با رمز عبور را، قفل خواهد کرد، بنابراین، اطمینان از این که هنوز بتوانید با مجوزهای مدیریتی، به سرور مجازی دسترسی داشته باشید، ضروری است.
پس از کسب اطمینان از اینکه یک حساب کاربری با دسترسیهای مدیریتی دارید، چه به عنوان root و چه با یک حساب با دسترسیهای sudo، وارد سرور مجازی خود با استفاده از کلید SSH شوید، سپس فایل پیکربندی سرویس SSH را باز کنید:
sudo nano /etc/ssh/sshd_config
داخل فایل، به دنبال دستور PasswordAuthentication
بگردید. این خط ممکن است با علامت #
در ابتدای خط کامنت شده باشد. برای فعال کردن خط، علامت #
را بردارید و مقدار آن را به no
تغییر دهید. این کار، باعث غیرفعال شدن قابلیت ورود با رمز عبور به سرور از طریق SSH میشود:
. . .
PasswordAuthentication no
. . .
پس از انجام تغییرات فوق، با فشردن CTRL+X و سپس Y، تغییرات را ثبت کنید؛ در نهایت ENTER را بزنید تا تغییرات ذخیره شود و از nano خارج شوید. برای فعالسازی این تغییرات، باید سرویس sshd را دوباره راهاندازی کنید:
sudo systemctl restart ssh
بهتر است که برای اطمینان بیشتر، یک ترمینال جدید باز کنید و تست کنید که آیا سرویس SSH به درستی کار میکند یا خیر، پیش از اینکه ترمینال فعلی خود را ببندید:
ssh username@remote_host
پس از اطمینان از اینکه سرویس SSH به درستی کار میکند، میتوانید با خیال راحت تمامی ترمینالهای فعلی را ببندید. حالا سرویس SSH در سرور Ubuntu شما فقط به احراز هویت مبتنی بر کلید SSH پاسخ میدهد و ورود با رمز عبور غیرفعال شده است.
نتیجهگیری
در این مقاله نحوه تنظیم SSH-key برای ورود بدون رمز عبور به سرور Ubuntu را توضیح دادیم. با استفاده از این روش، میتوانید امنیت سرور خود را بالا ببرید و از حملات brute-force جلوگیری کنید. همچنین با غیرفعال کردن ورود به سرور با رمز عبور، میتوانید از دسترسیهای غیرمجاز جلوگیری کنید و دسترسیهای امنتری فراهم کنید.
در صورتی که نیاز به یک سرور مجازی دائمی هستید؛ میتوانید از سرورهای مجازی ایران در لیارا، استفاده کنید. سرور مجازی لیارا (VPS) یک زیرساخت قدرتمند و سریع ارائه میدهد که برای پروژههای مختلف مناسب است. با سرعت بالا و پشتیبانی فنی قوی، سرورهای مجازی لیارا، تضمین میکنند که سایتها و اپلیکیشنهای شما همیشه در دسترس باشند. همچنین به دلیل مقیاسپذیری بالا، شما میتوانید به راحتی منابع سرور خود را بر اساس نیازهای پروژه، بدون نگرانی از مشکلات عملکردی، تنظیم کنید.
همچنین بخوانید: نحوه نصب و استفاده از mosh روی سرور مجازی (VPS)