در این مطلب نسبتاً مفصل قصد داریم که برخی از بهترین مهارت‌ها در امنیت php آشنا شویم. با ما همراه باشید.

۱) دشمن خود را بشناسید.

برنامه‌های مبتنی بر PHP با انواع مختلفی از حملات مواجه می‌شوند. برخی از مهمترین این حملات از قرار زیر خواهند بود:

XSS- اسکریپت‌های اشتراکی یک نقطه آسیب‌پذیر در برنامه‌های php  تحت وب محسوب می‌شوند. مهاجمان از این طریق می‌توانند به اطلاعات کاربران دسترسی پیدا کنند. برای این منظور شما می‌توانید سرور آپاچی را تنظیم کرده و کدهای php امن‌تری بنویسید.

نفوذ به SQL-  این نقطه آسیب‌پذیر در لایه پایگاه داده یک برنامه مبتنی بر php است. وقتی ورودی کاربر به شکلی نادرست فیلتر شود، هر  نوع عبارت SQL ممکن است توسط برنامه اجرا گردد. تنظیم سرور آپاچی و نوشتن کدهای امن می‌تواند برای جلوگیری از چنین حملاتی مؤثر باشد. یکی از روش‌های رایج در این زمینه، چشم‌پوشی از پارامترها با استفاده از تابع mysql_real_escape_string() قبل از ارسال کوئری SQL است.

کلاهبرداری

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

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

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

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

۲) پیدا کردن ماژول‌های داخلی PHP

برای مشاهده ماژول‌های داخلی کامپایل‌شده php فرمان زیر را تایپ کنید:


# php -m

نمونه خروجی

[PHP Modules]

apc

bcmath

bz2

calendar

Core

ctype

curl

date

dom

ereg

exif

fileinfo

filter

ftp

gd

gettext

gmp

hash

iconv

imap

json

libxml

mbstring

memcache

mysql

mysqli

openssl

pcntl

pcre

PDO

pdo_mysql

pdo_sqlite

Phar

readline

Reflection

session

shmop

SimpleXML

sockets

SPL

sqlite3

standard

suhosin

tokenizer

wddx

xml

xmlreader

xmlrpc

xmlwriter

xsl

zip

zlib

 

[Zend Modules]

Suhosin

به منظور ارتقای امنیت php و عملکرد آن، توصیه می‌شود که از حداقل ماژول‌ها استفاده کنید. به عنوان مثال، می‌توانید ماژول sqlite3 را با حذف فایل تنظیمات یا تغییر نام یک فایل با نام /etc/php.d/sqlite3.ini، غیرفعال کنید. این کار به‌وسیله فرمان زیر انجام می‌شود:


# rm /etc/php.d/sqlite3.ini

و یا:


# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable

سایر ماژول‌های داخلی تنها زمانی برداشته می‌شوند که یک نسخه خلاصه‌تر از PHP نصب کنید. امکان دریافت سورس‌کد php از php.net وجود دارد. در عین حال، شما می‌توانید آن را با پشتیبانی از GD، fastcgi و MySQL کامپایل کنید:


./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr \

--bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share \

--includedir=/usr/include --libexecdir=/usr/libexec --localstatedir=/var \

--sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info \

--cache-file=../config.cache --with-config-file-path=/etc \

--with-config-file-scan-dir=/etc/php.d  --enable-fastcgi \

-enable-force-cgi-redirect

۳) محدود کردن درز اطلاعات PHP

برای این منظور باید ابزار expose_php را غیرفعال کنید. در نتیجه باید به سراغ ویرایش /etc/php.d/secutity.ini بروید و تنظیم زیر را در آن وارد کنید:


expose_php=Off

وقتی expose_php فعال باشد، به تمام دنیا می‌فهماند که php بر روی سرور نصب شده است. از جمله اینکه در تیتر http نسخه php نشان داده می‌شود و لوگوی php نیز در معرض نمایش قرار می‌گیرد. در هنگام فعال‌بودن این ابزار می‌توانید با استفاده از فرمان زیر به نسخه php دسترسی پیدا کنید:


$ curl -I https://www.cyberciti.biz/index.php

نمونه خروجی:


HTTP/1.1 200 OK

X-Powered-By: PHP/5.3.3

Content-type: text/html; charset=UTF-8

Vary: Accept-Encoding, Cookie

X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session

Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT

...

