SHET30

HSTS چیست؟ تنظیم امن در آپاچی، لایت‌اسپید و NGINX

HSTS چیست؟ تنظیم امن در آپاچی، لایت‌اسپید و NGINX

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

توی این راهنما اول با زبان ساده می‌بینیم HSTS چیست و چگونه کار می‌کند. بعد سراغ پیش‌نیازها، کد مناسب برای آپاچی، لایت‌اسپید و NGINX، تفاوت includeSubDomains و preload و روش آزمایش تنظیمات می‌ریم. اگه می‌خواید با روش‌های دیگه محافظت از وردپرس هم آشنا بشید، مطالب بخش افزایش امنیت میهن وردپرس به‌دردتون می‌خوره.

HSTS چیست و چگونه کار می‌کند

HSTS کوتاه‌شده عبارت HTTP Strict Transport Security و به‌معنی «امنیت سخت‌گیرانه انتقال HTTP» هست. وب‌سرور این دستور رو به‌شکل یک هدر HTTP برای مرورگر می‌فرسته. هدر همون اطلاعات کوتاهیه که همراه پاسخ سایت فرستاده می‌شه. مرورگر دامنه رو برای مدت مشخصی به خاطر می‌سپاره و از اون به بعد فقط با HTTPS سراغش می‌ره.

قبل از فعال‌کردن HSTS باید گواهی SSL معتبر داشته باشید، نسخه HTTPS سایت بدون هشدار باز بشه و آدرس وردپرس و سایتتون هم روی HTTPS تنظیم شده باشه. HSTS جای گواهی SSL یا ریدایرکت سمت سرور رو نمی‌گیره. این هدر بعد از برقراری یک اتصال امن، مرورگر رو مجبور می‌کنه مراجعه‌های بعدی رو با HTTPS انجام بده. اگه جزئیات فنی هدر و رفتار مرورگر براتون مهمه، می‌تونید مستندات HSTS در MDN رو ببینید.

تغییر http به https آدرس سایت
تغییر http به https آدرس سایت

فرض کنید کاربر نشانی سایتتون رو با http:// وارد می‌کنه. اگه مرورگر قبلاً هدر معتبر HSTS این دامنه رو دریافت کرده باشه، قبل از ساخت اتصال ناامن، خودش نشانی رو به HTTPS تغییر می‌ده. ولی اگه کاربر برای اولین بار وارد سایت بشه و دامنه توی فهرست Preload مرورگر نباشه، باز هم به ریدایرکت درست HTTP به HTTPS روی سرور نیاز دارید.

پس HSTS معمولی از اولین مراجعه به‌طور کامل محافظت نمی‌کنه. اینجا یک نکته مهم هست: اضافه‌کردن کلمه preload به هدر، به‌تنهایی دامنه رو وارد فهرست مرورگرها نمی‌کنه. ثبت دامنه توی این فهرست یک کار جدا و اختیاریه که جلوتر درباره‌ش حرف می‌زنیم.

HSTS چگونه کار می‌کند
HSTS چگونه کار می‌کند

قبل از فعال‌کردن HSTS این موارد رو بررسی کنید

  • همه صفحه‌های سایت باید با HTTPS و بدون خطای گواهی باز بشن.
  • ریدایرکت دائمی HTTP به HTTPS باید روی سرور فعال باشه.
  • فایل‌های CSS، JavaScript، فونت‌ها و تصاویر نباید از نشانی ناامن HTTP بارگیری بشن. به این مشکل «محتوای ترکیبی» یا Mixed Content می‌گن.
  • باید به تنظیمات هاست یا سرور دسترسی داشته باشید و قبل از تغییر فایل پیکربندی، از اون نسخه پشتیبان بگیرید.
  • اگه می‌خواید includeSubDomains رو اضافه کنید، اول مطمئن بشید تک‌تک زیردامنه‌ها با HTTPS معتبر کار می‌کنن.

اگه از درست‌بودن یکی از این موارد مطمئن نیستید، از پشتیبانی هاست بخواید HTTPS و هدر HSTS رو براتون بررسی کنه. فعال‌کردن عجولانه HSTS با یک زمان طولانی، به‌خصوص همراه includeSubDomains یا preload، می‌تونه دردسر درست کنه.

HSTS رو مرحله‌به‌مرحله فعال کنید

