مقدمه
پوسته امن یا SSH یک پروتکل رمزگذاری شده است که برای مدیریت و تعامل با سرورها استفاده میشود. در اکثر مواقع کار با سرور لینوکس، شما بیشتر در یک ترمینال سشن که از طریق SSH به سرور متصل شده، خواهید بود.
برای وارد شدن به سرور SSH راه های متعددی وجود دارد که در این مطلب آموزشی به نصب SSH-key و ورود به سرور از این طریق میپردازیم. ورود به سرور با SSH-key روشی آسان و بسیار امن میباشد؛ به همین دلیل این روش را بیشتر از بقیه روشها به کاربرها توصیه میکنیم.
نحوه عملکرد SSH-key
روشهای مختلف و متعددی برای احراز هویت کلاینتها یک سرور SSH وجود دارد. اصلیترین روش برای احراز هویت از طریق کلمه عبور است که به سادگی انجام میشود؛ البته این روش خیلی امنیت ندارد. کلمه عبور به روشی ایمن به سرور ارسال میشود؛ با این حال به اندازه کافی پیچیده و طولانی نیست که بتواند در برابر حملات مکرر مهاجمان به سرور مقاومت کند. ترکیب قدرت پردازش مدرن با اسکریپتهای خودکار، باعث شده که امکان حمله brute force به یک حساب کاربری محافظت شده با کلمه عبور به شدت زیاد شود. البته روشهایی برای بالا بردن امنیت حساب کاربری (fail2ban و غیره) وجود دارد؛ اما یکی از روشهای قابل اعتماد و ایمن در واقع احراز هویت با SSH-key است. یک جفت SSH-key در واقع دو SSH-key رمزگذاری شده ایمن است که میتوان از آن برای احراز هویت یک کلاینت در سرور SSH استفاده کرد. هر جفت SSH-key شامل یک SSH-key شخصی و یک public key میشود.
کلاینت باید private key را پیش خود نگه دارد و فقط خودش آن را بداند. اگر به هر نحوی private key به اشتراک گذاشته شود و در معرض دید قرار بگیرد، مهاجمان میتوانند به راحتی وارد سرور پیکربندی شده با احراز هویت وابسته به public key شوند. برای احتیاط میتوان SSH-key ها را با یک عبارت عبور روی دیسک رمزگذاری کرد. برعکس SSH-key شخصی، public key را میتوان بدون هیچگونه عواقب منفی به اشتراک گذاشت. در واقع public key برای رمزگذاری پیامهایی استفاده میشود که فقط با private key میتوان آنها را رمزگشایی کرد. این ویژگی به عنوان روشی برای احراز هویت با استفاده از یک جفت SSH-key به کار میرود.
public key در یک سرور ریموت که میخواهید با SSH وارد آن شوید، آپلود میشود؛ این SSH-key به یک فایل خاص به اسم ssh/authorized_keys./~ در داخل حساب کاربری که با آن وارد شدید، اضافه میشود. وقتی که یک کلاینت میخواهد با استفاده از SSH-key احراز هویت کند، سرور آن را تست میکند تا ببیند که این کلاینت صاحب private key است یا نه؛ اگر کلاینت بتواند ثابت کند که صاحب private key است، یک شل سشن (shell session) ایجاد میشود یا دستور درخواست شده اجرا میشود.
در ادامه به شما نحوه ایجاد SSH-key را به شما نشان میدهیم. با وان سنتر همراه باشید.
روش ایجاد SSH-key
اولین مرحله پیکربندی احراز هویت با SSH-key در سرور خود، ایجاد یک جفت SSH-key در کامپیوتر خودتان است.
برای این کار میتوانید از یک ابزار خاص به اسم ssh-keygen استفاده کنید که شامل مجموعهای از ابزار استاندارد OpenSSH میشود. این ابزار به صورت پیشفرض یک جفت SSH-key ۲۰۴۸ بیتی RSA ایجاد میکند که برای اکثر موارد استفاده مناسب است.
در کامپیوتر خود با نوشتن دستور زیر یک جفت SSH-key ایجاد کنید:
ssh-kegen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
این ابزار بلافاصله از شما میخواهد محل SSH-key های ایجاد شده را تعیین کنید. البته SSH-key های ایجاد شده به صورت پیشفرض در دایرکتوری ~/.ssh دایرکتوری اصلی حساب کاربری شما ذخیره میشود. اسم private key id_rsa و اسم public key id_ras.pub خواهد بود.
معمولا بهترین کار در این مقطع، انتخاب محل پیشفرض برای SSH-key های جفت شده است. این کار باعث میشود که کلاینت SSH شما به صورت اتوماتیک SSH-key های شما را در زمان احراز هویت پیدا کند. اگر میخواهید که یک مسیر غیر استاندارد برای SSH-key های خود انتخاب کنید، مسیر را در دستور بالا بنویسید؛ در غیر این صورت ENTER را بزنید تا مسیر پیشفرض را تایید کنید.
اگر قبلا یک جفت SSH-key ایجاده کرده باشید، بلافاصله چنین چیزی خواهید دید:
/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?
اگر بخواهید که SSH-key را روی دیسک جایگزین کنید، دیگر نمیتوانید با استفاده از SSH-key قبلی خود احراز هویت کنید. اگر میخواهید yes را انتخاب کنید، مراقب باشید چون که این یک پروسه مخرب است و بازگشتپذیر نیست.
Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
در ادامه، باید یک عبارت عبور برای SSH-key وارد کنید. این عبارت عبور را به دلخواه میتوانید انتخاب کنید که برای رمزگذاری private key روی دیسک به کار میرود.
فواید SSH-key های محافظت شده با عبارت عبور
- private key (قسمتی که میتوان با عبارت عبور از آن محافظت کرد) هیچوقت در شبکه قرار نمیگیرد که فاش شود. عبارت عبور فقط برای رمزگشایی SSH-key در دستگاه شما استفاده میشود. این نشان میدهد که امکان حمله brute force شبکهای به عبارت عبور وجود نخواهد داشت.
- private key در داخل یک دایرکتوری تحت نظارت نگهداری میشود. کلاینت SSH در واقع private key که در دایرکتوری تحت نظارت نگهداری نشده باشد را شناسایی نخواهد کرد. دسترسیهای خود SSH-key هم باید محدود باشد (فقط خواندن و نوشتن برای مالک SSH-key قابل دسترسی باشد). این نشان میدهد که سایر کاربران در سیستم نمیتوانند مخفیانه وارد حساب کاربری شما شوند.
- هر مهاجمی که بخواهد عبارت عبور private key را بشکند، باید به سیستم دسترسی داشته باشد. این نشان میدهد که این مهاجمان به حساب کاربری شما یا حساب کاربری روت دسترسی دارند. اگر در چنین موقعیتی قرار بگیرید، عبارت عبور میتواند از ورود سریع مهاجمان به سایر سرورهای شما جلوگیری کند؛ خوشبختانه پروسه جلوگیری عبارت عبور از ورود مهاجمان، به شما زمان کافی میدهد تا یک جفت SSH-key جدید ایجاد و اجرا کنید و در نهایت دسترسی SSH-key شکسته شده را حذف کنید.
از آنجایی که private key در شبکه قرار نمیگیرد که فاش شود و از طریق دسترسیهای فایل محافظت میشود، به غیر از خود شما و کاربر روت هیچکس نباید به این فایل دسترسی داشته باشد. در مواقعی که SSH-key ها شکسته شوند، عبارت عبور به عنوان یک لایه امنیتی اضافی عمل خواهد کرد.
تعیین عبارت عبور اختیاری است. اگر شما عبارت عبور وارد کرده باشید، در هر بار استفاده از SSH-key باید عبارت را هم وارد کنید (مگر اینکه نرمافزار SSH agent را که SSh-key رمزگشایی شده را ذخیره میکند اجرا کرده باشید). به شما توصیه میکنیم که از عبارت عبور استفاده کنید، اما اگر نمیخواهید این کار را بکنید، میتوانید ENTER را بزنید و از این مرحله عبور کنید.
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
| ..o |
| E o= . |
| o. o |
| .. |
| ..S |
| o o. |
| =o.+. |
|. =++.. |
|o=++. |
+-----------------+
حالا شما یک public key و یک private key دارید که میتوانید برای احراز هویت از آنها استفاده کنید. در قسمت بعد نحوه کپی کردن public key در سرور را به شما آموزش میدهیم تا بتوانید برای ورود از احراز هویت SSH-key استفاده کنید. با وان سنتر همراه باشید.
نحوه کپی کردن public key در سرور
اگر از قبل یک سرور قابل دسترس دارید و SSH-key ها را در موقع ساختن سرور قرار ندادهاید، می توانید public key خود را آپلود کنید و از آن برای احراز هویت و ورود به سرور استفاده کنید.
روشی که برای این کار استفاده میکنید، بیشتر به ابزار قابل دسترس و جزئیات پیکربندی فعلی شما بستگی دارد. تمام روشهایی که در ادامه توضیح خواهیم داد نتیجه پایانی یکسانی خواهند داشت. آسانترین روش اولین آنها است؛ در هر کدام از روشهای بعدی در صورتی که نتوانید از روشهای قبلی استفاده کنید، باید یک سری مراحل را به صورت دستی انجام دهید.
کپی کردن public key با استفاده از SSH-Copy-ID
آسانترین راه برای کپی کردن public key در یک سرور، استفاده از ابزاری به اسم ssh-copy-id است. در صورتی که این ابزار قابل دسترس باشد، همین روش را به دلیل ساده بودن به شما توصیه میکنیم.
ابزار ssh-copy-id در بسیاری از بخشها در پکیجهای OpenSSH وجود دارد. بنابراین احتمالا در شما در کامپیوتر خود این ابزار را داشته باشید. برای اینکه این روش کارساز باشد، باید دسترسی SSH با کلمه عبور به سرور خود داشته باشید.
برای استفاده از این ابزار باید هاست ریموتی که میخواهید به آن وصل شوید و حساب کاربری که دسترسی SSH با کلمه عبور دارد را داشته باشید؛ این حساب کاربری همان حسابی است که public key شما در آن کپی خواهد شد.
سینتکس به شکل زیر خواهد بود:
ssh-copy-id username@remote_host
ممکن است که پیامی به شکل زیر ببینید:
The authenticity of host '111.111.11.111 (111.111.11.111)' 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
این پیام به شما میگوید که کامپیوتر شما هاست ریموت را نمیشناسد. وقتی که برای اولین بار به یک هاست جدید وصل میشوید این اتفاق میافتد. برای ادامه yes را بنویسید و ENTER را بزنید.
در ادامه، این ابزار، حساب کاربری شما را برای پیدا کردن id_rsa.pub key که قبلا ساختهاید اسکن میکند. بعد از پیدا کردن public key باید کلمه عبور حساب کاربری ریموت را وارد کنید:
/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
[email protected]'s password:
کلمه عبور را بنویسید (نوشته شدن کلمه عبور به دلایل امنیتی نشان داده نمیشود) و ENTER را بزنید. این ابزار با استفاده از کلمه عبوری که وارد کردهاید به حساب کاربری شما در هاست ریموت وصل میشود. این ابزار محتوای ssh/id_rsa.pub key./~ شما را در یک فایل در دایرکتوری ssh./~ حساب کاربری ریموت به اسم authorized_keys کپی خواهد کرد.
در ادامه یک خروجی به شکل زیر خواهید دید:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
حالا id_rsa.pub key شما در حساب کاربری ریموت آپلود شده است و میتوانید به قسمت بعد بروید.
کپی کردن public key با استفاده از SSH
اگر ابزار ssh-copy-id را ندارید اما دسترسی SSH با کلمه عبور به یک حساب کاربری در سرور دارید، میتوانید SSH-key های خود را با استفاده از روش معمول SSH آپلود کنید.
میتوانید این کار را با ایجاد محتوای public key خود در کامپیوترتان و منتقل کردن آن از طریق اتصال SSH به سرور ریموت، انجام دهید. از طرفی دیگر میتوانید از وجود دایرکتوری ssh./~ در داخل حساب کاربری که از آن استفاده میکنید، مطمئن شوید؛ سپس محتوایی که به فایل authorized_keys در داخل این دایرکتوری منتقل کردهاید را ایجاد کنید.
به جای جایگزینی، محتوا را با استفاده از علامت ریدایرکت (redirect) یا همان >> اضافه کنید. با این کار میتوانید SSH-key ها را بدون از بین بردن SSH-key های قبلی، اضافه کنید.
صورت کامل دستور به شکل زیر است:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
در ادامه پیغامی به شکل زیر برای شما می آید:
The authenticity of host '111.111.11.111 (111.111.11.111)' 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
این پیغام به شما میگوید که کامپیوتر شما هاست ریموت را نمیشناسد. در اولین باری که به یک هاست جدید وصل میشوید چنین پیغامی خواهد آمد. برای ادامه yes را بنویسید و ENTER را بزنید.
در ادامه باید کلمه عبور حساب کاربری که با آن میخواهید وصل شوید را وارد کنید.
[email protected]'s password:
بعد از وارد کردن کلمه عبور، محتوای id_rsa.pub key شما در آخر فایل authorized_keys حساب کاربری ریموت شما کپی میشود. بعد از این کار میتوانید وارد مرحله بعد شوید.
کپی کردن public key به صورت دستی
اگر دسترسی SSH با کلمه عبور به سرور ندارید، باید پروسهای که در قسمت قبل توضیح دادیم را به صورت دستی انجام دهید. با انجام این پروسه، شما محتوای فایل id_rsa.pub خود را به فایل ssh/authorized_keys./~ دستگاه ریموت خود اضافه خواهید کرد.
برای دیدن محتوای id_rsa.pub key خود دستور زیر را وارد کنید:
cat ~/.ssh/id_rsa.pub
در ادامه شما محتوای id_rsa.pub key را خواهید دید، که چیزی شبیه به شکل زیر خواهد بود:
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 را که در سیستم خود اجرا کردید، بنویسید؛ باید جایگزینی را با ssh-rsa AAAA… شروع کنید.
اگه این روش جواب داد، میتوانید بدون استفاده از کلمه عبور وارد سرور شوید. با وان سنتر همراه باشید تا در ادامه با نحوه وارد شدن به سرور با استفاده زا SSH-key آشنا شوید.
وارد شدن به سرور با استفاده از SSH-key
بعد از انجام یکی از سه پروسهای که در قسمت قبل توضیح دادیم، باید بتوانید بدون وارد کردن کلمه عبور حساب کاربری ریموت وارد هاست ریموت شوید.
پروسه اصلی ورود به هاست ریموت هم همینگونه است:
ssh username@remote_host
وقتی که برای اولین بار وارد این هاست شوید (اگه از روش آخری که در قسمت قبل توضیح دادیم، استفاده کرده باشید)، چیزی به شکل زیر خواهید دید:
The authenticity of host '111.111.11.111 (111.111.11.111)' 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
این پیغام میگوید که کامپیوتر شما هاست ریموت را نمیشناسد. برای ادامه yes را بنویسید و ENTER را بزنید.
اگر برای public key خود عبارت عبور تعیین نکرده باشید، بلافاصله وارد سرور خواهید شد. اما اگر در زمان ایجاد SSH-key، عبارت عبور برای public key خود تعیین کرده باشید، برای ورود به سرور باید عبارت عبور را وارد کنید. بعد از احراز هویت، یک شل سشن (shell session) جدید با حساب کاربری پیکربندی شده در سرور ریموت برای شما باز میشود.
اگر این قسمت را با موفقیت پشت سر گذاشتید، میتوانید وارد قسمت بعد شوید. در قسمت بعد روش غیرفعال کردن احراز هویت کلمه عبور در سرور را به شما آموزش میدهیم؛ با وان سنتر همراه باشید.
غیرفعال کردن احراز هویت کلمه عبور در سرور
اگر توانسته باشید که با استفاده از SSH-key و بدون کلمه عبور وارد حساب کاربری خود شوید، پیکربندی احراز هویت با SSH-key در حساب کاربری شما با موفقیت انجام شده است. البته مکانیزم احراز هویت با کلمه عبور شما همچنان فعال است که نشان میدهد هنوز سرور شما در معرض حملات brute-force قرار دارد.
قبل از انجام مراحل این قسمت، باید احراز هویت با SSH-key برای حساب کاربری روت در این سرور، پیکر بندی شده باشد. اگر هم برای حساب روت این کار را انجام نشده، برای یک حساب کاربری به غیر از روت که دسترسیهای sudo دارد، احراز هویت با SSH-key پیکر بندی شده باشد. این مرحله ورودهای با کلمه عبور را محدود میکند. بنابراین بسیار مهم است که بتوانید دسترسی مدیریتی داشته باشید.
اول از درست بودن شرایط بالا مطمئن شوید. حالا با حساب کاربری روت یا با حساب کاربری که دسترسی sudo دارد، با استفاده از SSH-key وارد سرور ریموت شوید. بعد از ورود، فایل پیکربندی SSH daemon را باز کنید:
sudo nano /etc/ssh/sshd_config
در داخل فایل، دستوری به اسم PasswordAuthentication را پیدا کنید. این خط را از حالت comment خارج کنید و ارزش آن را روی no تنظیم کنید. با این کار قابلیت ورود از طریق SSH با استفاده از کلمه عبور غیر فعال میشود:
PasswordAuthentication no
بعد از انجام این کار، فایل را ذخیره کنید و از آن خارج شوید. برای اینکه این تغییرات اعمال شوند باید سرویس sshd را مجدد اجرا کنید.
روی Ubuntu یا Debian، میتوانید با دستور زیر اینکار را انجام دهید:
sudo service restart ssh
روی CentOS یا Fedora، اسم daemon در واقع sshd است:
sudo service restart sshd
اگر این قسمت را با موفقیت انجام داده باشید، توانستهاید که با موفقیت SSH daemon خود را به گونهای تغییر دهید که فقط به SSH-key پاسخ دهد.
حالا روی سرور شما احراز هویت با SSH-key پیکربندی شده است و میتوانید بدون ارائه کلمه عبور حساب کاربری وارد سرور شوید.