Мандатен модел за разпределение на права в FreeBSD

Въведение

За допълнителен слой сигурност на сървъра може да се използва мандатен модел разпределение на достъпа. В тази публикация ще бъде описано как може да се стартира apache в jail с достъп само до компонентите, които са необходими за коректната работа на apache и php. По този принцип могат да се ограничават не само apache, но и всяка друга стек.

Подготовка

Този метод е подходящ само за файловата система ufs, като в този пример основната система ще използва zfs, а в jail съответно 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, приведете го в следния вид:

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). След тези манипулации е необходимо да се повторно компилира базата данни и да се постави потребителят root (както и тези, на които им е необходимо) в този клас за влизане:

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

След това можете спокойно да рестартирате системата. Как да създадете jail можете да прочетете в една от моите публикации. Но преди да създадете jail, е необходимо да добавите твърд диск, да създадете файлова система на него и да активирате multilabel, създайте файлова система ufs2 с размер на кластера 64kb:

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

В тази директория инсталирайте jail. След като jail заработи, в него е необходимо да извършите същите манипулации, както в основната система с потребителите и файловете /etc/login.conf, /etc/mac.conf.

Настройка

Преди да установите необходимите етикети, препоръчвам да инсталирате всички необходими пакети, в моя случай етикетите ще бъдат зададени с оглед на тези пакети:

mod_php73-7.3.4_1 PHP Сценарен език
php73-7.3.4_1 PHP Сценарен език
php73-ctype-7.3.4_1 Споделено разширение ctype за php
php73-curl-7.3.4_1 Споделено разширение curl за php
php73-dom-7.3.4_1 Споделено разширение dom за php
php73-extensions-1.0 "мета-порт" за инсталиране на PHP разширения
php73-filter-7.3.4_1 Споделено разширение filter за php
php73-gd-7.3.4_1 Споделено разширение gd за php
php73-gettext-7.3.4_1 Споделено разширение gettext за php
php73-hash-7.3.4_1 Споделено разширение hash за php
php73-iconv-7.3.4_1 Споделено разширение iconv за php
php73-json-7.3.4_1 Споделено разширение json за php
php73-mysqli-7.3.4_1 Споделено разширение mysqli за php
php73-opcache-7.3.4_1 Споделено разширение opcache за php
php73-openssl-7.3.4_1 Споделено разширение openssl за php
php73-pdo-7.3.4_1 Споделено разширение pdo за php
php73-pdo_sqlite-7.3.4_1 Споделено разширение pdo_sqlite за php
php73-phar-7.3.4_1 Споделено разширение phar за php
php73-posix-7.3.4_1 Споделено разширение posix за php
php73-session-7.3.4_1 Споделено разширение session за php
php73-simplexml-7.3.4_1 Споделено разширение simplexml за php
php73-sqlite3-7.3.4_1 Споделено разширение sqlite3 за php
php73-tokenizer-7.3.4_1 Споделено разширение tokenizer за php
php73-xml-7.3.4_1 Споделено разширение xml за php
php73-xmlreader-7.3.4_1 Споделено разширение xmlreader за php
php73-xmlrpc-7.3.4_1 Споделено разширение xmlrpc за php
php73-xmlwriter-7.3.4_1 Споделено разширение xmlwriter за php
php73-xsl-7.3.4_1 Споделено разширение xsl за php
php73-zip-7.3.4_1 Споделено разширение zip за php
php73-zlib-7.3.4_1 Споделено разширение zlib за php
apache24-2.4.39 

В този пример маркерите ще бъдат зададени, като се вземат предвид зависимостите на тези пакети. Разбира се, можете да подходите по-просто, като зададете маркери mls/low за папката /usr/local/lib и файловете, които се намират в този каталог, и следващите инсталирани пакети (например допълнителни разширения за php) ще могат да получат достъп до библиотеките в този каталог, но ми се струва по-добре да се предостави достъп само до тези файлове, които са необходими. Спирате jail и задавате маркери 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/low също трябва да бъде зададен и на тези директории. При стартиране на 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 (за тези пакети, които са инсталирани в моя пример).

Последният щрих ще бъде настройката на стартиране на jail на ниво mls/equal и apache на ниво mls/low. За да стартирате jail, е необходимо да направите промени в скрипта /etc/rc.d/jail, намерете в този скрипт функцията jail_start, променете променливата command по следния начин:

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 (въпреки че този метод е приложим и за друг стек), който освен това работи в jail, докато за администратора всичко това ще се случва прозрачно и незабелязано.

Списък на източниците, които ми помогнаха при написването на тази публикация:

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

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster