Modelul de distribuție a drepturilor în FreeBSD

Introducere

Pentru a asigura un nivel suplimentar de securitate a serverului, se poate utiliza modelul de mandat 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ă ghid).
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 jail 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 oficial 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:

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

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster