خانه » نحوه پیکربندی احراز هویت مبتنی بر کلید SSH در لینوکس
آموزش امنیت لینوکس

نحوه پیکربندی احراز هویت مبتنی بر کلید SSH در لینوکس

این راهنما تأیید می کند که احراز هویت مبتنی بر کلید SSH چیست، انواع روش های احراز هویت SSH، و در نهایت نحوه پیکربندی احراز هویت مبتنی بر کلید SSH در سیستم عامل های لینوکس و بر پایه یونیکس را توضیح می دهد.

احراز هویت مبتنی بر کلید SSH چیست؟

همانطور که همه ما می دانیم، Secure Shell ، به طور خلاصه SSH ، پروتکل شبکه رمزنگاری است که به شما امکان می دهد به طور ایمن با یک سیستم راه دور از طریق شبکه ناامن، به عنوان مثال اینترنت، ارتباط برقرار کنید و به آن دسترسی پیدا کنید.

هر زمان که داده ای را از طریق یک شبکه ناامن با استفاده از SSH ارسال می کنید، داده ها به طور خودکار در سیستم مبدا رمزگذاری می شوند و در سمت مقصد رمزگشایی می شوند.

SSH چهار روش احراز هویت را ارائه می دهد که عبارتند از احراز هویت مبتنی بر رمز عبور ،  احراز هویت مبتنی بر کلید ، احراز هویت مبتنی بر میزبان و تأیید هویت صفحه کلید .

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

در احراز هویت مبتنی بر رمز عبور، تنها چیزی که نیاز دارید رمز عبور کاربر سیستم راه دور است. اگر رمز عبور کاربر راه دور را می دانید، می توانید با استفاده از دستور “ssh user@remote-system-name” به سیستم مربوطه دسترسی پیدا کنید.

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

هر جفت کلید SSH از یک کلید خصوصی و کلید عمومی تشکیل شده است. کلید خصوصی باید در سیستم client نگهداری شود و کلید عمومی باید در سیستم های راه دور آپلود شود. شما نباید کلید خصوصی را برای کسی فاش کنید .

امیدوارم ایده اولیه در مورد SSH و روش های احراز هویت آن را درک کرده باشید. اکنون اجازه دهید احراز هویت مبتنی بر کلید SSH را در لینوکس پیکربندی کنیم.

احراز هویت مبتنی بر کلید SSH را در لینوکس پیکربندی کنید

در این مقاله من از سیستم Arch Linux به عنوان سیستم محلی و Ubuntu 18.04 LTS به عنوان سیستم راه دور استفاده خواهم کرد.

جزئیات سیستم محلی:

  • سیستم عامل : Arch Linux Desktop
  • آدرس IP : ۱۹۲.۱۶۸.۲۲۵.۳۷ / ۲۴

جزئیات سیستم از راه دور:

  • سیستم عامل : سرور اوبونتو 18.04 LTS
  • آدرس IP : ۱۹۲.۱۶۸.۲۲۵.۲۲/۲۴

جفت کلید SSH ایجاد کنید

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

کلیدهای عمومی معمولاً در فایلی به نام ssh/authorized_keys./~  در سیستم های SSH راه دور ذخیره می شوند.

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

اکنون اجازه دهید جفت کلید SSH را در سیستم محلی ایجاد کنیم. برای انجام این کار، دستور زیر را در سیستم مشتری محلی خود اجرا کنید.

$ ssh-keygen

دستور بالا یک جفت کلید RSA 2048 بیتی ایجاد می کند. عبارت عبور را دو بار وارد کنید. مهمتر از آن، کلمه عبور خود را به خاطر بسپارید. بعداً به آن نیاز خواهید داشت.

خروجی نمونه:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/mahdi/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/mahdi/.ssh/id_rsa.
Your public key has been saved in /home/mahdi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:wYOgvdkBgMFydTMCUI3qZaUxvjs+p2287Tn4uaZ5KyE mahdi@mahdi
The key's randomart image is:
+---[RSA 2048]----+
|+=+*= + |
|o.o=.* = |
|.oo * o + |
|. = + . o |
|. o + . S |
| . E . |
| + o |
| +.*o+o |
| .o*=OO+ |
+----[SHA256]-----+

در صورتی که قبلا جفت کلید را ایجاد کرده باشید، پیام زیر را مشاهده خواهید کرد. فقط “y” را تایپ کنید تا کلید موجود را بازنویسی کنید.

/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?

توجه داشته باشید:

لطفاً توجه داشته باشید که کلمه عبور اختیاری است . اگر آنرا تنظیم کنید، هر بار که می‌خواهید از طریق SSH به سیستم راه دور وارد شوید، از شما رمز عبور خواسته می‌شود، مگر اینکه از عامل SSH برای ذخیره رمز عبور استفاده کنید.