همچنین توصیه می‌شود که با تنظیمات ServerTokens و ServerSignature در فایل httpd.conf، نسخه آپاچی و نسخه PHP 5/7 را در هنگام استفاده از Nginx مخفی کنید.

۴) حداقل کردن اجرای ماژول‌های PHP

php از ویژگی‌ای با عنوان «پسوند دینامیک» پشتیبانی می‌کند. به صورت پیش‌فرض، RHEL تمام پسوندهای ماژول‌های موجود در دایرکتوری /etc/php.d/ را اجرا می‌کند. برای فعال یا غیرفعال‌کردن یک ماژول، تنها کافی است که فایل تنظیمات را در دایرکتوری /etc/php.d/ پیدا کنید ودر آن نام ماژول موردنظر را بیابید. این در حالی است که امکان تغییرنام یا حذف فایل تنظیمات ماژول نیز وجود خواهد داشت. برای اینکه به بهترین سطح از امنیت php برسید، باید تنها پسوندهایی را فعال کنید که برنامه‌های تحت‌وب شما به آنها نیاز دارند. به عنوان مثال، برای غیرفعال‌کردن پسوند gd، می‌توانید از فرمان‌های زیر کمک بگیرید:


# cd /etc/php.d/

# mv gd.{ini,disable}

# /sbin/service httpd restart

برای فعال‌کردن ماژول php با عنوان gd داریم:

# mv gd.{disable,ini}

# /sbin/service httpd restart

۵) ثبت تاریخچه تمام خطاهای php

برای ارتقای امنیت php، تمام پیغام‌های خطای را در معرض بازدیدکنندگان سایت قرار ندهید. برای این منظور، فایل /etc/php.d/security.ini را ویرایش کرده و اصلاح زیر را در آن انجام دهید:


display_errors=Off

همچنین حتماً تمام خطاهای php را در یک فایل ذخیره کنید:


log_errors=On

error_log=/var/log/httpd/php_scripts_error.log

۶) جلوی ارسال فایل را بگیرید.

فایل /etc/php.d/security.ini را ویرایش کرده و با انجام اصلاح زیر، جلوی ارسال فایل را به لحاظ امنیت php بگیرید:


file_uploads=Off

اگر کاربران برنامه حتماً بایستی ارسال فایل داشته باشند، این ویژگی را با اِعمال محدودیت حجم فایل قابل‌قبول برای php فعال کنید:


file_uploads=On

# user can only upload upto 1MB via php

upload_max_filesize=1M

۷) غیرفعال‌کردن اجرای کد به صورت ریموت

اگر ابزار allow_url_fopen فعال بادش، به توابع فایل php مانند file_get_contents() اجازه می‌دهد که داده‌ها را از فواصل دور مانند FTP یا وب‌سایت برداشت کنند.

برنامه‌نویسان معمولاً این موضوع را فراموش می‌کنند. در اکثر مواقع، فیلترینگ مناسب برای ورودی داده‌های کاربران به این توابع ایجاد نمی‌شود. در نتیجه، کدگذاری آنها دچار آسیب‌پذیری می‌گردد. برای حل این مشکل، به سراغ ویرایش فایل /etc/php.d/security.ini بروید و اصلاح زیر را انجام دهید:


allow_url_fopen=Off

همچنین پشنهاد می‌شود که به لحاظ امنیت php، ویژگی allow_url_include را نیز غیرفعال کنید:


allow_url_include=Off

۸) فعال‌کردن حالت امن SQL

فایل /etc/php.d/security.ini را ویرایش کرده و اصلاح زیر را انجام دهید:


sql.safe_mode=On

در صورتی که این ویژگی فعال باشد، mysql_connect() و mysql_pconnect() از هر متغیری که به آنها وارد می‌شود، صرف‌نظر می‌کنند. به خاطر داشته باشید که در این حالت ممکن است نیاز به تغییر بخش‌های از کد باشد. در حالتی که sql.safe_mode فعال باشد، برنامه‌های ثالث و متن‌باز مانند وردپرس ممکن است کاملاً از کار بیفتند. همچنین غیرفعال‌کردن magic_quotes_gpc برای تمام نسخه‌های php 5.3.x توصیه می‌شود. در این نسخه‌ها فیلترینگ ناشی از این ابزار چندان کارآیی ندارد و توابعی مانند mysql_escape_string() واکنش بهتری نشان می‌دهند.


magic_quotes_gpc=Off

۹) کنترل ابعاد POST

