ezjail برنامه‌ای قدرتمند برای مدیریت کردن زندان‌های فری‌بی‌اس‌دی است که به کمک آن می‌توان به آسانی زندان‌های مختلف را نصب، مدیریت و به روزرسانی کرد. همچنین استفاده از ezjail باعث کاهش یافتن مصرف منابع در سیستم می‌شود. به کمک ezjail می‌توان چندین ماشین مجازی در سطح سیستم‌عامل ایجاد کرد که به آنها زندان یا jail می‌گویند و هر زندان در حقیقت یک سیستم‌عامل مجزاست که دارای کاربران، فایل‌های پیکربندی، فرآیندها و به طور کلی منابع مخصوص به خود است. زندان‌ها بیشتر برای اهداف امنیتی مورد استفاده قرار می‌گیرند. برخی از سرویس‌دهنده‌های اینترنتی از جمله سرویس‌دهنده وب، پست الکترونیک، FTP و … که در معرض حملات متعدد قرار دارند را می‌توان در داخل زندان‌ها به اجرا درآورد. بدین ترتیب اگر حمله‌ای علیه این سرویس‌ها به وقوع پیوست، کل سیستم تحت تاثیر قرار نخواهد گرفت و حادثه تنها به همان زندان مورد نظر محدود خواهد شد. بدین ترتیب، پسندیده است که هر سرویس در یک زندان مجزا اجرا شود.

در آن سوی سکه، مشکل اصلی زندان‌ها این است که هر زندان یک کپی مستقل و مخصوص از سیستم است و تنها چیزی که در بین آنها و همین طور سیستم میزبان (سیستمی که زندان‌ها بر روی آن اجرا می‌شوند) مشترک است، هسته سیستم‌عامل است. وجود داشتن کپی‌های مستقل از سیستم، باعث مصرف شدن فضای دیسک و شماره inode می‌شود و از آن مهم تر اینکه نمی‌توان فایل‌های باینری را در بین زندان‌ها به اشتراک گذاشت و بنابراین، اجرا کردن چند زندان به صورت هم زمان باعث می‌شود میزان استفاده از حافظه اصلی (RAM) چند برابر شود. به علاوه، مشکل دیگری که در مدیریت زندان‌ها وجود دارد، به روزرسانی آنهاست. چرا که هر زندان باید به صورت مستقل به روزرسانی شود که این کار باعث بوجود آمدن دردسرهای زیادی برای مدیر سیستم خواهد شد.

هدف اصلی ezjail به حداقل رساندن مشکلات ذکر شده است و با استفاده از برنامه ezjail می‌توان مصرف حافظه و منابع سیستم را به حداقل رساند و به آسانی زندان‌های مختلفی را ایجاد کرد یا آنها را به نسخه جدید ارتقا داد. واسط کاربری اصلی برنامه ezjail، دستوری به نام ezjail-admin است که اکثر فعالیت‌ها از طریق همین دستور انجام می‌شود. به کمک این دستور، مدیر سیستم می‌تواند زندان‌های جدیدی را ایجاد کرده، آنها را حذف کند یا به نسخه جدید ارتقا دهد، زندان‌ها را بایگانی کند، کنسولی را در داخل یک زندان در حال اجرا باز کند و دستورات مورد نظر خود را در آن اجرا کند و … . برنامه ezjail یک فایل پیکربندی هم دارد که در مسیر /usr/local/etc/ezjail.conf قرار گرفته است. خیلی کم پیش می‌آید که نیاز به تغییر دادن این فایل باشد. یک فایل پیکربندی نمونه هم در مسیر /usr/local/etc/ezjail.conf.sample قرار دارد. همین طور یک اسکریپت rc.d به نام ezjail هم در سیستم نصب می‌شود که به کمک آن می‌توان زندان‌هایی که تحت کنترل ezjail قرار دارند را در هنگام آغاز به کار سیستم به اجرا درآورد.

زندان پایه‌ای

زندان پایه‌ای یک زندان خاص در ezjail است که همه زندان‌های دیگر بر روی آن بنا می‌شوند. به کمک دستور ezjail install می‌توان این زندان را ایجاد کرد. این دستور در کل دوران حیات ezjail تنها یک بار استفاده می‌شود. قبل از استفاده از ezjail، حتما باید این زندان پایه‌ای را نصب کرد. بدون ساختن این زندان، قادر به ساختن زندان‌های دیگر نخواهید بود. از زندان پایه‌ای نمی‌توان برای اهداف معمولی استفاده کرد و این زندان برای استفاده برنامه ezjail رزرو شده است. پس از آنکه زندان پایه‌ای ایجاد شد، به کمک دستور ezjail-admin create می‌توان زندان های جدیدی ایجاد کرد. این زندان‌ها مستقیما بر روی زندان پایه‌ای ایجاد می‌شوند و از آنها می‌توان برای اهداف مختلف استفاده کرد. هر زندان یک نام مختص به خود و یک یا چند آدرس IP دارد که در هنگام استفاده از دستور ezjail-admin create باید آنها را مشخص کنید. زندان‌ها به کمک nullfs بر روی زندان پایه سوار می‌شوند. وقتی که یک زندان جدید ایجاد می‌شود، در ابتدا تنها حدود دو مگابایت از فضای دیسک را اشغال می‌کند (حال اگر بدون استفاده از ezjail چند زندان ایجاد کنید، هر زندان حدود چند صد مگابایت فضا مصرف خواهد کرد!) در هنگام اجرا شدن یک زندان تازه ایجاد شده هم تنها تعداد معدودی از سرویس‌ها مانند cron، sendmail و syslogd به اجرا در می‌آیند و مصرف حافظه یک زندان تازه ایجاد شده هم در حداقل ترین حالت قرار دارد.