ویژگی max-age مشخص می‌کنه مرورگر قانون HSTS رو چند ثانیه نگه داره. بهتره با یک زمان کوتاه شروع کنید تا اگه مشکلی پیش اومد، مجبور نشید مدت زیادی برای پایان اون منتظر بمونید. برای آزمایش اول می‌تونید مقدار ۳۰۰ ثانیه رو بذارید:

Strict-Transport-Security: max-age=300

بعد از اینکه سایت رو کامل بررسی کردید، می‌تونید این مقدار رو به یک روز، بعد یک هفته و در آخر به زمان طولانی‌تری برسونید. یک روز ۸۶۴۰۰ ثانیه، یک هفته ۶۰۴۸۰۰ ثانیه و یک سال ۳۱۵۳۶۰۰۰ ثانیه هست. این افزایش تدریجی کمک می‌کنه خطاهای مربوط به گواهی، زیردامنه‌ها یا سرویس‌های قدیمی رو پیش از ماندگارشدن تنظیم پیدا کنید.

فعال‌کردن HSTS در وردپرس

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

فعال‌کردن HSTS در آپاچی و لایت‌اسپید

اگه هاستتون اجازه ویرایش .htaccess رو می‌ده، وارد File Manager بشید. این ابزار توی سی‌پنل و دایرکت‌ادمین در دسترسه. پوشه public_html رو باز کنید، از فایل .htaccess نسخه پشتیبان بگیرید و بعد اون رو برای ویرایش باز کنید.

برای آزمایش اولیه، کد زیر رو به فایل اضافه کنید. عبارت always کمک می‌کنه هدر روی پاسخ‌های بیشتری، از جمله بعضی پاسخ‌های خطا، فرستاده بشه. این کد فقط وقتی هدر رو می‌فرسته که اتصال فعلی HTTPS باشه:

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=300" env=HTTPS
</IfModule>

فایل رو ذخیره کنید و بعد سایت رو آزمایش کنید. اگه هدر نمایش داده شد و همه بخش‌ها درست کار کردن، مقدار max-age رو کم‌کم بالا ببرید. بعد از آزمایش کامل می‌تونید مقدار یک‌ساله زیر رو بذارید:

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000" env=HTTPS
</IfModule>

نحوه اثرگذاری دستور Header به تنظیمات سرور و نسخه ماژول‌ها هم بستگی داره. اگه کد باعث خطای ۵۰۰ شد یا هدر نمایش داده نشد، تغییر رو برگردونید و از پشتیبانی هاست کمک بگیرید. جزئیات این دستور توی مستندات رسمی Apache mod_headers نوشته شده.

فعال‌کردن HSTS در وب‌سرور NGINX

اگه سرور مجازی یا اختصاصی با NGINX دارید، فایل تنظیم مربوط به سایت رو باز کنید و دستور زیر رو فقط داخل بخش HTTPS همون سایت بذارید. بخش HTTPS معمولاً همون بلوکیه که روی پورت ۴۴۳ گوش می‌ده و گواهی SSL هم داخلش تنظیم شده:

add_header Strict-Transport-Security "max-age=300" always;

اول مطمئن بشید پیکربندی NGINX درسته و بعد سرویس رو دوباره بارگذاری کنید. وقتی دیدید سایت بدون مشکل کار می‌کنه، مقدار max-age رو به‌تدریج بالا ببرید. نمونه نهایی یک‌ساله به این شکله:

add_header Strict-Transport-Security "max-age=31536000" always;

پارامتر always باعث می‌شه NGINX هدر رو به کدهای پاسخ بیشتری اضافه کنه. اگه می‌خواید رفتار دقیق دستور add_header رو ببینید، به مستندات رسمی NGINX سر بزنید. اگه تجربه مدیریت سرور ندارید، بهتره این تغییر رو به مدیر سرور بسپارید.

چه زمانی includeSubDomains رو اضافه کنیم

گزینه includeSubDomains قانون HSTS رو روی همه زیردامنه‌ها هم فعال می‌کنه. مثلاً اگه اون رو برای دامنه اصلی بذارید، زیردامنه‌هایی مثل shop.example.com و mail.example.com هم باید همیشه با HTTPS معتبر باز بشن.

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

Strict-Transport-Security: max-age=31536000; includeSubDomains

HSTS Preload چیست و آیا به اون نیاز دارید

