
درک فرآیند رمزگذاری و اتصالات SSH
SSH، یا شل امن، یک پروتکل ایمن است و رایج ترین روش برای مدیریت ایمن سرورهای راه دور محسوب می شود. با استفاده از چندین فناوری رمزنگاری، SSH مکانیزمی فراهم می کند تا یک اتصال رمزنگاری شده بین دو طرف برقرار شود، هر طرف هویت طرف دیگر را تأیید کند و فرمان ها و خروجی ها را بین دو طرف رد و بدل کند.
در این راهنما، تکنیک های رمزنگاری پایه ای که SSH به کار می برد و روش هایی که برای ایجاد اتصالات امن استفاده می کند را بررسی خواهیم کرد. این اطلاعات می تواند برای درک لایه های مختلف رمزنگاری و مراحل مختلف لازم برای ایجاد اتصال و تأیید هویت هر دو طرف مفید باشد.
درک رمزگذاری متقارن، رمزگذاری نامتقارن و هش ها
برای ایمن کردن انتقال اطلاعات، SSH از چندین نوع تکنیک پردازش داده در نقاط مختلف تراکنش استفاده می کند. این تکنیک ها شامل رمزگذاری متقارن، رمزگذاری نامتقارن و هشینگ هستند.
رمزگذاری متقارن
ارتباط بین اجزایی که داده ها را رمزگذاری و رمزگشایی می کنند تعیین می کند که یک طرح رمزگذاری متقارن است یا نامتقارن.
رمزگذاری متقارن نوعی رمزگذاری است که در آن یک کلید می تواند برای رمزگذاری پیام ها به طرف مقابل و همچنین برای رمزگشایی پیام های دریافتی از طرف دیگر استفاده شود. این بدان معناست که هر کسی که کلید را در اختیار داشته باشد می تواند پیام ها را به هر کسی که کلید را دارد رمزگذاری و رمزگشایی کند.
این نوع طرح رمزگذاری اغلب "رمزگذاری راز مشترک" یا "رمزگذاری کلید مخفی" نامیده می شود. معمولاً تنها یک کلید برای تمام عملیات استفاده می شود یا یک جفت کلید وجود دارد که رابطه آن قابل کشف است و به راحتی می توان کلید مقابل را استخراج کرد.
SSH از کلیدهای متقارن برای رمزگذاری کل اتصال استفاده می کند. برخلاف تصور برخی کاربران، جفت کلید عمومی/خصوصی نامتقارن که ایجاد می شوند تنها برای احراز هویت استفاده می شوند، نه برای رمزگذاری اتصال. رمزگذاری متقارن حتی اجازه می دهد احراز هویت با رمز عبور نیز در برابر نظارت محافظت شود.
کلاینت و سرور هر دو در ایجاد این کلید مشارکت دارند و راز حاصل هرگز برای افراد خارج شناخته نمی شود. کلید مخفی از طریق فرآیندی به نام الگوریتم تبادل کلید ایجاد می شود. این تبادل باعث می شود که سرور و کلاینت هر دو به طور مستقل به همان کلید برسند با به اشتراک گذاشتن بخش هایی از داده عمومی و پردازش آن ها با داده های مخفی خاص. این فرآیند بعداً به طور دقیق تر توضیح داده می شود.
کلید رمزگذاری متقارن ایجاد شده توسط این روش مبتنی بر جلسه است و رمزگذاری واقعی داده های ارسالی بین سرور و کلاینت را تشکیل می دهد. پس از این مرحله، تمام داده های دیگر باید با این راز مشترک رمزگذاری شوند. این کار قبل از احراز هویت کلاینت انجام می شود.
SSH می تواند با استفاده از سیستم های رمزگذاری متقارن مختلفی پیکربندی شود، از جمله Advanced Encryption Standard (AES)، Blowfish، 3DES، CAST128 و Arcfour. سرور و کلاینت می توانند لیستی از رمزهای پشتیبانی شده خود را بر اساس ترجیح مرتب کنند. اولین گزینه از لیست کلاینت که روی سرور موجود باشد، به عنوان الگوریتم رمزگذاری در هر دو جهت استفاده می شود.
در Ubuntu 20.04، تنظیمات پیش فرض برای کلاینت و سرور به صورت زیر است:
chacha20-poly1305@openssh.com
aes128-ctr
aes192-ctr
aes256-ctr
aes128-gcm@openssh.com
aes256-gcm@openssh.com
این بدان معناست که اگر دو ماشین Ubuntu 20.04 به یکدیگر متصل شوند (بدون تغییر رمزهای پیش فرض از طریق گزینه های پیکربندی)، همیشه از رمز chacha20-poly1305@openssh.com برای رمزگذاری اتصال استفاده خواهند کرد.
رمزگذاری نامتقارن
رمزگذاری نامتقارن با رمزگذاری متقارن متفاوت است زیرا برای ارسال داده در یک جهت، به دو کلید مرتبط نیاز است. یکی از این کلیدها کلید خصوصی و دیگری کلید عمومی نامیده می شود.
کلید عمومی می تواند به طور آزاد با هر طرفی به اشتراک گذاشته شود. این کلید با کلید جفت خود مرتبط است، اما کلید خصوصی نمی تواند از کلید عمومی استخراج شود. رابطه ریاضی بین کلید عمومی و کلید خصوصی اجازه می دهد کلید عمومی پیام هایی را رمزگذاری کند که تنها توسط کلید خصوصی رمزگشایی شوند. این قابلیت یک طرفه است، یعنی کلید عمومی نمی تواند پیام هایی که خودش رمزگذاری کرده را رمزگشایی کند و نمی تواند هیچ چیزی را که کلید خصوصی ممکن است ارسال کند رمزگشایی کند.
کلید خصوصی باید کاملاً محرمانه نگه داشته شود و هرگز با شخص دیگری به اشتراک گذاشته نشود. این یک شرط کلیدی برای کارکرد الگوی کلید عمومی است. کلید خصوصی تنها جزئی است که قادر به رمزگشایی پیام هایی است که با کلید عمومی مرتبط رمزگذاری شده اند. بر اساس این واقعیت، هر موجودی که قادر به رمزگشایی این پیام ها باشد نشان می دهد که کنترل کلید خصوصی را در اختیار دارد.
SSH از رمزگذاری نامتقارن در چندین مرحله مختلف استفاده می کند. در طول فرآیند تبادل کلید اولیه که برای راه اندازی رمزگذاری متقارن (برای رمزگذاری جلسه) استفاده می شود، رمزگذاری نامتقارن به کار می رود. در این مرحله، هر دو طرف جفت کلید موقت تولید می کنند و کلید عمومی را تبادل می کنند تا راز مشترکی ایجاد شود که برای رمزگذاری متقارن استفاده می شود.
استفاده مشهورتر از رمزگذاری نامتقارن در SSH مربوط به احراز هویت مبتنی بر کلید SSH است. جفت کلیدهای SSH می توانند برای احراز هویت یک کلاینت به یک سرور استفاده شوند. کلاینت یک جفت کلید ایجاد می کند و سپس کلید عمومی را به هر سرور راه دوری که می خواهد دسترسی داشته باشد، آپلود می کند. این کلید در فایلی به نام authorized_keys در دایرکتوری ~/.ssh در حساب کاربری سرور راه دور قرار می گیرد.
پس از اینکه رمزگذاری متقارن برای ایمن سازی ارتباط بین سرور و کلاینت برقرار شد، کلاینت باید احراز هویت شود تا اجازه دسترسی دریافت کند. سرور می تواند از کلید عمومی موجود در این فایل برای رمزگذاری یک پیام چالش به کلاینت استفاده کند. اگر کلاینت بتواند ثابت کند که توانسته این پیام را رمزگشایی کند، نشان داده است که مالک کلید خصوصی مرتبط است. سپس سرور می تواند محیط لازم برای کلاینت را تنظیم کند.
هشینگ
یکی دیگر از روش های پردازش داده که SSH از آن استفاده می کند، هشینگ رمزنگاری است. توابع هش رمزنگاری روش هایی برای ایجاد یک «امضا» یا خلاصه فشرده از یک مجموعه اطلاعات هستند. ویژگی های اصلی آن ها عبارتند از: هرگز برای معکوس کردن طراحی نشده اند، عملاً غیرقابل پیش بینی هستند و عملاً منحصر به فرد هستند.
استفاده از همان تابع هش و پیام باید همان هش را تولید کند؛ هرگونه تغییر در داده ها باید هش کاملاً متفاوتی ایجاد کند. کاربر نباید بتواند پیام اصلی را از یک هش تولید کند، اما باید بتواند تشخیص دهد که آیا یک پیام داده شده همان هش را تولید کرده است یا خیر.
با توجه به این ویژگی ها، هش ها عمدتاً برای حفظ صحت داده ها و تأیید اعتبار ارتباط استفاده می شوند. استفاده اصلی در SSH با HMAC، یا کدهای احراز هویت پیام مبتنی بر هش است. این کدها برای اطمینان از این استفاده می شوند که متن پیام دریافتی دست نخورده و اصلاح نشده باقی بماند.
به عنوان بخشی از مذاکره رمزگذاری متقارن که پیش تر توضیح داده شد، یک الگوریتم کد احراز هویت پیام (MAC) انتخاب می شود. الگوریتم با بررسی لیست گزینه های MAC قابل قبول کلاینت انتخاب می شود. اولین گزینه ای که سرور پشتیبانی می کند استفاده خواهد شد.
هر پیامی که پس از مذاکره رمزگذاری ارسال شود باید شامل یک MAC باشد تا طرف دیگر بتواند صحت بسته را بررسی کند. MAC از راز مشترک متقارن، شماره دنباله بسته پیام و محتوای واقعی پیام محاسبه می شود.
خود MAC خارج از ناحیه رمزگذاری متقارن به عنوان بخش نهایی بسته ارسال می شود. پژوهشگران معمولاً این روش را توصیه می کنند: ابتدا داده ها رمزگذاری شوند و سپس MAC محاسبه گردد.
درک نحوه کار SSH
احتمالاً شما درک اولیه ای از نحوه کار SSH دارید. پروتکل SSH از مدل کلاینت-سرور برای احراز هویت دو طرف و رمزگذاری داده ها بین آن ها استفاده می کند.
کامپوننت سرور روی یک پورت مشخص برای اتصال ها گوش می دهد. این بخش مسئول مذاکره برای ایجاد اتصال امن، احراز هویت طرف متصل و ایجاد محیط مناسب در صورت پذیرش اطلاعات اعتبارسنجی است.
کلاینت مسئول شروع handshake اولیه TCP با سرور، مذاکره برای اتصال امن، بررسی اینکه هویت سرور با اطلاعات قبلاً ثبت شده مطابقت دارد، و ارائه اطلاعات اعتبارسنجی برای احراز هویت است.
یک جلسه SSH در دو مرحله جداگانه برقرار می شود. مرحله اول توافق و ایجاد رمزگذاری برای محافظت از ارتباطات آینده است. مرحله دوم احراز هویت کاربر و تعیین اینکه آیا دسترسی به سرور باید داده شود یا خیر، است.
مذاکره رمزگذاری برای جلسه
هنگامی که یک اتصال TCP توسط کلاینت ایجاد می شود، سرور با نسخه های پروتکلی که پشتیبانی می کند پاسخ می دهد. اگر کلاینت بتواند یکی از نسخه های قابل قبول پروتکل را تطبیق دهد، اتصال ادامه پیدا می کند. سرور همچنین کلید عمومی میزبان خود را ارائه می دهد که کلاینت می تواند برای بررسی اینکه آیا این همان میزبان مورد نظر است یا خیر، استفاده کند.
در این مرحله، هر دو طرف یک کلید جلسه را با استفاده از نسخه ای از الگوریتمی به نام Diffie-Hellman مذاکره می کنند. این الگوریتم (و واریانت های آن) امکان می دهد که هر طرف داده های خصوصی خود را با داده های عمومی سیستم دیگر ترکیب کند تا به یک کلید جلسه مخفی یکسان برسد.
کلید جلسه برای رمزگذاری کل جلسه استفاده خواهد شد. جفت کلیدهای عمومی و خصوصی استفاده شده در این بخش کاملاً جدا از کلیدهای SSH هستند که برای احراز هویت کلاینت به سرور استفاده می شوند.
پایه این فرآیند برای Diffie-Hellman کلاسیک به شرح زیر است:
- هر دو طرف بر روی یک عدد اول بزرگ توافق می کنند که به عنوان مقدار اولیه (seed) استفاده می شود.
- هر دو طرف بر روی یک مولد رمزگذاری (معمولاً AES) توافق می کنند که برای پردازش مقادیر به روشی از پیش تعیین شده استفاده می شود.
- هر طرف به طور مستقل یک عدد اول دیگر تولید می کند که برای طرف دیگر مخفی باقی می ماند. این عدد به عنوان کلید خصوصی برای این تعامل استفاده می شود (متمایز از کلید خصوصی SSH برای احراز هویت).
- کلید خصوصی تولیدشده، مولد رمزگذاری و عدد اول مشترک برای تولید یک کلید عمومی استفاده می شوند که از کلید خصوصی مشتق شده است، اما می تواند با طرف دیگر به اشتراک گذاشته شود.
- هر دو شرکت کننده کلیدهای عمومی تولیدشده خود را با یکدیگر تبادل می کنند.
- موجود دریافت کننده با استفاده از کلید خصوصی خود، کلید عمومی طرف دیگر و عدد اول مشترک اصلی، یک کلید مخفی مشترک محاسبه می کند. اگرچه هر طرف به طور مستقل این کار را انجام می دهد، اما با استفاده از کلیدهای خصوصی و عمومی مقابل، به همان کلید مخفی مشترک می رسد.
- کلید مخفی مشترک سپس برای رمزگذاری تمام ارتباطات بعدی استفاده می شود.
این فرآیند اجازه می دهد هر دو طرف به طور مساوی در تولید کلید مخفی مشترک مشارکت داشته باشند و یک طرف نتواند کنترل این راز را در دست گیرد. همچنین امکان تولید یک کلید مخفی یکسان بدون ارسال اطلاعات آن از طریق کانال های ناامن فراهم می شود. رمزگذاری مخفی مشترک که برای ادامه اتصال استفاده می شود، پروتکل بسته های باینری نامیده می شود.
راز تولیدشده یک کلید متقارن است، به این معنی که همان کلید استفاده شده برای رمزگذاری پیام می تواند برای رمزگشایی آن در سمت دیگر نیز استفاده شود. هدف از این کار پوشش دادن تمام ارتباطات بعدی در یک تونل رمزگذاری شده است که توسط افراد خارج قابل رمزگشایی نیست.
پس از ایجاد رمزگذاری جلسه، مرحله احراز هویت کاربر آغاز می شود.
احراز هویت دسترسی کاربر به سرور
گام بعدی شامل احراز هویت کاربر و تصمیم گیری درباره دسترسی است. چند روش برای احراز هویت وجود دارد که بسته به آنچه سرور قبول می کند، استفاده می شوند.
روش عمومی احراز هویت با رمز عبور است، زمانی که سرور از کلاینت می خواهد رمز عبور حسابی که قصد ورود به آن را دارد وارد کند. رمز عبور از طریق رمزگذاری مذاکره شده ارسال می شود، بنابراین از دسترسی افراد خارج ایمن است.
با اینکه رمز عبور رمزگذاری می شود، این روش معمولاً توصیه نمی شود به دلیل محدودیت ها در پیچیدگی رمز عبور. اسکریپت های خودکار می توانند رمزهای عبور با طول معمولی را به راحتی نسبت به سایر روش های احراز هویت بشکنند.
متداول ترین و توصیه شده ترین جایگزین استفاده از جفت کلیدهای SSH است. جفت کلیدهای SSH، کلیدهای نامتقارن هستند، به این معنی که دو کلید مرتبط عملکردهای متفاوتی دارند.
کلید عمومی برای رمزگذاری داده استفاده می شود که تنها با کلید خصوصی قابل رمزگشایی است. کلید عمومی می تواند آزادانه به اشتراک گذاشته شود، زیرا با وجود اینکه می تواند برای کلید خصوصی رمزگذاری کند، هیچ روشی برای استخراج کلید خصوصی از کلید عمومی وجود ندارد.
احراز هویت با استفاده از جفت کلیدهای SSH پس از ایجاد رمزگذاری متقارن، همان طور که در بخش قبلی توضیح داده شد، انجام می شود. این فرآیند به شرح زیر است:
- کلاینت با ارسال یک شناسه (ID) برای جفت کلیدی که می خواهد با آن احراز هویت شود، کار را آغاز می کند.
- سرور فایل authorized_keys حسابی که کلاینت قصد ورود به آن را دارد، برای شناسه کلید بررسی می کند.
- اگر کلید عمومی با شناسه مطابقت پیدا کند، سرور یک عدد تصادفی تولید کرده و از کلید عمومی برای رمزگذاری آن عدد استفاده می کند.
- سرور این پیام رمزگذاری شده را به کلاینت ارسال می کند.
- اگر کلاینت واقعاً کلید خصوصی مرتبط را داشته باشد، قادر خواهد بود پیام را با آن کلید رمزگشایی کند و عدد اصلی را آشکار سازد.
- کلاینت عدد رمزگشایی شده را با کلید جلسه مشترکی که برای رمزگذاری ارتباط استفاده می شود ترکیب کرده و مقدار هش MD5 این مقدار را محاسبه می کند. MD5 یک الگوریتم خلاصه پیام است که با استفاده از تابع هش یک مقدار هش 128 بیتی تولید می کند.
- کلاینت سپس این هش MD5 را به عنوان پاسخ به پیام عدد رمزگذاری شده به سرور ارسال می کند.
- سرور با استفاده از همان کلید جلسه مشترک و عدد اصلی که به کلاینت ارسال کرده بود، مقدار MD5 را به طور مستقل محاسبه می کند. سپس محاسبه خود را با مقداری که کلاینت بازگردانده مقایسه می کند. اگر این دو مقدار مطابقت داشته باشند، ثابت می کند که کلاینت کلید خصوصی را در اختیار داشته و احراز هویت شده است.
به طور خلاصه، نامتقارنی کلیدها اجازه می دهد سرور پیام ها را با استفاده از کلید عمومی به کلاینت رمزگذاری کند. سپس کلاینت می تواند با رمزگشایی صحیح پیام ثابت کند که کلید خصوصی را در اختیار دارد. دو نوع رمزگذاری استفاده شده (راز مشترک متقارن و کلیدهای عمومی/خصوصی نامتقارن) هر یک می توانند از نقاط قوت خاص خود در این مدل بهره ببرند.
نتیجه گیری
یادگیری مراحل مذاکره اتصال و لایه های رمزگذاری در SSH می تواند به شما کمک کند بهتر درک کنید چه اتفاقی هنگام ورود به یک سرور راه دور رخ می دهد. اکنون می توانید رابطه بین اجزای مختلف و الگوریتم ها را بشناسید و درک کنید که همه این اجزا چگونه در کنار هم کار می کنند.
برای یادگیری بیشتر درباره SSH، می توانید راهنماهای زیر را مطالعه کنید:
- How To Configure SSH Key-Based Authentication on a Linux Server
- How To Use SSH to Connect to a Remote Server
- How to Set Up SSH Keys for various operating systems
- SSH Essentials: Working with SSH Servers, Clients, and Keys
منبع DigitalOcean