Model distribúcie povinných práv vo FreeBSD

Úvod

Ak chcete poskytnúť ďalšiu úroveň zabezpečenia servera, môžete použiť mandátny model distribúcia prístupu. Táto publikácia popisuje, ako môžete spustiť apache vo väzení s prístupom len k tým komponentom, ktoré vyžadujú prístup pre správne fungovanie apache a php. Pomocou tohto princípu môžete obmedziť nielen Apache, ale aj akýkoľvek iný zásobník.

Tréning

Táto metóda je vhodná iba pre súborový systém ufs; v tomto príklade sa zfs použije v hlavnom systéme a ufs vo väzení. Prvým krokom je prebudovanie jadra; pri inštalácii FreeBSD nainštalujte zdrojový kód.
Po nainštalovaní systému upravte súbor:

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

Do tohto súboru stačí pridať jeden riadok:

options     MAC_MLS

Označenie mls/high bude mať dominantné postavenie nad označením mls/low, aplikácie, ktoré budú spustené s označením mls/low, nebudú mať prístup k súborom, ktoré majú označenie mls/high. Viac podrobností o všetkých dostupných tagoch ​​v systéme FreeBSD nájdete v tomto vedenie.
Ďalej prejdite do adresára /usr/src:

cd /usr/src

Ak chcete začať zostavovať jadro, spustite (v kľúči j zadajte počet jadier v systéme):

make -j 4 buildkernel KERNCONF=GENERIC

Po kompilácii jadra je potrebné ho nainštalovať:

make installkernel KERNCONF=GENERIC

Po inštalácii jadra sa neponáhľajte s reštartovaním systému, pretože je potrebné preniesť používateľov do prihlasovacej triedy po jej predchádzajúcej konfigurácii. Upravte súbor /etc/login.conf, v tomto súbore musíte upraviť predvolenú prihlasovaciu triedu, uveďte ju do formulára:

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:

Riadok :label=mls/equal umožní užívateľom, ktorí sú členmi tejto triedy, pristupovať k súborom, ktoré sú označené akoukoľvek menovkou (mls/low, mls/high). Po týchto manipuláciách musíte obnoviť databázu a umiestniť používateľa root (rovnako ako tých, ktorí to potrebujú) do tejto prihlasovacej triedy:

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

Aby sa politika vzťahovala iba na súbory, musíte upraviť súbor /etc/mac.conf a ponechať v ňom iba jeden riadok:

default_labels file ?mls

Musíte tiež pridať modul mac_mls.ko do automatického spustenia:

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

Potom môžete bezpečne reštartovať systém. Ako vytvoriť väzenia Môžete si to prečítať v jednej z mojich publikácií. Pred vytvorením väzenia však musíte pridať pevný disk a vytvoriť na ňom súborový systém a povoliť na ňom multilabel, vytvoriť súborový systém ufs2 s veľkosťou klastra 64 kb:

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

Po vytvorení systému súborov a pridaní multilabelu musíte pridať pevný disk do /etc/fstab, do tohto súboru pridať riadok:

/dev/ada1               /jail  ufs     rw              0       1

V Mountpointe zadajte adresár, do ktorého pripojíte pevný disk; v Pass nezabudnite zadať 1 (v akom poradí bude tento pevný disk kontrolovaný) - je to potrebné, pretože súborový systém ufs je citlivý na náhle výpadky napájania . Po týchto krokoch pripojte disk:

mount /dev/ada1 /jail

Nainštalujte väzenie do tohto adresára. Po spustení väzenia v ňom musíte vykonať rovnaké manipulácie ako v hlavnom systéme s používateľmi a súbormi /etc/login.conf, /etc/mac.conf.

nastavenie

Pred inštaláciou potrebných značiek odporúčam nainštalovať všetky potrebné balíčky, v mojom prípade budú značky nastavené s ohľadom na tieto balíčky:

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 

V tomto príklade budú menovky nastavené s ohľadom na závislosti týchto balíkov. Samozrejme, môžete to urobiť jednoduchšie: pre priečinok /usr/local/lib a súbory umiestnené v tomto adresári nastavte štítky mls/low a následne nainštalované balíky (napríklad ďalšie rozšírenia pre php) budú mať prístup knižnice v tomto adresári, ale zdá sa mi lepšie poskytnúť prístup iba k tým súborom, ktoré sú potrebné. Zastavte väzenie a nastavte štítky mls/high na všetky súbory:

setfmac -R mls/high /jail

Pri nastavovaní značiek sa proces zastaví, ak setfmac narazí na pevné odkazy, v mojom príklade som odstránil pevné odkazy v nasledujúcich adresároch:

/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

Po nastavení štítkov musíte nastaviť štítky mls/low pre apache, prvá vec, ktorú musíte urobiť, je zistiť, aké súbory sú potrebné na spustenie apache:

ldd /usr/local/sbin/httpd

Po vykonaní tohto príkazu sa na obrazovke zobrazia závislosti, ale nastavenie potrebných štítkov na týchto súboroch nebude stačiť, keďže adresáre, v ktorých sa tieto súbory nachádzajú, majú štítok mls/high, preto je potrebné označiť aj tieto adresáre mls/nízka. Pri spustení Apache vypíše aj súbory, ktoré sú potrebné na jeho spustenie a pre php tieto závislosti nájdete v protokole 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

Tento zoznam obsahuje značky mls/low pre všetky súbory, ktoré sú potrebné pre správnu činnosť kombinácie apache a php (pre tie balíčky, ktoré sú nainštalované v mojom príklade).

Posledným krokom bude konfigurácia väzenia na spustenie na úrovni mls/equal a Apache na úrovni mls/low. Ak chcete spustiť väzenie, musíte vykonať zmeny v skripte /etc/rc.d/jail, nájsť funkcie jail_start v tomto skripte, zmeniť premennú príkazu na tvar:

command="setpmac mls/equal $jail_program"

Príkaz setpmac spustí spustiteľný súbor na požadovanej úrovni schopností, v tomto prípade mls/equal, aby mal prístup ku všetkým označeniam. V Apache musíte upraviť spúšťací skript /usr/local/etc/rc.d/apache24. Zmeňte funkciu apache24_prestart:

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

В úradník Manuál obsahuje ďalší príklad, ale nemohol som ho použiť, pretože sa mi stále zobrazovalo hlásenie o nemožnosti použiť príkaz setpmac.

Výkon

Tento spôsob distribúcie prístupu pridá ďalšiu úroveň zabezpečenia pre apache (hoci tento spôsob je vhodný pre akýkoľvek iný zásobník), ktorý navyše beží vo väzení, pričom pre administrátora sa to všetko stane transparentne a nepozorovane.

Zoznam zdrojov, ktoré mi pomohli pri písaní tejto publikácie:

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

Zdroj: hab.com

Pridať komentár