Úvod
Na zabezpečenie ďalšej úrovne bezpečnosti servera je možné použiť distribúcie prístupu. V tomto článku bude opísané, ako je možné spúšťať apache v jail s prístupom len k tým komponentom, ku ktorým je potrebný prístup na korektnú prácu apache a php. Na tento princíp je možné obmedziť nielen apache, ale aj akýkoľvek iný stack.
Príprava
Táto metóda je vhodná len pre súborový systém ufs, v tomto príklade bude v hlavnom systéme použitý zfs a v jail príslušne ufs. Najprv je potrebné prekompilovať jadro, pri inštalácii FreeBSD si nainštalujte zdrojový kód.
Po tom, ako bude systém nainštalovaný, editujte súbor:
/usr/src/sys/amd64/conf/GENERIC
Do tohto súboru je potrebné pridať len jeden riadok:
options MAC_MLS
Štítok mls/high bude mať dominujúce postavenie nad štítkom mls/low, aplikácie, ktoré budú spustené so štítkom mls/low, sa nebudú môcť dostať k súborom, ktoré majú štítok mls/high. Podrobnejšie informácie o všetkých dostupných štítkoch v systéme FreeBSD si môžete prečítať v tomto .
Ďalej prejdite do adresára /usr/src:
cd /usr/src
Na spustenie zostavenia jadra vykonajte (v kľúči j uveďte počet jadier v systéme):
make -j 4 buildkernel KERNCONF=GENERIC
Po tom, ako bude jadro zostavené, je potrebné ho nainštalovať:
make installkernel KERNCONF=GENERIC
Po inštalácii jadra sa nepokúšajte ihneď reštartovať systém, pretože je potrebné preložiť používateľov do prihlasovacej triedy, predtým ju nastavte. Editujte súbor /etc/login.conf, v tomto súbore je potrebné editovať prihlasovaciu triedu default a upraviť ju na:
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í používateľom, ktorí sú v tejto triede, získať prístup k súborom, ktoré sú označené akýmkoľvek štítkom (mls/low, mls/high). Po týchto manipuláciách je potrebné prekompilovať databázu a preniesť používateľa root (ako aj tých, ktorým je to potrebné) do tejto prihlasovacej triedy:
cap_mkdb /etc/login.conf
pw usermod root -L default
Aby táto politika platila iba pre súbory, je potrebné upraviť súbor /etc/mac.conf a ponechať v ňom iba jeden riadok:
default_labels file ?mls
Je tiež potrebné pridať modul mac_mls.ko do automatického spúšťania:
echo 'mac_mls_load="YES"' >> /boot/loader.conf
Po tom môžete bezstarostne reštartovať systém. Ako vytvoriť si môžete prečítať v jednom z mých publikácií. Ale predtým, ako vytvoríte jail, je potrebné pridať prísny disk a vytvoriť na ňom súborový systém a povoliť multilabel, vytvorte súborový systém ufs2 s veľkosťou bloku 64kb:
newfs -O 2 -b 64kb /dev/ada1
tunefs -l enable /dev/ada1
Po vytvorení súborového systému a pridaní multilabel je potrebné pridať prísny disk do /etc/fstab, pridajte riadok do tohto súboru:
/dev/ada1 /jail ufs rw 0 1
V Mountpoint uveďte adresár, do ktorého budete montovať prísny disk, v Pass určite uveďte 1 (v akej sekvencii sa bude kontrolovať tento prísny disk) — to je potrebné, pretože súborový systém ufs je citlivý na náhle výpadky napájania. Po týchto krokoch namontujte disk:
mount /dev/ada1 /jail
Do tohto adresára nainštalujte jail. Po tom, ako jail začne fungovať, je potrebné vykonať v ňom rovnaké úkony, ako v hlavnom systéme s používateľmi a súbormi /etc/login.conf, /etc/mac.conf.
Nastavenie
Predtým, ako nastavíte potrebné značky, odporúčam nainštalovať všetky potrebné balíky, v mojom prípade budú značky nastavené so zohľadnením týchto balíkov:
mod_php73-7.3.4_1 PHP Skriptovací jazyk
php73-7.3.4_1 PHP Skriptovací jazyk
php73-ctype-7.3.4_1 Sdílené rozšíření ctype pro php
php73-curl-7.3.4_1 Sdílené rozšíření curl pro php
php73-dom-7.3.4_1 Sdílené rozšíření dom pro php
php73-extensions-1.0 "meta-port" pro instalaci PHP rozšíření
php73-filter-7.3.4_1 Sdílené rozšíření filter pro php
php73-gd-7.3.4_1 Sdílené rozšíření gd pro php
php73-gettext-7.3.4_1 Sdílené rozšíření gettext pro php
php73-hash-7.3.4_1 Sdílené rozšíření hash pro php
php73-iconv-7.3.4_1 Sdílené rozšíření iconv pro php
php73-json-7.3.4_1 Sdílené rozšíření json pro php
php73-mysqli-7.3.4_1 Sdílené rozšíření mysqli pro php
php73-opcache-7.3.4_1 Sdílené rozšíření opcache pro php
php73-openssl-7.3.4_1 Sdílené rozšíření openssl pro php
php73-pdo-7.3.4_1 Sdílené rozšíření pdo pro php
php73-pdo_sqlite-7.3.4_1 Sdílené rozšíření pdo_sqlite pro php
php73-phar-7.3.4_1 Sdílené rozšíření phar pro php
php73-posix-7.3.4_1 Sdílené rozšíření posix pro php
php73-session-7.3.4_1 Sdílené rozšíření session pro php
php73-simplexml-7.3.4_1 Sdílené rozšíření simplexml pro php
php73-sqlite3-7.3.4_1 Sdílené rozšíření sqlite3 pro php
php73-tokenizer-7.3.4_1 Sdílené rozšíření tokenizer pro php
php73-xml-7.3.4_1 Sdílené rozšíření xml pro php
php73-xmlreader-7.3.4_1 Sdílené rozšíření xmlreader pro php
php73-xmlrpc-7.3.4_1 Sdílené rozšíření xmlrpc pro php
php73-xmlwriter-7.3.4_1 Sdílené rozšíření xmlwriter pro php
php73-xsl-7.3.4_1 Sdílené rozšíření xsl pro php
php73-zip-7.3.4_1 Sdílené rozšíření zip pro php
php73-zlib-7.3.4_1 Sdílené rozšíření zlib pro php
apache24-2.4.39
V tomto příkladu budou štítky nastaveny s ohledem na závislosti daných balíčků. Můžete to samozřejmě udělat jednodušeji, nastavit štítky mls/low pro adresář /usr/local/lib a soubory, které se nacházejí v tomto adresáři, ale myslím, že je lepší poskytnout přístup pouze k těm souborům, které jsou nezbytné. Zastavte jail a nastavte štítky mls/high pro všechny soubory:
setfmac -R mls/high /jail
Při nastavování štítků se proces zastaví, pokud se setfmac setká s tvrdými odkazy; v mém příkladu jsem odstraňoval tvrdé 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 nastavování štítků je nutné nastavit štítky mls/low pro apache, nejprve je potřeba zjistit, které soubory jsou nezbytné pro spuštění apache:
ldd /usr/local/sbin/httpd
Po vykonaní tejto príkazovej sekvencie sa na obrazovke zobrazia závislosti, ale na pre dané súbory bude potrebné nastaviť požadované značky, pretože adresáre, v ktorých sa tieto súbory nachádzajú, majú značku mls/high, a preto je potrebné nastaviť značku mls/low aj pre tieto adresáre. Pri spustení apache sa tiež zobrazia súbory potrebné na jeho spustenie, a pre php je možné tieto závislosti zistiť v logu 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
V tomto zozname sa nastavujú značky mls/low na všetky súbory, ktoré sú nevyhnutné pre správnu funkciu väzby medzi apache a php (pre tie balíčky, ktoré sú nainštalované v mojom príklade).
Posledným krokom bude nastavenie spustenia jail na úrovni mls/equal a apache na úrovni mls/low. Na spustenie jail je potrebné vykonať zmeny v skripte /etc/rc.d/jail, nájdite v tomto skripte funkcie jail_start a premennú command upravte na nasledujúcu podobu:
command="setpmac mls/equal $jail_program"
Príkaz setpmac spúšťa vykonateľný súbor na potrebnej mandátnej úrovni, v tomto prípade mls/equal, aby mal prístup ku všetkým označeniam. V apache je potrebné upraviť štartovací skript /usr/local/etc/rc.d/apache24. Urobte zmeny vo funkcii apache24_prestart:
apache24_prestart() {
apache24_checkfib
apache24_precmd
eval "setpmac mls/low" ${command} ${apache24_flags}
}
V V príručke je uvedený iný príklad, ale nemohol som ho použiť, pretože som neustále dostával správu o nemožnosti použiť príkaz setpmac.
Záver
Tento spôsob distribúcie prístupu pridá ďalšiu úroveň ochrany apache (aj keď tento prístup je vhodný pre akýkoľvek iný stack), ktorý sa navyše spúšťa v jail, zatiaľ čo pre správcu sa to všetko bude diať priehľadne a neviditeľne.
Zoznam zdrojov, ktoré mi pomohli pri písaní tejto publikácie:
Zdroj: habr.com
