ايران ويج

نسخه‌ی کامل: 25 نکته ی امنیتی در php
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام

در این آدرس که به زبان انگلیسش هستش 25 نکته‌ی آموزشی برای کانفیک php در لینوکس رو آموزش داده

لینک رو گذاشتم اینجا روزی یکی دوتا شو از روی تصاویرش ترجمه کنیم Biggrin Biggrin


آموزش شمازه یک که در مورد انواع حملات هستش



۲ - ماجول‌های فعال رو میشه با دستور زیر دید :

کد php:
php -

برای غیر فعال کردن ماجول‌ها یا فایل کانفیک ماجول رو پاک کنید و یا تغیر نامش بدید:

برای مثال میخواییم ماجول sqlite رو غیر فعال کنیم:
کد php:
# rm /etc/php.d/sqlite3.ini 
که تنظیمات ماجول رو پاک میکنه

وبا دستور زیر تغیر نامش میدیم (فایل sqlite.ini به sqlite.disable تغیر نام داده شد):

کد php:
# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable 




۳ - مخفی نگه داشتن اطلاعات php

اگر
کد php:
expose_php=on 
باشه ؛ هنگانی که درخواستی به سایتی کنیم؛ php مشخصات خودشو در هدر مینویسه:
کد php:
HTTP/1.1 200 OK
X
-Powered-ByPHP/5.3.3
Content
-typetext/htmlcharset=UTF-8
Vary
Accept-EncodingCookie 

برای جلوگیری از اینکار expose_php رو در فایل تنظیمات php برابر off قرار میدیم

کد php:
expose_php=Off 
۴ - در php امام ماجولها بصورت پیش فرض لود میشن؛ و چون ممکنه ما همه‌ی اونا رو احتیاج نداشته باشیم؛ توصیه میکنند که فقط اونهایی رو لود کنیم ازش استفاده میکنیم!

برای لود نشدن ماجولها به ( ۲ ) مراحعه کنید
و یا میتونید در فایل تنظیمات php ؛ادر ول نام ماجول از ( ; ) استفاده کنید (که تبدیل به کامنت میشه)




5 - برای اینکه خطاهایی که در حین اجرا رخ میده رو کاربر نبینه (که بعضی وقتا این اطلاعات دارای اطلاعاتی هستند که نفوذگر میتونه ازشون استفاده کنه) دستور زیر رو در فایل تنظیمات php ؛ off میکنیم:
کد php:
display_errors=Off 

برای اینکه خودمون به بعنوان ادمین بفهمیم مشکل کجا بوده؛ میتونیم این خطاها رو لاگ کنیم:
کد php:
log_errors=On
error_log
=/var/log/httpd/php_scripts_error.log 

error_log مسیری هستش که توش فایل خطاهامون ذخیره میشه؛ چون داریم در لینوکس کار میکنیم این نوع آدرس رو دادیم؛ در ویندوز باید مطابق آدرس دهی فایل در ویندوز عمل کنید




6 - غیر فعال کردن آپلود فایل
با فرمان زیر در فایل تنظیمات php کاری میکنیم که نشه فایلی آپلود کرد:
کد php:
file_uploads=Off 

اما اگه احتیاح به آپلود فایل بود؛ میشه با دستور زیر اونو فعال کرد و همچنین تعییت کرد حداکر حجم فایلی که میتونه آپلود کنه چقدره:
کد php:
file_uploads=On
upload_max_filesize
=1M 
که ما تعیین کردیم اگه کمتر مساوی ۱ مگ بود آپلود کن؛ در غیر اینصورت فایل آپلود نخواهد شد
۷ - بستن file_get_contents و fopen برای دریافت اطلاعات از URL ها

در حالت معمولی fopen و file_get_contents برای از کردن و گرفتن محتویات فایل هستش؛ اما میشه باهاشون به صفحات و سایتها‌ی مختلف متصل شد و دیتا گرفت ازشون!
برای اینکه فقط محدود به فایل‌های لوکال بشن باید:
کد php:
allow_url_fopen=Off 
رو در فایل
کد php:
/etc/php.d/security.ini 
و یا هرجایی که تنظیمات php شما اونحا هست؛ ست بکنید

