هیجانی برای اکتشاف

دنیایی برای خلق

امن کردن ریکوئست‌ها

جز متن‌های "برنامه‌نویسی و کامپیوتر"


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

این متن پنج ماه پیش نوشته شده

اهمیت امن کردن درخواست‌ها

زمانی که کاربران شما از سایتتون استفاده می‌کنن، خیلی مهمه که ارتباطشون با سرور امن باشه. از جمله دلایل این مسئله میشه به این اشاره کرد که کاربراتون اطلاعات حساسی مثل مشخصات بانکی و غیره رو سمت سرور شما میفرستن. این اطلاعات باید با حداقل رمزنگاری ارسال بشه. برای اینکار، باید ریکوئست‌ها، دور یه لایه‌ی امنیتی پیچیده بشن تا اطلاعات رمزنگاری بشه و سمت سرور دریافت بشه. اینجاست که اهمیت پروتکل HTTPS مشخص میشه. این پروتکل، که کنار آدرس سایت قرار میگیره، زمانی خودش رو نشون میده که تماس از طریق لایه‌های SSL بسته‌بندی میشه. اینجا لازم هست که با چندتا واژه آشنا بشید:

SSL

اس‌اس‌ال (SSL) خلاصه شده "Secure Sockets Layer" که تکنولوژی استاندارد برای امن کردن ارتباط در فضای اینترنت و مراقبت از اطلاعات حساس کاربراست. اطلاعات از طریق این تکنولوژی بین دو سیستم تبادل میشن، و از خواندن و تغییر اونها توسط افراد واسط یا هکرها جلوگیری میکنن. این ارتباط بین دو سیستم میتونه هر سیستمی باشه، سرور به سرور یا سرور به کلاینت.

کاری که توسط SSL انجام میشه، اینه که کاری میکنه تا بسته‌های ارسالی و دریافتی قابل خوندن برای ما نباشن و در حقیقت رمزگذاری بشن.

TLS

تی‌ال‌اس (TLS) یا "Transport Layer Security" نسخه‌ی بروز شده و امنتری از SSL هست. گرچه ما همچنان این گواهی‌نامه ها رو SSL خطاب میکنیم چون عموما اینطوره، با این حال اکثر گواهی‌نامه‌ها با TLS ارائه میشن.

HTTPS

اچ‌تی‌تی‌پی‌اس (HTTPS) یا "Hyper Text Transfer Protocol Secure" تو آدرس سایت نمایش داده میشه و نشون میده که آیا ارتباطات در این سایت امن هستند یا نه. مثلا نمونه‌ای از این سایت‌ها میتونن دی‌جی‌کالا، بانک ملت و... باشن.

چرا باید از SSL استفاده کرد؟

SSL صرفا یک موضوع امنیتی پایه برای هر سایتی هست و الزاما امنیت کامل رو تضمین نمیکنه، با این حال جز شروط لازم هست و نه شرط کافی. دوتا دلیل اصلی برای اینکار وجود داره،

  1. سئو: گوگل و بقیه موتورهای جست‌وجو میخوان مطمئن باشن که کاربرهاشون رو به آدرس‌های الکی نمیفرستن و حتما کاربرهایی که از طریق سرویسشون سایتی رو پیدا میکنن، ازشون دزدی نمیشه. برای همین خیلی زیاد به موضوع گواهینامه اس‌اس‌ال اهمیت میدن. در حقیقت سایت‌هایی که گواهی اس‌اس‌ال دارن، از نظر موتورهای جست‌وجو جهش خوبی رو تو رتبه‌بندیشون پیدا کردن. 
  2. امنیت: به عنوان مالک سایت، شما هم باید از امینت کاربراتون اطمینان حاصل کنید و فضای امنی رو برای اونها فراهم کنید.

الان، روش کار پروتکل‌های HTTPS، TCP و UDP رو توضیح میدم. اگر میخواید که ازشون رد بشید و به مرحله نصب گواهینامه برید، روی این لینک کلیک کنید.

توضیح عمومی

SSL پروتکلیه که مستقیما روی TCP فعالیت میکنه. TCP مجموعه‌ای از پروتکل‌هایی هستن که برای ارتباط بین اینترنتی استفاده میشن. TCP کمک میکنه تا ارتباطات به ترتیب و کنترل شده (رفع ارور یا صرفا مدیریت ارور) دریافت و ارسال بشن. SSL روی UDP هم کار میکنه. UDP پروتکلی مشابه TCP هست با یکسری تفاوت‌ها که مثلا ارورها توش کنترل نمیشن. (UDP برای استریم دیتا خیلی خوبه!).

به خاطر اینکه SSL مستقیم رو TCP کار میکنه، بسته‌ها یا دیتاهایی که روی HTTP هم ارسال میشن، میتونن امن بشن. با این حال، HTTPS گزینه‌ی بهتری برای اینکار هست که الان توضیح میدم.