از روش درخواست HTTP POST زمانی استفاده می‌شود که کلاینت (مرورگر یا کاربر) نیاز به ارسال داده وب‌سرور آپاچی داشته باشد. مثلا زمانی را درنظر بگیرید که یک فایل آپلود می‌شود و یا یک فرم تکمیل‌شده و ارسال می‌گردد. در این حالت، مهاجمان ممکن سعی کنند که با ارسال POST های حجیم، منابع سیستم‌تان را به پایان برسانند. برای جلوگیری از این موضوع، شما باید ابعاد POST را که php پردازش می‌کند، محدود کنید. برای این منظور، فایل /etc/php.d/security.ini را ویرایش کرده و تنظیم زیر را انجام دهید:


; Set a realistic value here

post_max_size=1K

مقدار 1K حداکثر ابعاد قابل‌قبول برای برنامه‌های php را مشخص می‌کند. این تنظیم همچنین بر فایل‌های ارسالی تأثیر می‌گذارد. برای ارسال فایل‌های حجیم، این مقدار باید بزرگتر از upload_max_filesize باشد. همچنین پیشنهاد می‌شود که روش‌های در دسترسی برای استفاده از وب‌سرور آپاچی را نیز محدود کنید. برای این منظور فایل httpd.conf را ویرایش کرده و تنظیم زیر را برای DocumentRoot /var/www/html انجام دهید:


<directory /var/www/html>

<limitExcept GET POST>

Order allow,deny

</limitExcept>

## Add rest of the config goes here... ##

</directory>

۱۰) کنترل منابع (کنترل حمله DoS)

امکان تنظیم زمان اجرا (به ثانیه) هر کدام از اسکریپت‌های php وجود دارد. یکی دیگر از گزینه‌های پیشنهادی، تنظیم زمانی است که هر کدام از اسکریپت‌ها برای داده‌های درخواستی منتظر می‌مانند. همچنین تنظیم حداکثر حافظه‌ای که یک اسکریپت‌ مصرف می‌کند. برای این منظور، فایل /etc/php.d/security.ini را ویرایش کرده و اصلاحات زیر را انجام دهید:


# set in seconds

max_execution_time =  30

max_input_time = 30

memory_limit = 40M

۱۱) نصب سیستم حفاظت پیشرفته Suhosin برای امنیت php

در صفحه توضیحات این پروژه می‌خوانیم:

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

۱۲) غیرفعال‌کردن توابع خطرناک PHP

php دارای مجموعه گسترده‌ای از توابع است که که در صورتی که به‌درستی استفاده نشوند، می‌توانند برای نفوذ به سرور به کار گرفته شوند. در عین حال، شما می‌توانید یک از سری از توابع را در /etc/php.d/security.ini تنظیم کنید. این کار با استفاده از مقداردهی به disable_functions صورت می‌گیرد:


disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

۱۳) مشخصه PHP Fastcgi / CGI – cgi.force_redirect

php با FastCGI کار می کند. Fascgi موجب می‌شود که میزان استفاده از حافظه وب‌سرور شما کاهش پیدا کند. در همین حال، شما هنوز هم قدرت و سرعت زبان php را در اختیار خواهید داشت. شما می‌توانید تنظیمات Apache2+PHP+FastCGI یا cgi را به شرح زیر انجام دهید. مشخصه تنظیمی cgi.force_redirect از هرگونه فراخوانی مستقیم از طریق آدرس اینترنتی جلوگیری می‌کند. در نتیجه، باید بنابر ملاحظات امنیتی، cgi.force_redirect را فعال کنید. برای این منظور، فایل /etc/php.d/security.ini را ویرایش کرده و اصلاح زیر را انجام دهید:


; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup

cgi.force_redirect=On

۱۴) شناسه کاربر و گروه php

mod_fastcgi یک ماژول cgi برای وب‌سرور آپاچی است و میتواند به سرور خارجی FastCGI متصل شود. در این حالت، شما باید مطمئن شوید که php به صورت یک کاربر غیر روت کار می‌کند. اگر php به عنوان یک کاربر روت یا یک کاربر با شناسه زیر ۱۰۰ کار کند، ممکن است به فایل‌های سیستمی دسترسی پیدا کرده و آنها را دستکاری کند. در نتیجه، باید با استفاده از mod_suPHP یا suEXEC در آپاچی، PHP CGI‌ها را به صورت کاربرانی بدون امتیازات ویژه اجرا کنید. ابزار suEXEC امکانی را برای کاربران آپاچی فراهم می‌کند که برنامه‌های CGI را تحت شناسه‌های مختلف از کاربران وب‌سرور اجرا کنند. در این مثال،  php-cgi به عنوان کاربر phpcgi اجرا شده و آپاچی به عنوان کاربر apache اجرا می‌شود:


