• مشکی
  • سفید
  • سبز
  • آبی
  • قرمز
  • نارنجی
  • بنفش
  • طلایی
  • تعداد بازديد :
  • 3659
  • يکشنبه 1383/3/10
  • تاريخ :

امنیت برتر در سرورهای Apache


این مقاله به صورت قدم به قدم به شما نحوه نصب و تنظیم نمودن وب سرورهای آپاچی نسخه1.3.xجهت امنیت بالاتر را نشان می دهد كه سعی شده جزئیات كار به خوبی مورد بررسی قرار بگیرد .

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

این وب سرور از طریق اینترنت قابل دسترسی است

فقط صفحات اچ-تی-ام-ال ثابت در آن قرار می گیرد

این سرور مكانیزم هاستینگ مجازی را پشتیبانی خواهد نمود

صفحات مهم وب سایت فقط از طریق یك آدرسIPمخصوص و یا كاربران خاص مورد استفاده قرار می گیرد (Basic authentication)

این سرور همه درخواست های دریافتی را ضبط می كند ( شامل اطلاعاتی در مورد مرورگرهای وب نیز خواهد شد )

از این جهت قابل تاكید است كه كه مدل ذكر شده در بالا PHP, JSP, CGI و دیگر تكنولوژی هایی كه امكان تداخل با سرویس های وب سرور را دارد را پشتیبانی نمی كند . استفاده از تكنولوژی هایی كه در بالا ذكر شد با این كه در دنیای امروز مورد احتیاج هسنتد ممكن است یك ریسك امنیتی بزرگ در امنیت باشد كه قابل ذكر است یك اسكریپت كوچك می تواند امنیت سرور را به كلی كاهش دهد . ولی چرا ؟ باید بگم اسكریپت های كاربردی
ASP/CGIممكن است دارای حفره های امنیتی باشد ( مانندSQL Injection , CSS ). دوم این تكنولوژی ها ممكن است خود نیز دارای مشكل باشد (  مانند آسیب پذیری های ماژول هایPHP, Perl
و ... ) به همین دلیل است استفاده از این تكنولوژی ها را زمانی پیشنهاد می شود كه واقعا مورد احتیاج باشند .

فرض های امنیتی

یكی از مهم ترین موارد در هر پروژه كامپیوتری توجه به فرض های امنیتی است ( با  توجه به توضیحاتی كه در زیر آورده می شود این موضوع به راحتی قابل تحلیل است )  و این فرض ها باید قبل از اینكه یك پروژه به انجام برسد در نظر گرفته شود . فرض های امنیتی كه ما جهت وب سرورمان در نظر گرفته ایم این ها هستند :


سیستم عامل باید تا آنجایی كه امكان دارد از نظر امنیت مورد بررسی قرار گرفته باشد و مشكلات امنیتی ان برطرف گردد ( هم در مقابل حملات داخلی و هم ریموت )

وب سرور نباید هیچ سرویس دیگری غیر از سرویس اچ-تی-تی-پی را ارائه دهد

دسترسی ریموت به سرور باید توسط یك فایروال كنترل گردد

سرویس آپاچی باید تنها سرویسی باشد كه در سیستم وجود دارد

فقط ماژول های آپاچی آن هایی كه مورد احتیاج هستند باید فعال باشند

پروسه های آپاچی باید دسترسی محدود شده به فایل های سیستمی داشته باشند

نصب سیستم عامل

قبل از نصب وب سرور آپاچی ما باید یك سیستم عامل را انتخاب نماییم . سرور آپاچی می تواند بر روی بیشتر سیستم عامل ها كامپایل و نصب شود . بیشتر مقاله بر روی امنیت وب سرور آپاچی در سیستم عامل FreeBSD ( نسخه 4.7 ) تاكید دارد ولی سعی شده تا آن جا كه امكان داشته روش های به گونه ای باشند كه در بیشتر سیستم عامل ها قابل استفاده باشد . من استفاده از سیستم عامل ویندوز را پیشنهاد نمی كنم چون جهت بالا بردن امنیت آپاچی سازگاری كمی دارد .

