Модел дистрибуције обавезних права у ФрееБСД-у

Увод

Да бисте обезбедили додатни ниво безбедности сервера, можете да користите мандатни модел дистрибуција приступа. Ова публикација ће описати како можете покренути апацхе у затвору са приступом само оним компонентама којима је потребан приступ да би апацхе и пхп исправно радили. Користећи овај принцип, можете ограничити не само Апацхе, већ и било који други стек.

Обука

Овај метод је погодан само за систем датотека уфс у овом примеру, зфс ће се користити у главном систему, а уфс у затвору; Први корак је да поново изградите кернел када инсталирате ФрееБСД, инсталирајте изворни код.
Након што се систем инсталира, уредите датотеку:

/usr/src/sys/amd64/conf/GENERIC

Потребно је да додате само један ред овој датотеци:

options     MAC_MLS

Ознака млс/хигх ће имати доминантну позицију над ознаком млс/лов, апликације које ће бити покренуте са ознаком млс/лов неће моћи да приступе датотекама које имају ознаку млс/хигх. Више детаља о свим доступним ознакама у систему ФрееБСД можете наћи у овоме вођство.
Затим идите у директоријум /уср/срц:

cd /usr/src

Да бисте започели прављење кернела, покрените (у кључу ј наведите број језгара у систему):

make -j 4 buildkernel KERNCONF=GENERIC

Након што је кернел компајлиран, мора се инсталирати:

make installkernel KERNCONF=GENERIC

Након инсталирања кернела, немојте журити да поново покренете систем, јер је потребно пренети кориснике у класу за пријаву, након што сте је претходно конфигурисали. Уредите датотеку /етц/логин.цонф, у овој датотеци треба да уредите подразумевану класу за пријаву, доведите је у форму:

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:

Линија :лабел=млс/екуал ће омогућити корисницима који су чланови ове класе да приступе датотекама које су означене било којом ознаком (млс/лов, млс/хигх). Након ових манипулација, потребно је да поново изградите базу података и поставите роот корисника (као и оне којима је то потребно) у ову класу за пријаву:

cap_mkdb /etc/login.conf
pw usermod root -L default

Да би се политика применила само на датотеке, потребно је да измените /етц/мац.цонф датотеку, остављајући само један ред у њој:

default_labels file ?mls

Такође морате да додате модул мац_млс.ко у аутоматско покретање:

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

Након тога, можете безбедно поново покренути систем. Како створити затвор Можете га прочитати у једној од мојих публикација. Али пре него што направите затвор, потребно је да додате чврсти диск и креирате систем датотека на њему и омогућите више ознака на њему, креирате уфс2 систем датотека са величином кластера од 64 кб:

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

Након креирања система датотека и додавања мултилабел, потребно је да додате чврсти диск у /етц/фстаб, додајте ред овој датотеци:

/dev/ada1               /jail  ufs     rw              0       1

У Моунтпоинту наведите директоријум у који ћете монтирати чврсти диск у Пасс-у, обавезно наведите 1 (у ком редоследу ће се овај чврсти диск проверавати) - ово је неопходно, пошто је систем датотека уфс осетљив на изненадне прекиде напајања; . Након ових корака, монтирајте диск:

mount /dev/ada1 /jail

Инсталирајте јаил у овај директоријум. Након што се јаил покрене, потребно је да урадите исте манипулације у њему као у главном систему са корисницима и датотекама /етц/логин.цонф, /етц/мац.цонф.

подешавање

Пре инсталирања потребних ознака, препоручујем да инсталирате све потребне пакете у мом случају, ознаке ће бити постављене узимајући у обзир ове пакете:

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 

У овом примеру, ознаке ће бити постављене узимајући у обзир зависности ових пакета. Наравно, можете то учинити једноставније: за фасциклу /уср/лоцал/либ и датотеке које се налазе у овом директоријуму, подесите ознаке млс/лов и накнадно инсталирани пакети (на пример, додатне екстензије за пхп) ће моћи да приступе библиотеке у овом директоријуму, али ми се чини боље да омогући приступ само оним датотекама које су неопходне. Зауставите затвор и поставите млс/хигх ознаке на све датотеке:

setfmac -R mls/high /jail

Приликом постављања ознака, процес ће бити заустављен ако сетфмац наиђе на чврсте везе, у мом примеру сам обрисао чврсте везе у следећим директоријумима:

/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

Након што су ознаке постављене, потребно је да подесите млс/лов лабеле за апацхе, прва ствар коју треба да урадите је да сазнате које датотеке су потребне за покретање апацхе-а:

ldd /usr/local/sbin/httpd

Након извршења ове команде, зависности ће бити приказане на екрану, али постављање потребних ознака на ове датотеке неће бити довољно, пошто директоријуми у којима се ти фајлови налазе имају ознаку млс/хигх, па је потребно и ове директоријуме означити млс/лов. Приликом покретања, апацхе ће такође избацити датотеке које су неопходне за његово покретање, а за пхп ове зависности се могу наћи у дневнику хттпд-еррор.лог.

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

Ова листа садржи млс/лов ознаке за све датотеке које су неопходне за исправан рад апацхе и пхп комбинације (за оне пакете који су инсталирани у мом примеру).

Последњи додир ће бити да конфигуришете јаил да ради на млс/екуал нивоу, а апацхе на млс/лов нивоу. Да бисте покренули затвор, потребно је да унесете измене у /етц/рц.д/јаил скрипту, пронађете јаил_старт функције у овој скрипти, промените командну променљиву у форму:

command="setpmac mls/equal $jail_program"

Команда сетпмац покреће извршну датотеку на потребном нивоу могућности, у овом случају млс/екуал, да би имала приступ свим ознакама. У Апацхе-у морате уредити скрипту за покретање /уср/лоцал/етц/рц.д/апацхе24. Промените функцију апацхе24_престарт:

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

В званичник Приручник садржи још један пример, али нисам могао да га користим јер сам стално добијао поруку о немогућности коришћења команде сетпмац.

Излаз

Овај начин дистрибуције приступа ће додати додатни ниво сигурности Апацхе-у (иако је овај метод погодан за било који други стек), који поред тога ради у затвору, у исто време, за администратора ће се све ово дешавати транспарентно и неприметно.

Списак извора који су ми помогли у писању ове публикације:

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

Извор: ввв.хабр.цом

Додај коментар