Мандатная мадэль размеркавання правоў у 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 неабходна дадаць цвёрдую кружэлку і стварыць на ім файлавую сістэму і ўлучыць на ім 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 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), змогуць атрымае доступ да бібліятэк у дадзеным каталогу, але мне здаецца лепш даць доступ толькі да тых файла якія неабходныя. Спыніце 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

Дадаць каментар