امنیت برنامه جنگو: یک آموزش پیدانتیک، قسمت 4


این چهارمین قسمت از یک سری در مورد استفاده از pydantic برای پروژه‌های مبتنی بر جنگو است. قبل از ادامه، مرور می کنیم: Iدر قسمت اول این سری، ما بر روی استفاده pydantic از نکات نوع پایتون تمرکز کردیم. مدیریت تنظیمات جنگو را ساده کنید. در آموزش دوم، ما در حین ساختن یک برنامه وب بر اساس این مفهوم از Docker استفاده کردیم، همسو کردن توسعه و تولید ما محیط ها مقاله سوم توضیح داد میزبانی برنامه ما در Heroku.

Django که با یک اصل طراحی امنیت اول نوشته شده است – انحراف از کتابخانه های Python مانند Flask و FastAPI – دارای پشتیبانی پخته شده برای شناسایی بسیاری از مشکلات امنیتی رایج است. با استفاده از یک مثال کاربردی وب کاربردی، در حال اجرا و در دسترس برای اینترنت، ما از جنگو برای افزایش امنیت برنامه استفاده خواهیم کرد.

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

مرحله 1: آسیب پذیری های برنامه را ارزیابی کنید

یکی از راه های اجرای جنگو بازرسی امنیتی و دنباله تأیید سایت به این صورت است که به دایرکتوری اصلی برنامه ما بروید و اجرا کنید:

python manage.py check --deploy --fail-level WARNING

اما این دستور قبلاً در برنامه ما موجود است heroku-release.sh فایل (طبق مراحل انجام شده در قسمت 3 این مجموعه آموزشی)، و اسکریپت به طور خودکار هنگام استقرار برنامه اجرا می شود.

را check دستور در اسکریپت قبلی لیستی از جنگو را تولید می کند هشدارهای مربوط به امنیت، با کلیک بر روی آن قابل مشاهده است نمایش گزارش انتشار دکمه در داشبورد Heroku. خروجی برنامه ما به شرح زیر است:

System check identified some issues:
​
WARNINGS:
?: (security.W004) You have not set a value for the SECURE_HSTS_SECONDS setting. If your entire site is served only over SSL, you may want to consider setting a value and enabling HTTP Strict Transport Security. Be sure to read the documentation first; enabling HSTS carelessly can cause serious, irreversible problems.
?: (security.W008) Your SECURE_SSL_REDIRECT setting is not set to True. Unless your site should be available over both SSL and non-SSL connections, you may want to either set this setting True or configure a load balancer or reverse-proxy server to redirect all connections to HTTPS.
?: (security.W012) SESSION_COOKIE_SECURE is not set to True. Using a secure-only session cookie makes it more difficult for network traffic sniffers to hijack user sessions.
?: (security.W016) You have 'django.middleware.csrf.CsrfViewMiddleware' in your MIDDLEWARE, but you have not set CSRF_COOKIE_SECURE to True. Using a secure-only CSRF cookie makes it more difficult for network traffic sniffers to steal the CSRF token.​
System check identified 4 issues (0 silenced).

با تفسیر مجدد، لیست قبلی پیشنهاد می کند که به چهار نگرانی امنیتی زیر توجه کنیم:

مورد

مقدار (نیاز: تنظیم کنید True)

نتیجه

HSTS

SECURE_HSTS_SECONDS

HTTP Strict Transport Security را فعال می کند.

HTTPS

SECURE_SSL_REDIRECT

همه اتصالات را به HTTPS هدایت می کند.

کوکی جلسه

SESSION_COOKIE_SECURE

مانع ربودن جلسه کاربر می شود.

کوکی CSRF

CSRF_COOKIE_SECURE

مانع از سرقت توکن CSRF می شود.

اکنون به هر یک از چهار موضوع مشخص شده می پردازیم. راه‌اندازی HSTS ما این را به حساب می‌آورد (security.W004) پیام هشدار در مورد فعال کردن HSTS بدون دقت برای جلوگیری از شکستگی بزرگ سایت.

مرحله 2: تقویت امنیت برنامه جنگو

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