# ps aux | grep php-cgi

خروجی نمونه:


phpcgi      6012  0.0  0.4 225036 60140 ?        S    Nov22   0:12 /usr/bin/php-cgi

phpcgi      6054  0.0  0.5 229928 62820 ?        S    Nov22   0:11 /usr/bin/php-cgi

phpcgi      6055  0.1  0.4 224944 53260 ?        S    Nov22   0:18 /usr/bin/php-cgi

phpcgi      6085  0.0  0.4 224680 56948 ?        S    Nov22   0:11 /usr/bin/php-cgi

phpcgi      6103  0.0  0.4 224564 57956 ?        S    Nov22   0:11 /usr/bin/php-cgi

phpcgi      6815  0.4  0.5 228556 61220 ?        S    00:52   0:19 /usr/bin/php-cgi

phpcgi      6821  0.3  0.5 228008 61252 ?        S    00:55   0:12 /usr/bin/php-cgi

phpcgi      6823  0.3  0.4 225536 58536 ?        S    00:57   0:13 /usr/bin/php-cgi

در عین حال، می‌توانید از ابزارهایی مانند spawn-fcgi برای ردیابی فرآیندهای ریموت و محلی FastCGI به عنوان کاربر phpcgi استفاده کنید. البته باید ابتدا کاربر phpcgi را به سیستم اضافه کنید:


# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi

حالا می‌توانید آپاچی، Lighttpd و Nginx را به‌گونه‌ای تنظیم کنید که از php FastCGI خارجی در پورت ۹۰۰۰ در آدرس 127.0.0.1  استفاده کنند.

۱۵) محدودیت دسترسی php به فایل‌های سیستمی

open_basedir تنظیم‌کننده دایرکتوری‌هایی است که php اجازه دسترسی به آنها را با استفاده از توابعی مانند fopen() خواهد داشت. اگر فایلی خارج از محدوده تعریف‌شده open_basdir باشد، php از باز کردن آن خودداری خواهد کرد. در همین حال، نمی‌توانید از یک آدرس سمبلیک استفاده کنید. به عنوان مثال، اگر دسترسی به /var/www/html وجود داشته باشد، نمی‌توان به دایرکتوری /var/www یا /tmp ارجاع داد.


; Limits the PHP process from accessing files outside

; of specifically designated directories such as /var/www/html/

open_basedir="/var/www/html/"

; ------------------------------------

; Multiple dirs example

; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"

; ------------------------------------

۱۶) مسیر Session

پشتیبانی از Session در php عبارتست از راهی برای حفظ داده‌های خاص در دسترسی‌هایی که برایشان اتفاق می‌افتد. چنین چیزی به شما کمک می‌کند که برنامه‌هایی سفارشی‌تر تولید کنید و سطح ظاهری وب‌سایتتان را ارتقا دهید. این مسیر در فایل /etc/php.ini تعریف شده و تمام داده‌های مربوط به یک session خاص در دایرکتوری‌ای که session.save_path تعیین می‌کند، ذخیره می شوند. حالت پیش‌فرض در لینوکس‌های RHEL/CentOS/Fedora به صورت زیر خواهد بود:


session.save_path="/var/lib/php/session"

; Set the temporary directory used for storing files when doing file upload

upload_tmp_dir="/var/lib/php/session"

حتماً دقت کنید که مسیر خارج از /var/www/html باشد و هیچکدام از کاربران دیگر سیستم نتوانند آن را بخوانند یا ویرایش کنند.


# ls -Z /var/lib/php/

نمونه خروجی


drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session

نکته: گزینه –Z در فرمان ls نشان‌دهنده حالت امنیتی SELinux از جمله وضعیت فایل، کاربر، گروه، محتوای امنیتی و عنوان فایل خواهد بود.

۱۷) به‌روز نگه‌داشتن php، نرم‌افزار و سیستم‌عامل

اضافه‌کردن بسته‌های امنیتی یکی از بخش‌های مهم حفظ و نگهداری سرورهای لینوکس، آپاچی، php و MySQL است. تمام آپدیت‌های امنیت php بایستی مورد ارزیابی قرار گرفته و با کمک فرمان زیر، در کمترین زمان ممکن اِعمال شوند:


