Model distribuce povinných práv ve FreeBSD

úvod

Chcete-li poskytnout další úroveň zabezpečení serveru, můžete použít mandátní model distribuce přístupu. Tato publikace popisuje, jak můžete spustit apache ve vězení s přístupem pouze k těm komponentám, které vyžadují přístup pro apache a php, aby správně fungovaly. Pomocí tohoto principu můžete omezit nejen Apache, ale i jakýkoli jiný stack.

Trénink

Tato metoda je vhodná pouze pro souborový systém ufs, v tomto příkladu bude zfs použit v hlavním systému, respektive ufs ve vězení. Prvním krokem je přebudování jádra, při instalaci FreeBSD nainstalujte zdrojový kód.
Po instalaci systému upravte soubor:

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

Do tohoto souboru stačí přidat jeden řádek:

options     MAC_MLS

Štítek mls/high bude mít dominantní postavení nad štítkem mls/low, aplikace, které budou spuštěny se štítkem mls/low, nebudou mít přístup k souborům, které mají štítek mls/high. Více podrobností o všech dostupných značkách v systému FreeBSD naleznete zde průvodce.
Dále přejděte do adresáře /usr/src:

cd /usr/src

Chcete-li začít sestavovat jádro, spusťte (v klíči j zadejte počet jader v systému):

make -j 4 buildkernel KERNCONF=GENERIC

Po zkompilování jádra je třeba jej nainstalovat:

make installkernel KERNCONF=GENERIC

Po instalaci jádra nespěchejte s restartováním systému, protože je nutné přenést uživatele do třídy přihlášení, kterou předtím nakonfigurovali. Upravte soubor /etc/login.conf, v tomto souboru musíte upravit výchozí třídu přihlášení, přeneste ji do formuláře:

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:

Řádek :label=mls/equal umožní uživatelům, kteří jsou členy této třídy, přístup k souborům, které jsou označeny libovolným štítkem (mls/low, mls/high). Po těchto manipulacích musíte znovu sestavit databázi a umístit uživatele root (stejně jako ty, kteří to potřebují) do této přihlašovací třídy:

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

Aby se zásady vztahovaly pouze na soubory, musíte upravit soubor /etc/mac.conf a ponechat v něm pouze jeden řádek:

default_labels file ?mls

Musíte také přidat modul mac_mls.ko do automatického spouštění:

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

Poté můžete bezpečně restartovat systém. Jak vytvořit vězení Můžete si to přečíst v jedné z mých publikací. Ale před vytvořením vězení musíte přidat pevný disk a vytvořit na něm systém souborů a povolit na něm multilabel, vytvořit souborový systém ufs2 s velikostí clusteru 64 kb:

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

Po vytvoření systému souborů a přidání multilabelu musíte přidat pevný disk do /etc/fstab, přidejte řádek do tohoto souboru:

/dev/ada1               /jail  ufs     rw              0       1

V Mountpointu zadejte adresář, do kterého budete pevný disk připojovat; v Pass nezapomeňte zadat 1 (v jakém pořadí bude tento pevný disk kontrolován) - je to nutné, protože souborový systém ufs je citlivý na náhlé výpadky napájení . Po těchto krocích připojte disk:

mount /dev/ada1 /jail

Nainstalujte jail do tohoto adresáře. Po spuštění vězení v něm musíte provést stejné manipulace jako v hlavním systému s uživateli a soubory /etc/login.conf, /etc/mac.conf.

Nastavení

Před instalací potřebných značek doporučuji nainstalovat všechny potřebné balíčky, v mém případě budou značky nastaveny s ohledem na tyto 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 příkladu budou štítky nastaveny s ohledem na závislosti těchto balíčků. Samozřejmě to můžete udělat jednodušeji: pro složku /usr/local/lib a soubory umístěné v tomto adresáři nastavte štítky mls/low a následně nainstalované balíčky (například další rozšíření pro php) budou mít přístup knihovny v tomto adresáři, ale zdá se mi lepší poskytnout přístup pouze k těm souborům, které jsou nezbytné. Zastavte vězení a nastavte štítky mls/high na všechny soubory:

setfmac -R mls/high /jail

Při nastavování značek se proces zastaví, pokud setfmac narazí na pevné odkazy, v mém příkladu jsem smazal pevné odkazy v následujících adresářích:

/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ítků musíte nastavit štítky mls/low pro apache, první věc, kterou musíte udělat, je zjistit, jaké soubory jsou potřeba ke spuštění apache:

ldd /usr/local/sbin/httpd

Po provedení tohoto příkazu se na obrazovce zobrazí závislosti, ale nastavení potřebných štítků na těchto souborech nebude stačit, protože adresáře, ve kterých se tyto soubory nacházejí, mají štítek mls/high, takže je potřeba označit i tyto adresáře mls/nízká. Při startu Apache také vypíše soubory, které jsou nutné k jeho spuštění, a pro php lze tyto závislosti nalézt v protokolu 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 seznam obsahuje značky mls/low pro všechny soubory, které jsou nezbytné pro správnou funkci kombinace apache a php (pro ty balíčky, které jsou nainstalovány v mém příkladu).

Posledním krokem bude konfigurace vězení tak, aby běželo na úrovni mls/equal a Apache na úrovni mls/low. Chcete-li spustit vězení, musíte provést změny ve skriptu /etc/rc.d/jail, najít v tomto skriptu funkce jail_start, změnit proměnnou příkazu na tvar:

command="setpmac mls/equal $jail_program"

Příkaz setpmac spustí spustitelný soubor na požadované úrovni schopností, v tomto případě mls/equal, aby měl přístup ke všem štítkům. V Apache musíte upravit spouštěcí skript /usr/local/etc/rc.d/apache24. Změňte funkci apache24_prestart:

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

В oficiální Manuál obsahuje další příklad, ale nemohl jsem jej použít, protože se mi neustále objevovala zpráva o nemožnosti použít příkaz setpmac.

Výkon

Tento způsob distribuce přístupu přidá další úroveň zabezpečení Apache (ačkoli je tento způsob vhodný pro jakýkoli jiný stack), který navíc běží ve vězení, zároveň se to pro administrátora stane transparentně a nepozorovaně.

Seznam zdrojů, které mi pomohly při psaní této publikace:

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

Zdroj: www.habr.com

Přidat komentář