نموذج توزيع الحقوق الإلزامي في FreeBSD

مقدمة

لتوفير مستوى إضافي من أمان الخادم، يمكنك استخدام نموذج الولاية توزيع الوصول. سيصف هذا المنشور كيف يمكنك تشغيل Apache في السجن مع إمكانية الوصول فقط إلى تلك المكونات التي تتطلب الوصول إلى Apache وphp للعمل بشكل صحيح. باستخدام هذا المبدأ، لا يمكنك تقييد Apache فحسب، بل يمكنك أيضًا تقييد أي مكدس آخر.

تدريب

هذه الطريقة مناسبة فقط لنظام الملفات 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 للتشغيل التلقائي:

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

بعد ذلك، يمكنك إعادة تشغيل النظام بأمان. كيف تنشأ سجن يمكنك قراءتها في أحد منشوراتي. ولكن قبل إنشاء سجن، تحتاج إلى إضافة محرك أقراص ثابت وإنشاء نظام ملفات عليه وتمكين التصنيف المتعدد عليه، وإنشاء نظام ملفات ufs2 بحجم مجموعة يبلغ 64 كيلو بايت:

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

بعد إنشاء نظام الملفات وإضافة multilabel، تحتاج إلى إضافة القرص الصلب إلى /etc/fstab، وإضافة السطر إلى هذا الملف:

/dev/ada1               /jail  ufs     rw              0       1

في Mountpoint، حدد الدليل الذي ستقوم بتثبيت محرك الأقراص الثابتة فيه؛ وفي Pass، تأكد من تحديد 1 (في أي تسلسل سيتم فحص محرك الأقراص الثابتة هذا) - وهذا ضروري، نظرًا لأن نظام ملفات ufs حساس لانقطاع التيار الكهربائي المفاجئ . بعد هذه الخطوات، قم بتثبيت القرص:

mount /dev/ada1 /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، لذا يجب أيضًا تسمية هذه الأدلة مل/منخفض. عند البدء، سيقوم Apache أيضًا بإخراج الملفات الضرورية لتشغيله، وبالنسبة لـ 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/equal، وApache على المستوى mls/low. لبدء السجن، تحتاج إلى إجراء تغييرات على البرنامج النصي /etc/rc.d/jail، والعثور على وظائف jail_start في هذا البرنامج النصي، وتغيير متغير الأمر إلى النموذج:

command="setpmac mls/equal $jail_program"

يقوم الأمر setpmac بتشغيل الملف القابل للتنفيذ على مستوى القدرة المطلوب، في هذه الحالة mls/equal، من أجل الوصول إلى جميع التصنيفات. في Apache، تحتاج إلى تحرير البرنامج النصي لبدء التشغيل /usr/local/etc/rc.d/apache24. قم بتغيير وظيفة Apache24_prestart:

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

В رسمي يحتوي الدليل على مثال آخر، لكنني لم أتمكن من استخدامه لأنني ظلت أتلقى رسالة تفيد بعدم القدرة على استخدام الأمر setpmac.

إنتاج

ستضيف طريقة توزيع الوصول هذه مستوى إضافيًا من الأمان إلى Apache (على الرغم من أن هذه الطريقة مناسبة لأي مكدس آخر)، والذي يعمل أيضًا في السجن، وفي نفس الوقت، سيحدث كل هذا للمسؤول بشفافية وغير ملحوظة.

قائمة المصادر التي ساعدتني في كتابة هذا المنشور:

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

المصدر: www.habr.com

إضافة تعليق