و همچنین پیشنهاد کرده که
کد php:
allow_url_include=Off 
رو هم تنظیم کنید!




۸ - فعال کردن حالت safe mode برا SQL :
(Exclamation ناقص)
کد php:
sql.safe_mode=On 
وقتی از این استفاده بشه؛هنگام فراخوانی
کد php:
mysql_connect() 
mysql_pconnect() 
پارامترهای ارسال به این ۲ تابع نادیده گرفته میشن و مقادیر پیش فرض جایگزیشون میشه!
(حالا این مقادیر روکجا میشه تنظیم کرد رو نمیدونم)
اما گفته شده که عضی از سیستم‌ها مثل وردپرس اگه سیف مد آن باشه کار نمیکنند




۹ - تعیین ماکزیمم مقدار برای ارسال به روش post:
کد php:
post_max_size=1K 
حمله کننده میتونه با تغییر سایز منابع سیستم رو هدر بده که با این روش جلوش گرفته میشه
تغییر این مقدار بر روی آپلود فایل نیز تاثیر میزاره! یعنی الا فایلمون نمیتونه بیتشر از ۱کیلو بایت باشه! حتی اگه در تنظیمات؛ میزان سایز فایل برای آپلود فایل رو ۱مگ تنظیم کرده باشیم!
10 - کنترل منابع در php
همانند مدت زمان اجرای فایل php
مدت زمان انتظار برای گرفتن ورودی
حافظه‌ی ای که اختصاص پیدا کنه به اسکریپت php
کد php:
# set in seconds
max_execution_time =  30
max_input_time 
30
memory_limit 
40M 

خب کاراییشاون معلومه؛ تمام این مقادیر به ثانیه هستند؛ مقدار آخری به مگابایت؛
memory_limit واسه اینه که کل فایلی که در حافظه لود میشه نباید از 40 مگ بیتشر بشه!




11 - نصب Suhosin بر روی php
Suhosin یک پروژه پیشرفته برای محافظت از سرور و کاربران هستش
وب سایت
نحوه‌ی نصب
(اگه قسمت شد واسه این یه تاپیک میزنم و هرچی ازش متوجه بشم رو میزارم)




12 - غیر فعال کردن توابع خطرناک!

کد php:
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source 

هر تابعی که دوست داشتید هم میتونید به لیست اضافه کند!


13 - استفاده از Fastcgi

CGI چیست
Fastcgi چیست؟ (زبان اصلی)
FastCGI در واقع همون CGI هستش؛ که نسبت به CGI امنتر هست؛ و مدیریت حافظهی بهتری داره و ...
سایت پروژه‌ی Fastcgi
Apache2+PHP+FastCGI (زبان اصلی)
تنظیمات و نصب Red Hat / CentOS Apache 2 FastCGI (زبان اصلی)

php توانایی کار با fastcgi رو داره که با دستور زیر میتونید (بعد از نصب کردنش) فعالش کتید

کد php:
cgi.force_redirect=On 
سلام.
البته من با اجازه babyy عزیز یه چیز در مورد CGI بگم.
اگه توابع پرل تو سرور روشن باشن تمام این کارا بی فایده هستش...
چون راحت میشه CGI اجرا کرد و به کل سرور دسترسی پیدا کرد.

babyy جان ببخشید :)
14 - مجوزهای مربوط به user و گروه (Exclamation ناقص)
درمورد مجوز ها صحبت کرده که باید فایلهای CGI تحت مجوز root نباشند؛



15 - محدود سازی مسیر دسترسی به فایل در php
با تنظیم زیر میتونید کاری کنید که برنامه‌ی php در همون پوشه‌ی مخصوصی که مشخص کردید دسترسی داشته باشه
کد php:
open_basedir="/var/www/html/" 



16 - مسیر نشست (Session) و تغییر پوشه‌ی مربوط به آپلود موقت فایل
خوب از عناوینش مشخصه دیگه!
کد php:
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" 

