نکات امنیتی دروپال در لینوکس

Drupal security

برای میزبانی دروپال در هاست های اشتراکی، برخی دغدغه های امنیتی وجود دارد. که من در این جا برخی از آن ها را مطرح می کنم. این مطلب برای مدیران سرور مفید خواهد بود.
سیستم عامل مورد شرح در این مطلب، لینوکس Debian 6 squeeze می باشد و دروپال مورد استفاده نسخه ی 7.25 می باشد. گرچه سایر نسخه ها و توزیع های لینوکس و دروپال نیز، مشابه خواهند بود.

مجوز فایل های اصلی دروپال

یک کانفیگ بسیار مناسب و متداول برای میزبانی اپلیکیشن های PHP به این صورت است که از وب سرور apache2 همراه با ماژول fastcgi و سرویس php-fpm استفاده می شود.
برای شرح بیشتر راجع به این نوع کانفیگ، به لینک زیر مراجعه کنید. دقت کنید که ادامه ی مطلب دقیقا بر اساس لینک زیر نمی باشد. لینک زیر فقط برای راه اندازی یک حالت خاص از کانفیگی که نام بردم می باشد:
Install Drupal in php-fpm (fastcgi) with Apache and a chroot php-fpm

نکته:برای شرح بیشتر در خصوص مجوز ها در لینوکس، این لینک را مطالعه کنید

در این پیکربندی، ما برای میزبانی هر سایت، یک کاربر جدید در لینوکس ایجاد می کنیم و در php-fpm یک pool جدید ایجاد می کنیم و تنظیم می کنیم که php-fpm برای هر سایت، با سطح دسترسی و هویت کاربر صاحب سایت اجرا شود.
فایده ی این کار این است که اگر چندین سایت مختلف داشته باشیم، هر سایت با مجوز های صاحب همان سایت اجرا می شود و اگر نفوذگر بتواند به یکی از سایت ها نفوذ کند، به سایر سایت ها دسترسی نخواهد داشت.

اما روال اجرای کار به این سادگی هم نیست. چند تا نکته را باید مد نظر قرار داد:

اولا وب سرور apache معمولا تحت کاربر www-data و گروه www-data اجرا می شود و وب سرور باید بتواند به فایل های دروپال (دست کم، پوشه ی اصلی سایت و پوشه ی files) دسترسی داشته باشد.
ثانیا، باید طوری تنظیم کنیم که سایر کاربرها، به جز www-data به فایل ها دسترسی نداشته باشند.

برای رسیدن به هدف اول، کافی است که group owner فایل های دروپال را به www-data تغییر دهیم.

chmod 711 /home/siteuser
chown siteuser:www-data -R /home/siteuser/public_html
chmod 750 /home/siteuser/public_html

اکنون که group owner فایل های دروپال با www-data تنظیم شده، باید مجوز فایل ها را طوری تنظیم کنیم که فقط php و apache به آن ها دسترسی داشته باشند. برای این منظور، مجوز پوشه ها را برابر 750 و مجوز فایل ها را برابر 640 در نظر می گیریم:

cd /home/siteuser/public_html
find -type d -exec chmod 750 {} \;
find -type f -exec chmod 640 {} \;

مجوز فایل های خاص

همچنین باید مجوز پوشه ی اصلی سایت و فایل settings.php را تنظیم کنیم. (البته این کار توسط دروپال هم انجام می شود.)

chmod 550 sites/default
chmod 440 sites/default/settings.php

مجوز فایل های جدید

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

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

برای تغییر مجوز فایل های ایجاد شده توسط PHP باید از دستور umask استفاده کنیم. با توجه به این که می خواهیم کاربر other به فایل ها هیچ دسترسی نداشته باشد، umask قابل استفاده 0027 می باشد. ساده ترین راه برای انچام این تنظیم، این است که خط زیر را به ابتدای فایل index.php دروپال اضافه کنیم. (ظاهرا می توان آن را به فایل settings.php هم اضافه کرد که در این صورت بهتر خواهد بود.)

umask(0027);

به این ترتیب، پوشه هایی که توسط php ایجاد می شوند، با مجوز 750 و فایل ها با مجوز 640 ایجاد خواهند شد که مطلوب ماست.

نکته ی دیگر این است که فایل هایی که توسط کاربر آپلود می شوند (مانند فایل های ضمیمه ی ارسال شده در node ها) به طور خودکار توسط دروپال مجوز 644 و پوشه ها مجوز 755 می گیرند و این مطلوب ما نیست.

خوشبختانه دروپال گزینه ای برای تنظیم این موضوع دارد. یک variable موجود است به نام file_chmod_directory که مجوز پوشه های جدید را مشخص می کند و variable دیگری به نام file_chmod_file وجود داره که مجوز فایل های جدید را مشخص می کند. می توان این دو variable را به کمک تابع variable_set تنظیم کرد. اما روش ساده تر و ایمن تر این است که دو تا خط زیر را به انتهای فایل settings.php دروپال اضافه کنیم.

دو خط زیر سبب می شود که variable های فوق override شوند و از مقادیر مشخص شده در فایل settings.php استفاده شود:

$conf['file_chmod_directory'] = octdec('0750');
$conf['file_chmod_file'] = octdec('0640');

سپس فایل settings.php را ذخیره می کنیم (دقت کنید که این فایل read only است و باید در موقع ذخیره کردن با برنامه ی vim، از ! استفاده کرد.)

صاحب فایل های آپلود شده و ایجاد شده ی جدید

آخرین موضوع برای حل کردن این است که وقتی یک فایل جدید در دروپال آپلود می شود، از آن جایی که فایل توسط php ذخیره می شود که owner سایت ذخیره می شود. در حالی که ما می خواهیم group owner آن www-data باشد. چون در غیر این صورت در فایل توسط apache قابل serve شدن نخواهد بود و بارز ترین و سریع ترین واکنشی که مشاهده می کنیم این است که دروپال بدون استایل لود می شود و کلیه ی صفحات سایت بدون هیچ شکل و شمایلی نشان داده می شوند و یا کد های javascript اجرا نمی شود.

اگر در این حالت firebug را باز کنیم، می بینیم که علت بروز این مشکل، خطای 403 در هنگام لود شدن استایل ها و فایل های جاوااسکریپ می باشد.

برای رفع این مشکل، می توانیم مجوز sgid را برای پوشه ی files تنظیم کنیم:

cd /home/siteuser/public_html/sites/default
chown siteuser:www-data files
chmod 2750 files

به این ترتیب، فایل های جدید ایجاد شده، دارای group owner وب سرور (www-data) خواهند بود.

روش بهتر:

cd /home/siteuser/public_html
chown siteuser:www-data -R .
find -type d -exec chmod 2750 {} \;

امیدوارم که این مطلب آموزشی مورد استفاده ی شما قرار گرفته باشد. لطفا نظرات خود را برای من ارسال کنید.

نکته: برای رفع این مشکلات، همچنین می توان از ACL ها استفاده کرد که البته تنظیم آن ها قدری پیچیده تر است نیاز به پشتیبانی هسته ی لینوکس و filesystem دارد و ممکن است در پست دیگری آن را شرح دهم.

لینک های مرتبط:

Securing file permissions and ownership

Securing file permissions using Linux ACLs

نظرات شما

قسمت نظرات با استفاده از سرویس دیسکاس پیاده سازی شده است. متاسفانه این سرویس از داخل ایران قابل دسترس نیست. لطفا از آی پی خارجی استفاده کنید.