اولین قدم در بالا بردن امنیت وب سرور , رفع مشكلات امنیتی سیستم عامل به طور كامل است كه البته مقالات بسیاری بر روی اینترنت جهت این كار موجود است .

خوب بعد از اینكه سیستم عامل نصب شد و مشكلات امنیتی آن رفع گردید ما باید یك گروه جدید ( Apache ) را به پروسه ها اضافه كنیم ( مثال زیر این روند را در FreeBSD نشان می دهد )


 pw groupadd apache
  pw useradd apache -c "Apache Server" -d
/dev/null -g apache -s  /sbin/nologin


به طور پیش فرض پروسه های آپاچی با سطح دسترسیnobody( به غیر از پروسه اصلی آن كه با سطح دسترسی روت اجرا می شود ) اجرا می شوند كه این نیز خود یك مشكل امنیتی است .


اما نرم افزارها ...

قدم بعدی دریافت آخرین نسخه http://httpd.apache.org وب سرور آپاچی است . كه بعضی از تنظیمات این سرور در هنگام كامپایل قابل تغییر است به همین دلیل این حائز اهمیت است كه سورس آن را در مقابل نسخه باینری دریافت نمایید .

اما بعد از دریافت ما باید تصمیم بگیریم كه چه ماژول هایی از سرور فعال شوند و توضیح كوتاهی در این مورد در http://httpd.apache.org/docs/mod قابل مشاهده است .

ماژول های آپاچی

انتخاب ماژول های این سرور از موارد مهم در امنیت سرور است. ما باید این قانون را مورد توجه قرار دهیم ( هر چه كم تر , بهتر ! ) . اما جهت روند امنیتی ماژول هایی كه مورد احتیاج هستند در اینجا ذكر شده ‌:

نام ماژولشرح
httpd_core

دیگر ماژول های آپاچی باید غیرفعال شوند . این ارزش را دارد كه بگویم دو ماژول آپاچی وجود دارند كه خطرناك تر از دیگر ماژول ها هستند :
و mod_autoindex
mod_info  . اولین ماژول فراهم كننده directory indexing به صورت خودكار است و صورت پیش فرش فعال شده است . این براحتی قابل متوجه شدن است كه این ماژول نصب شده است یا نه ( برای مثال http://server_name/icons
)
و محتوای دایركتوری ها را ببینیم و دومین ماژول mod_info هرگز نیاید از طریق اینترنت قابل دسترسی باشد به این دلیل كهسترسی به تنظیمات سرور را امكان پذیر می سازد.سوال بعدی چگونگی كامپایل ماژول ها است . روش ثابت راه حل مناسب تری به نظر می رسد .

كامپایل نمودن نرم افزار

اول از همه باید بگویم
اگر :: پچ امنیتی جدیدی وجود داشت :: باید بروز رسانده شود بعد از آن باید سرور
كامپایل شود و از این طریق نصب شود :



./configure --prefix=/usr/local/apache


--disable-module=all --server-
     uid=apache --server-gid=apache --enable-module=access
--enable-
     module=log_config --enable-module=dir
--enable-module=mime --enable-module=auth
make
su
umask 022
make install
chown -R root:sys /usr/local/apache

اما مرحله بعد ...

قدم بعدی محدود نمودن دسترسی پروسه های آپاچی به فایل های سیتمی است. ما این كار را از طریق ایجاد یك دایركتوری روت جدید در دایركتوری   /chroot/httpd انجام می دهیم :

مالك همه دایركتوری های بالا باید روت باشد و سطح دسترسی باید به 0755 تغییر یابد . بعد ما یك فایل دیوایس
را ایجاد می كنیم :


ls -al


/dev/null
  crw-rw-rw-   1  root wheel   2,  2 Mar 14
12:53 /dev/null
mknod /chroot/httpd/dev/null c 2 2
chown root:sys /chroot/httpd/dev/null
chmod 666 /chroot/httpd/dev/null

یك روش دیگر نیز باید استفاده شود تا /chroot/httpd/dev/log
ایجاد شود كه هم چنین برای اینكه سرور به درستی كار كند . به دلیل اینكه سیستم FreeBSD است این لاین باید به/etc/rc.conf اضافه شود :


