در مقالهی قبل با عنوان"پروتکل پوسته امن یا SSH چیست و چگونه کار میکند؟" درباره سرورها و کلاینت SSH، تاریخچهی شکل گیری آن و کلید رمزگذاری اطلاعاتی به دست آوردیم. در این مقاله قصد داریم درباره تفاوت میان SSH و HTTPS، اطلاعات قابل انتقال با SSH، نحوهی کارکرد آن و انواع رمزگذاری صحبت کنیم.
چه تفاوتی میان SSH و HTTPS وجود دارد؟
HTTPS به مرورگرهای وب اجازه میدهد از طریق یک مکانیزم ایمن اطلاعات موردنیاز برای نمایش وبسایتها را از سرورها دریافت (واکشی) کنند، در حالیکه SSH عملکردی فراتر از HTTPS دارد و تبادل دادهها میان دو دستگاه را امکانپذیر میکنند و به کلاینتها یا برنامههای کاربردی اجازه میدهد، به شکل ایمن با یکدیگر ارتباط برقرار کنند.
هنگامی که به یک سرور SSH متصل میشوید، تمامی عملیات ارسال و دریافت اطلاعات از طریق یک پوسته (Shell) انجام میشود که میتواند یک پوسته ترمینال لینوکس یا خط فرمان ویندوز باشد که دستورات را دریافت میکند. وقتی از ترمینال یا خط فرمان استفاده میکنید، این امکان فراهم است که از SSH برای برقراری ارتباط ایمن با سیستم عاملهای راه دور استفاده کنید. برای روشن شدن بحث اجازه دهید به مثال سادهای اشاره کنیم. فرض کنید، قصد دارید نسخه پشتیبانی از فریمور (سیستمعامل تجهیزات شبکه) IOS، روتر یا سوییچ سیسکو تهیه کنید یا دستگاه را پیکربندی کنید. برای آنکه اطمینان حاصل کنید که ارتباط به شکل ایمن برقرار خواهد شد باید از پروتکل SSH برای برقراری ارتباط مستقیم با سیستمعامل استفاده کنید. در این حالت، تمامی اطلاعاتی که میان شما و دستگاه مبادله میشود، رمزگذاری میشود.
چه نوع اطلاعاتی با SSH قابل انتقال است؟
SSH میتواند برای انتقال دادهها، دستورات، متن و فایلها به کار گرفته شود. در خصوص انتقال فایلها از پروتکل انتقال امن فایل SFTP مخفف Secure File Transfer Protocol استفاده میشود که نسخهای رمزگذاری شده از پروتکل FTP است که مانع پیادهسازی موفقیتآمیز حملههای مرد میانی میشود. («حمله مرد میانی - Man-in-the-Middle Attack» (یا به اختصار MITM) نوع رایجی از حملات در حوزه امنیت سایبری است که به مهاجمین اجازه میدهد قادر به استراق سمع ارتباطات میان دو هدف باشند. این حمله در جایی میان دو هاست ارتباطی انجام میشود و هکر قادر به «شنیدن» مکالمات اهدافی خواهد بود که در حالت عادی نباید بتواند آنها را بشنود. نام «مرد میانی» نیز بر همین اساس انتخاب شده است.)
SSH چگونه کار میکند؟
SSH دادهها را به مجموعهای از بستهها تجزیه میکند، سپس در هر فرآیند انتقال، فیلدهایی را به بستهها اضافه میکند و سپس انتقال را انجام میدهد. برای درک بهتر عملکرد پروتکل مذکور به تصویر زیر دقت کنید.
در تصویر بالا:
- فیلد اندازه بسته (Packet Length) به شما اعلام میدارد که بسته چقدر بزرگ است.
- در ادامه، فیلد مقدار پدینگ (Padding Amount) را دارید که نشان میدهد اندازه padding چقدر است (فیلد padding در پروتکل TCP برای اطمینان از این موضوع که هدر TCP پایان پذیرفته و طول سرآیند TCP دارای بیتهای 32 بیتی است، استفاده میشود)
- در لایه بعد محتوای اصلی که باید برای کاربر ارسال شود قرار دارند که به آنها بدنه پیام (Payload) گفته میشود.
- فیلد پدینگ (Padding) شامل بایتهای تصادفی است که هیچ معنا و مفهوم مشخصی ندارند و به منظور رمزگذاری به بسته دادهای افزوده میشوند تا فرآیند تشخیص دادهها را سختتر کنند. به بیان دقیقتر، با درج دادههای تصادفی مانع مشاهده اطلاعات میشود. در نهایت، کد احراز هویت پیام قرار دارد که اطمینان میدهد، دادهها دستکاری نشدهاند.
- بدنه پیام را میتوان با استفاده از الگوریتمهای فشردهسازی استاندارد فشرده کرد تا حجم بستهها کوچکتر شده و ترافیک کمتری در زمان انتقال مصرف شود، در این حالت کل بسته دادهای، به استثنا طول و کد احراز هویت، رمزگذاری میشود. اکنون بسته دادهای همانند شکل زیر ارسال میشود.
هنگامی که فرآیند رمزگذاری بسته به اتمام رسید، فرآیند ارسال بسته از سمت کاربر برای سرور انجام میشود. سرور بسته را دریافت و فرآیند رمزگشایی را انجام میدهد، سپس بدنه پیام را از حالت فشرده خارج میکند تا بتواند دادهها را استخراج کند. همین فرآیند هنگام ارسال بسته از سمت سرور برای کاربر تکرار میشود تا یک مکانیزم ارتباطی ایمن دوطرفه برقرار شود.
برای آنکه ضریب امنیتی پروتکل SSH بیشتر شود از سه نوع تکنیک دستکاری دادهها در فرآیند انتقال استفاده میشود. این سه تکنیک به شرح زیر هستند:
- رمزگذاری متقارن (Symmetrical Encryption)
- رمزگذاری نامتقارن (Asymmetrical Encryption)
- درهم آمیختن (Hashing)
رمزگذاری متقارن (Symmetrical Encryption)
رمزگذاری متقارن نوعی رمزگذاری است که میتواند از یک کلید برای رمزگذاری پیامهای ارسال شده و رمزگشایی پیامهای دریافتی در مقصد استفاده کند. این طرح رمزگذاری به عنوان رمزگذاری مخفی مشترک یا رمزگذاری کلید مشترک (shared key encryption) شناخته میشود.
هر دو دستگاه از یک کلید برای رمزگذاری دادههایی که ارسال میکنند و رمزگشایی دادههایی که دریافت میکنند استفاده میکنند. نکته کلیدی این مکانیزم وجود کلید پنهان مخصوص هر نشست SSH است. این نوع رمزگذاری است که برای رمزگذاری کل اتصال SSH استفاده میشود مانع از آن میشود تا حملهای مثل، حملههای مرد میانی بتوانند دادهها را بخوانند، زیرا کلید مخفی را ندارند.
یکی از مشکلات رایج در ارتباط با مکانیزم فوق، تعویض کلید اولیه است. اگر شخص ثالثی در حین مبادله کلید فرآیند شنود را انجام دهد و موفق شود کلید را شناسایی کند، قادر است تمام پیامهای ما را رمزگشایی کند. یکی از راههای جلوگیری از بروز چنین مشکلی، استفاده از الگوریتم تبادل کلید (Key Exchange Algorithm) است.
الگوریتم تبادل کلید یک راه امن برای تبادل کلیدهای پنهان بدون رهگیری است. این کار توسط هر دو سامانهای که دادههای عمومی را ارسال و دریافت میکنند انجام میشود. در این حالت هر سامانه از طریق مکانیزمهای مستقل از هم، اقدام به استخراج کلید پنهان میکند. برای پیادهسازی یک الگوریتم تبادل کلید، به رمزگذاری نامتقارن نیاز داریم.
رمزگذاری نامتقارن (Asymmetrical Encryption)
در مکانیزم مذکور، رمزگذاری از طریق بهکارگیری دو کلید مجزا برای رمزگذاری و رمزگشایی، یک کلید عمومی و یک کلید خصوصی انجام میشود. کلید عمومی را میتوان با هر کاربری به اشتراک گذاشت، اما کلید خصوصی نباید هیچگاه به اشتراک گذاشته شود. ترکیب کلید عمومی و کلید خصوصی یک جفت کلید را تشکیل میدهند. پیامی که با کلید عمومی یک ماشین رمزگذاری شده است، تنها با کلید خصوصی قابل رمزگشایی است. کلید عمومی در سرور SSH و کلید خصوصی به صورت محلی در سرویس گیرنده SSH ذخیره میشود.
بهطور مثال، اگر من کلید عمومی خود را در اختیار شما قرار دهم، شما میتوانید از طریق کلید عمومی من پیامی را رمزگذاری کرده و برای من ارسال کنید. در ادامه من با استفاده از کلید خصوصی که در اختیار دارم، قادر به رمزگشایی و مشاهده متن پیام شما هستم. برای روشن شدن بحث به مثال زیر دقت کنید:
اگر شخص ثالثی موفق به دریافت کلید عمومی شود، قادر نیست هیچ پیامی را رمزگشایی کند، زیرا کلید خصوصی را ندارد. تا زمانیکه کلید خصوصی در دستگاه شما به شکل ایمن نگهداری شود، پیامهای شما قابل رمزگشایی نیستند.
SSH به روشها و در مکانهای مختلفی از الگوریتم رمزگذاری نامتقارن استفاده میکند. بهطور مثال، هنگام پیادهسازی الگوریتم تبادل کلید از الگوریتم رمزگذاری نامتقارن استفاده میکند. رمزگذاری نامتقارن نیز از کلیدی استفاده میکند که میتواند یک کانال ارتباطی ایمن برای تعامل با سرورها در اختیار ما قرار دهد. در این حالت از الگوریتم، برای تولید کلیدهایی استفاده میکنیم که در رمزگذاری و رمزگشایی پیامها استفاده میشوند.
در معماری فوق، هر دو دستگاه میتوانند کلیدهای عمومی و خصوصی موقتی تولید کنند و کلیدهای عمومی مربوطه را به اشتراک بگذارند. در ادامه، به طور مستقل یک کلید متقارن جدید تولید میکنند که هر دو دستگاه از آن برای رمزگذاری و رمزگشایی پیامها استفاده میکنند. این عملیات تولید و ارسال کلیدها بر مبنای محاسبات ریاضی و بهکارگیری الگوریتمهایی مثل دیفن هلمن (Diffie Hellman) انجام میشود. در ابتدای تبادل کلید Diffie Hellman، دو دستگاه باید روی چند پارامتر که برای تعویض کلید استفاده میکنند به توافق برسند:
تولیدکننده جی (Generator g)
عدد اول ان (Prime number n)
هر دستگاه از g به همراه کلیدهای خصوصی خود برای تولید یک کلید عمومی استفاده میکند. هنگامی که یک ارتباط متقارن امن برقرار شد، سرور از کلید عمومی کاربر برای رمزگذاری استفاده میکند و برای احراز هویت برای کلاینت ارسال میکند. اگر کلاینت بتواند با موفقیت کلید را رمزگشایی کند، به این معنا است که کلید خصوصی مورد نیاز برای اتصال را در اختیار دارد و نشست SSH آغاز میشود.
هشسازی (Hashing)
هشسازی شکل دیگری از رمزنگاری است که از اتصالات پوسته ایمن (secure shell connections) استفاده میکند. هشسازی به شما اجازه میدهد یک امضا یا مجموعهای از اطلاعات ایجاد کنید. مکانیزم فوق یک فرآیند یک طرفه است و دادههای هش شده هرگز قرار نیست رمزگشایی شوند. با این توصیف، مکانیزم فوق چرا مفید است؟
اگر شخص ثالثی موفق شود کلاینت و میزبان را فریب دهد، میتواند پیامها را دستکاری کند، برای حل این مشکل، SSH ازکدهای احراز هویت پیام مبتنی بر هش HMAC سرنام (Hash-based Message Authentication Codes) استفاده میکند. HMACها اطمینان حاصل میکنند که پیامهای ارسالی به صورت کامل و بدون تغییر دریافت میشوند.
با استفاده از تابع هش، هر پیامی که ارسال میشود باید حاوی چیزی به نام مک (MAC) باشد. این MAC یک هش است که بر مبنای کلید متقارن، شماره توالی بسته و محتوای پیام ارسال شده ساخته میشود. ترکیب این سه عنصر به عنوان ورودی در یک تابع هش، باعث ساخت رشتهای میشوند که معنا و مفهوم مشخصی ندارد، اما اصالت پیام را تایید میکند. در ادامه این رشته یا امضا برای میزبان ارسال میشود.
میزبان چگونه بررسی میکند که پیام دستکاری نشده است؟
با توجه به اینکه میزبان اطلاعات یکسانی دارد (کلید متقارن، شماره توالی بسته و محتوای پیام)، میتواند از همان تابع هش برای تولید هش استفاده کنند. اگر هش ایجاد شده با هش دریافتی مطابقت داشته باشد، بیانگر این موضوع است که امضای کلاینت مورد تایید است. اینکار به این دلیل انجام میشود که اگر دادهها به هر نحوی تغییر کردند، گیرنده متوجه شود. بهطور مثال، اگر تنها یک کاراکتر تغییر کند، الگوی هش کاملاً متفاوت خواهد بود. به همین دلیل است که برخی از سایتهای بارگذاری فایلها در کنار لینکهای دانلود، مقدار هش را ذکر میکنند تا کاربر بتواند با استعلام این مقدار از سایت اصلی مطمئن شود که محتوای فایل تغییر پیدا نکرده است.
آیا SSH آسیبپذیر است؟
امنیت ارتباطات SSH کامل نیست، اما خوشبختانه معایب آن شناسایی شدهاند. در بیشتر موارد مشکلات به دلیل عدم استفاده درست یا عدم بهکارگیری عبارت عبوری به وجود میآید. به عنوان مثال، ما میدانیم که کلیدهای SSH را میتوان به سرقت برد و هکرها میتوانند از آنها به عنوان درب پشتی برای ورود به سیستمهای آسیبپذیر استفاده کنند. مشکل فوق به این دلیل به وجود میآید که افراد مبحث محافظت از کلیدها را نادیده میگیرند.
مشکل اصلی این است که وقتی یک مهاجم به یک کلید SSH دسترسی پیدا میکند، به تمام کلیدهای ذخیره شده در دستگاه نیز دسترسی پیدا میکند. به طور کلی، اگر هکرها بتوانند تنها چند کلید در اختیار داشته باشند، ممکن است بتوانند به کانالهای ارتباطی مختلف شبکه دسترسی پیدا کنند. از مهمترین مشکلات پروتکل SSH به موارد زیر باید اشاره کرد:
- اشتراکگذاری مکرر کلیدهای SSH.
- وجود کلیدهای SSH ایستا و توکار.
امیدوارم این مقاله به شما در درک بهتر عملکرد SSH کمک کرده باشد. اگر علاقهمند هستید تا اطلاعات دقیقتری در ارتباط با عملکرد SSH به دست آورید، پیشنهاد میکنم به منابع زیر مراجعه کنید: