مدل توزیع حقوق اجباری در FreeBSD

معرفی

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

پرورش

این روش فقط برای سیستم فایل ufs مناسب است؛ در این مثال به ترتیب از zfs در سیستم اصلی و ufs در زندان استفاده می شود. اولین قدم بازسازی هسته است؛ هنگام نصب FreeBSD، کد منبع را نصب کنید.
پس از نصب سیستم، فایل را ویرایش کنید:

/usr/src/sys/amd64/conf/GENERIC

شما فقط باید یک خط به این فایل اضافه کنید:

options     MAC_MLS

برچسب mls/high یک موقعیت غالب بر برچسب mls/low خواهد داشت، برنامه‌هایی که با برچسب mls/low راه‌اندازی می‌شوند، نمی‌توانند به فایل‌هایی که دارای برچسب mls/high هستند دسترسی داشته باشند. جزئیات بیشتر در مورد تمام تگ های موجود در سیستم FreeBSD را می توان در این مطلب یافت رهبری.
سپس به پوشه /usr/src بروید:

cd /usr/src

برای شروع ساختن هسته، اجرا کنید (در کلید j تعداد هسته های سیستم را مشخص کنید):

make -j 4 buildkernel KERNCONF=GENERIC

پس از کامپایل شدن هسته، باید نصب شود:

make installkernel KERNCONF=GENERIC

پس از نصب هسته، برای راه اندازی مجدد سیستم عجله نکنید، زیرا لازم است کاربران را با پیکربندی قبلی به کلاس ورود منتقل کنید. فایل /etc/login.conf را ویرایش کنید، در این فایل باید کلاس لاگین پیش فرض را ویرایش کنید، آن را به فرم بیاورید:

default:
        :passwd_format=sha512:
        :copyright=/etc/COPYRIGHT:
        :welcome=/etc/motd:
        :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:
        :path=/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin ~/bin:
        :nologin=/var/run/nologin:
        :cputime=unlimited:
        :datasize=unlimited:
        :stacksize=unlimited:
        :memorylocked=64K:
        :memoryuse=unlimited:
        :filesize=unlimited:
        :coredumpsize=unlimited:
        :openfiles=unlimited:
        :maxproc=unlimited:
        :sbsize=unlimited:
        :vmemoryuse=unlimited:
        :swapuse=unlimited:
        :pseudoterminals=unlimited:
        :kqueues=unlimited:
        :umtxp=unlimited:
        :priority=0:
        :ignoretime@:
        :umask=022:
        :label=mls/equal:

خط :label=mls/equal به کاربرانی که عضو این کلاس هستند اجازه می‌دهد به فایل‌هایی که با هر برچسبی (mls/low، mls/high) علامت‌گذاری شده‌اند، دسترسی داشته باشند. پس از این دستکاری ها، باید پایگاه داده را بازسازی کنید و کاربر ریشه (و همچنین کسانی که به آن نیاز دارند) را در این کلاس ورود قرار دهید:

cap_mkdb /etc/login.conf
pw usermod root -L default

برای اینکه این خط مشی فقط برای فایل ها اعمال شود، باید فایل /etc/mac.conf را ویرایش کنید و فقط یک خط در آن باقی بگذارید:

default_labels file ?mls

همچنین باید ماژول mac_mls.ko را به autorun اضافه کنید:

echo 'mac_mls_load="YES"' >> /boot/loader.conf

پس از این، می توانید با خیال راحت سیستم را راه اندازی مجدد کنید. چگونه ایجاد کنیم زندان می توانید آن را در یکی از نشریات من بخوانید. اما قبل از ایجاد یک زندان، باید یک هارد دیسک اضافه کنید و یک سیستم فایل روی آن ایجاد کنید و چند برچسب را روی آن فعال کنید، یک فایل سیستم ufs2 با اندازه کلاستر 64 کیلوبایت ایجاد کنید:

newfs -O 2 -b 64kb /dev/ada1
tunefs -l enable /dev/ada1

پس از ایجاد سیستم فایل و افزودن چند برچسب، باید هارد دیسک را به /etc/fstab اضافه کنید، خط را به این فایل اضافه کنید:

/dev/ada1               /jail  ufs     rw              0       1

در Mountpoint، دایرکتوری را که در آن هارد دیسک را نصب می کنید، مشخص کنید؛ در Pass، حتما 1 را مشخص کنید (در چه ترتیبی این هارد دیسک بررسی می شود) - این ضروری است، زیرا سیستم فایل ufs به قطع ناگهانی برق حساس است. . پس از این مراحل، دیسک را سوار کنید:

mount /dev/ada1 /jail

jail را در این دایرکتوری نصب کنید. پس از اجرای زندان، باید همان دستکاری هایی را که در سیستم اصلی با کاربران و فایل های /etc/login.conf، /etc/mac.conf انجام می شود، انجام دهید.

تنظیم

قبل از نصب برچسب های لازم، توصیه می کنم تمام بسته های لازم را نصب کنید؛ در مورد من، برچسب ها با در نظر گرفتن این بسته ها تنظیم می شوند:

mod_php73-7.3.4_1              PHP Scripting Language
php73-7.3.4_1                  PHP Scripting Language
php73-ctype-7.3.4_1            The ctype shared extension for php
php73-curl-7.3.4_1             The curl shared extension for php
php73-dom-7.3.4_1              The dom shared extension for php
php73-extensions-1.0           "meta-port" to install PHP extensions
php73-filter-7.3.4_1           The filter shared extension for php
php73-gd-7.3.4_1               The gd shared extension for php
php73-gettext-7.3.4_1          The gettext shared extension for php
php73-hash-7.3.4_1             The hash shared extension for php
php73-iconv-7.3.4_1            The iconv shared extension for php
php73-json-7.3.4_1             The json shared extension for php
php73-mysqli-7.3.4_1           The mysqli shared extension for php
php73-opcache-7.3.4_1          The opcache shared extension for php
php73-openssl-7.3.4_1          The openssl shared extension for php
php73-pdo-7.3.4_1              The pdo shared extension for php
php73-pdo_sqlite-7.3.4_1       The pdo_sqlite shared extension for php
php73-phar-7.3.4_1             The phar shared extension for php
php73-posix-7.3.4_1            The posix shared extension for php
php73-session-7.3.4_1          The session shared extension for php
php73-simplexml-7.3.4_1        The simplexml shared extension for php
php73-sqlite3-7.3.4_1          The sqlite3 shared extension for php
php73-tokenizer-7.3.4_1        The tokenizer shared extension for php
php73-xml-7.3.4_1              The xml shared extension for php
php73-xmlreader-7.3.4_1        The xmlreader shared extension for php
php73-xmlrpc-7.3.4_1           The xmlrpc shared extension for php
php73-xmlwriter-7.3.4_1        The xmlwriter shared extension for php
php73-xsl-7.3.4_1              The xsl shared extension for php
php73-zip-7.3.4_1              The zip shared extension for php
php73-zlib-7.3.4_1             The zlib shared extension for php
apache24-2.4.39 

در این مثال، برچسب ها با در نظر گرفتن وابستگی های این بسته ها تنظیم می شوند. البته، می‌توانید این کار را ساده‌تر انجام دهید: برای پوشه /usr/local/lib و فایل‌های موجود در این فهرست، برچسب‌های mls/low را تنظیم کنید و بسته‌های نصب‌شده بعدی (به عنوان مثال، پسوندهای اضافی برای php) قادر به دسترسی خواهند بود. کتابخانه های موجود در این فهرست، اما به نظر من بهتر است فقط به آن دسته از فایل هایی که ضروری هستند دسترسی داشته باشم. زندان را متوقف کنید و برچسب های mls/high را روی همه فایل ها تنظیم کنید:

setfmac -R mls/high /jail

هنگام تنظیم علامت ها، اگر setfmac با لینک های سخت مواجه شود، روند متوقف می شود، در مثال من لینک های سخت را در دایرکتوری های زیر حذف کردم:

/var/db/etcupdate/current/
/var/db/etcupdate/current/etc
/var/db/etcupdate/current/usr/share/openssl/man/en.ISO8859-15
/var/db/etcupdate/current/usr/share/man/en.ISO8859-15
/var/db/etcupdate/current/usr/share/man/en.UTF-8
/var/db/etcupdate/current/usr/share/nls
/etc/ssl
/usr/local/etc
/usr/local/etc/fonts/conf.d
/usr/local/openssl

پس از تنظیم برچسب ها، باید برچسب های mls/low را برای apache تنظیم کنید، اولین کاری که باید انجام دهید این است که بدانید چه فایل هایی برای راه اندازی apache نیاز است:

ldd /usr/local/sbin/httpd

پس از اجرای این دستور، وابستگی ها روی صفحه نمایش داده می شوند، اما تنظیم برچسب های لازم روی این فایل ها کافی نخواهد بود، زیرا دایرکتوری هایی که این فایل ها در آنها قرار دارند دارای برچسب mls/high هستند، بنابراین این دایرکتوری ها نیز باید برچسب گذاری شوند. mls/کم. هنگام راه‌اندازی، آپاچی فایل‌های لازم برای اجرای آن را نیز خروجی می‌دهد، و برای php این وابستگی‌ها را می‌توان در گزارش httpd-error.log پیدا کرد.