# yum update

و یا:


# apt-get update && apt-get upgrade

ضمن اینکه می‌توانید لینوکس‌های Red hat / CentOS / Fedora را به‌گونه‌ای تنظیم کنید که آپدیت‌های بسته yum را به ایمیلتان ارسال کنند. گزینه دیگر نصب تمام آپدیت‌های امنیتی با cron job است. در توزیع‌های لینوکس دبیان و اوبونتو، می‌‌توانید از ابزار apticron نیز برای ارسال هشدارهای امنیتی استفاده کنید.

۱۸) محدود کردن دسترسی به فایل و دایرکتوری

حتماً دقت کنید که آپاچی را به صورت یک کاربر غیر روت مانند Apache یا www راه‌اندازی کنید. تمام فایل‌ها و دایرکتوری‌ها می‌بایست در مالکیت کاربر غیر روت تحت آدرس /var/www/html باشند:


# chown -R apache:apache /var/www/html/

/var/www/html/ یک ساب‌دایرکتوری است  و امکان ثبت تغییرات در DocumentRoot توس سایر کاربران وجود دارد. از آنجایی که  کاربر روت هیچ‌گونه فایلی خارج از آن اجرا نمی‌کند و نباید هم فایل در آنجا ایجاد کرد.

بنابراین حتماً دقت کنید که مجوز فایل‌ها در /var/www/html/ به صورت فقط خواندنی و با کد 0444 باشند.


# chmod -R 0444 /var/www/html/

همچنین تمام مجوزهای دایرکتوری‌های تحت /var/www/html/ را به صورت 0444 تنظیم کنید:


# find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}

نکاتی در مورد تنظیم درست مجوزهای فایل‌ها

فرمان‌های chown و chmod باعث می‌شود که تحت هیچ شرایطی DocumentRoot یا فایل‌های موجود در آن بوسیله کاربر وب‌سرور آپاچی قابل‌تغییر نباشند. به خاطر داشته باشید که مجوزها را باید بر اساس مدل توسعه وب‌سایت خود تنظیم کنید. بنابراین باید در استفاده از فرمان‌های chown و chmod به خود آزادی عمل بدهید. در مثال زیر، وب‌سرور آپاچی به صورت کاربر apache اجرا شده است. چنین چیزی با استفاده از تنظیم User و Group در فایل httpd.conf انجام می‌شود. کاربر apache باید به خواندن تمام فایل‌های موجود DocumentRoot دسترسی داشته باشد، امّا لزوماً نباید بتواند همه آنها را ویرایش کند.

بر این اساس، حتماً دقت کنید که فایل httpd.conf حاوی تنظیمات زیر باشد:


<directory / >

Options None

AllowOverride None

Order allow,deny

</directory>

شما بایستی تنها در صورت نیاز، دسترسی ایجاد کنید. برخی برنامه‌های  تحت‌وب مانند وردپرس ممکن است نیاز به یک دایرکتوری ذخیره یا caching داشته باشند. امکان ایجاد دسترسی به این دایرکتوری ذخیره، با استفاده فرمان زیر وجود خواهد داشت:


# chmod a+w /var/www/html/blog/wp-content/cache

### block access to all ###

# echo 'deny from all' > /var/www/html/blog/wp-content/cache/.htaccess

۱۹) حفاظت از ویرایش فایل‌های تنظیمات آپاچی، php و MySQL

به منظور حفاظت از ویرایش فایل‌های تنظیمات از فرمان chattr استفاده کنید:


# chattr +i /etc/php.ini

# chattr +i /etc/php.d/*

# chattr +i /etc/my.ini

# chattr +i /etc/httpd/conf/httpd.conf

# chattr +i /etc/

فرمان chattr همچنین می‌تواند از فایل‌ یا فایل‌های php شما در دایرکتوری /var/www/html نیز محافظت کند:


# chattr +i /var/www/html/file1.php

# chattr +i /var/www/html/

۲۰) استفاده از افزونه‌های امنیتی لینوکس مانند SELinux

