Увядзенне
Для забеспячэння дадатковага ўзроўню бяспекі сервера можна выкарыстоўваць
Падрыхтоўка
Дадзены метад падыдзе толькі для файлавай сістэмы 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
Пасля гэтага можна смела перазагрузіць сістэму. Як стварыць
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}
}
В
Выснова
Дадзены спосаб размеркавання доступу дадасць дадатковы ўзровень абароненасці apache (хоць гэты спосаб падыдзе да любога іншага стэка), які апроч гэтага запускаецца ў jail, у той жа час для адміністратара ўсё гэта будзе адбывацца празрыста і не прыкметна.
Спіс крыніцай, якія мне дапамаглі ў напісанні дадзенай публікацыі:
Крыніца: habr.com