syslogd_flags="-l


/chroot/httpd/dev/log"

ما برای اینكه تغییرات انجام بپذیرد باید سیستم را ری استارت نماییم . البته جهت ایجاد /chroot/httpd/dev/log
در سیستم عامل های دیگر باید به راهنمای دیگر در مورد syslogd مراجعه كنیم .

قدم بعدی كپی httpd به یك دایركتوری جدید همراه با همه باینری ها و فایل لایبرری است  . جهت این كار باید لیستی از فایل های مورد نیاز را تهیه كنیم . ما می توانیم یك لیست را با چنین دستوراتی تهیه نماییم :


دستوراجرا در محیطشرح
lddهمه

مثال هایی از استفاده از دستورهای ldd وstrings و truss :


localhost# ldd


/usr/local/apache/bin/httpd
/usr/local/apache/bin/httpd:
        libcrypt.so.2 => /usr/lib/libcrypt.so.2
(0x280bd000)
        libc.so.4 => /usr/lib/libc.so.4
(0x280d6000)

localhost# strings /usr/local/apache/bin/httpd | grep lib
/usr/libexec/ld-elf.so.1
libcrypt.so.2
libc.so.4

localhost# truss /usr/local/apache/bin/httpd | grep open
(...)
open("/var/run/ld-elf.so.hints",0,00)
= 3 (0x3)
open("/usr/lib/libcrypt.so.2",0,027757775370)    = 3 (0x3)
open("/usr/lib/libc.so.4",0,027757775370)
= 3 (0x3)
open("/etc/spwd.db",0,00)
= 3 (0x3)
open("/etc/group",0,0666)
= 3 (0x3)
open("/usr/local/apache/conf/httpd.conf",0,0666) = 3 (0x3)
(...)

دستورات بالا نه تنها جهت httpd باید اجرا شوند بلكه جهت همه باینری ها و لایبرری ها مورد احتیاج هستند . به دلیل اینكه سیستم عامل ما



cp /etc/hosts


/chroot/httpd/etc/
cp /etc/host.conf /chroot/httpd/etc/
cp /etc/resolv.conf /chroot/httpd/etc/
cp /etc/group /chroot/httpd/etc/
cp /etc/master.passwd /chroot/httpd/etc/passwords
cp /usr/local/apache/conf/mime.types /chroot/httpd/usr/local/apache/conf/

دقت كنید كه در /chroot/httpd/etc/passwords ما باید همه لاین ها را به غیر از nobody و apache را حذف كنیم . در یك جای دیگر ما باید چنین عملی را نیز دوباره در
/chroot/httpd/etc/group تكرار كنیم  . سپس ما باید بانك اطلاعاتی پسورد ها را این گونه بسازیم :

cd


/chroot/httpd/etc
pwd_mkdb -d /chroot/httpd/etc passwords
rm -rf /chroot/httpd/etc/master.passwd

قدم بعدی این است كه تست كنیم كه آیا httpd به درستی كار می كند یا نه . جهت انجام این كار ما باید فایل تنظیمات آپاچی وindex.html


cp /usr/local/apache/conf/httpd.conf


/chroot/httpd/usr/local/apache/co
nf/
cp /usr/local/apache/htdocs/index.html.en /chroot/httpd/www/index.html

بعد از كپی فایل های مورد احتیاج ما باید DocumentRoot رو همین طور كه در زیر نشان داده شده تغییر دهیم :


DocumentRoot


"/www"

سپس سرور را اجرا كنیم :




chroot /chroot/httpd /usr/local/apache/bin/httpd


اگر با مشكلی برخورد نمودید من پیشنهاد می كنم فایل ضبط كننده وقایع (chroot/httpd/usr/local/apache/logs) را آنالیز كنید . از راه دیگر چنین فرمانی نیز می تواند به كار برده شود:


truss chroot


/chroot/httpd /usr/local/apache/bin/httpd

این فرمان می تواند دلیل مشكل ایجاد شده را نشان دهد . بعد از رفع مشكل همه خطاها ما می توانیم سرور را تنظیم نماییم .