برخی بسته‌های امنیتی در لینوکس می‌توانند از شما در مقابل تنظیمات نامناسب و یا برنامه‌های سرور مخرب محافظت کنند. ابزار امنیتی SELinux و دیگر افزونه‌های لینوکس برای ایجاد محدودیت بر شبکه و دیگر برنامه‌ها توصیه می‌شوند. SELinux مجموعه امنیتی متنوعی را برای کرنل لینوکس و وب‌سرور آپاچی ارائه می‌کند که در مطالب قبلی به آن اشاره شد. برای تهیه لیست از تمام متغیر امنیتی آپاچی SELinux فرمان زیر را تایپ کنید:


# getsebool -a | grep httpd

نمونه خروجی


allow_httpd_anon_write --> off

allow_httpd_mod_auth_ntlm_winbind --> off

allow_httpd_mod_auth_pam --> off

allow_httpd_sys_script_anon_write --> off

httpd_builtin_scripting --> on

httpd_can_check_spam --> off

httpd_can_network_connect --> off

httpd_can_network_connect_cobbler --> off

httpd_can_network_connect_db --> off

httpd_can_network_memcache --> off

httpd_can_network_relay --> off

httpd_can_sendmail --> off

httpd_dbus_avahi --> on

httpd_enable_cgi --> on

httpd_enable_ftp_server --> off

httpd_enable_homedirs --> off

httpd_execmem --> off

httpd_read_user_content --> off

httpd_setrlimit --> off

httpd_ssi_exec --> off

httpd_tmp_exec --> off

httpd_tty_comm --> on

httpd_unified --> on

httpd_use_cifs --> off

httpd_use_gpg --> off

httpd_use_nfs --> off

To disable Apache cgi support, enter:

# setsebool -P httpd_enable_cgi off

۲۱) نصب Mod_security

ModSecurity یک ابزار متن‌باز تشخیص و جلوگیری از نفوذ برای برنامه‌های تحت‌وب است. شما می‌توانید به‌راحتی این ابزار را در لینوکس نصب کرده و برنامه‌های مبتنی بر php را در برابر حملات xss و … محافظت کنید.


## A few Examples ##

# Do not allow to open files in /etc/

SecFilter /etc/

# Stop SQL injection

SecFilter "delete[[:space:]]+from"

SecFilter "select.+from"

۲۲)  در صورت امکان آپاچی /PHP را در یک فضا ایزوله اجرا کنید.

قرار دادن php و یا آپاچی در یک فضای ایزوله و در یک بخش کوچک از فایل‌های سیستمی، ریسک ناشی از خطرات احتمالی را به حداقل می‌رساند. امکان استفاده از تنظیمات ایزوله معمولی در آپاچی وجود دارد. FreeBSD jails، شبیه‌سازی XEN و OpenVZ، همگی می‌توانند ابزاری برای این منظور باشند.

۲۳) استفاده از فایروال برای محدود کردن ارتباطات خروجی

مهاجم می‌تواند با استفاده از ابزارهایی مانند wget، فایل‌ها را بر روی وب‌سرور شما دریافت کند. در عین حال، شما می‌توانید از iptable ها برای بلوکه‌کردن ارتباطات خروجی از کاربر apache استفاده کنید. ماژول ipt_owner  سعی می‌کند که مشخصه‌های مختلف یک بسته داخلی را با سازنده آن تطبیق دهد. این ماژول تنها در زنجیره OUTPUT یافت می‌شود. در این مثال، به کاربر vivek اجازه داده می‌شود که با استفاده از پورت ۸۰، ارتباط خروجی داشته باشد‌؛ موضوعی که برای دسترسی RHN یا دریافت بروزرسانی‌های CentOS مفید خواهد بود.


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

در اینجا مثال دیگری را داریم که تمام ارتباطات خروجی کاربر آپاچی را به جز ارتباطی که با سرور smtp و سرویس API تشخیص اسپم دارد، بلوکه می‌کند:


# ....

/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 192.168.1.100 --dport 25 -j RETURN

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

/sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.62 --dport 80 -j RETURN

/sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.61 --dport 80 -j RETURN

/sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.89 --dport 80 -j RETURN

/sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.88 --dport 80 -j RETURN

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

## Add more rules here ##

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

# No editing below

# Drop everything for apache outgoing connection

/sbin/iptables --append apache_user -j REJECT

۲۴) بررسی تاریخچه عملکرد و حسابرسی سرور

فایل تاریخچه عملکرد apache را بررسی کنید. برای این منظور می‌توانید از فرمان‌های grep و egrep کمک بگیرید:


# 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

