Introducere
Pentru a asigura un nivel suplimentar de securitate a serverului, se poate utiliza pentru distribuția accesului. În această publicație va fi descris cum se poate rula Apache în jail cu acces doar la componentele necesare pentru funcționarea corectă a Apache și PHP. După acest principiu, se pot restricționa nu doar Apache, ci și orice alt stack.
Pregătire
Această metodă este potrivită doar pentru sistemul de fișiere UFS; în acest exemplu, în sistemul principal va fi folosit ZFS, iar în jail, respectiv, UFS. În primul rând, este necesar să recompilați nucleul; la instalarea FreeBSD, instalați codul sursă.
După ce sistemul va fi instalat, editați fișierul:
/usr/src/sys/amd64/conf/GENERIC
În acest fișier trebuie să adăugați o singură linie:
options MAC_MLS
Eticheta mls/high va avea o poziție dominantă asupra etichetei mls/low; aplicațiile care sunt lansate cu eticheta mls/low nu vor putea accesa fișierele care au eticheta mls/high. Mai multe detalii despre toate etichetele disponibile în sistemul FreeBSD pot fi citite în această .
Apoi, accesați directorul /usr/src:
cd /usr/src
Pentru a lansează compilarea nucleului, executați (în parametru j, specificați numărul de nuclee din sistem):
make -j 4 buildkernel KERNCONF=GENERIC
După ce nucleul a fost compilat, acesta trebuie instalat:
make installkernel KERNCONF=GENERIC
După instalarea nucleului, nu vă grăbiți să reporniți sistemul, deoarece trebuie să mutați utilizatorii în clasa de logare, configurând-o mai întâi. Editează fișierul /etc/login.conf; în acest fișier trebuie să editați clasa de logare default, aducând-o la următoarea formă:
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:
Linia :label=mls/equal va permite utilizatorilor care fac parte din această clasă să acceseze fișierele marcate cu orice etichetă (mls/low, mls/high). După aceste manevre, trebuie să recompilați baza de date și să plasați utilizatorul root (precum și pe cei care au nevoie) în această clasă de logare:
cap_mkdb /etc/login.conf
pw usermod root -L default
Pentru ca politica să se aplice doar fișierelor, este necesar să editați fișierul /etc/mac.conf, păstrând în el doar o singură linie:
default_labels file ?mls
De asemenea, este necesar să adăugați modulul mac_mls.ko la pornirea automată:
echo 'mac_mls_load="YES"' >> /boot/loader.conf
După aceasta, puteți reporni sistemul fără grijă. Cum să creați puteți citi în una dintre publicațiile mele. Însă, înainte de a crea jail, trebuie să adăugați un disc dur și să creați pe acesta un sistem de fișiere, activând multilabel; creați un sistem de fișiere ufs2 cu dimensiunea clusterului de 64kb:
newfs -O 2 -b 64kb /dev/ada1
tunefs -l enable /dev/ada1
După ce ați creat sistemul de fișiere și ați adăugat multilabel, este necesar să adăugați discul dur în /etc/fstab, adăugați următoarea linie în acest fișier:
/dev/ada1 /jail ufs rw 0 1
În Mountpoint indicați directorul în care veți monta discul dur, iar la Pass indicați obligatoriu 1 (în ce ordine va fi verificat acest disc dur) — aceasta este necesară, deoarece sistemul de fișiere ufs este sensibil la întreruperile bruste de curent. După aceste acțiuni, montați discul:
mount /dev/ada1 /jail
În acest director instalați jail. După ce jail-ul va funcționa, trebuie efectuate aceleași manipulări cu utilizatorii și fișierele /etc/login.conf, /etc/mac.conf ca în sistemul principal.
Configurare
Înainte de a stabili etichetele necesare, recomand să instalați toate pachetele necesare; în cazul meu, etichetele vor fi aplicate ținând cont de aceste pachete:
mod_php73-7.3.4_1 Limbaj de scripting PHP
php73-7.3.4_1 Limbaj de scripting PHP
php73-ctype-7.3.4_1 Extensia ctype partajată pentru php
php73-curl-7.3.4_1 Extensia curl partajată pentru php
php73-dom-7.3.4_1 Extensia dom partajată pentru php
php73-extensions-1.0 "meta-port" pentru instalarea extensiilor PHP
php73-filter-7.3.4_1 Extensia filter partajată pentru php
php73-gd-7.3.4_1 Extensia gd partajată pentru php
php73-gettext-7.3.4_1 Extensia gettext partajată pentru php
php73-hash-7.3.4_1 Extensia hash partajată pentru php
php73-iconv-7.3.4_1 Extensia iconv partajată pentru php
php73-json-7.3.4_1 Extensia json partajată pentru php
php73-mysqli-7.3.4_1 Extensia mysqli partajată pentru php
php73-opcache-7.3.4_1 Extensia opcache partajată pentru php
php73-openssl-7.3.4_1 Extensia openssl partajată pentru php
php73-pdo-7.3.4_1 Extensia pdo partajată pentru php
php73-pdo_sqlite-7.3.4_1 Extensia pdo_sqlite partajată pentru php
php73-phar-7.3.4_1 Extensia phar partajată pentru php
php73-posix-7.3.4_1 Extensia posix partajată pentru php
php73-session-7.3.4_1 Extensia session partajată pentru php
php73-simplexml-7.3.4_1 Extensia simplexml partajată pentru php
php73-sqlite3-7.3.4_1 Extensia sqlite3 partajată pentru php
php73-tokenizer-7.3.4_1 Extensia tokenizer partajată pentru php
php73-xml-7.3.4_1 Extensia xml partajată pentru php
php73-xmlreader-7.3.4_1 Extensia xmlreader partajată pentru php
php73-xmlrpc-7.3.4_1 Extensia xmlrpc partajată pentru php
php73-xmlwriter-7.3.4_1 Extensia xmlwriter partajată pentru php
php73-xsl-7.3.4_1 Extensia xsl partajată pentru php
php73-zip-7.3.4_1 Extensia zip partajată pentru php
php73-zlib-7.3.4_1 Extensia zlib partajată pentru php
apache24-2.4.39
În acest exemplu, etichetele vor fi atribuite având în vedere dependențele acestor pachete. Desigur, ar fi mai simplu să stabilim etichetele mls/low pentru directorul /usr/local/lib și fișierele aflate în acest director, iar pachetele instalate ulterior (de exemplu, extensiile suplimentare pentru php) vor putea accesa bibliotecile din acest director, dar cred că este mai bine să oferim acces doar fișierelor necesare. Opriți jail-ul și atribuiți etichete mls/high tuturor fișierelor:
setfmac -R mls/high /jail
Atunci când se stabilesc etichetele, procesul va fi oprit dacă setfmac întâlnește linkuri hard; în exemplul meu, am eliminat linkurile hard din următoarele directoare:
/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
După ce etichetele au fost stabilite, trebuie să atribuim etichete mls/low pentru apache; mai întâi, trebuie să stabilim care fișiere sunt necesare pentru funcționarea apache:
ldd /usr/local/sbin/httpd
După executarea acestei comenzi, dependențele vor apărea pe ecran, dar nu va fi suficient să se atribuie etichetele necesare fișierelor, deoarece directoarele în care se află aceste fișiere au eticheta mls/high. Prin urmare, este necesar să se atribuie și eticheta mls/low acestor directoare. La pornirea Apache-ului, vor fi afișate fișierele necesare pentru a-l rula, iar pentru PHP, aceste dependențe pot fi găsite în logul 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
Această listă atribuie etichete mls/low tuturor fișierelor necesare pentru funcționarea corectă a combinației Apache și PHP (pentru pachetele instalate în exemplul meu).
Ultimul pas va fi configurarea lansării jail-ului la nivelul mls/equal și a Apache la nivelul mls/low. Pentru a lansa jail-ul, este necesar să faceți modificări în scriptul /etc/rc.d/jail, căutați în acest script funcția jail_start și adaptați variabila command la următoarea formă:
command="setpmac mls/equal $jail_program"
Comanda setpmac lansează fișierul executabil la nivelul mandatinte necesar, în acest caz mls/equal, pentru a avea acces la toate etichetele. În Apache, este necesar să editați scriptul de pornire /usr/local/etc/rc.d/apache24. Faceți modificările în funcția apache24_prestart:
apache24_prestart() {
apache24_checkfib
apache24_precmd
eval "setpmac mls/low" ${command} ${apache24_flags}
}
În manualul oferă un alt exemplu, dar nu am reușit să îl folosesc deoarece am primit constant un mesaj de imposibilitate de a utiliza comanda setpmac.
Ieșire
Această metodă de distribuire a accesului va adăuga un nivel suplimentar de securitate Apache (deși această metodă poate fi aplicată oricărui alt stack), care, în plus, este lansat în jail, în același timp fiind transparență și neobservabil pentru administrator.
Lista surselor care m-au ajutat în redactarea acestei publicații:
Sursa: habr.com