برای پشتیبانی از درخواست های SSL، متغیر پیکربندی را تنظیم می کنیم USE_SSL. راه‌اندازی این متغیر رفتار برنامه ما را تغییر نمی‌دهد، اما این اولین قدم به سوی تغییرات بیشتر در پیکربندی است.

بیایید به بخش پیکربندی Vars داشبورد Heroku در تب تنظیمات برویم، جایی که می‌توانیم جفت‌های کلید-مقدار پیکربندی شده خود را مشاهده کنیم:

کلید

ارزش

ALLOWED_HOSTS

[“hello-visitor.herokuapp.com”]

SECRET_KEY

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

اشکال زدایی

نادرست

DEBUG_TEMPLATES

نادرست

طبق قرارداد، تنظیمات امنیتی جنگو در یک ذخیره می شود برنامه های وب settings.py فایل. settings.py شامل SettingsFromEnvironment کلاسی که مسئول متغیرهای محیطی است. بیایید یک متغیر پیکربندی جدید اضافه کنیم و کلید آن را روی آن تنظیم کنیم USE_SSL و ارزش آن به TRUE. SettingsFromEnvironment پاسخ خواهد داد و این متغیر را مدیریت می کند.

در حالی که در ما settings.py اجازه دهید مقادیر متغیر HTTPS، کوکی جلسه و کوکی CSRF را نیز به روز کنیم. ما منتظر می مانیم تا HSTS را فعال کنیم، زیرا این به یک مرحله اضافی نیاز دارد.

ویرایش های کلیدی برای پشتیبانی از SSL و به روز رسانی این سه متغیر موجود عبارتند از:

class SettingsFromEnvironment(BaseSettings):
    USE_SSL: bool = False
​
try:
   # ...
    USE_SSL = config.USE_SSL

# ...
if not USE_SSL:
    SECURE_PROXY_SSL_HEADER = None
    SECURE_SSL_REDIRECT = False
    SESSION_COOKIE_SECURE = False
    CSRF_COOKIE_SECURE = False
else:
    # (security.W008)
    SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
    SECURE_SSL_REDIRECT = True
    # (security.W012)
    SESSION_COOKIE_SECURE = True
    # (security.W016)
    CSRF_COOKIE_SECURE = True

این به روز رسانی های امنیتی جنگو برای محافظت از برنامه ما مهم هستند. هر تنظیم جنگو با شناسه هشدار امنیتی مربوطه به عنوان نظر کد برچسب گذاری شده است.

را SECURE_PROXY_SSL_HEADER و SECURE_SSL_REDIRECT تنظیمات تضمین می کند که برنامه ما فقط از اتصال به سایت ما از طریق HTTPS پشتیبانی می کند، گزینه ای بسیار امن تر از HTTP رمزگذاری نشده. تغییرات ما تضمین می کند که مرورگری که سعی می کند از طریق HTTP به سایت ما متصل شود، برای اتصال از طریق HTTPS هدایت می شود.

برای پشتیبانی از HTTPS، باید گواهی SSL ارائه کنیم. هروکو مدیریت خودکار گواهی (ACM) ویژگی متناسب با این لایحه است و به طور پیش‌فرض برای داینوهای پایه یا حرفه‌ای تنظیم شده است.

با اضافه شدن این تنظیمات به settings.py ما می‌توانیم تغییرات کد خود را فشار دهیم، به پنل مدیریت Heroku برویم و یک برنامه کاربردی دیگر را از مخزن اجرا کنیم تا این تغییرات در سایت ما آشکار شود.

مرحله 3: بررسی تغییر مسیر HTTPS

پس از تکمیل استقرار، بیایید عملکردهای HTTPS را در سایت خود بررسی کنیم و تأیید کنیم که سایت:

  • با استفاده از https:// پیشوند
  • هنگام استفاده از HTTP به HTTPS هدایت می شود http:// پیشوند

با انجام تغییر مسیر HTTPS، ما به سه مورد از چهار هشدار اولیه خود (شماره های 2، 3، و 4) پرداخته ایم. نگرانی باقی مانده ما برای پرداختن به HSTS است.

مرحله 4: سیاست HSTS را اجرا کنید