اگر عبارت عبور نمی خواهید (البته ایمن نیست)، وقتی از شما خواسته شد که رمز عبور را ارائه کنیدبه سادگی کلید ENTER را دوبار فشار دهید. با این حال، من به شما توصیه می کنم از رمز عبور استفاده کنید.

استفاده از کلید ssh بدون رمز عبور معمولاً از نقطه نظر امنیتی ایده خوبی نیست. این کلیدها باید به موارد بسیار خاص مانند خدمات دسترسی به یک سیستم راه دور بدون دخالت کاربر محدود شوند (مثلاً پشتیبان گیری از راه دور با rsync، unison ، …).

اگر قبلاً یک کلید ssh بدون عبارت عبور در فایل خصوصی ssh/id_rsa./~ دارید و می‌خواهید کلید را با رمز عبور به‌روزرسانی کنید، از دستور زیر استفاده کنید:

$ ssh-keygen -p -f ~/.ssh/id_rsa

خروجی نمونه:

Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

کلید عمومی SSH را در سیستم های راه دور کپی کنید

ما جفت کلید را در سیستم محلی ایجاد کرده ایم. سپس، کلید عمومی SSH را با استفاده از دستور زیر در سرور SSH راه دور خود کپی کنید:

$ ssh-copy-id mahdi@192.168.225.22

در اینجا، من کلید عمومی سیستم محلی (Arch Linux) را در سیستم راه دور کپی کرد (در مورد من Ubuntu 18.04 LTS).

از نظر فنی، دستور بالا محتویات کلید ssh/id_rsa.pub./~ سیستم محلی را در فایل ssh/authorized_keys./~ سیستم از راه دور کپی می کند. این موضوع روشن است؟ خوب

yes را برای اتصال به سرور SSH راه دور وارد کنید و سپس رمز عبور sudo (یا کاربر ریشه) سیستم راه دور را تایپ کنید.

/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
mahdi@192.168.225.22's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'mahdi@192.168.225.22'"
and check to make sure that only the key(s) you wanted were added.

اگر قبلاً کلید را کپی کرده اید، اما می خواهید کلید را با عبارت عبور جدید به روز کنید، از گزینه f برای بازنویسی کلید موجود مانند زیر استفاده کنید.

$ ssh-copy-id -f mahdi@192.168.225.22

ما با موفقیت کلید عمومی SSH سیستم محلی را به سیستم راه دور اضافه کردیم.

اکنون می توانیم احراز هویت مبتنی بر رمز عبور را در سیستم راه دور به طور کامل غیرفعال کنیم. زیرا، حالا دیگر ما احراز هویت مبتنی بر کلید را پیکربندی کرده‌ایم، بنابراین دیگر نیازی به احراز هویت مبتنی بر رمز عبور نداریم.

احراز هویت مبتنی بر رمز عبور SSH را در سیستم راه دور غیرفعال کنید

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

برای غیرفعال کردن احراز هویت مبتنی بر رمز عبور، به کنسول سیستم راه دور خود بروید و فایل پیکربندی etc/ssh/sshd_config/ را با استفاده از یک ویرایشگر ویرایش کنید:

$ sudo vi /etc/ssh/sshd_config

خط زیر را پیدا کنید. آن را از وضعیت کامنت خارج کنید و مقدار آن را به عنوان no تنظیم کنید.

PasswordAuthentication no

برای اعمال تغییرات، سرویس ssh را مجددا راه اندازی کنید.

$ sudo systemctl restart sshd

دسترسی به سیستم از راه دور از سیستم محلی

با استفاده از دستور زیر از سیستم محلی خود به سرور راه دور خود SSH بزنید:

$ ssh mahdi@192.168.225.22

عبارت عبور را برای ورود به سیستم راه دور وارد کنید.

خروجی نمونه:

Enter passphrase for key '/home/mahdi/.ssh/id_rsa': 
Last login: Mon Jul 9 09:59:51 2018 from 192.168.225.37
mahdi@ubuntuserver:~$

همانطور که متوجه شدید، ما با استفاده از رمز عبوری که قبلاً با استفاده از دستور ssh-keygen ایجاد کرده بودیم، به حساب سیستم راه دور وارد شده ایم ، نه با استفاده از رمز عبور واقعی حساب کاربری.

اگر سعی کنید از سیستم کلاینت دیگری ssh کنید، این پیغام خطا را دریافت خواهید کرد. به عنوان مثال، من سعی کردم با استفاده از CentOS خود، به سیستم Ubuntu مورد نظر SSH بزنم:

