Model obvezne razdelitve pravic v FreeBSD

Predstavitev

Če želite zagotoviti dodatno raven varnosti strežnika, lahko uporabite model mandata distribucija dostopa. Ta publikacija bo opisala, kako lahko zaženete apache v zaporu z dostopom samo do tistih komponent, ki potrebujejo dostop za pravilno delovanje apache in php. S tem načelom lahko omejite ne samo Apache, ampak tudi kateri koli drug sklad.

Izobraževanje

Ta metoda je primerna samo za datotečni sistem ufs; v tem primeru bo zfs uporabljen v glavnem sistemu, ufs pa v zaporu. Prvi korak je ponovna izdelava jedra; ko nameščate FreeBSD, namestite izvorno kodo.
Ko je sistem nameščen, uredite datoteko:

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

V to datoteko morate dodati samo eno vrstico:

options     MAC_MLS

Oznaka mls/high bo imela dominanten položaj nad oznako mls/low, aplikacije, ki se bodo zagnale z oznako mls/low, ne bodo mogle dostopati do datotek z oznako mls/high. Več podrobnosti o vseh razpoložljivih oznakah v sistemu FreeBSD lahko najdete tukaj vodstvo.
Nato pojdite v imenik /usr/src:

cd /usr/src

Za začetek gradnje jedra zaženite (v tipki j določite število jeder v sistemu):

make -j 4 buildkernel KERNCONF=GENERIC

Ko je jedro prevedeno, ga je treba namestiti:

make installkernel KERNCONF=GENERIC

Po namestitvi jedra ne hitite s ponovnim zagonom sistema, saj je treba uporabnike prenesti v razred za prijavo, potem ko ste ga predhodno konfigurirali. Uredite datoteko /etc/login.conf, v tej datoteki morate urediti privzeti prijavni razred, prinesite ga v obrazec:

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:

Vrstica :label=mls/equal bo uporabnikom, ki so člani tega razreda, omogočila dostop do datotek, ki so označene s katero koli oznako (mls/low, mls/high). Po teh manipulacijah morate znova zgraditi bazo podatkov in postaviti korenskega uporabnika (kot tudi tiste, ki ga potrebujejo) v ta prijavni razred:

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

Če želite, da pravilnik velja samo za datoteke, morate urediti datoteko /etc/mac.conf in v njej pustiti samo eno vrstico:

default_labels file ?mls

V samodejni zagon morate dodati tudi modul mac_mls.ko:

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

Po tem lahko varno znova zaženete sistem. Kako ustvariti zapor Preberete ga lahko v eni od mojih publikacij. Toda preden ustvarite zapor, morate dodati trdi disk in na njem ustvariti datotečni sistem ter na njem omogočiti multilabel, ustvariti datotečni sistem ufs2 z velikostjo gruče 64 kb:

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

Ko ustvarite datotečni sistem in dodate multilabel, morate trdi disk dodati v /etc/fstab, tej datoteki dodajte vrstico:

/dev/ada1               /jail  ufs     rw              0       1

V Mountpoint določite imenik, v katerega boste priklopili trdi disk; v Pass obvezno navedite 1 (v kakšnem zaporedju bo ta trdi disk preverjen) - to je potrebno, ker je datotečni sistem ufs občutljiv na nenadne izpade električne energije . Po teh korakih namestite disk:

mount /dev/ada1 /jail

Namestite jail v ta imenik. Ko se zapor zažene, morate v njem narediti enake manipulacije kot v glavnem sistemu z uporabniki in datotekami /etc/login.conf, /etc/mac.conf.

prilagoditev

Preden namestite potrebne oznake, priporočam namestitev vseh potrebnih paketov; v mojem primeru bodo oznake nastavljene ob upoštevanju teh paketov:

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 

V tem primeru bodo oznake nastavljene ob upoštevanju odvisnosti teh paketov. Seveda lahko naredite preprosteje: za mapo /usr/local/lib in datoteke, ki se nahajajo v tem imeniku, nastavite oznake mls/low in naslednji nameščeni paketi (na primer dodatne razširitve za php) bodo lahko dostopali knjižnice v tem imeniku, vendar se mi zdi bolje zagotoviti dostop samo do tistih datotek, ki so potrebne. Zaustavite zapor in nastavite oznake mls/high za vse datoteke:

setfmac -R mls/high /jail

Pri nastavljanju oznak se bo postopek ustavil, če setfmac naleti na trde povezave, v svojem primeru sem izbrisal trde povezave v naslednjih imenikih:

/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

Ko so oznake nastavljene, morate nastaviti oznake mls/low za apache. Prva stvar, ki jo morate storiti, je ugotoviti, katere datoteke so potrebne za zagon apache:

ldd /usr/local/sbin/httpd

Po izvedbi tega ukaza se bodo na zaslonu prikazale odvisnosti, vendar nastavitev potrebnih oznak za te datoteke ne bo dovolj, saj imajo imeniki, v katerih se te datoteke nahajajo, oznako mls/high, zato je treba tudi te imenike označiti ml/nizko. Ob zagonu bo apache izdal tudi datoteke, ki so potrebne za zagon, za php pa te odvisnosti najdete v dnevniku 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

Ta seznam vsebuje oznake mls/low za vse datoteke, ki so potrebne za pravilno delovanje kombinacije apache in php (za tiste pakete, ki so nameščeni v mojem primeru).

Zadnji dotik bo konfiguracija programa jail za izvajanje na ravni mls/equal in apache na ravni mls/low. Če želite zagnati zapor, morate spremeniti skript /etc/rc.d/jail, poiskati funkcije jail_start v tem skriptu, spremeniti ukazno spremenljivko v obliko:

command="setpmac mls/equal $jail_program"

Ukaz setpmac zažene izvedljivo datoteko na zahtevani ravni zmogljivosti, v tem primeru mls/equal, da bi imeli dostop do vseh oznak. V apache morate urediti zagonski skript /usr/local/etc/rc.d/apache24. Spremenite funkcijo apache24_prestart:

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

В uradni Priročnik vsebuje še en primer, vendar ga nisem mogel uporabiti, ker sem dobival sporočilo o nezmožnosti uporabe ukaza setpmac.

Izhod

Ta način razdeljevanja dostopa bo dodal dodatno raven varnosti apacheju (čeprav je ta način primeren za kateri koli drug stack), ki poleg tega teče v zaporu, hkrati pa se bo za administratorja vse to dogajalo transparentno in neopazno.

Seznam virov, ki so mi pomagali pri pisanju te objave:

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

Vir: www.habr.com

Dodaj komentar