مقدمة
لتوفير مستوى إضافي من أمان الخادم، يمكنك استخدام
تدريب
هذه الطريقة مناسبة فقط لنظام الملفات 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
بعد ذلك، يمكنك إعادة تشغيل النظام بأمان. كيف تنشأ
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}
}
В
إنتاج
ستضيف طريقة توزيع الوصول هذه مستوى إضافيًا من الأمان إلى Apache (على الرغم من أن هذه الطريقة مناسبة لأي مكدس آخر)، والذي يعمل أيضًا في السجن، وفي نفس الوقت، سيحدث كل هذا للمسؤول بشفافية وغير ملحوظة.
قائمة المصادر التي ساعدتني في كتابة هذا المنشور:
المصدر: www.habr.com