زمانی که از SSL (و همینطور نسخه جدیدترش TLS) درست استفاده میکنید، تمام چیزی که هکرها میتونن ببینن، اینه که به چه IP و پورتی متصل شدید (در بهترین حالت چقدر دیتا ارسال کردید) و چه کدگذاری و فشرده‌سازی برای بسته‌ها انجام شده. هکرها میتونن حتی ارتباط رو قطع کنن، با این حال هم سرور و هم کلاینت متوجه میشن که ارتباط توسط شخص سوم قطع شده.

در حالت کلی، هکر میتونه متوجه بشه که اسم هاستی که بهش متصل شدید چیه، ولی از بقیه آدرس خبری نداره و صرفا اسم رو میدونه. اینجاست که HTTPS خودش رو نشون میده!

وقتی از HTTPS استفاده میکنید، باید یه درخواست اولیه به سرور DNS ارسال بشه تا اون اطلاعات هاست رو به شما بده و بعد باقی اطلاعات ارسال بشه.

توضیح کامل و دقیقتر

بعد از اینکه یک اتصال TCP اتفاق افتاد، اصطلاحا SSL به کلاینت دست میده (Hand Shake) که در حقیقت اعلام میکنه به سرور که می‌خواد تماس امن برقرار کنه. کاربر که میتونه مرورگر، یا هر برنامه‌ی دیگه‌ای باشه، چندتا مورد رو موقع Hand Shake به سرور ارسال میکنه:

  • چه نسخه‌ای از SSL در حال اجراست
  • چه سوئیت‌های کدگذاری (MD5, SHA, RSA و...) در حال استفاده هستن
  • چه متدی برای فشرده‌سازی استفاده میشه.

سرور اینجا کنترل میکنه که بالاترین نسخه‌ی SSL که توسط کلاینت و سرور پشتیبانی میشه چیه، یک سوئیت کدگذاری رو انتخاب میکنه و در صورت نیاز یک متد فشرده‌سازی برای بسته‌ها درنظر میگیره.

بعد از اینکه مقدمات انجام شدن، سرور گواهینامش رو ارسال میکنه. این گواهینامه یا باید توسط کاربر یا یک واسط که کاربر بهش مطمئنه تایید بشه. حالا کاربر، گواهینامه رو تایید میکنه و مطمئن میشه که این سرور، همون سروریه که باید بهش متصل بشه، یه کلید بینشون جابجا میشه. این کلید، یه کلید عمومی هست که در واقع چیز خاصی نیست. با داشتن این کلید، حالا کلاینت و سرور با هم ارتباط برقرار میکنن و آماده میشن تا رمزگذاری اصلی رو انجام بدن. از اینجا به بعد، کلاینت به سرور گفته که تمامی ارتباطات بین ما امن خواهند بود و باید رمزگذاری بشه، و بعد یک بسته رمزگذاری شده رو برای سرور ارسال میکنه.

سرور بعد از دریافت این بسته، چک میکنه که آیا MAC‌ آدرس ارسال شده درست هست یا نه، و بعد آیا بسته ارسال شده میتونه به درستی رمزگشایی بشه، و در نهایت پیامی رو برای کاربر ارسال میکنه که آیا این کدگشایی درست هست یا نه و کاربر هم تایید میکنه.

تمام این مراحل مقدمه ارتباط امن بودن و حالا، Hand Shake تموم شده. از اینجا به بعد ارتباط امن هست.

برای اینکه تماس بین کلاینت و سرور قطع بشه، یک پیام "قطع تماس" استفاده میشه. اگر هکر بخواد ارتباط رو قطع کنه، این پیام ارسال نمیشه و یا قابل تایید برای سرور نیست و در نتیجه هم کلاینت و هم سرور متوجه میشن. تو این حالت اتصال در بهترین حالت فقط میتونه کمی دستکاری بشه اما تغییر نمیکنه و دست هکر بستست.

چطور تماس SSL رو دستکاری کنیم؟

خلاصه‌وار توضیح میدم:

  • زمانی که کاربر پیام‌های امنیتی رو نادیده بگیره.
  • کاربر اتصالی رو با یک منبع نا امن (عموما HTTP) برقرار کنه.
  • صفحه لاگینی که امن نشده و به یک سرویس SSL ارسال میشه، میتونه بین راه تغییر کنه.
  • نرم‌افزارهایی که بسته نشدن، میتونن کدگذاری‌های سمت کلاینت رو افشا کنن.
  • رفت و آمد‌های مکرر و یا حتی دستکاری‌های فیزیکی سرور
  • افشا شدن کانال‌های کناری برای ارتباط
  • هک‌های کوانتومی!

نرم‌افزار Certbot و نصب گواهینامه

سرت‌بات (Certbot) نرم‌افزاریه که به سادگی به شما اجازه میده سرورتون رو امن کنید. این نرم‌افزار توسط EFF و افراد دیگه‌ای ساخته شده و میشه خیلی بهش مطمئن بود.

