چکیده
از آنجایی که مدیریت سیستم کاری سخت و دشوار است، ابزارهای قدرتمندی برای انجام کارهای مدیریتی ایجاد شدهاند که استفاده از این ابزارها زندگی را برای مدیران سیستم شیرین تر میکند. یکی از مهمترین کارهایی که یک مدیر سیستم باید انجام دهد این است که امنیت سیستم را به خوبی برقرار سازد. یکی از ابزارهایی که میتواند باعث افزایش امنیت یک سیستم FreeBSD شود، زندانها هستند. زندانها اولین بار در FreeBSD 4.X دیده شدند، اما در نسخه ۵٫X به امکانات آنها اضافه شد و آنها تبدیل به یک زیرسیستم قدرتمند و انعطافپذیر شدند و توسعه آنها همچنان ادامه دارد.
اصطلاحات مربوط به زندانها
Jail چیست؟
سیستمهای شبیه BSD ابزاری دارند به اسم chroot که این ابزار از زمان ۴٫۲BSD وارد این سیستمعامل ها شده است. به کمک ابزار chroot میتوان دایرکتوری ریشه بعضی از پروسهها را تغییر داد. به این ترتیب پروسه مورد نظر از دیگر قسمتهای سیستم مجزا شده و محیطی امن برای اجرای آن فراهم میشود. پروسه هایی که در یک محیط chroot شده ساخته میشوند، نمی توانند به فایلها یا منابع خارج از آن محیط دسترسی داشته باشند. به همین دلیل به خطرانداختن سرویس های در حال اجرا در محیط chroot نمی تواند به یک مهاجم اجازه دهد تا خطر بالقوه ای برای کل سیستم به وجود آورد. ابزار chroot برای کارهای ساده مناسب است اما در مواقعی که نیاز به انعطاف پذیری و پیچیدگی و ویژگیهای خاصی باشد، نمیتوان به آن اعتماد کرد. از آنجا که با آغاز به کار مفهوم chroot این ابزار در طول زمان و در نسخه های مدرن هسته FreeBSD پیشرفت کرده است اغلب راههای زیادی برای کنار گذاشتن محیط chroot مطرح است. این واضح است که chroot نمیتواند یک راه حل ایدهآل برای تأمین امنیت باشد. این یکی از دلایل اصلی است که چرا jail توسعه داده شد.
در حقیقت مکانیسم jailها در FreeBSD، یک پیادهسازی از تکنولوژي «مجازیسازی سطح سیستمعامل» است که به مدیران سیستم اجازه میدهد تا یک سیستم FreeBSD را به چندین زیرسیستم مستقل تقسیم کند که به هر یک از این زیر سیستمها یک jail یا زندان میگویند. همین طور به سیستم اصلی هم اصطلاح میزبان اطلاق میشود. هر زندان یا jail یک محیط مجازی است که بر روی ماشین میزبان اجرا میشود و فایلها، پروسهها و کاربران مخصوص به خود را دارد. بنابراین زندانها را یک کامپیوتر مستقل در نظر بگیرید که تقریبا به طور کامل با سیستم میزبان متفاوت هستند. همین طور زندانها به طور کامل از یکدیگر جدا هستند و هیچ ارتباطی با هم ندارند.
یک jail به وسیله چهار ویژگی مشخص میشود:
- یک دایرکتوری زیرمجموعه: نقطه آغازین یک jail و دایرکتوری ریشه آن است. پروسههایی که در داخل jail اجرا میشوند، قادر به فرار کردن از این دایرکتوری نخواهند بود و به منابع و فایلهای خارج از این دایرکتوری دسترسی نخواهند داشت.
- یک نام میزبان hostname: زندهانها اکثرا برای میزبانی سرویسهای شبکه استفاده میشوند. به همین دلیل اگر هر jail یک نام میزبان مخصوص داشته باشد، کار مدیر شبکه بسیار راحتتر خواهد شد.
- یک آدرس IP: به هر jail یک آدرس IP اختصاص مییابد و به هیچ شکلی قابل تغییر نیست. این آدرس IP معمولا یکی از آدرسهای مستعاری است که بر روی یکی از کارت شبکههای سیستم وجود دارد.
- یک دستور: یک فایل اجرایی که باید در داخل jail اجرا شود. مسیر این فایل وابسته به دایرکتوری ریشه jail مورد نظر است.
jailها میتوانند کاربر root مخصوص به خود را داشته باشند. طبیعتا قدرت این کاربر root محدود به محیط همان jail است و خارج از آن قدرتی نخواهد داشت. همین طور هر زندان یک Jail ID یا JID دارد. JID یک عدد منحصر به فرد است که به هر jail اختصاص مییابد. (JID را همانند PID در نظر بگیرید)
ساختن و کنترل کردن jail
بعضی از مدیران سیستم jail ها را به دو نوع تقسیم می کنند : jail کامل که شبیه یک سیستم کامل FreeBSD است و jail سرویس که با یک سری دسترسی به یک برنامه کاربردی یا سرویس اختصاص داده میشود. البته این تقسیم بندی تنها به صورت مفهومی است و نحوه ساخت هر دو نوع jail مشابه بوده به یک صورت انجام میگیرد.
آماده کردن سیستم برای ساختن jail
برای ساختن یک jail در سیستم خود به ترتیب دستورات زیر را اجرا می کنیم. ( توضیح هر دستور در زیر آن آمده است.)
# setenv D /here/is/the/jail
با اجرای دستور بالا یک متغیر محیطی به نام D و با مقدار /here/is/the/jail به سیستم معرفی می کنیم. در واقع متغیر D مشخص کننده مسیر jail مورد نظر است. این مسیر دلخواه بوده و شما می توانید هر مسیری که میخواهید jail را در آن بسازید انتخاب کنید. بنا به یک سنت قدیمی، jailها معمولا در مسیر /usr/jail/jailname ایجاد میشوند. سیستمفایل /usr/ هم معمولا آنقدر بزرگ هست که بتوان jailها را در آن ایجاد کرد.
# mkdir -p $D
با اجرای این دستور مسیری که به متغیر محیطی D داده بودیم را با تمام زیر شاخه هایش در فایل سسیستم ساخته می شود.
# cd /usr/src
با اجرای دستور بالا به مسیری که source های سیستم در آن نصب می باشد می رویم.
# make buildworld
با اجرای دستور بالا به سیستم میگوییم که source کل سیستم را از نو کامپایل کند. اگر قبلا سورسهای سیستم را کامپایل کردهاید، می توانید همان باینریهای موجود را نصب کرده و از انجام این مرحله صرفه نظر کنید. (مراجعه شود به کامپال مجدد هسته FreeBSD)
# make installworld DESTDIR=$D
با اجرای دستور بالا به سیستم میگوییم که سیستمی که در مرحله قبل کامپال کرده بود را در مسیری که برای متغیر محیطی D تعریف کرده بودیم نصب کند.
# make distribution DESTDIR=$D
با اجرای دستور بالا به سیستم میگوییم که تمام فایلهای پیکربندی سیستم را ایجاد کرده و در مسیر jail مورد نظر نصب کند. در این مرحله سیستم برای مثال تمام فایلهای تنظیماتی که در مسیر /usr/src/etc هست را در محیط jail به مسیر $D/etc نصب می کند.
# mount -t devfs devfs $D/dev
با این دستور فایل سیستم devfs را در دایرکتوری dev محیط jail به اصطلاح متصل یا mount می کنیم.
پس از اینکه نصب یک jail به اتمام رسید، میتوان آن را از طریق ابزار jail به اجرا درآورد. ابزار jail چهار آرگومان اجباری دریافت میکند که این چهار آرگومان قبلا مورد بحث قرار گرفتند. قالب کلی این دستور به شکل زیر است:
# jail /path/to/jail jail_hostname jail_ip_address command
اجرای jail در هنگام بوت کردن سیستم
jailها اغلب در هنگام بوت شدن سیستم شروع به کار میکنند. همچنین مکانیسم rc در FreeBSD انجام این کار را بسیار ساده کرده است:
۱- ابتدا باید قابلیت jail را در سیستم فعال کنیم و همچنین لیستی از jail هایی که باید در هنگام بوت اجرا شوند را به فایل /etc/rc.conf اضافه کنیم. برای این کار فایل rc.conf را با ویرایشگر دلخواه مان باز کرده و خطوط زیر را به آن اضافه می کنیم:
jail_enable="YES" jail_list="www"
خط اول قابلیت jail را در سیستم فعال میکند. برای غیرفعال کردن این قابلیت آن را با NO مقدار دهی کنید. خط دوم هم لیستی از jailهای موجود در سیستم را مشخص میکند. برای مشخص کردن jailهای مورد نظر خود، آنها را با کاراکتر space یا tab از یکدیگر جدا کنید. این jailها در هنگام بوت شدن سیستم به صورت خودکار اجرا خواهند شد.
۲- برای هر jail ای که در jail_list آورده شده است باید یک سری از تنظیمات اصلی را در فایل rc.conf وارد کنیم. برای مثال:
jail_www_rootdir="/usr/jail/www" jail_www_hostname="www.example.org" jail_www_ip="192.168.0.10" jail_www_devfs_enable="YES" jail_www_devfs_ruleset="www_ruleset"
در تمام مثالهای بالا www نام jail مورد نظر است. بنابراین آن را با نام jail مورد نظر خود جایگزین کنید. خط اول دایرکتوری ریشه jail مورد نظر یا به عبارتی دیگر مسیری که jail مورد نظر در آنجا نصب شده را مشخص میکند. خط دوم نام دامنه jail مورد نظر را مشخص میکند. خط سوم آدرس IP اختصاص یافته به jail مورد نظر را مشخص میکند. خط چهارم سیستمفایل devfs را در داخل jail مورد نظر مونت میکند. خط آخر هم قوانینی که برای سیستمفایل devfs تعیین شده را مشخص میکند.
man -k 5 rc.conf
راه اندازی و از کار انداختن jail به صورت دستی
برای اینکه jail را به صورت دستی راه اندازی کنیم دستور زیر را اجرا می کنیم:
# /etc/rc.d/jail start www
و برای اینکه یک jail را به صورت دستی متوقف کنیم، دستور زیر را اجرا میکنیم:
# /etc/rc.d/jail stop www
خاموش کردن jail از داخل خودش
برای این کار دستور زیر را از داخل خود jail اجرا می کنیم.
# sh /etc/rc.shutdown
تنظیمات و میزان سازی jail
در اینجا آپشن های زیادی برای اینکه بتوانیم jial ها را تنظیم کنیم وجود دارد و همچنین ترکیب یک سیستم FreeBSD میزبان با یک jail برای بوجود آوردن یک سیستم سطح بالا. مباحثی که در این قسمت ارایه می شوند:
برخی گزینه ها در دسترس برای میزان سازی و تنظیم رفتار و محدودیتهای امنیتی هنگام نصب یک jail.
برخی از برنامه هاای سطح بالا برای مدیریت jail که به وسیله پورت های FreeBSD در دسترس هستند و می توانند پیادهسازی شوند برای راه حلهایی که بر پایه jail ارایه می شوند.
ابزارهای سیستمی برای میزان سازی و تنظیم jail در FreeBSD
یک تنظیم خوب برای تنظیمات jail اغلب با تنظیم متغیرهای sysctl انجام می شود. یک زیر مجموعه اختصاصی از sysctl موجود هست که گزینه های سازماندهی اساسی را در اختیار می گذارد. security.jail.* یک سلسله مراتب از گزینه های هسته FreeBSD است. ما در زیر لیستی از تنظیمات اصلی jail در sysctl را همراه با مقادیر پیشفرض میآوریم.
security.jail.set_hostname_allowed: 1 security.jail.socket_unixiproute_only: 1 security.jail.sysvipc_allowed: 0 security.jail.enforce_statfs: 2 security.jail.allow_raw_sockets: 0 security.jail.chflags_allowed: 0 security.jail.jailed: 0
این متغیر ها به وسیله مدیر سیستم اصلی که jail ها روی آن قرار دارند می توانند استفاده شوند.
معرفی دو دستور در رابطه با jail
jls : لیستی از jail های در حال اجرا همراه با شماره مخصوص هر jail (JID) و آدرس IP و اسم Jail (hostname) چاپ می کند.
jexec : یک دستور را به یک jail متصل میکند یا دستور را در jail اجرا می کند یا میشود کارهای مدیریتی داخل jail را با آن انجام داد. برای مثال دستور زیر یک شل را درون jail اجرا می کند.
jexec 1 tcsh
ابزارهای مدیریت سطح بالا در مجموعه پورت های FreeBSD
ابزار های third-party زیادی برای مدیریت jail ها وجود دارد. یکی از مهمترین و بهترین ابزارها، ابزار sysutils/jailutils است. مجموعهای از ابزار های کوچک که منجر به مدیریت بهتر jail ها می شود.