HSTS Preload فهرستی از دامنه‌هاست که داخل مرورگرهای پشتیبانی‌شده قرار می‌گیره. با این روش، مرورگر حتی در اولین مراجعه هم برای ساخت اتصال HTTP تلاش نمی‌کنه. ولی فقط اضافه‌کردن واژه preload به هدر، دامنه رو توی این فهرست ثبت نمی‌کنه. باید همه شرایط لازم رو کامل کنید و دامنه رو جداگانه برای بررسی بفرستید.

این قابلیت برای همه سایت‌ها لازم نیست و برگشتن از اون هم فوری انجام نمی‌شه. طبق راهنمای سرویس رسمی HSTS Preload، دامنه باید HTTPS معتبر، ریدایرکت درست، max-age حداقل یک‌ساله، includeSubDomains و preload داشته باشه. همه زیردامنه‌ها هم باید برای اجبار HTTPS آماده باشن.

قبل از ثبت دامنه، اثر این تصمیم روی زیردامنه‌های ایمیل، پنل‌ها، APIها و سرویس‌های داخلی رو بررسی کنید. حذف دامنه از فهرست و رسیدن این تغییر به مرورگرهای کاربران ممکنه زمان زیادی بگیره. پس preload رو به کد پیش‌فرض اضافه نکنید، مگر اینکه پیامدهاش رو کامل سنجیده باشید.

چطور مطمئن بشیم HSTS فعال شده

برای آزمایش آنلاین، وارد ابزار تست HSTS در Geekflare بشید، دامنه رو وارد کنید و آزمایش رو اجرا کنید. نتیجه باید هدر Strict-Transport-Security و مقدار max-age رو نشون بده.

hsts test
hsts test

راه دوم اینه که از ابزار توسعه‌دهنده مرورگر کمک بگیرید. سایت رو با HTTPS باز کنید، کلید F12 رو بزنید و وارد بخش Network بشید. صفحه رو دوباره بارگذاری کنید، درخواست اصلی صفحه رو انتخاب کنید و توی Response Headers دنبال Strict-Transport-Security بگردید.

Strict-Transport-Security
Strict-Transport-Security

اگه به خط فرمان دسترسی دارید، دستور زیر هم هدرهای پاسخ رو نشون می‌ده. فقط به‌جای دامنه نمونه، نشانی واقعی سایتتون رو بنویسید:

curl -I https://example.com

یادتون نره که دیدن ریدایرکت HTTP به HTTPS، به‌تنهایی فعال‌بودن HSTS رو ثابت نمی‌کنه. باید خود هدر رو روی پاسخ HTTPS ببینید. هدر HSTS روی پاسخ HTTP معتبر نیست و مرورگر هم اون رو نادیده می‌گیره.

اگه تنظیم HSTS مشکل ساخت چه‌کار کنیم

اگه از اول با زمان کوتاه شروع کرده باشید، می‌تونید هدر رو حذف کنید و تا پایان max-age منتظر بمونید. برای مرورگرهایی که هنوز از راه HTTPS به سایت دسترسی دارن، فرستادن موقت هدر زیر سابقه HSTS دامنه رو پاک می‌کنه:

Strict-Transport-Security: max-age=0

این کار مشکل گواهی خراب رو دور نمی‌زنه، چون مرورگری که سابقه HSTS داره اجازه عبور از هشدار گواهی رو نمی‌ده. اگه includeSubDomains یا Preload رو فعال کرده باشید، برگردوندن وضعیت پیچیده‌تر می‌شه. به همین دلیله که آزمایش مرحله‌ای و آماده‌بودن همه زیردامنه‌ها اهمیت زیادی داره.

آیا برای فعال‌کردن HSTS به SSL نیاز داریم؟

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

آیا HSTS سرعت سایت رو بیشتر می‌کنه؟

کار اصلی HSTS افزایش امنیت و جلوگیری از اتصال HTTP هست. ممکنه در مراجعه‌های بعدی یک مرحله ریدایرکت سمت سرور حذف بشه، ولی HSTS جای روش‌های اصلی افزایش سرعت سایت رو نمی‌گیره.

برای HSTS به افزونه وردپرس نیاز داریم؟

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

آیا بهتره HSTS Preload رو برای هر سایتی فعال کنیم؟

نه. Preload همه زیردامنه‌ها رو به HTTPS وابسته می‌کنه و برگشتن از اون سریع نیست. فقط وقتی سراغش برید که همه شرایط فهرست رسمی رو می‌دونید و تمام زیردامنه‌هاتون برای HTTPS آماده هستن.

