Bevezetés
A kiszolgáló biztonságának további szintjének biztosítása érdekében használható hozzáférés-elosztás. Ebben a publikációban leírjuk, hogyan lehet az Apachét jail módban futtatni, csak azokhoz az alkatrészekhez hozzáférve, amelyekre szükség van az Apache és PHP helyes működéséhez. Ezen az elven nemcsak az Apache, hanem bármely más stack is korlátozható.
Előkészületek
Ez a módszer csak az UFS fájlrendszerhez megfelelő; ebben a példában az alaprendszer ZFS-t, míg a jail UFS-t fog használni. Először is, újra kell építeni a kernelt, FreeBSD telepítésekor telepítse a forrást.
Miután a rendszer telepítve lett, szerkessze a fájlt:
/usr/src/sys/amd64/conf/GENERIC
Ehhez a fájlhoz mindössze egy sort kell hozzáadni:
options MAC_MLS
A mls/high jelölés dominálni fog a mls/low jelölés felett, a mls/low jelöléssel rendelkező alkalmazások nem tudják elérni a mls/high jelöléssel ellátott fájlokat. A FreeBSD rendszerben rendelkezésre álló összes jelölésről bővebben olvashat ebben a .
Ezután lépjen a /usr/src könyvtárba:
cd /usr/src
A kernel építéséhez futtassa (a j kulcsnál adja meg a rendszeren lévő magok számát):
make -j 4 buildkernel KERNCONF=GENERIC
Miután a kernel felépült, telepíteni kell:
make installkernel KERNCONF=GENERIC
A kernel telepítése után ne siessen a rendszer újraindításával, mivel a felhasználókat a belépési osztályba kell áthelyezni, azt először beállítva. Szerkessze a fájlt /etc/login.conf, ebben a fájlban a default belépési osztályt kell szerkeszteni, és a következő formában kell megadni:
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:
A :label=mls/equal sor lehetővé teszi a belépési osztályba tartozó felhasználók számára, hogy hozzáférjenek bármely jelöléssel (mls/low, mls/high) ellátott fájlokhoz. Ezek után frissíteni kell az adatbázist, és a root felhasználót (valamint azokat, akiknek szükségük van rá) át kell helyezni ebbe a belépési osztályba:
cap_mkdb /etc/login.conf
pw usermod root -L default
A politikának csak a fájlokra vonatkozóan való létrehozásához szerkesztenie kell a /etc/mac.conf fájlt, hagyja benne csak egy sor:
default_labels file ?mls
Továbbá hozzá kell adni a mac_mls.ko modult az automatikus indításhoz:
echo 'mac_mls_load="YES"' >> /boot/loader.conf
Ezután nyugodtan újraindíthatja a rendszert. Hogyan lehet létrehozni erről az egyik publikációmban olvashat. De a jail létrehozása előtt hozzá kell adnia egy merevlemezt, és létrehoznia kell egy fájlrendszert, és aktiválni kell rajta a multilabel funkciót, hozzon létre egy ufs2 fájlrendszert 64kb cluster mérettel:
newfs -O 2 -b 64kb /dev/ada1
tunefs -l enable /dev/ada1
A fájlrendszer létrehozása és a multilabel hozzáadása után hozzá kell adnia a merevlemezt a /etc/fstab-hoz, adja hozzá ezt a sort a fájlhoz:
/dev/ada1 /jail ufs rw 0 1
A Mountpointnál adja meg a könyvtárat, ahová a merevlemezt csatolja, a Pass-nál mindenképpen 1-et kell megadnia (milyen sorrendben ellenőrzi ezt a merevlemezt) — ez szükséges, mivel az ufs fájlrendszer érzékeny az áramellátás hirtelen megszakítására. E lépések után csatolja a lemezt:
mount /dev/ada1 /jail
Ide telepítse a jail-t. Miután a jail működik, ugyanazokat a műveleteket kell elvégeznie, mint a fő rendszerben a felhasználók és a fájlok /etc/login.conf, /etc/mac.conf vonatkozásában.
Beállítás
Mielőtt a szükséges címkéket beállítaná, javaslom, hogy telepítse az összes szükséges csomagot, az én esetemben a címkék ezeknek a csomagoknak az figyelembevételével lesznek beállítva:
mod_php73-7.3.4_1 PHP Scripting Language
php73-7.3.4_1 PHP Scripting Language
php73-ctype-7.3.4_1 A ctype megosztott kiterjesztés a php-hez
php73-curl-7.3.4_1 A curl megosztott kiterjesztés a php-hez
php73-dom-7.3.4_1 A dom megosztott kiterjesztés a php-hez
php73-extensions-1.0 "meta-port" a PHP kiterjesztések telepítéséhez
php73-filter-7.3.4_1 A filter megosztott kiterjesztés a php-hez
php73-gd-7.3.4_1 A gd megosztott kiterjesztés a php-hez
php73-gettext-7.3.4_1 A gettext megosztott kiterjesztés a php-hez
php73-hash-7.3.4_1 A hash megosztott kiterjesztés a php-hez
php73-iconv-7.3.4_1 A iconv megosztott kiterjesztés a php-hez
php73-json-7.3.4_1 A json megosztott kiterjesztés a php-hez
php73-mysqli-7.3.4_1 A mysqli megosztott kiterjesztés a php-hez
php73-opcache-7.3.4_1 A opcache megosztott kiterjesztés a php-hez
php73-openssl-7.3.4_1 A openssl megosztott kiterjesztés a php-hez
php73-pdo-7.3.4_1 A pdo megosztott kiterjesztés a php-hez
php73-pdo_sqlite-7.3.4_1 A pdo_sqlite megosztott kiterjesztés a php-hez
php73-phar-7.3.4_1 A phar megosztott kiterjesztés a php-hez
php73-posix-7.3.4_1 A posix megosztott kiterjesztés a php-hez
php73-session-7.3.4_1 A session megosztott kiterjesztés a php-hez
php73-simplexml-7.3.4_1 A simplexml megosztott kiterjesztés a php-hez
php73-sqlite3-7.3.4_1 A sqlite3 megosztott kiterjesztés a php-hez
php73-tokenizer-7.3.4_1 A tokenizer megosztott kiterjesztés a php-hez
php73-xml-7.3.4_1 A xml megosztott kiterjesztés a php-hez
php73-xmlreader-7.3.4_1 A xmlreader megosztott kiterjesztés a php-hez
php73-xmlrpc-7.3.4_1 A xmlrpc megosztott kiterjesztés a php-hez
php73-xmlwriter-7.3.4_1 A xmlwriter megosztott kiterjesztés a php-hez
php73-xsl-7.3.4_1 A xsl megosztott kiterjesztés a php-hez
php73-zip-7.3.4_1 A zip megosztott kiterjesztés a php-hez
php73-zlib-7.3.4_1 A zlib megosztott kiterjesztés a php-hez
apache24-2.4.39
Ebben a példában a címkék az adott csomagok függőségeit figyelembe véve lesznek beállítva. Persze egyszerűbben is eljárhatnánk, az /usr/local/lib mappára és abban található fájlokra a mls/low címkét beállítva, a később telepített csomagok (például a php további kiterjesztései) hozzáférhetnek a könyvtárban található könyvtárakhoz, de szerintem jobb csak azokhoz a fájlokhoz biztosítani a hozzáférést, amelyek valóban szükségesek. Állítsa le a jail-t és állítson mls/high címkéket az összes fájlra:
setfmac -R mls/high /jail
Címkék beállításakor a folyamat meg fog állni, ha a setfmac kemény hivatkozásokba ütközik, az én példámban a következő könyvtárakban töröltem a kemény hivatkozásokat:
/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
Miután a címkék beállításra kerültek, be kell állítani az mls/low címkéket az apache-hoz. Először is ki kell deríteni, hogy mely fájlokra van szükség az apache elindításához:
ldd /usr/local/sbin/httpd
A parancs végrehajtása után a képernyőn megjelennek a függőségek, de nem lesz elegendő a megfelelő címkék beállítása ezeken a fájlokon, mivel azok a könyvtárak, amelyekben ezek a fájlok találhatók, mls/high címkével rendelkeznek, ezért ezeken a könyvtárakon is be kell állítani az mls/low címkét. Az apache indításakor a szükséges fájlokat is megjeleníti, míg a php esetében ezeket a függőségeket a httpd-error.log naplóban lehet megismerni.
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
Ebben a listában mls/low címkét állítunk be minden fájlhoz, amely szükséges az apache és php összekapcsolásának megfelelő működéséhez (az általam bemutatott csomagok számára).
Az utolsó simítás a jail indításának beállítása mls/equal szinten, míg az apache mls/low szinten lesz. A jail indításához módosítani kell a szkriptet /etc/rc.d/jail, keresse meg a jail_start funkciót, és a command változót állítsa a következőképpen:
command="setpmac mls/equal $jail_program"
A setpmac parancs egy végrehajtható fájlt indít el a szükséges mandátumi szinten, jelen esetben mls/equal, hogy hozzáférjen az összes címkéhez. Az apache esetében módosítania kell a start szkriptet /usr/local/etc/rc.d/apache24. Végezze el a változtatásokat az apache24_prestart funkcióban:
apache24_prestart() {
apache24_checkfib
apache24_precmd
eval "setpmac mls/low" ${command} ${apache24_flags}
}
A A kézikönyvben másik példa található, de nem tudtam használni, mert folyamatosan megjelent a hibaüzenet, hogy a setpmac parancs nem használható.
Következtetés
Ez a hozzáférés-elosztási módszer további védelmi szintet ad az apache-nak (bár ez a módszer bármely más stackhez is alkalmazható), amely ráadásul jail-ben fut, miközben az adminisztrátor számára mindez átlátszó és észrevétlen marad.
Azok a források, amelyek segítettek ennek a publikációnak a megírásában:
Forrás: habr.com
