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

مدیریت امن زیرساختها و سرورهای لینوکسی از راه دور، یکی از وظایف حیاتی مدیران شبکه و توسعهدهندگان است. بخش زیادی از اتصالات راه دور به سرورها از طریق پروتکل SSH انجام میشود. با این حال، تکیه بر روشهای سنتی مانند ورود با نام کاربری و رمز عبور، مخاطرات امنیتی متعددی به همراه دارد. استفاده از احراز هویت بر پایه کلید عمومی یا همان Public Key Authentication، یکی از روشهای استاندارد و امن برای برقراری این اتصالات است که امنیت دسترسی به سرور را به میزان چشمگیری افزایش میدهد.
احراز هویت بر پایه کلید عمومی در SSH چیست؟
این مکانیسم روشی امن برای اعتبارسنجی کاربران در پروتکل SSH است که به جای تکیه بر رمز عبور حساب کاربری، از یک جفت کلید رمزنگاری (Key Pair) استفاده میکند. اگرچه انتخاب یک رمز عبور قوی و پیچیده میتواند خطر نفوذ را کاهش دهد، اما همچنان حساب کاربری را در برابر حملاتی مانند حدس زدن رمز عبور، حملات Brute Force یا افشای اطلاعات آسیبپذیر میکند. در روش Public Key Authentication، کلید خصوصی کاربر روی سیستم محلی باقی میماند و کلید عمومی روی سرور ثبت میشود. در نتیجه، احراز هویت بدون ارسال رمز عبور حساب کاربری انجام میشود.
بیشتر بخوانید : نکات مهم در تامین امنیت SSH در لینوکس
این روش علاوه بر افزایش امنیت، برای مدیریت سرورها و اجرای فرایندهای خودکار نیز کاربرد زیادی دارد. در صورت استفاده از Passphrase و ابزارهایی مانند ssh-agent، میتوان امنیت کلید خصوصی را حفظ کرد و در عین حال از وارد کردن مکرر عبارت عبور جلوگیری کرد.
برای راه اندازی و استفاده از این روش، پیش نیازهای زیر مورد نیاز است:
- دسترسی به محیط Command Line یا ترمینال همراه با سطوح دسترسی مدیریتی
- فعال بودن سرویس SSH و امکان دسترسی به پورت SSH روی سرور مقصد
- دسترسی به یک سیستم محلی مانند رایانه شخصی یا سرور مدیریتی
- پیکربندی صحیح سرویس SSH برای استفاده از کلید عمومی جهت احراز هویت
ساختار زوج کلید و نحوه کارکرد احراز هویت SSH
مکانیسم احراز هویت بر پایه کلید عمومی از رمزنگاری نامتقارن استفاده میکند. در این روش، دو کلید مجزا اما از نظر ریاضی مرتبط با یکدیگر تولید میشوند که هرکدام نقش متفاوتی دارند:
- Private Key: کلید خصوصی که روی سیستم محلی کاربر باقی میماند و باید کاملا محرمانه حفظ شود.
- Public Key: کلید عمومی که روی سرور مقصد قرار میگیرد و در صورت نیاز میتواند در اختیار دیگران قرار گیرد.
فرایند احراز هویت به صورت کلی طی مراحل زیر انجام میشود:
- تولید جفت کلید: کاربر یک Key Pair شامل کلید عمومی و کلید خصوصی ایجاد میکند.
- انتقال کلید عمومی: کلید عمومی به سرور مقصد منتقل و در فایل
authorized_keysکاربر ثبت میشود. - درخواست احراز هویت: هنگام برقراری اتصال، سرور بررسی میکند که آیا کلید عمومی ارائهشده برای حساب کاربری مجاز است یا خیر.
- اثبات مالکیت کلید خصوصی: کلاینت با استفاده از کلید خصوصی، امضای رمزنگاریشده مورد نیاز را ایجاد میکند. سرور با کلید عمومی متناظر، صحت این امضا را بررسی میکند و در صورت موفقیت، دسترسی را صادر میکند.
این مدل بر اساس این فرض کار میکند که کلید خصوصی همیشه امن بماند. تعیین یک عبارت عبور (Passphrase) برای محافظت از کلید خصوصی، یک لایه امنیتی مهم ایجاد میکند. در فرایندهای اتوماسیون نیز باید از روشهای مناسب مدیریت کلید استفاده شود تا کلید خصوصی بدون محافظت در فایلها، اسکریپتها یا محیطهای ناامن قرار نگیرد.
الگوریتمهای رایج در ساخت کلید SSH
OpenSSH از چند الگوریتم برای ساخت کلیدهای احراز هویت پشتیبانی میکند. انتخاب الگوریتم مناسب به سازگاری سیستمها و سطح امنیت مورد نیاز بستگی دارد. گزینههای رایج عبارتند از:
- Ed25519: یکی از الگوریتمهای مدرن و امن مبتنی بر رمزنگاری منحنی بیضوی است که کلیدهای کوتاهی دارد و از نظر عملکرد نیز کارایی مناسبی ارائه میدهد. برای بیشتر سیستمهای امروزی، این گزینه انتخاب مناسبی است.
- RSA: الگوریتمی قدیمیتر اما همچنان پرکاربرد است که با طیف گستردهای از سیستمها سازگاری دارد. در صورت استفاده از RSA، کلیدهای 3072 یا 4096 بیتی گزینههای رایجی هستند.
- ECDSA: الگوریتمی مبتنی بر رمزنگاری منحنی بیضوی است که نسبت به RSA با اندازه کلید کوچکتری سطح امنیت مشابهی ارائه میدهد. با این حال، در سیستمهای جدید معمولا Ed25519 انتخاب سادهتر و ترجیح دادهشدهتری است.
آموزش ساخت SSH Key Pair در سیستم محلی
برای ساخت جفت کلید روی سیستم محلی لینوکس با استفاده از ابزار OpenSSH، میتوانید مراحل زیر را در ترمینال انجام دهید.
ابتدا ترمینال را باز کنید.
با اجرای دستور زیر بررسی کنید که آیا کلیدهای SSH از قبل در سیستم وجود دارند یا خیر:
ls -l ~/.ssh/id*
اگر کلیدهایی از قبل وجود داشته باشند، فایلهایی مانند id_rsa، id_rsa.pub یا کلیدهای دیگری مانند id_ed25519 و id_ed25519.pub در خروجی نمایش داده میشوند. در صورت نبودن فایلهای مورد نظر، دستور ls خطای مربوط به پیدا نشدن فایل را نمایش میدهد.
اگر پوشه .ssh در سیستم وجود ندارد، آن را با دستور زیر ایجاد کنید:
mkdir -p ~/.ssh
سپس سطح دسترسی این دایرکتوری را محدود کنید:
chmod 700 ~/.ssh
ساخت کلید Ed25519
در سیستمهای امروزی، Ed25519 یکی از گزینههای مناسب برای احراز هویت SSH است. برای ساخت یک کلید از این نوع، دستور زیر را اجرا کنید:
ssh-keygen -t ed25519
پس از اجرای دستور، ابزار از شما مسیر ذخیره سازی کلید را میپرسد. مسیر پیش فرض معمولا به شکل زیر است:
/home/username/.ssh/id_ed25519
در صورت تمایل میتوانید نام یا مسیر دیگری برای کلید تعیین کنید. اگر کلید قبلی با همین نام وجود داشته باشد، ssh-keygen پیش از بازنویسی فایل درباره آن از شما سوال میکند.
در مرحله بعد، یک عبارت عبور (Passphrase) برای محافظت از کلید خصوصی وارد کنید و آن را مجددا تایید کنید. استفاده از Passphrase باعث میشود در صورت دسترسی افراد غیرمجاز به فایل کلید خصوصی، استفاده مستقیم از آن امکان پذیر نباشد.
در پایان، ابزار اطلاعاتی مانند مسیر ذخیره سازی کلید، اثر انگشت کلید (Fingerprint) و یک محیط گرافیکی را در ترمینال نمایش میدهد.
محتویات دایرکتوری را بررسی کنید تا از ساخته شدن کلیدها مطمئن شوید:
ls -l ~/.ssh
در این مرحله، معمولا دو فایل اصلی ایجاد شده است:
- id_ed25519: کلید خصوصی (Private Key) که باید کاملا محرمانه باقی بماند.
- id_ed25519.pub: کلید عمومی (Public Key) که باید روی سرور مقصد ثبت شود.
ساخت کلید RSA
اگر به دلیل سازگاری با سیستمهای قدیمیتر نیاز به استفاده از RSA دارید، میتوانید کلید 4096 بیتی ایجاد کنید:
ssh-keygen -t rsa -b 4096
در این حالت، فایلهای پیش فرض با نام id_rsa و id_rsa.pub ایجاد میشوند.
روشهای کپی کردن کلید عمومی به سرور مقصد
برای اینکه سرور بتواند کلید شما را برای احراز هویت معتبر تشخیص دهد، باید محتوای فایل کلید عمومی در فایل ~/.ssh/authorized_keys حساب کاربری مقصد قرار گیرد. این کار به دو روش اصلی انجام میشود.
روش اول: استفاده از ابزار ssh-copy-id
سادهترین روش در بسیاری از محیطهای لینوکسی، استفاده از ssh-copy-id است. برای انتقال کلید عمومی، دستور زیر را اجرا کنید:
ssh-copy-id username@remote_host
اگر کلید مورد نظر در مسیر پیش فرض قرار داشته باشد، ابزار به صورت خودکار کلید عمومی را انتخاب میکند. در صورتی که چند کلید روی سیستم وجود دارد، میتوانید فایل مشخصی را با گزینه -i معرفی کنید:
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@remote_host
این ابزار ابتدا به سرور متصل میشود و سپس کلید عمومی را در فایل authorized_keys کاربر مقصد اضافه میکند. برای این مرحله معمولا باید امکان ورود با رمز عبور یا یک روش احراز هویت معتبر دیگر روی سرور وجود داشته باشد.
روش دوم: کپی دستی کلید عمومی
اگر ابزار ssh-copy-id در دسترس نباشد، میتوانید محتوای کلید عمومی را با دستور زیر مشاهده کنید:
cat ~/.ssh/id_ed25519.pub
سپس متن خروجی را کپی کرده و وارد سرور مقصد شوید. در صورتی که پوشه .ssh وجود ندارد، آن را ایجاد کنید:
mkdir -p ~/.ssh chmod 700 ~/.ssh
فایل authorized_keys را ایجاد یا ویرایش کنید و کلید عمومی را در یک خط کامل داخل آن قرار دهید:
nano ~/.ssh/authorized_keys
در نهایت، سطح دسترسی فایل را محدود کنید:
chmod 600 ~/.ssh/authorized_keys
اگر از RSA استفاده کردهاید، مسیر کلید عمومی را متناسب با آن، یعنی ~/.ssh/id_rsa.pub، در نظر بگیرید.
نحوه ورود به سرور و برقراری اتصال
پس از ایجاد و ثبت کلید عمومی روی سرور، میتوانید با دستور زیر به سرور متصل شوید:
ssh username@host
اگر نام کاربری مشخص نشود، SSH به صورت خودکار از نام کاربری جاری سیستم محلی استفاده میکند. در زمان اتصال، کلاینت SSH کلید خصوصی مناسب را پیدا کرده و فرایند احراز هویت را انجام میدهد. اگر برای کلید خصوصی Passphrase تعیین کرده باشید، ممکن است از شما خواسته شود آن را وارد کنید.
پس از تایید موفقیت آمیز هویت، اتصال SSH برقرار میشود و میتوانید از ترمینال سیستم مقصد استفاده کنید.
افزایش امنیت سرور با غیرفعال کردن لاگین با رمز عبور
پس از اطمینان از صحت عملکرد احراز هویت با کلید SSH، میتوانید ورود مبتنی بر رمز عبور را غیرفعال کنید. این کار باعث میشود حملات Brute Force مبتنی بر حدس زدن رمز عبور حسابهای SSH دیگر امکان پذیر نباشند.
برای این کار ابتدا فایل تنظیمات SSH سرور را باز کنید:
sudo nano /etc/ssh/sshd_config
در این فایل، تنظیمات زیر را پیدا کرده یا در صورت نبودن، اضافه کنید:
PasswordAuthentication no PubkeyAuthentication yes
در برخی پیکربندیها ممکن است گزینههای دیگری مانند KbdInteractiveAuthentication نیز برای روشهای تعاملی احراز هویت فعال باشند. اگر هدف شما حذف کامل احراز هویت مبتنی بر رمز عبور است، باید تنظیمات مربوط به این روشها را نیز متناسب با پیکربندی سیستم بررسی کنید.
پیش از اعمال تغییرات، صحت فایل پیکربندی را بررسی کنید:
sudo sshd -t
اگر خطایی نمایش داده نشد، میتوانید سرویس SSH را مجددا بارگذاری کنید. نام سرویس بسته به توزیع لینوکس ممکن است ssh یا sshd باشد. برای مثال، در بسیاری از سیستمهای Debian و Ubuntu میتوانید از دستور زیر استفاده کنید:
sudo systemctl reload ssh
در توزیعهایی که نام سرویس sshd است، دستور به شکل زیر خواهد بود:
sudo systemctl reload sshd
بهتر است تا زمانی که اتصال جدید با کلید SSH را در یک نشست جداگانه آزمایش نکردهاید، نشست فعلی SSH را نبندید. این کار در صورت وجود خطا در تنظیمات، امکان اصلاح پیکربندی را بدون از دست دادن دسترسی فعلی فراهم میکند.
نکات کلیدی در مدیریت و نگهداری کلیدهای SSH
حفاظت از کلید خصوصی اهمیت بسیار بالایی دارد، زیرا افشای آن میتواند دسترسی به تمام سرورهایی را که آن کلید را پذیرفتهاند، در معرض خطر قرار دهد. برای نگهداری امن کلیدها موارد زیر را رعایت کنید:
- تعیین Passphrase قوی: روی کلیدهای خصوصی یک عبارت عبور مناسب قرار دهید تا در صورت سرقت فایل کلید، استفاده مستقیم از آن دشوار یا غیرممکن شود.
- استفاده از SSH Agent: برای جلوگیری از ورود مکرر Passphrase در طول روز، ابزار
ssh-agentرا به کار بگیرید تا کلیدهای مورد نیاز را به صورت موقت در حافظه نگهداری کند. - عدم به اشتراک گذاری Private Key: کلید خصوصی را تحت هیچ شرایطی روی سرورهای غیرضروری یا در اختیار افراد دیگر قرار ندهید.
- پشتیبان گیری امن: از کلیدهای خصوصی مورد نیاز خود در یک محیط ایزوله و رمزنگاری شده نسخه پشتیبان تهیه کنید.
- تنظیم دسترسی مناسب: سطح دسترسی فایل کلید خصوصی و دایرکتوری
.sshرا محدود نگه دارید تا سایر کاربران سیستم نتوانند به آن دسترسی پیدا کنند. - مدیریت کلیدهای قدیمی: کلیدهایی را که دیگر مورد استفاده نیستند از
authorized_keysحذف کنید و در صورت احتمال افشای یک کلید، آن را در سریع ترین زمان ممکن از سرورها حذف و کلید جدیدی ایجاد کنید.
گام نهایی در سخت سازی دسترسی های زیرساخت
مهاجرت از روش سنتی احراز هویت با رمز عبور به سمت Public Key Authentication، یکی از مهم ترین اقدامات برای سخت سازی دسترسی به سرورهای لینوکس است. رعایت دقیق مراحل ساخت و انتقال کلید، تنظیم صحیح دسترسی فایل ها، استفاده از Passphrase و غیرفعال سازی احراز هویت مبتنی بر رمز عبور میتواند سطح امنیت دسترسی SSH را به شکل قابل توجهی افزایش دهد.
در نهایت، امنیت SSH فقط به استفاده از کلید عمومی محدود نمیشود. مدیریت صحیح کلیدهای خصوصی، حذف کلیدهای بلااستفاده، بررسی تنظیمات سرویس SSH و حفظ دسترسی جایگزین برای مواقع اضطراری، همگی بخشی از فرایند ایمن سازی زیرساخت هستند.
سوالات متداول
برای انتقال کلید عمومی به سرور، سادهترین روش استفاده از دستور ssh-copy-id username@remote_host در ترمینال است. این ابزار به صورت خودکار کلید عمومی شما را در فایل authorized_keys سرور قرار میدهد. همچنین میتوان محتوای فایل id_rsa.pub را به صورت دستی درون فایل مذکور در مسیر ssh/. کاربر روی سرور کپی کرد.
عبارت عبور یا Passphrase جهت رمزنگاری کلید خصوصی روی سیستم شما استفاده میشود و امکان بازیابی آن وجود ندارد. در صورت فراموشی Passphrase، باید یک جفتکلید جدید با دستور ssh-keygen بسازید و کلید عمومی جدید را مجددا روی سرورهای مقصد جایگزین کنید.
الگوریتم Ed25519 بر پایه منحنیهای بیضوی طراحی شده و علاوه بر ارائه طول کلید بسیار کوتاهتر، امنیت و سرعت بسیار بالاتری نسبت به RSA دارد. الگوریتم RSA قدیمیتر است و برای تامین امنیت معادل، نیازمند طول کلید حداقل ۳۰۷۲ یا ۴۰۹۶ بیت است؛ بنابراین امروزه استفاده از الگوریتم Ed25519 اولویت و توصیه اصلی محسوب میشود.
بله، کلید خصوصی یا Private Key تحت هیچ شرایطی نباید از سیستم محلی شما خارج شده یا روی سرور مقصد کپی شود. تنها فایلی که روی سرور قرار میگیرد، کلید عمومی یا همان Public Key با پسوند pub. است. افشای کلید خصوصی به معنی دسترسی کامل افراد نامشخص به تمام سرورهای متصل به آن کلید خواهد بود.
پس از اطمینان از صحت کارکرد کلید، وارد سرور شده و فایل etc/ssh/sshd_config/ را ویرایش کنید. مقدار پارامتر PasswordAuthentication را به no تغییر داده و سپس سرویس SSH را با دستور sudo systemctl restart sshd بازنشانی کنید تا ورود با رمز عبور کاملا غیرفعال شود.




























شما میتوانید دیدگاه خود را در مورد این مطلب با ما با اشتراک بگذارید.