Model obvezne distribucije prava u FreeBSD-u

Uvod

Za dodatnu razinu sigurnosti poslužitelja možete koristiti model mandata distribucija pristupa. Ova publikacija će opisati kako možete pokrenuti apache u zatvoru s pristupom samo onim komponentama kojima je potreban pristup da bi apache i php ispravno radili. Koristeći ovaj princip, možete ograničiti ne samo Apache, već i bilo koji drugi stog.

Trening

Ova metoda je prikladna samo za ufs datotečni sustav; u ovom primjeru, zfs će se koristiti u glavnom sustavu, a ufs u zatvoru. Prvi korak je ponovna izgradnja kernela; kada instalirate FreeBSD, instalirajte izvorni kod.
Nakon što je sustav instaliran, uredite datoteku:

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

U ovu datoteku trebate dodati samo jedan redak:

options     MAC_MLS

Oznaka mls/high imat će dominantan položaj u odnosu na oznaku mls/low, aplikacije koje će biti pokrenute s oznakom mls/low neće moći pristupiti datotekama koje imaju oznaku mls/high. Više detalja o svim dostupnim oznakama u FreeBSD sustavu možete pronaći ovdje rukovodstvo.
Zatim idite u direktorij /usr/src:

cd /usr/src

Za početak izgradnje kernela pokrenite (u tipki j navedite broj jezgri u sustavu):

make -j 4 buildkernel KERNCONF=GENERIC

Nakon što je kernel kompajliran, mora se instalirati:

make installkernel KERNCONF=GENERIC

Nakon instaliranja kernela, nemojte žuriti s ponovnim pokretanjem sustava, jer je potrebno prenijeti korisnike u klasu za prijavu, nakon što ste je prethodno konfigurirali. Uredite datoteku /etc/login.conf, u ovoj datoteci morate urediti zadanu klasu prijave, dovedite je u obrazac:

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:

Linija :label=mls/equal omogućit će korisnicima koji su članovi ove klase pristup datotekama koje su označene bilo kojom oznakom (mls/low, mls/high). Nakon ovih manipulacija, trebate ponovno izgraditi bazu podataka i smjestiti root korisnika (kao i one koji ga trebaju) u ovu klasu za prijavu:

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

Kako bi se pravilo primijenilo samo na datoteke, trebate urediti datoteku /etc/mac.conf, ostavljajući u njoj samo jedan redak:

default_labels file ?mls

Također morate dodati modul mac_mls.ko u autorun:

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

Nakon toga možete sigurno ponovno pokrenuti sustav. Kako stvoriti zatvor Možete ga pročitati u jednoj od mojih publikacija. Ali prije stvaranja zatvora, morate dodati tvrdi disk i kreirati datotečni sustav na njemu i omogućiti multilabel na njemu, stvoriti ufs2 datotečni sustav s veličinom klastera od 64 kb:

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

Nakon kreiranja datotečnog sustava i dodavanja multilabela, trebate dodati tvrdi disk u /etc/fstab, dodati red u ovu datoteku:

/dev/ada1               /jail  ufs     rw              0       1

U Mountpoint navedite direktorij u koji ćete montirati tvrdi disk; u Pass svakako navedite 1 (u kojem će se redoslijedu ovaj tvrdi disk provjeravati) - ovo je neophodno jer je ufs datotečni sustav osjetljiv na iznenadne nestanke struje . Nakon ovih koraka montirajte disk:

mount /dev/ada1 /jail

Instalirajte zatvor u ovaj direktorij. Nakon što se jail pokrene, morate u njemu izvršiti iste manipulacije kao u glavnom sustavu s korisnicima i datotekama /etc/login.conf, /etc/mac.conf.

podešavanje

Prije instaliranja potrebnih oznaka, preporučujem instaliranje svih potrebnih paketa; u mom slučaju, oznake će biti postavljene uzimajući u obzir ove pakete:

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 

U ovom primjeru, oznake će biti postavljene uzimajući u obzir ovisnosti ovih paketa. Naravno, možete to učiniti jednostavnije: za mapu /usr/local/lib i datoteke koje se nalaze u ovom direktoriju postavite oznake mls/low i naknadno instalirani paketi (na primjer, dodatna proširenja za php) moći će pristupiti biblioteke u ovom direktoriju, ali čini mi se da je bolje omogućiti pristup samo onim datotekama koje su potrebne. Zaustavite zatvaranje i postavite oznake mls/high na sve datoteke:

setfmac -R mls/high /jail

Prilikom postavljanja oznaka, proces će se zaustaviti ako setfmac naiđe na tvrde veze, u mom primjeru izbrisao sam tvrde veze u sljedećim direktorijima:

/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

Nakon što su oznake postavljene, trebate postaviti mls/low oznake za apache, prvo što trebate učiniti je saznati koje su datoteke potrebne za pokretanje apachea:

ldd /usr/local/sbin/httpd

Nakon izvršenja ove naredbe, ovisnosti će biti prikazane na ekranu, ali postavljanje potrebnih oznaka na te datoteke neće biti dovoljno, budući da direktoriji u kojima se te datoteke nalaze imaju oznaku mls/high, pa je i ove direktorije potrebno označiti mls/nisko. Prilikom pokretanja, apache će također ispisati datoteke koje su potrebne za njegovo pokretanje, a za php te se ovisnosti mogu pronaći u zapisniku 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

Ovaj popis sadrži mls/low oznake za sve datoteke koje su potrebne za ispravan rad kombinacije apache i php (za one pakete koji su instalirani u mom primjeru).

Posljednji korak bit će konfiguriranje zatvora za rad na mls/equal razini, a apache na mls/low razini. Da biste pokrenuli zatvor, morate napraviti promjene u /etc/rc.d/jail skripti, pronaći jail_start funkcije u ovoj skripti, promijeniti varijablu naredbe u oblik:

command="setpmac mls/equal $jail_program"

Naredba setpmac pokreće izvršnu datoteku na potrebnoj razini mogućnosti, u ovom slučaju mls/equal, kako bi imali pristup svim oznakama. U apacheu trebate urediti skriptu za pokretanje /usr/local/etc/rc.d/apache24. Promijenite funkciju apache24_prestart:

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

В službeno Priručnik sadrži još jedan primjer, ali ga nisam mogao koristiti jer sam stalno dobivao poruku o nemogućnosti korištenja naredbe setpmac.

Izlaz

Ova metoda distribucije pristupa će dodati dodatnu razinu sigurnosti za apache (iako je ova metoda prikladna za bilo koji drugi stack), koji osim toga radi u zatvoru, u isto vrijeme, za administratora će se sve to dogoditi transparentno i neprimjetno.

Popis izvora koji su mi pomogli u pisanju ove publikacije:

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

Izvor: www.habr.com

Dodajte komentar