$ ssh mahdi@192.168.225.22

خروجی نمونه:

The authenticity of host '192.168.225.22 (192.168.225.22)' can't be established.
ECDSA key fingerprint is 67:fc:69:b7:d4:4d:fd:6e:38:44:a8:2f:08:ed:f4:21.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.225.22' (ECDSA) to the list of known hosts.
Permission denied (publickey).

همانطور که در خروجی بالا مشاهده می کنید، من اجازه SSH به سیستم های اوبونتو 18.04 راه دور خود را از سایر سیستم ها نداشتم.

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

این بسیار مهم است. همانطور که قبلاً گفتم، شما نمی توانید از طریق SSH به سیستم راه دور دسترسی داشته باشید، به جز سیستمی که پیکربندی کرده اید (در مورد ما، اوبونتو است).

من می خواهم به مشتریان بیشتری اجازه دسترسی به سرور SSH راه دور را بدهم. باید چکار کنم؟ ساده است. شما باید جفت کلید SSH را در تمام سیستم های کلاینت خود تولید کنید و کلید عمومی ssh را به صورت دستی در سرور راه دوری که می خواهید از طریق SSH به آن دسترسی داشته باشید کپی کنید.

برای ایجاد جفت کلید SSH در سیستم های مشتری خود، اجرا کنید:

$ ssh-keygen

رمز عبور را دو بار وارد کنید. پس از ایجاد جفت کلید، کلید عمومی ssh (نه کلید خصوصی) را به صورت دستی در سرور راه دور خود کپی کنید.

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

$ cat ~/.ssh/id_rsa.pub

شما باید خروجی چیزی مانند زیر را ببینید.

ssh-rsa aaaab3nzac1yc2eaaaaadaqabaabaqct3a9tiek5rpx9p74/kjevxa6/oodyrp0qls/slp8w6itxfl+ugalzlupvngvngvrr5luj9dlhwwc+d4umumavwc GQ1Jzyykt5k+IANS6VTRX5LDOBCPNPEBDT4VTIXQ7GZHRDUUK5586IKEFFWMCWGUHVETNLYKMO2EYL2RV7TMYQ+EY2ZQQCSOK0FZXMK7IIFGXVMUIFGXVMUUMUUMUUIFGXVMUIFGXVMUIFGXVMUIFGXVMUIFZKFIMO PCAN+DG3NAAZICCXNII9B4NSSGZ3MMY4Y7 OSTECHNIX@CENTOSSERVER

کل محتویات را کپی کنید (از طریق درایو USB یا هر رسانه ای) و به کنسول سرور راه دور خود بروید. مطابق شکل زیر یک دایرکتوری به نام ssh در فهرست اصلی ایجاد کنید.

$ mkdir -p ~/.ssh

سپس، کلید pub سیستم کلاینت خود را که در مرحله قبل ایجاد کردید در فایلی به نام “ssh/authorized_keys./~” اضافه کنید :

echo {Your_public_key_contents_here} >> ~/.ssh/authorized_keys

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

اگر افزودن دستی ssh pubkey دشوار به نظر می رسد، احراز هویت مبتنی بر رمز عبور را به طور موقت در سیستم راه دور فعال کنید و کلید را با استفاده از دستور “ssh-copy-id” از سیستم محلی خود کپی کنید و در نهایت دوباره احراز هویت مبتنی بر رمز عبور را غیرفعال کنید.

نتیجه

احراز هویت مبتنی بر کلید SSH یک لایه اضافی محافظت در برابر حملات brute-force فراهم می کند. همانطور که می بینید، پیکربندی احراز هویت مبتنی بر کلید نیز چندان دشوار نیست. این یکی از روش های توصیه شده برای ایمن نگه داشتن سرورهای لینوکس شما است.

مهدی منصوری

من مهدی منصوری و کارشناس حوزه نرم افزار و امنیت اطلاعات هستم. کارشناسی ارشد خودم را در رشته امنیت اطلاعات از دانشگاه مالک اشتر تهران گرفتم. هم اکنون در زمینه DevOPS مشغول هستم. و در زمان های ممکن در این سایت و چند سایت دیگه مطلب می گذارم

درباره نویسنده

مهدی منصوری

من مهدی منصوری و کارشناس حوزه نرم افزار و امنیت اطلاعات هستم. کارشناسی ارشد خودم را در رشته امنیت اطلاعات از دانشگاه مالک اشتر تهران گرفتم.
هم اکنون در زمینه DevOPS مشغول هستم. و در زمان های ممکن در این سایت و چند سایت دیگه مطلب می گذارم

افزودن نظر

برای ارسال نظرات خود اینجا را کلیک کنید