setfmac mls/low /
setfmac mls/low /usr/local/lib/libpcre.so.1
setfmac mls/low /usr/local/lib/libaprutil-1.so.0
setfmac mls/low /usr/local/lib/libdb-5.3.so.0
setfmac mls/low /usr/local/lib/libgdbm.so.6
setfmac mls/low /usr/local/lib/libexpat.so.1
setfmac mls/low /usr/local/lib/libapr-1.so.0
setfmac mls/low /lib/libcrypt.so.5
setfmac mls/low /lib/libthr.so.3
setfmac mls/low /lib/libc.so.7
setfmac mls/low /usr/local/lib/libintl.so.8
setfmac mls/low /var
setfmac mls/low /var/run
setfmac mls/low /var/log
setfmac mls/low /var/log/httpd-access.log
setfmac mls/low /var/log/httpd-error.log
setfmac mls/low /var/run/httpd.pid
setfmac mls/low /lib
setfmac mls/low /lib/libcrypt.so.5
setfmac mls/low /usr/local/lib/db5/libdb-5.3.so.0
setfmac mls/low /usr/local/lib/db5/libdb-5.3.so.0.0.0
setfmac mls/low /usr/local/lib/db5
setfmac mls/low /usr/local/lib
setfmac mls/low /libexec
setfmac mls/low /libexec/ld-elf.so.1
setfmac  mls/low /dev
setfmac  mls/low /dev/random
setfmac  mls/low /usr/local/libexec
setfmac  mls/low /usr/local/libexec/apache24
setfmac  mls/low /usr/local/libexec/apache24/*
setfmac  mls/low /etc/pwd.db
setfmac  mls/low /etc/passwd
setfmac  mls/low /etc/group
setfmac  mls/low /etc/
setfmac  mls/low /usr/local/etc
setfmac -R mls/low /usr/local/etc/apache24
setfmac mls/low /usr
setfmac mls/low /usr/local
setfmac mls/low /usr/local/sbin
setfmac mls/low /usr/local/sbin/*
setfmac -R mls/low /usr/local/etc/rc.d/
setfmac mls/low /usr/local/sbin/htcacheclean
setfmac mls/low /var/log/httpd-access.log
setfmac mls/low /var/log/httpd-error.log
setfmac -R mls/low /usr/local/www
setfmac mls/low /usr/lib
setfmac mls/low /tmp
setfmac -R mls/low /usr/local/lib/php
setfmac -R mls/low /usr/local/etc/php
setfmac mls/low /usr/local/etc/php.conf
setfmac mls/low /lib/libelf.so.2
setfmac mls/low /lib/libm.so.5
setfmac mls/low /usr/local/lib/libxml2.so.2
setfmac mls/low /lib/libz.so.6
setfmac mls/low /usr/lib/liblzma.so.5
setfmac mls/low /usr/local/lib/libiconv.so.2
setfmac mls/low /usr/lib/librt.so.1
setfmac mls/low /lib/libthr.so.3
setfmac mls/low /usr/local/lib/libpng16.so.16
setfmac mls/low /usr/lib/libbz2.so.4
setfmac mls/low /usr/local/lib/libargon2.so.0
setfmac mls/low /usr/local/lib/libpcre2-8.so.0
setfmac mls/low /usr/local/lib/libsqlite3.so.0
setfmac mls/low /usr/local/lib/libgd.so.6
setfmac mls/low /usr/local/lib/libjpeg.so.8
setfmac mls/low /usr/local/lib/libfreetype.so
setfmac mls/low /usr/local/lib/libfontconfig.so.1
setfmac mls/low /usr/local/lib/libtiff.so.5
setfmac mls/low /usr/local/lib/libwebp.so.7
setfmac mls/low /usr/local/lib/libjbig.so.2
setfmac mls/low /usr/lib/libssl.so.8
setfmac mls/low /lib/libcrypto.so.8
setfmac mls/low /usr/local/lib/libzip.so.5
setfmac mls/low /etc/resolv.conf

این لیست حاوی تگ های mls/low برای همه فایل هایی است که برای عملکرد صحیح ترکیب apache و php (برای بسته هایی که در مثال من نصب شده اند) ضروری هستند.

آخرین لمس پیکربندی زندان برای اجرا در سطح mls/برابر و apache در سطح mls/low خواهد بود. برای شروع jail، باید تغییراتی در اسکریپت /etc/rc.d/jail ایجاد کنید، توابع jail_start را در این اسکریپت پیدا کنید، متغیر فرمان را به شکل تغییر دهید:

command="setpmac mls/equal $jail_program"

دستور setpmac فایل اجرایی را در سطح قابلیت مورد نیاز، در این مورد mls/equal، اجرا می کند تا به همه برچسب ها دسترسی داشته باشد. در آپاچی باید اسکریپت راه اندازی /usr/local/etc/rc.d/apache24 را ویرایش کنید. تابع apache24_prestart را تغییر دهید:

apache24_prestart() {
        apache24_checkfib
        apache24_precmd
        eval "setpmac mls/low" ${command} ${apache24_flags}
}

В رسمی دفترچه راهنما حاوی مثال دیگری است، اما من نتوانستم از آن استفاده کنم زیرا مرتباً پیامی مبنی بر عدم امکان استفاده از دستور setpmac دریافت می کردم.

نتیجه

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

فهرست منابعی که در نوشتن این نشریه به من کمک کردند:

https://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac.html

منبع: www.habr.com

اضافه کردن نظر