مشاهده فایل تاریخچه عملکرد یکی از روش‌های مناسب در ارزیابی امنیت php است. در این فایل شما درک بسیار خوبی از حملات به سرور پیدا می‌کنید و تشخیص می‌دهید که چه سطح امنیتی برایتان موردنیاز است. ضمن اینکه سرویس auditd برای حسابرسی سیستم ارائه شده است. این سرویس را می‌توانید برای اهدافی مانند اتفاقات مرتبط با SELinux، تأیید دسترسی، اصلاح فایل‌ها و حساب‌های کاربری استفاده کنید. همچنین استفاده از ابزار استاندارد موسوم به “Linux System Monitoring Tools” برای پایش وب‌سرور به شما توصیه می‌شود.

۲۵) راه‌اندازی سرویس برای هر سیستم یا VM

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


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

/ ISP/Router /

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

\

|

Firewall

\

|

+------------+

| LB01       |

+------------+                 +--------------------------+

|                 | static.lan. ariaservice.net |

+-----------------+--------------------------+

| phpcgi1.lan. ariaservice.net |

+--------------------------+

| phpcgi2.lan. ariaservice.net |

+--------------------------+

| mysql1.lan. ariaservice.net |

+--------------------------+

| mcache1.lan. ariaservice.net |

+--------------------------+

سرویس‌های شبکه مختلف را در سرورها یا VM های جداگانه راه‌اندازی کنید. چنین کاری می‌تواند تعداد خدمات دیگری را که ممکن است تحت‌الشعاع قرار گیرند، کاهش دهد. به عنوان مثال، اگر یک مهاجم بتواند به یک نرم‌افزار مانند Apache flow نفوذ کند، ممکن است بتواند به تمام سرویس‌های دیگر وجود در سرور مانند MySQL و ایمیل دسترسی پیدا کند.  در مثال بالا، سرورها به صورت زیر تعریف شده‌اند:

static.lan.ariaservice.net –استفاده از سرور لایت‌تی‌پی‌دی یا انجینیکس برای ابزارهای استاتیک مانند تصاویر، جی‌اس و سی‌اس‌اس.

phpcgi1.lan. ariaservice.net and phpcgi2.lan. ariaservice.net –وب‌سرور آپاچی همراه با پی‌اچ‌پی برای تولید محتوای دینامیک

mysql1.lan. ariaservice.net – سرور پایگاه داده مای‌اس‌کیو‌ال

mcache1.lan. ariaservice.net –

سرور Memcached یک سیستم ذخیره بسیار سریع برای MySQL محسوب می‌شود. این سرور از ابزار libevent یا epoll برای پوشش هر تعداد از ارتباط‌های باز استفاده می‌کند و از شبکه بدون قطعی I/O بهره می‌برد.

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

۲۶) ابزارهای اضافی

PHPIDS

در صفحه پروژه می‌خوانیم:

سیستم تشخیص نفوذ php یا PHPIDS یک ابزار ساده، سریع و با ساختار متناسب است.  این ابزار از آخرین تکنولوژی‌های امنیتی برای برنامه‌های وب مبتنی بر php بهره می‌برد. سیستم ISD چیزی را حذف یا فیلتر نمی‌کند. بلکه به شکلی ساده، حمله مهاجمین را تشخیص داده و اقدام دلخواه شما را انجام می‌دهد.

PhpSecInfo

در صفحه پروژه می‌خوانیم:

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

اطلاعات امنیتی در مورد برنامه مبتنی بر php

اطلاعات امنیتی در مورد برنامه مبتنی بر php

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

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

  • دریافت فایل
  • ارسال فایل
  • نصب روت‌کیت‌ها
  • تنظیم سرورهای ایمیل اسپم
  • تنظیم یک سرور پروکسی برای مخفی‌کردن رهگیری‌ها
  • به‌دست گرفتن کنترل سرور
  • سرقت تمام اطلاعات
  • حذف تمام اطلاعات و پایگاه داده
  • باز کردن پورت‌های TCP و UDP
چگونه درهای مخفی php را جستجو کنیم؟

می‌توانید از فرمان grep در لینوکس یا یونیکس برای جستجو بسته c99 یا r57 استفاده کنید. برای این منظور داریم:


# 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 است، ارتقا یافته است. با این وجود، هنوز هم ممکن نقاط آسیب‌پذیری در سیستم شما باشند. برای برطرف‌کردن این نقاط لازم است که از مراجع و منابع مختلف، مشورت‌های لازم را بگیرید.