پس از اینکه یک زندان ایجاد شد، می‌توان آنها را در یک آرشیو نوع pax بایگانی کرد، بازیابی کرد و یا سرانجام آنها را پاک کرد.

وقتی که نسخه جدیدی از فری‌بی‌اس‌دی منتشر می‌شود، تنها زندان پایه نیاز به بروز رسانی دارد و لازم نیست همه زندان‌ها را تک تک به روزرسانی کنید. (بدون استفاده از ezjail هر زندان باید به صورت مجزا به روزرسانی شود که عملی بسیار طاقت فرسا و وقت‌گیر است) به روزرسانی زندان پایه هم به صورت باینری و با استفاده از freebsd-update و هم به روش کامپایل دستی از کدهای منبع امکان پذیر است.

ساختار یک زندان

در سیستم ezjail، یک زندان توسط دایرکتوری ریشه آن و همچنین تعدادی مقادیر پیکربندی مانند نام و آدرس‌های IP آن مخصوص آن زندان تعریف می‌شود. دایرکتوری ریشه جایی است که تمام فایل‌های مورد نیاز زندان در آن قرار دارند. البته این دایرکتوری تنها فایل‌هایی که مختص زندان مورد نظر هستند را دربرمی‌گیرد و بسیاری از فایل‌ها به وسیله زندان پایه در میان بقیه زندان‌ها به اشتراک گذاشته می‌شود تا در مصرف دیسک صرفه‌جویی شود. دایرکتوری ریشه یک زندان دریرگیرنده فایل‌های پیکربندی، داده‌ها و پورت‌هایی است که توسط مدیر سیستم بر روی زندان مورد نظر نصب شده اند. همان طور که گفته شد، زندان پایه به وسیله nullfs در میان بقیه زندان‌ها به اشتراک گذاشته شده است تا در فضا و شماره inode صرفه جویی شود، خصوصا وقتی که قرار است در داخل زندان‌ها از درخت پورت‌ها استفاده شود. همچنین با این کار در مصرف حافظه هم صرفه جویی می‌شود، چرا که هسته می‌تواند کپی برنامه‌های در حال اجرا را در بین زندان‌ها به اشتراک بگذارد و نیازی نیست تا یک نمونه از هر برنامه به ازای هر زندان در حافظه قرار گیرد. مسیری پیش فرضی که زندان‌ها در آن قرار دارند، مسیر /usr/jails است. البته با تنظیم کردن متغیر ‎$ezjail_jaildir می‌توان این مسیر را تغییر داد.

هر زندان، توسط یک فایل پیکربندی که در مسیر /usr/local/etc/ezjail/ قرار گرفته، تشریح می‌شود. نام این فایل با نام زندان مورد نظر برابر است. این فایل مجموعه‌ای از متغیرهاست که توسط sh خوانده می‌شود (همانند فایل rc.conf). این فایل هم زمان با زندان مورد نظر ایجاد می‌شود و عموما نیازی نیست تا مدیر سیستم آن را تغییر دهد. در ادامه برخی از متغیرهای این فایل را بررسی می‌کنیم. در کلیه متغیرها، عبارت JAILNAME را با نام واقعی زندان جایگزین کنید.

jail_JAILNAME_hostname نام میزبان زندان مورد نظر را مشخص می‌کند. به صورت پیش فرض، نام میزبان یک زندان، برابر با نام زندان است. مگر اینکه کاراکترهای خاصی برای نام گذاری مد نظر باشد.

jail_JAILNAME_ip آدرس(های) IP که قرار است به زندان اختصاص داده شود. برای مشخص کردن چند آدرس IP، می‌توانید انها را با کاما از هم جدا کنید.

jail_JAILNAME_rootdir دایرکتوری که فایل‌های زندان در آن نگه‌داری می‌شود.

jail_JAILNAME_exec_start دستوری که قرار است در هنگام آغاز به کار زندان در داخل آن اجرا شود. دستور پیش فرض ‎/bin/sh /etc/rc است.

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

jail_JAILNAME_devfs_enable یک متغیر بولی که مقدادیر YES یا NO می‌گیرد و مشخص می‌کند آیا سیستم‌فایل devfs در مسیر /dev در داخل زندان مونت شود یا نه.

ezjail_JAILNAME_procfs یک متغیر بولی که مشخص می‌کند آیا سیستم‌فایل /proc در داخل زندان مونت شود یا خیر.

ادامه دارد …