منظور از پوشه ‌ی موقت اینه که وقتی داریم یک فایلی رو آپلود میکنیم؛ این اول یکجایی ذخیره میشه و بعد به جایی که مشخص کردیم منتقل میشه؛ توسز دشتور دومی میتونید اون پوشه‌ای که فایل داخلش آپلود میشه تا اینکه به صورت مامل دریافت بشه رو تغییر بدین!

و پیشنهاد داده این پوشه رو خارج از مسیر زیر درست کنید و مجوزش رو طوری تغییر بدین که هیچ کاربر دیگری حق خواندن و نوشتن نداشته باشند بجز apache
کد php:
/var/www/html 


17 - به روز نگه داشتن php و apache و ....



18 - هیچ فایل یا پوشه‌ای رو با مجوز root نداشته باشید!
دستور زیر؛ کاربر و گروه کاربری تمام به تمام محتویات مسیر به آپاچی تغییر میده:
کد php:
chown -R apache:apache /var/www/html

و همچنین به فایلها فقط مجوز خواندنی میده:
کد php:
chmod -R 0444 /var/www/html


19 - حفاظت از فایل‌های تنظیم:
اطلاعات بیشتر
کد php:
# 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/ 


20 - استفاده از افزونه‌های امنیتی همانند SElinux

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

سایت selinux
در ویکی پدیا بخوانید (زیان اصلی)
21 - نصب Mod_security در آپاچی

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

نحوه‌ی نصب

مثالی از تنظیم این ماجول برای جلوگیری از چند نوع حمله مثل تزریق در پایگاه داده (sql injection)
کد php:
## A few Examples ##
# Do not allow to open files in /etc/
SecFilter /etc/
 
# Stop SQL injection
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from" 

چون پوشه‌ی etc مهمه؛ این دستور کاری میکنه که توی اگه توی مسیرمون؛ مسیر etc اومد اونو فیلتز میکنه!
(منبع هادی اعظم)


22 - اجرای آپاچی و ملحقات اون در محیط امن یا مجازی
که در صورت نفوذ کل سیستم به فنا نره

مقالات زیر زبا اصلی هستند؛ کسی خواست ترجمه کنه خوشحال میشیم Biggrin

FreeBSD Jail
XEN Virtualization
KVM Virtualization
OpenVZ



23 - محدود مکردن اتصالات خروجی به بیرون با استفاده از فایروال

وقتی حمله کننده از سرور دسترسی بگیره سعی میکنه که با برنامه هایی مثل wget (برای دانلود فایل) فایلهایی رو دانلود کنه؛ که با مدیریت اتصالات میتونید جلوی این کار رو بگیرید
کد php:
/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED  -j ACCEPT 
و یا مثالی دیگه:

کد php:
# ....  
/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 -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 -RETURN
/
sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.61 --dport 80 -RETURN
/
sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.89 --dport 80 -RETURN
/
sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.88 --dport 80 -RETURN
#########################
## Add more rules here ##
#########################
# No editing below
# Drop everything for apache outgoing connection
/sbin/iptables --append apache_user -j REJECT 

** توصیه میکنم قبل از اجرای دستورات اول نحوه‌ی کار با iptables رو یاد بگیرد و بعد دستورات رو اجرا کنید



24 - رسیدگی به فایل‌های log
log آپاجی:
کد php:
# 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 
log php
کد php:
# tail -f /var/log/httpd/php_scripts_error.log
# grep "...etc/passwd" /var/log/httpd/php_scripts_error.log 
و یا میتونید از ابزارهای دیگه‌ای هم استفاده کنید



25 - اگه وب سایت بزرگی دارین سرویسهاتون رو در سرور های جدا راه اندازی کنید!




26 - امکانات اضافی:

PHP IDS
PhpSecInfo


پیدا کردن درهای پشتی و شل کد ها بر روی سایت:

کد php:
# 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/ 

دستور بالا برای شل کد c99 یا r57 هست....