Model obligatoriu de distribuire a drepturilor în FreeBSD

Introducere

Pentru a oferi un nivel suplimentar de securitate a serverului, puteți utiliza model de mandat distribuția accesului. Această publicație va descrie cum puteți rula apache într-o închisoare cu acces numai la acele componente care necesită acces pentru ca apache și php să funcționeze corect. Folosind acest principiu, puteți limita nu numai Apache, ci și orice altă stivă.

Pregătire

Această metodă este potrivită numai pentru sistemul de fișiere ufs; în acest exemplu, zfs va fi folosit în sistemul principal și, respectiv, ufs în închisoare. Primul pas este reconstruirea nucleului; atunci când instalați FreeBSD, instalați codul sursă.
După ce sistemul este instalat, editați fișierul:

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

Trebuie doar să adăugați o linie la acest fișier:

options     MAC_MLS

Eticheta mls/high va avea o pozitie dominanta fata de eticheta mls/low, aplicatiile care vor fi lansate cu eticheta mls/low nu vor putea accesa fisierele care au eticheta mls/high. Mai multe detalii despre toate etichetele disponibile în sistemul FreeBSD pot fi găsite în aceasta conducere.
Apoi, accesați directorul /usr/src:

cd /usr/src

Pentru a începe construirea nucleului, rulați (în tasta 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 este necesar să transferați utilizatorii la clasa de conectare, după ce ați configurat-o anterior. Editați fișierul /etc/login.conf, în acest fișier trebuie să editați clasa de conectare implicită, aduceți-o la formularul:

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 sunt membri ai acestei clase să acceseze fișierele care sunt marcate cu orice etichetă (mls/low, mls/high). După aceste manipulări, trebuie să reconstruiți baza de date și să plasați utilizatorul root (precum și cei care au nevoie de el) în această clasă de conectare:

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

Pentru ca politica să se aplice numai fișierelor, trebuie să editați fișierul /etc/mac.conf, lăsând o singură linie în el:

default_labels file ?mls

De asemenea, trebuie să adăugați modulul mac_mls.ko la autorun:

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

După aceasta, puteți reporni sistemul în siguranță. Cum se creează închisoare O puteți citi într-una dintre publicațiile mele. Dar, înainte de a crea o închisoare, trebuie să adăugați un hard disk și să creați un sistem de fișiere pe acesta și să activați mai multe etichete pe acesta, să creați un sistem de fișiere ufs2 cu o dimensiune de cluster de 64 kb:

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

După crearea sistemului de fișiere și adăugarea mai multor etichete, trebuie să adăugați hard disk-ul la /etc/fstab, adăugați linia la acest fișier:

/dev/ada1               /jail  ufs     rw              0       1

În Mountpoint, specificați directorul în care veți monta hard disk-ul; în Pass, asigurați-vă că specificați 1 (în ce secvență va fi verificat acest hard disk) - acest lucru este necesar, deoarece sistemul de fișiere ufs este sensibil la întreruperile bruște de curent . După acești pași, montați discul:

mount /dev/ada1 /jail

Instalează jail în acest director. După ce închisoarea rulează, trebuie să faceți aceleași manipulări în ea ca în sistemul principal cu utilizatorii și fișierele /etc/login.conf, /etc/mac.conf.

ajustare

Înainte de a instala etichetele necesare, recomand să instalați toate pachetele necesare; în cazul meu, etichetele vor fi setate ținând cont de aceste pachete:

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 

În acest exemplu, etichetele vor fi setate ținând cont de dependențele acestor pachete. Desigur, o puteți face mai simplu: pentru folderul /usr/local/lib și fișierele aflate în acest director, setați etichetele mls/low și pachetele instalate ulterioare (de exemplu, extensii suplimentare pentru php) vor putea accesa bibliotecile din acest director, dar mi se pare mai bine să ofere acces doar la acele fișiere care sunt necesare. Opriți închisoarea și setați mls/high labels pentru toate fișierele:

setfmac -R mls/high /jail

La setarea marcajelor, procesul va fi oprit dacă setfmac întâlnește linkuri hard, în exemplul meu am șters 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 setate, trebuie să setați etichetele mls/low pentru apache, primul lucru pe care trebuie să-l faceți este să aflați ce fișiere sunt necesare pentru a porni apache:

ldd /usr/local/sbin/httpd

După executarea acestei comenzi, dependențele vor fi afișate pe ecran, dar setarea etichetelor necesare pe aceste fișiere nu va fi suficientă, deoarece directoarele în care se află aceste fișiere au eticheta mls/high, deci și aceste directoare trebuie să fie etichetate. mls/scăzut. La pornire, apache va scoate și fișierele necesare pentru a-l rula, iar pentru php aceste dependențe pot fi găsite în jurnalul 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ă conține etichete mls/low pentru toate fișierele care sunt necesare pentru funcționarea corectă a combinației apache și php (pentru acele pachete care sunt instalate în exemplul meu).

Atingerea finală va fi configurarea jail-ului să ruleze la nivel mls/equal și apache la nivel mls/low. Pentru a porni închisoare, trebuie să faceți modificări în scriptul /etc/rc.d/jail, să găsiți funcțiile jail_start în acest script, să schimbați variabila de comandă în forma:

command="setpmac mls/equal $jail_program"

Comanda setpmac rulează fișierul executabil la nivelul de capacitate necesar, în acest caz mls/equal, pentru a avea acces la toate etichetele. În apache trebuie să editați scriptul de pornire /usr/local/etc/rc.d/apache24. Schimbați funcția apache24_prestart:

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

В oficial Manualul conține un alt exemplu, dar nu am putut să-l folosesc, deoarece am primit în continuare un mesaj despre incapacitatea de a utiliza comanda setpmac.

Producție

Această metodă de distribuire a accesului va adăuga un nivel suplimentar de securitate la apache (deși această metodă este potrivită pentru orice altă stivă), care în plus rulează într-o închisoare, în același timp, pentru administrator toate acestea se vor întâmpla transparent și inobservabil.

Lista surselor care m-au ajutat în scrierea acestei publicații:

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

Sursa: www.habr.com

Adauga un comentariu