دسته بندی:

پچ امنیتی برای whmcs

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

چرا سیستم صورت‌حساب گران‌ترین هدف روی سرور شماست

در پایگاه‌داده WHMCS مشخصات هویتی مشتریان، تاریخچه فاکتورها، اطلاعات پرداخت، تیکت‌ها و مهم‌تر از همه اعتبارنامه اتصال به سرورهای شما ذخیره می‌شود؛ چون همین نرم‌افزار است که روی cPanel، DirectAdmin یا Plesk اکانت می‌سازد. نفوذ به WHMCS یعنی نفوذ به همه سرورهایی که به آن وصل‌اند؛ برای مهاجم از خود وب‌سایت شرکت باارزش‌تر است.

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

به‌روز نگه‌داشتن؛ همان «پچ امنیتی» واقعی

WHMCS اصلاحیه‌های امنیتی را داخل انتشارهای معمولی خود منتشر می‌کند. بنابراین به‌جای جست‌وجوی یک فایل وصله، مسیر درست این است که در پنل مدیریت به بخش Utilities > Update WHMCS بروید و نسخه پایدار فعلی را نصب کنید. توجه کنید که ارتقا پیش‌نیاز محیطی هم دارد: نسخه ۹ این نرم‌افزار به PHP 8.2 یا بالاتر نیاز دارد و ابزار به‌روزرسانی فقط نسخه‌ای را پیشنهاد می‌کند که سرور شما حداقل‌های آن را داشته باشد؛ روی PHP قدیمی‌تر، به‌روزرسانی به نسخه ۹ اصلاً به شما نشان داده نمی‌شود. لودر ionCube هم باید همانی باشد که سازنده برای نسخه PHP سرور شما منتشر کرده است.

ماژول‌ها و درگاه‌های پرداخت جانبی را هم به‌روز نگه دارید؛ آن‌ها هم کد اجرایی روی همان دامنه‌اند. پس از هر ارتقا صفحه Configuration > System Health را باز کنید تا هشدارهای پیکربندی و امنیتی باقی‌مانده را ببینید؛ راهنماهایی که این صفحه را زیر منوی Utilities نشان می‌دهند به نسخه‌های خیلی قدیمی مربوط‌اند.

پوشه مدیریت را از حالت پیش‌فرض خارج کنید

مسیر پیش‌فرض /admin اولین چیزی است که اسکنرهای خودکار امتحان می‌کنند. پوشه را به نامی دلخواه — فقط حرف و عدد و خط تیره — تغییر نام دهید و همان نام را، نه مسیر کامل، در configuration.php اعلام کنید:

$customadminpath = "myadmin1234";

این کار حمله را غیرممکن نمی‌کند، ولی حجم عظیمی از تلاش‌های خودکار برای حدس رمز را حذف می‌کند. یک نکته را فراموش نکنید: بعد از هر ارتقا باید فایل‌های تازه پوشه admin بسته نصبی را دستی داخل پوشه سفارشی خودتان کپی کنید، وگرنه ورود به پنل مدیریت خطا می‌دهد. اگر چند مشتری یا چند برند را روی یک بستر مدیریت می‌کنید — مثلاً روی سرویس نمایندگی هاست — این تغییر را برای هر نصب جداگانه انجام دهید و نام‌ها را یکسان نگذارید.

ورود مدیر را به IP‌های مشخص محدود کنید

اگر کارمندان شما از IP ثابت کار می‌کنند، بهترین لایه دفاعی این است که پوشه مدیریت را در سطح وب‌سرور ببندید. برای این کار یک فایل .htaccess داخل همان پوشه مدیریت بسازید. در آپاچی نسخه ۲.۴ نحو درست این است:

Require ip 12.34.56.78

و برای یک محدوده: Require ip 12.34.56.0/24؛ هر تعداد خط که لازم دارید اضافه کنید. دستورهای قدیمی order deny,allow و allow from مربوط به آپاچی ۲.۲ هستند و امروز فقط با ماژول سازگاری mod_access_compat کار می‌کنند؛ روی بسیاری از سرورها یا نادیده گرفته می‌شوند یا خطای ۵۰۰ می‌دهند. در Nginx فایل .htaccess اصلاً خوانده نمی‌شود و باید همین کار را در بلوک location با دستورهای allow و deny انجام دهید.

ورود دومرحله‌ای را برای همه کارمندان اجباری کنید

رمز عبور به‌تنهایی کافی نیست، چون می‌تواند از یک سایت دیگر لو برود. WHMCS به‌صورت داخلی از ورود دومرحله‌ای پشتیبانی می‌کند؛ هر مدیر از مسیر Account > My Account گزینه Two-Factor Authentication را روشن و روش Time Based Tokens را انتخاب می‌کند تا کد یک‌بارمصرف در اپلیکیشن احرازهویت گوشی تولید شود؛ کد پشتیبانِ نمایش‌داده‌شده را جای امنی نگه دارید. این قابلیت را برای همه حساب‌های کارمندی فعال کنید، نه فقط مدیر اصلی، و حساب کارمندانی که دیگر در مجموعه نیستند را غیرفعال کنید.