HTTP Strict Transport Security (HSTS) مرورگرهای سازگار را محدود می کند که فقط از HTTPS برای اتصال به سایت ما استفاده کنند. اولین باری که به سایت ما از طریق یک مرورگر سازگار و از طریق HTTPS دسترسی پیدا می‌کند، HSTS باز خواهد گشت آ Strict-Transport-Security پاسخ سرصفحه که از دسترسی HTTP از آن نقطه به بعد جلوگیری می کند.

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

علاوه بر این، HSTS از حافظه نهان جداگانه خود استفاده می کند که دست نخورده باقی می ماند، حتی زمانی که کاربر کش معمولی خود را پاک می کند.

برای اجرای پشتیبانی HSTS، بیایید برنامه خود را به روز کنیم settings.py فایل:

 if not USE_SSL:
     SECURE_PROXY_SSL_HEADER = None
     SECURE_SSL_REDIRECT = False
     SESSION_COOKIE_SECURE = False
     CSRF_COOKIE_SECURE = False
+    SECURE_HSTS_INCLUDE_SUBDOMAINS = False
+    SECURE_HSTS_PRELOAD = False

سپس به پایین به پایین پرش کنید else بلافاصله بعد از آن مسدود کنید و این خطوط را اضافه کنید:

   # IMPORTANT:
   # (-) Add these only once the HTTPS redirect is confirmed to work
   #
   # (security.W004)
   SECURE_HSTS_SECONDS = 3600  # 1 hour
   SECURE_HSTS_INCLUDE_SUBDOMAINS = True
   SECURE_HSTS_PRELOAD = True

همانطور که توسط توصیه شده است، برای فعال کردن HSTS سه تنظیمات را به روز کرده ایم مستندات جنگوو سایت ما را به لیست پیش بارگذاری مرورگر ارسال کنیم. شما ممکن است به یاد داشته باشید که ما (security.W004) نسبت به فعال کردن بی دقتی HSTS هشدار داد. برای جلوگیری از هر گونه اتفاق ناگوار مربوط به HSTS که زودتر از موعد فعال شده است، مقدار را برای SECURE_HSTS_SECONDS تا یک ساعت؛ این مدت زمانی است که سایت شما در صورت راه اندازی نادرست خراب می شود. ما HSTS را با این مقدار کوچکتر آزمایش می کنیم تا تأیید کنیم که پیکربندی سرور قبل از اینکه آن را افزایش دهیم سازگار است – یک گزینه رایج این است 31536000 ثانیه یا یک سال

اکنون که ما هر چهار مرحله امنیتی را پیاده‌سازی کرده‌ایم، سایت ما به منطق تغییر مسیر HTTPS ترکیب شده با یک هدر HSTS مجهز شده است، بنابراین اطمینان حاصل می‌شود که اتصالات توسط امنیت اضافه شده SSL پشتیبانی می‌شوند.

مزیت اضافی کدگذاری منطق تنظیمات ما در اطراف USE_SSL متغیر پیکربندی این است که یک نمونه واحد از کد (the settings.py file) هم روی سیستم توسعه و هم روی سرورهای تولید ما کار می کند.

امنیت جانگو برای آرامش ذهن

حفاظت از یک سایت کار ساده ای نیست، اما جنگو با چند مرحله ساده و در عین حال حیاتی این کار را ممکن می کند. پلتفرم توسعه جنگو به شما این امکان را می دهد که از یک سایت با سهولت نسبی محافظت کنید، صرف نظر از اینکه متخصص امنیت هستید یا تازه کار. من با موفقیت برنامه‌های جنگو بی‌شماری را در هروکو مستقر کرده‌ام و شب‌ها به خوبی می‌خوابم – مانند مشتریانم.


وبلاگ مهندسی تاپتال قدردانی خود را به استیون هریس دیویدسون برای بررسی و آزمایش بتا نمونه کد ارائه شده در این مقاله.

ادامه مطلب در وبلاگ مهندسی تاپتال:



منبع

Matthew Newman

Matthew Newman Matthew has over 15 years of experience in database management and software development, with a strong focus on full-stack web applications. He specializes in Django and Vue.js with expertise deploying to both server and serverless environments on AWS. He also works with relational databases and large datasets
[ Back To Top ]