اقدامات امنیتی مناسب در PHP | قسمت چهارم

زمان مطالعه: 4 دقیقه
انتشار :
۱۳۹۷-۱۰-۰۹

۱۱.در صورت امکان PHP و Apache را در یک فضای محدود (Chroot jail ) اجرا کنید. اقدامات امنیتی | قسمت چهارم
قرار دادن PHP و یا Apache در یک فضای محدود با محصور کردن سرور در یک بخش کوچک از فایلهای سیستمی ، آسیبهای ناشی از حملات احتمالی را به حداقل می رساند. شما می توانید نوع سنتی chroot همراه Apache را نصب کنید. با این حال من پیشنهاد می کنم از FreeBSD jailsXEN virtulizationKVM virtulizationو یا OpenVZ virtualization استفاده کنید.

  1. برای محدود کردن تماسهای خروجی از firewall استفاده کنید

مهاجمان معمولاً با استفاده از ابزاری مانند wget فایلها را به صورت local بر روی سرور شما دانلود     می کنند. برای مسدود کردن تماسهای خروجی از سوی کاربر Apache از iptables استفاده کنید. ماژول ipt_owner تلاش می کند تا مشخصات مختلف سازنده ی packet را برای packetهایی که به صورت local ایجاد می شوند ، شناسایی کرده و مطابقت دهد. این کار فقط برای زنجیره ی خروجی معتبر است. در این مثال به کاربر vivek اجازه داده شده است که با استفاده از پورت ۸۰ تماس خروجی داشته باشد( که برای RHN و دسترسی به centos repo مفید است) :

/sbin/iptables -A OUTPUT -o eth0 -m owner –uid-owner vivek -p tcp –dport ۸۰ -m state –state NEW,ESTABLISHED -j ACCEPT

در مثال بعدی کلیه ی تماسهای خروجی کاربر Apache به غیر از تماس با smtp server و سرویس API برای شناسایی و اعتبار سنجی spam مسدود شده است:

# ….

/sbin/iptables –new-chain apache_user

/sbin/iptables –append OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

/sbin/iptables –append OUTPUT -m owner –uid-owner apache -j apache_user

# allow apache user to connec to our smtp server

/sbin/iptables –append apache_user -p tcp –syn -d ۱۹۲.۱۶۸.۱.۱۰۰ –dport ۲۵ -j RETURN

# Allow apache user to connec to api server for spam validation

/sbin/iptables –append apache_user -p tcp –syn -d   ۶۶.۱۳۵.۵۸.۶۲ –dport ۸۰ -j RETURN

/sbin/iptables –append apache_user -p tcp –syn -d   ۶۶.۱۳۵.۵۸.۶۱ –dport ۸۰ -j RETURN

/sbin/iptables –append apache_user -p tcp –syn -d   ۷۲.۲۳۳.۶۹.۸۹ –dport ۸۰ -j RETURN

/sbin/iptables –append apache_user -p tcp –syn -d   ۷۲.۲۳۳.۶۹.۸۸ –dport ۸۰ -j RETURN

#########################

## Add more rules here ##

#########################

# No editing below

# Drop everything for apache outgoing connection

/sbin/iptables –append apache_user -j REJECT

  1. ۱۳.مراقب موارد ثبت شده و بازرسیهای خود باشید

فایل ثبت وقایع Apache را چک کنید:

# tail -f /var/log/httpd/error_log
# grep ‘login.php’ /var/log/httpd/error_log
# egrep -i “denied|error|warn” /var/log/httpd/error_log

فایل ثبت وقایع PHP را چک کنید:

# tail -f /var/log/httpd/php_scripts_error.log
# grep “…etc/passwd” /var/log/httpd/php_scripts_error.log

اقدامات امنیتی | قسمت چهارم

فایلهای ثبت وقایع شما را با آنچه که حملات بر سر سرور شما می آورند ، آشنا کرده و به شما این امکان را می دهند که متوجه شوید که آیا سرور شما از سطح امنیتی لازم برخوردار هست؟ سرویس های بازرسی نیز برای بررسی سیستم فراهم شده اند. این سرویس را برای یررسی وقایع SELinux ، تأیید و ارزیابی وقایع ، اصلاح فایل ها ، اصلاح حساب ها و مانند آن فعال کنید. همچنین پیشنهاد می کنم از ابزارهای استاندارد نظارت بر سیستم Linux برای نظارت بر سرور مجازی خود استفاده کنید.

  1. ۱۴.خدمات را در سیستم   یا نمونه ی VM اجرا کنید.

در موارد نصب سیستمهای بزرگ ، توصیه می شود که database ، فایلهای دینامیک و ایستا (ثابت) را از سرورهای مجزا اجرا کنید.

///////////////

/ ISP/Router /

//////////////

\

   |

   Firewall

     \

     |

     +————+

     | LB01       |

     +————+                 +————————–+

                 |                 | static.lan.cyberciti.biz |

               +—————–+————————–+

                                   | phpcgi1.lan.cyberciti.biz|

                                   +————————–+

                                   | phpcgi2.lan.cyberciti.biz|

                                   +————————–+

                                   | mysql1.lan.cyberciti.biz |

                                   +————————–+

                                   | mcache1.lan.cyberciti.biz|

                                   +————————–+

(Fig.01: Running Services On Separate Servers)