سطح دسترسی فایل‌ها را درست تنظیم کنید

فایل configuration.php حساس‌ترین فایل نصب شماست؛ کلید لایسنس، اطلاعات اتصال پایگاه‌داده و کلید رمزگذاری در آن قرار دارد. سازنده توصیه می‌کند سطح دسترسی آن را فقط-خواندنی کنید:

chmod 400 configuration.php

روی بعضی پیکربندی‌های سرور مقدار 400 باعث خطا در بارگذاری برنامه می‌شود؛ در آن حالت به‌ترتیب 440 و سپس 444 را امتحان کنید. فقط یادتان باشد هنگام تغییر کلید لایسنس باید موقتاً فایل را قابل نوشتن کنید — مستندات رسمی برای همین لحظه 755 را می‌گوید — و بلافاصله بعد از آن به 400 برگردید.

درباره پوشه‌ها، توصیه‌های قدیمی اینترنتی معمولاً 777 پیشنهاد می‌دهند. این عدد امروز لازم نیست: روی سرورهایی که PHP با کاربر خودِ اکانت اجرا می‌شود — حالت رایج در cPanel و DirectAdmin امروزی — سطح 755 کفایت می‌کند و 777 فقط ریسک اضافه می‌سازد. اگر تشخیص این موضوع روی سرور شما ساده نیست، با کسی که سرور را مدیریت می‌کند بررسی کنید؛ خدمات مدیریت و پشتیبانی سرور دقیقاً برای همین دست کارها ارائه می‌شود.

پوشه‌های نوشتنی و کرون را از دسترس وب خارج کنید

پوشه‌های نوشتنی، اگر از طریق مرورگر قابل دسترسی باشند، به محل مناسبی برای اجرای فایل آپلودشده تبدیل می‌شوند. WHMCS سه پوشه نوشتنی دارد: attachments، downloads و templates_c. هر سه را به مسیری بالاتر از public_html منتقل کنید. مسیر تازه templates_c در فایل پیکربندی اعلام می‌شود:

$templates_compiledir = "/home/username/templates_c/";

اما مسیر دو پوشه دیگر در configuration.php تعریف نمی‌شود. راهنماهایی که هنوز $attachments_dir و $downloads_dir را پیشنهاد می‌دهند به نسخه‌های قدیمی برمی‌گردند؛ امروز این کار از پنل مدیریت و از مسیر Configuration > System Settings > Storage Settings انجام می‌شود: در تب Configurations یک پیکربندی از نوع Local Storage با مسیر تازه بسازید و در تب Settings همان را انتخاب کنید. اگر خودِ پوشه را جابه‌جا کرده‌اید گزینه Switch و اگر پوشه خالی تازه ساخته‌اید گزینه Migrate درست است.

پوشه crons هم باید بالاتر از دایرکتوری وب برود و این کار سه مرحله دارد که جا انداختن هرکدام، اتوماسیون را بی‌سروصدا می‌خواباند:

  • خط $crons_dir = "/home/username/whmcs_crons/"; را به انتهای configuration.php اضافه کنید.
  • داخل پوشه منتقل‌شده فایل config.php.new را به config.php تغییر نام دهید و در آن مقدار $whmcspath را برابر مسیر کامل نصب WHMCS قرار دهید.
  • دستور کرون سرور را به فایل cron.php در محل تازه به‌روز کنید، وگرنه صدور فاکتور و تمدید سرویس متوقف می‌شود.

مثل پوشه مدیریت، بعد از هر ارتقا باید فایل‌های تازه پوشه crons را هم دستی روی مسیر سفارشی کپی کنید.

بکاپی که آزموده‌اید، نه بکاپی که فقط گرفته‌اید

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

جمع‌بندی

لینک‌های قدیمی انجمن WHMCS که سال‌ها پیش برای دانلود وصله معرفی می‌شدند دیگر در دسترس نیستند. چیزی که امروز جواب می‌دهد یک چک‌لیست ساده است: نسخه به‌روز، پوشه مدیریت تغییرنام‌یافته، دسترسی مدیر محدود به IP، ورود دومرحله‌ای فعال، configuration.php فقط-خواندنی، پوشه‌های نوشتنی و کرون بیرون از دایرکتوری وب، و یک نسخه پشتیبان آزموده‌شده. اگر این هفت مورد برقرار باشد، نصب شما از اکثریت نصب‌های موجود امن‌تر است.