تنظیم نمودن سرور

قدم اول حذف فایل/chroot/httpd/usr/local/apache/conf/httpd.conf است و جایگزین یك فایل جدید به جای آن است . محتوای فایل باید :


#


=================================================
# Basic settings
# =================================================
ServerType standalone
ServerRoot "/usr/local/apache"
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
ResourceConfig /dev/null
AccessConfig /dev/null

# =================================================
# Performance settings
# =================================================
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0

# =================================================
# Apache's modules
# =================================================
ClearModuleList
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_dir.c
AddModule mod_access.c
AddModule mod_auth.c

# =================================================
# General settings
# =================================================
Port 80
User apache
Group apache
ServerAdmin Webmaster@www.ebank.lab
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod

    DirectoryIndex index.html

DocumentRoot "/www/vhosts"

# =================================================
# Access control
# =================================================

    Options None
    AllowOverride None
    Order deny,allow
    Deny from all


    Order allow,deny
    Allow from all


    Order allow,deny
    Allow from all


# =================================================
# MIME encoding
# =================================================

    TypesConfig /usr/local/apache/conf/mime.types

DefaultType text/plain

    AddEncoding x-compress Z
    AddEncoding x-gzip gz tgz
    AddType application/x-tar .tgz


# =================================================
# Logs
# =================================================
LogLevel warn
LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/""
combined
LogFormat "%h %l %u %t /"%r/" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
ErrorLog /usr/local/apache/logs/error_log
CustomLog /usr/local/apache/logs/access_log combined

# =================================================
# Virtual hosts
# =================================================
NameVirtualHost *

DocumentRoot "/www/vhosts/www.ebank.lab"
ServerName "www.ebank.lab"
ServerAlias "www.e-bank.lab"
ErrorLog logs/www.ebank.lab/error_log
CustomLog logs/www.ebank.lab/access_log combined


DocumentRoot "/www/vhosts/www.test.lab"
ServerName "www.test.lab"
ErrorLog logs/www.test.lab/error_log
CustomLog logs/www.test.lab/access_log combined




تنظیمات ارائه شده در بالا شامل فرمان هایی می گردد كه جهت فعالیت سرور و امنیت آن مورد احتیاج است . دو هاست مجازی وجود دارند كه توسط سرور پشتیبانی شده اند :

- http://www.ebank.lab (www.e-bank.lab)
- http://www.test.lab

محتوای وب سایت های بالا به طور فیزیكی در این دایركتوری ها وجود دارد :

- /chroot/httpd/www/vhosts/www.ebank.lab
- /chroot/httpd/www/vhosts/www.test.lab

و هر وب سایت لاگ فایل مخصوص به خود را دارد كه در این دایركتوری هستند‌:

- /chroot/httpd/usr/local/apache/logs/www.ebank.lab
- /chroot/httpd/usr/local/apache/logs/www.test.lab

این دایركتوری ها قبل از اینكه سرور آپاچی برای اولین بار اجرا می شود باید ایجاد شوند . مالك این دایركتوری ها باید به root:sys است شود و سطح دسترسی به 0755 تغییر یابد .

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

قدم بعدی ایجاد یك استارت آپ اسكرپت "apache.sh" است كه محتوای آن باید :




#!/bin/sh

CHROOT=/chroot/httpd/
HTTPD=/usr/local/apache/bin/httpd
PIDFILE=/usr/local/apache/logs/httpd.pid

echo -n " apache"

case "$1" in
start)
/usr/sbin/chroot $CHROOT $HTTPD
;;
stop)
kill `cat ${CHROOT}/${PIDFILE}`
;;
*)
echo ""
echo "Usage: `basename $0` {start|stop}" >&2
exit 64
;;
esac

exit 0






كه این اسكرسپت باید به دایركتوری مربوطه كپی شود كه بستگی به نوع سیستم عامل دارد . مثلا در FreeBSD دایركتوری مربوطه /usr/local/etc/rc.d می باشد

حال این مقاله می تواند در بالا بردن امنیت سرورهای آپاچی بسیار مفید باشد ...


برگرفته از سایت www.iritn.com

UserName