خدمات شبکه های مختلف را بر روی سرورهای جداگانه و یا نمونه های VM اجرا کنید. این کار تعداد سرویسهایی را که ممکن است شناسایی شده و به خطر بیفتند ، به حداقل می رساند. برای مثال اگر یک مهاجم بتواند به یک نرم افزار مانند سیستم اطلاعات Apache دست پیدا کند ، می تواند به تمام سرویسهایی که از طریق همان سرور ارائه می شوند ( مانند MySQL و سرور ارائه ی خدمات ایمیل و …) ،نیز دسترسی پیدا کند. اما در مثال بالا سرویسها به شکل زیر دسته بندی و ارائه می شوند:

  1. _ از سرور های lighttpd یا nginx برای منابع ایستا مانند js/css/images استفاده کنید.
  2. _ سرور Apache و PHP برای تولید محتوای دینامیک استفاده می شود.
  3. _ سرور MySQL database
  4. _ سرور Memcachedیک سیستم caching بسیار سریع برای MySQL است. این سیستم از libevent یا epoll برای درجه بندی تعداد اتصالات باز استفاده می کند و همچنین از شبکه های غیرمسدود I/O استفاده می کند.
  5. LB01 _ یک سرور Nginx و پراکسی reverse در مقابل سرورهای Apache .تمامی تماسهای ورودی از اینترنت به یک سرور از طریق سرور پراکسی nginx ردیابی می شوند ، که ممکن است این ردیابی به درخواست خودش یا به صورت کامل یا نیمه به درخواست سرور اختصاصی اصلی انجام شود. LB01 یک توازن بار ساده ایجاد می کند.
  6. ۱۵.ابزار اضافی

PHPIDS (سیستم تشخیص حمله به PHP ) یک لایه ی امنیتی خوش ساخت، هنرمندانه و ساده برای برنامه های تحت وب بر پایه ی PHP است. IDS نه ورودیهای خطرناک را شناسایی و حذف می کند و نه آنها را فیلتر می کند ، بلکه به سادگی هر زمان که یک مهاجم سعی در ورود به سایت شما داشته باشد ، آن را تشخیص داده و طبق خواسته ی شما نسبت به آن واکنش نشان می دهد.

شما می توانید از PHPIDS برای شناسایی کاربران پرخطر استفاده کرده و تمام حملاتی که تشخیص داده شده است را برای بررسیهای بعدی ثبت کنید.

اقدامات امنیتی | قسمت چهارم
PhpSecInfo
 تعادلی در عملکرد phpinfo() که اطلاعات امنیتی را از محیط PHP گزارش می دهد، برقرار می کند و پیشنهاداتی برای بهتر شدن و پیشرفت ارائه می دهد. این سیستم جایگزین تکنیکهای امنیتی نیست و هیچ کد یا بازرسی برنامه ای ندارد ، اما می تواند ابزار خوبی برای رویکردهای امنیتی چندلایه باشد.

نکته ای در مورد فایل های مخفی PHP

ممکن است با دستورات پنهانی PHP یا آنچه که بطور رایج فایلهای مخفی PHP نامیده می شوند ، مثل c99, c99madshell, r57 و مانند آن ، مواجه شوید. دستورات مخفی همان دستورات پنهانی هستند که برای عبور از اعتبارسنجی ها و در صورت لزوم دستیابی به سرور شما مورد استفاده قرار می گیرند. این دستورات توسط مهاجمینی که به سرور شما دسترسی دارند و در عین حال سعی می کنند ناشناس باقی بمانند ، بر روی سرور شما نصب می شوند. بطور معمول یک دستور PHP ( و یا هر دستور CGI دیگر ) به اشتباه اجازه ی به کارگیری کدهای آسیب رسان را هم در مرورگر وب می دهد. مهاجم می تواند با به کارگیری این کدهای     آسیب رسان پوسته های مخفی را آپلود کند که امکاناتی را در اختیار وی قرار می دهد، امکاناتی از قبیل:

  • دانلود فایل
  • آپلود فایل
  • نصب rootkit
  • · ایجاد spam در سرور سرویس mail و سرور تقویت
  • ایجاد سرور پراکسی برای مخفی کردن مسیرها
  • به دست گرفتن کنترل سرور
  • به دست گرفتن کنترل سرور database
  • سرقت تمامی اطلاعات
  • حذف تمامی اطلاعات و database
  • باز کردن پورتهای TCP/UDP و حتی بیشتر از آن
نکته: چگونه دستورات مخفیPHP  را جستجو کنیم؟

برای جستجوی پوسته ی c99 یا r57 از دستور Unix / Linux grep استفاده کنید:

# grep -iR ‘c99’ /var/www/html/
# grep -iR ‘r57’ /var/www/html/
# find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99
# grep -RPn “(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)” /var/www/html/

نتیجه

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

بازخوردها
مقالات مرتبط
گیم فیشینگ چیست؟
گیمیفیکیشن چیست و چه تاثیری بر کسب و کارها دارد؟
یکی از نوین‌ترین روش‌ها برای برقراری ارتباط با مشتریان و یا مخاطبان، استفاده از روش‌های گیمیفیکیشن Gamification است.…
زمان مطالعه: 5 دقیقه
انواع سیستم عامل چیست ؟
سیستم عامل چیست؟ (معرفی انواع سیستم عامل)
بدون شک تمامی افرادی که با سیستم‌ها و تجهیزات کامپیوتری در ارتباط هستند، نام سیستم‌عامل را شنیدند و…
زمان مطالعه: 4 دقیقه