جمع‌بندی

HSTS به مرورگر می‌گه سایتتون رو فقط با HTTPS باز کنه و اجازه برگشت به اتصال ناامن رو نمی‌ده. برای فعال‌کردن امن اون، اول HTTPS و ریدایرکت‌ها رو کامل بررسی کنید. بعد با max-age کوتاه شروع کنید و زمان رو کم‌کم بالا ببرید. includeSubDomains و preload هم گزینه‌های اختیاری و حساسی هستن؛ پس فقط وقتی سراغشون برید که از وضعیت همه زیردامنه‌ها مطمئنید.

نظر شما در این مورد چیه؟

  1. U332597۱۹ آبان ۱۴۰۲

    سلام وقت بخیر جناب حسینی.من تو سایت تست گرفتم ارور داده.حتی دامین سایت میهن وردپرس تست کردم جواب تست نمیده.Internal Server Error این رو میده بهم.

    • رضا راد۲۰ آبان ۱۴۰۲

      سلام از سایت دیگری استفاده کنید. توی گوگل سرچ کنید hsts test online

  2. U317638۱۴ مرداد ۱۴۰۲

    سلام آیا این سایت تست کننده امن است چون سایت های تازه تاسیس شده رو بهش می دم و امنیت سایت هاش پایینه

    • رضا راد۱۵ مرداد ۱۴۰۲

      سلام امنیت پایین منظورش امنیت سایتتون هست نه سایت خودش

      • U317638۱۵ مرداد ۱۴۰۲

        سایت خودم

        • رضا راد۱۶ مرداد ۱۴۰۲

          خب اگه میگه امن نیست حتما hsts فعال نیست

          • U317638۱۶ مرداد ۱۴۰۲

            نه منظورم این نیست این هست که این سایت تست کننده ایمن هست یا نه. چون سایت هام هنوز ایمن نیست و افزونه امنیتی روش نصب نیست
            می گم وبسایت من رو هک نمی کنه ؟

            • رضا راد۲۱ مرداد ۱۴۰۲

              سلام بله مشکلی نیست فقط میخاد hsts رو تست کنه

  3. U10966۲۶ دی ۱۴۰۱

    سلام
    من آموزش های شما رو دنبال دارم میکنم و HSTS رو برای سایت خودم فعال کردم ، لما چرا رو سایت خودتون فعال نیست؟
    آیا این برای همه سایت ها مناسب هست و یا شرایط استفاده خاصی داره؟
    مثلا من دیجیکالا رو چک کردم فعال نبود ولی رو بانی مد فعال هست.

    • رضا راد۲۷ دی ۱۴۰۱

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

      • U317638۱۶ مرداد ۱۴۰۲

        چرا من تست کردم رو میهن وردپرس فعال بود

  4. U310322۲۵ آذر ۱۴۰۰

    با سلام
    ممنون از توضیحات خوبتون
    دامنه ما روی ابر آروان هست
    باید با پشتیبانی ابر آروان هماهنگ کنیم برای فعال کردن ؟

  5. U30244۲۷ فروردین ۱۴۰۰

    سلام.
    ممنون از این مقاله‌تون.
    قبل از خواندن این مقاله فکر می‌کردم که HSTS همان پروتکل HTTPS است. اما فهمیدم که فرق دارد و تو سایت خودم الان فعال کردم. خیلی ممنون. اگر امکانش هست یک مقاله هم راجع به SSH بگذارید.
    باتشکر از شما.

    • رضا راد۲۸ فروردین ۱۴۰۰

      سپاس از شما. مقاله درباره ssh روی سایت داریم.

  6. U38774۲۲ فروردین ۱۴۰۰

    سلام بنده هر کار کردم در سایت بازهم میزنه که HSTS فعال نیست. 🙁

    • رضا راد۲۲ فروردین ۱۴۰۰

      سلام وب سرور شما چی هست؟ از هاستینگ بپرسید

      • U38774۲۳ فروردین ۱۴۰۰
        • رضا راد۲۳ فروردین ۱۴۰۰

          اگر لایت اسپید هست نباید مشکلی باشه. اگر openlitespeed هست با شرکت هاست در میان بذارید باید از پنل وب سرور تنظیم کنند.

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

در حال بارگذاری...

هر سوالی دارید بپرسید.پاسخگوی شما هستیم.