بلاگ/چک‌لیست امنیت و سخت‌سازی وردپرس روی سرور مجازی و اختصاصی
به‌روز شده

چک‌لیست امنیت و سخت‌سازی وردپرس روی سرور مجازی و اختصاصی

1405/07/260 بازدید
چک‌لیست امنیت و سخت‌سازی وردپرس روی سرور مجازی و اختصاصی

چک‌لیست امنیت و سخت‌سازی وردپرس روی سرور مجازی و اختصاصی

چک‌لیست امنیت وردپرس روی سرور

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

چرا روی سرور خودتان باید دستی سخت‌سازی کنید؟

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

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

۱. وردپرس، قالب و افزونه‌ها را به‌روز نگه دارید

بیشتر هک‌های وردپرس از یک آسیب‌پذیری شناخته‌شده در نسخه قدیمی هسته، قالب یا یک افزونه شروع می‌شود، نه از یک حمله پیچیده. چند قدم ساده:

  • در پیشخان، مسیر «به‌روزرسانی‌ها» را هر هفته چک کنید یا آپدیت خودکار هسته را برای نسخه‌های امنیتی فعال بگذارید.
  • افزونه‌هایی که بیش از یک سال آپدیت نگرفته‌اند یا در پیشخان علامت «ناسازگار» گرفته‌اند را حذف کنید، نه فقط غیرفعال؛ کد غیرفعال هم روی دیسک می‌ماند و قابل اجراست اگر مسیرش شناخته شود.
  • قبل از آپدیت روی سایت فعال، یک اسنپ‌شات یا بک‌آپ کامل بگیرید. آپدیت‌هایی که قالب را خراب می‌کنند معمولا روی استیجینگ یا یک نسخه تست قابل جبران‌اند، نه روی سایت زنده.

۲. حساب ادمین و رمزها را امن کنید

نام کاربری «admin» و رمز ضعیف هنوز شایع‌ترین راه ورود به سایت‌های وردپرسی است.

  • اگر کاربری با نام admin دارید، یک کاربر جدید با نقش مدیر و نام دیگر بسازید، مطالب را به او منتقل کنید و admin را حذف کنید.
  • رمز حداقل ۱۲ کاراکتر با حروف، عدد و نماد؛ یک مدیر رمز (مثل Bitwarden) برای تولید و نگهداری رمزها استفاده کنید، نه یک رمز تکراری بین چند سایت.
  • ورود دومرحله‌ای (2FA) را با افزونه‌ای مثل WP 2FA یا Wordfence فعال کنید، مخصوصا برای حساب‌های با نقش مدیر.
  • تعداد تلاش‌های ناموفق ورود را محدود کنید. افزونه Limit Login Attempts Reloaded این کار را ساده می‌کند؛ روی سطح سرور هم می‌توانید با fail2ban و یک jail برای وردپرس، IPهایی که چندبار رمز اشتباه می‌زنند را چند ساعت مسدود کنید.

۳. ویرایشگر فایل را قفل کنید

پیشخان وردپرس یک ویرایشگر فایل داخلی دارد که اجازه می‌دهد کد قالب و افزونه‌ها از همان مرورگر ویرایش شود. اگر یک حساب مدیر هک شود، همین ویرایشگر راحت‌ترین راه برای تزریق کد مخرب است. این خط را به انتهای wp-config.php اضافه کنید، قبل از خط /* That's all, stop editing! */:

define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);

خط اول ویرایشگر قالب و افزونه در پیشخان را خاموش می‌کند. خط دوم یک قدم جلوتر می‌رود و نصب یا آپدیت افزونه و قالب از داخل پیشخان را هم می‌بندد؛ اگر از ابزار دیگری مثل WP-CLI یا git برای دیپلوی استفاده می‌کنید، این قفل مشکلی برایتان ایجاد نمی‌کند.

۴. دسترسی به wp-login.php و wp-admin را محدود کنید

محدود کردن دسترسی به پنل مدیریت وردپرس

صفحه ورود وردپرس هدف دائمی ربات‌های brute-force است. چند راه برای کم کردن این فشار:

  • اگر تیم شما از یک رنج IP ثابت کار می‌کند، دسترسی به /wp-admin/ و /wp-login.php را در تنظیمات nginx یا Apache به همان IPها محدود کنید.
  • یک پلاگین امنیتی مثل Wordfence یا Sucuri بگذارید تا الگوهای حمله شناخته‌شده را قبل از رسیدن به وردپرس فیلتر کند.
  • روی سرور، نرخ درخواست به این دو مسیر را با limit_req در nginx محدود کنید تا یک ربات نتواند در عرض چند دقیقه هزاران رمز را امتحان کند.
  • اگر پلاگین صفحه ورود را تغییر می‌دهد، آدرس هم تغییر می‌کند و بخشی از ربات‌های عمومی که فقط wp-login.php پیش‌فرض را می‌زنند خودشان حذف می‌شوند.

۵. تنظیمات امن سرور: فرقی ندارد مجازی باشد یا اختصاصی

لایه سرور همان‌قدر مهم است که تنظیمات خود وردپرس. چند مورد که روی هر دو نوع سرور باید چک شود:

  • ورود SSH با رمز را خاموش کنید و فقط با کلید وارد شوید: PasswordAuthentication no در /etc/ssh/sshd_config (راهنمای کامل امن‌سازی SSH را ببینید).
  • فایروال سطح سرور (ufw یا iptables) فقط پورت‌های ۲۲، ۸۰ و ۴۴۳ را باز بگذارد، بقیه بسته باشد.
  • در php.ini مقدار disable_functions را برای توابع پرخطر مثل exec و shell_exec تنظیم کنید و open_basedir را به پوشه سایت محدود کنید تا یک فایل مخرب در یک سایت نتواند به پوشه سایت دیگر روی همان سرور دسترسی پیدا کند.
  • مجوز فایل‌ها را درست بگذارید: پوشه‌ها ۷۵۵، فایل‌ها ۶۴۴، و wp-config.php روی ۶۰۰.

نکته‌ای که بین VPS و سرور اختصاصی فرق می‌کند، سطح ایزوله‌سازی پیش‌فرض است:

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

هر دو مدل، تنظیمات امنیتی بالا را عینا نیاز دارند؛ تفاوت فقط در سرعت بازگشت بعد از یک حادثه است.

۶. بک‌آپ منظم و قابل بازیابی

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

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

۷. اتصال امن با SSL و هدرهای HTTP

گواهی SSL رایگان با Let's Encrypt و تمدید خودکار آن (certbot) باید روی هر سایت وردپرسی فعال باشد. چند هدر HTTP هم در nginx اضافه کنید تا امنیت وردپرس یک قدم جلوتر برود:

add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;

هدر اول مرورگر را مجبور می‌کند همیشه از HTTPS استفاده کند، حتی اگر کاربر آدرس را بدون https بزند. دو هدر بعدی جلوی حمله‌های clickjacking و MIME sniffing را می‌گیرند.

جمع‌بندی

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

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

سؤالات متداول

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

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

بهترین راه جلوگیری از حمله brute-force به wp-login.php چیست؟ ترکیب محدودیت تلاش ورود، 2FA و مسدودسازی IP با fail2ban در سطح سرور. هیچ‌کدام به‌تنهایی کافی نیست، اما با هم فشار این حمله‌ها را به‌شدت کم می‌کنند.

اگر سایت قبلا هک شده باشد از کجا شروع کنم؟ اول سایت را آفلاین یا در حالت تعمیر بگذارید، از یک بک‌آپ سالم و قدیمی‌تر از تاریخ نفوذ ریستور کنید، همه رمزها و کلیدهای امنیتی wp-config.php را عوض کنید و بعد موردهای این چک‌لیست را یکی‌یکی اجرا کنید تا همان راه نفوذ دوباره باز نماند.