یکی از مزایای سرت‌بات اینه که وب‌سرور شما (Apache, NginX و ...) رو اتوماتیک کانفیگ میکنه و خیلی سریع شما رو برای استفاده از SSL/TLS و HTTPS آماده میکنه. برای آپاچی، آپشن‌هایی رو بهتون میده مثل دستکاری اتوماتیک سوئیت‌های کدگذاری یا مثلا ریدایرکت‌های اتوماتیک از HTTP به HTTPS یا حتی، بروزرسانی ریکوئست‌های نا امن!

سایت سرت‌بات به شما این امکان رو میده که بتونید نحوه نصب متناسب با سرورتون رو پیدا کنید، اما روشش خیلی سادست و خصوصا موقع نصب میتونه یکمی دردسر درست کنه. مثلا، ریپازیتوری‌های لینوکسیش همیشه آپدیت نیستن و گاهی تو بروزرسانی‌های گواهینامه‌هاتون شما رو با مشکل مواجه میکنن. برای همین، اینجا بهتون روش دیگه‌ای برای نصب مطمئنتر رو آموزش میدم.

مقدمات نصب

سرت‌بات برای نصب، به پایتون ۲.۶، ۲.۷ یا ۳.۳ به بالا نیاز داره. در حالت عادی هم نیاز به دسترسی روت برای نوشتن داخل /etc/letsencrypt، /var/log/letsencrypt و /var/lib/letsencrypt داره تا بتونه پورت‌های ۸۰ و ۴۴۳ رو به هم متصل و ضمنا بتونه کانفیگ‌های وب‌سرور رو دستکاری کنه.

نصب نرم‌افزار به حداقل ۵۱۲مگابایت رم نیاز داره تا بتونه دیپندنسی‌های بیشتری رو بسازه.

شروع نصب

certbot-auto بهترین روش برای نصب نرم‌افزار هست. چون، محیط مجازی رو برای پایتون فراهم میکنه و دیپندنسی‌ها رو به صورت اتوماتیک میسازه، از همه مهمتر اتوماتیک چک میکنه که آیا از آخرین نسخه نرم‌افزار استفاده میشه یا نه و اون را بروز نگه میداره. مراحل نصب:

$ wget https://dl.eff.org/certbot-auto
$ chmod a+x ./certbot-auto
$ ./certbot-auto

پروسه دانلود از پروتکل HTTPS استفاده میکنه برای همین نیازی به نگرانی نصب نیست.

چیزهایی که کاربرها باید بدونن

  • هر ۳ ماه گواهینامه‌ها رو بروز کنید! برای اینکار دستور ./certbot-auto renew رو ران کنید.
  • یک دستور cron برای بروزرسانی بسازید! بهترین نوع دستورات cron برای سرت‌بات اینه که هر هفته اجرا بشن. یادتون باشه که گواهینامه‌هایی بروز میشن که کمتر از ۳۰ روز برای انقضاشون باقی مونده. این یعنی اگر هر ماه بخواد دستور cron اجرا بشه، ممکنه ۲۹ روز گواهینامه نداشته باشید! (ایده‌آل اینه که هر روز cron اجرا بشه) که توضیحش رو پایین‌تر شرح میدم
  • عضو سایت اعلان وضعیت سرورهای سرت‌بات بشید! این موضوع خیلی مهمه که همیشه بروز باشید و بدونید که آخرین وضعیت پروتکل‌های امنیتی چیه.

ساخت دستور cron

اول مطمئن بشید که cron روی سیستم شما نصب شده. بعد، کافیه که یک اسکریپت شِل (Shell Script) رو تو یکی از فولدرهای /etc/cron.daily، /etc/cron.hourly، /etc/cron.monthly یا /etc/cron.weekly قرار بدید. اگر این زمان‌بندی‌ها براتون کافی نیست، میتونید دستور زیر رو اجرا کنید و تغییرات بیشتری به دستوراتتون بدید:

$ crontab -e

این دستور، پنل cron شما رو باز میکنه، خط اول، همه‌چیز رو براتون توضیح میده :)

حالا، توی اون فایل شِل که ساختید، این دستور رو قرار بدید:

43 6 * * * ~/certbot-auto renew --post-hook "systemctl reload apache2"

به واژه apache2 که انتهای دستور هست دقت کنید! مطمئن باشید که اسم سرویس وب‌سرورتون اونجا قرار گرفته! آرگومان post-hook--، دستوری رو که داخل دبل‌کوت اومده رو اجرا میکنه، و ما اینجا ازش میخوایم که وب‌سرور رو ریلود کنه تا گواهینامه‌ها بروز بشن.

فکر میکنم هر آنچه که تونستم رو براتون شرح دادم. اگر سوالی داشتید، میتونید برام کامنت بذارید، اما قبلش حتما یه سری به داکیومنتیشن سایت سرت‌بات بزنید و ببینید جواب سوالتون اونجا داده میشه یا نه. در غیر این صورت من برای کمک بهتون اینجا هستم.

با آرزوی موفقیت