1- بدست آوردن ورژن php سرور
php -v
خروجی مانند زیر خواهید دید
PHP 5.4.45 (cli) (built: Jul 22 2016 19:13:31)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
2- برای مشاهده ماژول های کامپایل شده php از دستور زیر استفاده کنید
php -m
خروجی شبیه زیر خواهید داشت برای امنیت بیشتر بهتر است ماژول های که به ان احتیاج ندارید را غیر فعال کنید
[PHP Modules]
bz2
calendar
Core
ctype
curl
date
ereg
exif
fileinfo
filter
ftp
gettext
gmp
hash
iconv
ionCube Loader
json
libxml
mbstring
mhash
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
tokenizer
xml
zip
zlib
جهت غیر فعال کردن ماژول مورد نظر می توانید ان را از مسیر php.d حذف و یا ان را انتقال دهید. برای مثال در صورتی که بخواهید ماژول SimpleXML را غیر فعال کنید می توانید از دستورات زیر استفاده کنید.
# rm /etc/php.d/SimpleXML.ini
یا
mv /etc/php.d/SimpleXML.ini /etc/php.d/SimpleXML.disable
3- جهت جلوگیری از نشر اطلاعات php وارد مسیر زیر شوید و expose_php را غیر فعال کنید
nano etc/php.d/security.ini
expose_php=Off
سپس برای اعمال تغییرات اپاچی خود را ریست کنید.
زمانی که expose_php فعال باشد با زدن دستور زیر تمام اطلاعات مربوط به php شما شامل نسخه و سایر اطلاعات برای مهاجمان قابل نمایش است و با استفاده از ان می توانند سرور شما را مورد حمله قرار دهند
curl -I http://www.wikiconfig.ir/index.php
خروجی مانند زیر را مشاهده خواهید کرد :
HTTP/1.1 200 OK
Date: Thu, 13 Oct 2016 06:18:40 GMT
Server: Apache
X-Powered-By: PHP/5.5.45
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
همچنین توصیه می شود که دستورات server Tokens و server signature را نیز در فایل httpd.conf تنظیم کنید تا نسخه آپاچی و سایر اطلاعات را نیز مخفی شوند.
ابتدا فایل httpd.conf را با استفاده از یک وایرایش گر متن باز کنید
vi httpd.conf
و دستورات را به صورت زیر اضافه و یا تغییر دهید.
server signature off
server Tokens prod
سپس فایل را ذخیر و اپاچی را مجددا راه اندازی کنید
4- php از اکستنشن های مختلفی پشتیبانی می کند که بسیاری از انها مور نیاز نیستند برای افزایش امنیت php می توانید مازول های که به انها نیاز ندارید را غیر فعال کنید و در زمان نیاز انها را مجددا فعال نمایید . لیست ماژول ها را می توانید در مسیر زیر مشاهده کنید و هرکدام را که نیاز ندارد با قرار دادن علامت # در کنار ان ، ان را غیر فعال کنید.
/etc/php.d
و یا می توانید از دستورات زیر استفاده کنید برای مثال جهت غیر فعال کردن ماژول gd به صورت زیر دستورات را اجرا کنید
cd
mv gd.{ini,disable}
/sbin/service httpd restart
برای فعال کردن مجدد ماژول gd دستور زیر را اجرا کنید
mv gd.{disable,ini}
/sbin/service httpd restart
5- خطا های php را در یک فایل log ذخیره کنید و ان را به کاربران سایت نمایش ندهید.
برای این منظور فایل etc/php.d/security.ini را ویرایش کنید. و دستورات زیر را تنظیم کنید.
Display_error=OFF
و جهت ذخیره خطا ها در فایل لاگ مسیر ان را به صورت زیر تنظیم کنید.
Log_error=On
Error_Log=/var/Log/httpd/Php_Scripts_error.log
6- برای امنیت بیشتر بهتر است آپلود فایل را غیر فعال کنید درصورتی که برنامه شما نیاز به آپلود فایل دارد بهتر است برای اندازه فایل آپلودی خود اندازه ای را در نظر بگیرید در ادامه فایل بالا می توانید دستور زیر را تنظیم کنید.
File_uploads=off
یا
file_Uploads=on
Upload_Max_Filesize=1M up to 2M
همچنین با آیتم زیر می توانید حداکثر زمان اجرای هر اسکریپت به ثانیه
Max_execution_time=30
و
memory_limit = 40M
Max_input_time=60
7- برای امنیت بیشتر بهتر است اجازه ندهیم کد ها php از راه دور قابل اجرا باشد
برای این منظور ایتم زیر را بر روی off تنظیم کنید.
allow_url_fopen=off
و دستور زیر را نیز غیر فعال کنید
allow-url-include=off
8- درصورتی که mySql_connect() وmySql_pcomect() رروی on تنظیم شده باشد هر گونه استدلالی که ارسال شود نادیده گرفته خواهد شد. لطفا توجه داشته باید در صورت فعال بودن این دو مد لازم است بعضی تغییرات را در که های خود اصلاح کنید. برای امنیت بیشتر بهتر است Sql.safe_mode بررویon تنظیم شود ولی با این کار ممکن است بعضی از برنامه های اپن سورس مانند وردپرس نتوانند به خوبی کار کنند. این گزینه به صورت پیش فرض بروی off تنظیم است
همچنین پیشنهاد می شود برای ورژن 5.3 و بالا تر php ایتم magic_quates_gpc برروی off تنظیم شود
mySql_connect()=on
mySql_pcomect()=on
Sql.safe_mode=off
magic_quates_gpc=off
9-با دستور زیر در خواست های post را برای php محدود کنید عدم محدودیت برای این دستور باعث می شود که مهاجمان بتوانند با ارسال در خواست های فیک منابع سرور را مصرف کنند و در عملکرد سرور اختلال ایجاد کنند.
post_max_size=1k
با این دستور حداکثر اندازه post هاphp مقدار 1k در نظر گرفته خواهد شد. این مقدار بر اندازه فایل های که قرار است آپلود شود نیز تاثیر خواهد گذاشت . برای اپلود فایل های بزرگ این مقدار باید بزرگتر از Upload_max_filesize در نظر گرفته شود. همچنین پیشنهاد می شود این محدودیت ها را برروی اپاچی نیز اعمال نمایید برای این منظور فایل httpd.conf را بازکنید و دستور زیر را تنظیم کنید.
nano /var/www/html/httpd.conf
کد زیر را ویرایش کنید
<directory /var/www/html>
<limit Except GET post>
ordert allow,deny
<limit Except>
## Add rest of the config goes here ...##
</directory>
10- وردپرس و بسیاری از برنامه های متن باز از کاربران در خواست می کنند جهت محافظت از منابع سرور خود برنامه Suhosin را بر روی سرور خود نصب کنند.
می توان suhosin را به عنوان یک اکستنشن نصب کرد.
# wget http://download.suhosin.org/suhosin-0.9.33.tgz
# tar -xvf suhosin-0.9.33.tgz
# yum install php-devel
برای نصب suhosin روی php5 در centos دستورات زیر را وارد کنید.
# cd suhosin-0.9.33
# phpize
# ./configure
# make
# make install
برای ایجاد فایل پیکربندی suhosin دستورات زیر را وارد کنید.
echo 'extension=suhosin.so' > /etc/php.d/suhosin.ini
از دستور زیر جهت ریست وب سرور استفاده کنید
service httpd restart
واگر از Lighttpd استفاده می کنید با دستور زیر ریستارت را انجام دهید
service lighttpd restart
جهت تایید نصب suhosin پس از تایپ دستور زیر باید در خروجی suhosin را مشاهده کنید.
php -v
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/suhosin.so' - /usr/lib64/php/modules/suhosin.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
11- بسیاری از توابع php که به درستی در سرور استفاده نشده اند می توانند برای سرور خطرناک باشند پس بهتر است توابع موجود در مسیر زیر را با دستورات زیر غیر فعال کنید.
nano /etc/php.d/security.ini
disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
12- تابع force-redirect اجازه نمی دهد که به طور مستقیم از طریق url با php در ارتباط باشید برای افزایش امنیت این تابع رااز مسیر زیر فعال کنید.
nano /etc/php.d/security.ini
; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup
cgi.force_redirect=On
13-کار بر php و group id
mod-fastcgi یک cgi-module برای وب سرور اپاچی است که می تواند به سرور FASTCGI خارجی وصل شود. شما باید مطمئن باشید که php توسط یک کاربر ، غیر از کاربر root اجرا می شود. اگر php توسط کاربر root و یا یک UID(یوزر ای دی ) زیر 100 اجرا شود می تواند به فایل های سیستمی دسترسی داشته باشد. و آنها را دستکاری کند شما باید بتوانید cgiهای php رابه عنوان کاربران غیر مجاز با استفاده از suEXEC یا mod_suPHP اپاچی اجرا کنید. قابلیت 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
ای پی اتصال 127.0.0.1
شماره پورت 9000
کاربر مجاز به اتصال phpcgi
نام کروه کاربر مجاز به اتصال phpcgi
مسیر اتصال /usr/bin/php-cgi
با دستور با لا شما می توانید آپاچی ، لایت اسپید و nginx را برای استفاده از external php FastCGI در پورت 9000 ای پی 127.0.0.1 کانفیگ کنید.
14- باید دسترسی php به فایل های سیستمی را محدود کنید. دستور open_basedir دایرکتوری های را ایجاد می کند که از طریق آن php قادر است با استفاده از توابع مانند Fopen() به فایل ها دسترسی داشته باشد. اگر یک فایل خارج از مسیر تعرف شده توسط open_basedir قرار داشته باشد php آن را باز نمی کند و شما نمی توانید از یک symboliclink برای حل مشکل استفاده کنید. برای مثال می توانید تعریف کنید که فقط دسترسی به مسیر /var/www/html مجاز باشد نه دسترسی به دایرکتوری های دیگر مانند /var/www, یا /tmp یا /etc
; Limits the PHP process from accessing files outside
; of specifically designated directories such as /var/www/html/
open_basedir="/var/www/html/"
; ------------------------------------
دسترسی به چند مسیر توسط php
; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"
چند مسیر مختلف با دو نقطه از هم جدا خواهند شد .
15- session support راهی برای حفظ اطلاعات خاص جهت استفاده، در دسترسی های یا نشست های بعدی است. این به شما این امکان را می دهد تا برنامه های سفارشی بیشتری بسازید و درخواست های مشاهده مجدد سایت خود را افزایش دهید. این مسیر در فایل etc/php.ini تعریف شده است و تمام اطلاعات مربوط به یک جلسه خاص در یک فایل دایرکتوری مشخص توسط گزینه session.save_path ذخیره می شود. مسیر پیش فرض در centos به صورت زیر است.
session.save_path="/var/lib/php/session"
تنظیم پوشه tmp برای ذخیره session ها
upload_tmp_dir="/var/lib/php/session"
مطمئن شوید که مسیر outside /var/www/html قابل خواندن و نوشتن توسط سایر کاربران سیستم نیست با دستور زیر
# ls -Z /var/lib/php/
خروجی شبیه زیر خواهیددید.
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
نکته : -z در دستور LS نشانگرهای امنیت SELinux مانند حالت فایل ، کاربر، گروه ، زمینه امنیتی، نام فایل را نشان می دهد.
16- اپاچی ، php و سیستم عامل و نرم افزارهای خود را بروز کنید. یکی از راه های حفظ امنیت آبدیت php ، سیستم عامل ف آپاچی به آخرین ورژن می باشد. با درستور زیر می توانید اپدیت را انجام دهید.
yum update
یا
apt-get update && apt-get upgrade