FreeBSD-s õiguste jaotamise mandaadimudel

Sissejuhatus

Serveri täiendava turvalisuse tagamiseks võib kasutada mandaadi mudelit juurdepääsu jaotamiseks. Selles väljaandes käsitletakse, kuidas käivitada apache'i jailis, milles on juurdepääs ainult neile komponentidele, mis on vajalikud apache'i ja php korrektseks töötamiseks. Selle printsiibi alusel saab piirata mitte ainult apache'i, vaid ka mistahes teist steki.

Ettevalmistus

See meetod sobib ainult ufs-failisüsteemile, antud näites kasutatakse põhitehases zfs-i ja jailis vastavalt ufs-i. Esiteks tuleb kerneli kokku panna, FreeBSD installimisel installige allikakood.
Pärast süsteemi installimist editeerige faili:

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

Sellele failile tuleb lisada vaid üks rida:

options     MAC_MLS

mls/high märgis omab mls/low märgise ülekaalu, rakendused, mis töötavad mls/low märgisega, ei saa juurde pääseda failidele, mis on mls/high märgisega. Täiendavat teavet kõikide FreeBSD-s saadaval olevate märkide kohta saab lugeda antud juhendist.
Seejärel liikuge katalooge /usr/src:

cd /usr/src

Kerneli koostamise käivitamiseks täitke (j võtmes märkige süsteemis olevate tuumade arv):

make -j 4 buildkernel KERNCONF=GENERIC

Pärast kerneli koostamist on vajalik installida see:

make installkernel KERNCONF=GENERIC

Pärast kerneli installimist ärge kiirustage süsteemi taaskäivitama, kuna peate kasutajad login-k klassi viima, eelnevalt selle seadistades. Redigeerige faili /etc/login.conf, see fail peab olema edititud algklass default, viige see järgmisse vormi:

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:

Rida :label=mls/equal võimaldab kasutajatel, kes kuuluvad sellesse klassi, pääseda juurde failidele, mis on märgistatud mistahes etiketti (mls/low, mls/high). Pärast neid toiminguid tuleb andmebaas uuesti koostada ja lisada kasutaja root (ning need, kellele see on vajalik) sellesse sisselogimise klassi:

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

Kuna poliitika kehtib ainult failide kohta, tuleb redigeerida faili /etc/mac.conf, jättes sinna vaid ühe rea:

default_labels file ?mls

Samuti tuleb lisada moodul mac_mls.ko käivitamisnimekirja:

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

Pärast seda saab süsteemi julgelt taaskäivitada. Kuidas luua jail seda saab lugeda mõnest minu publikatsioonist. Kuid enne jail'i loomist tuleb lisada kõvaketas, luua sellele failisüsteem ja lubada multilabel; looge failisüsteem ufs2, mille klastr suurus on 64 kb:

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

Pärast failisüsteemi loomist ja multilabel'i lisamist tuleb kõvaketas lisada /etc/fstab faili, lisage sellesse faili järgmine rida:

/dev/ada1               /jail  ufs     rw              0       1

Mountpoint'i all näidake katalooge, kuhu kavatsete kõvaketta mountida, ja Pass'is märkige kindlasti 1 (millises järjekorras kontrollitakse seda kõvaketast) — see on vajalik, kuna failisüsteem ufs on tundlik teravate elektrikatkestuste suhtes. Pärast neid toiminguid mountige ketas:

mount /dev/ada1 /jail

Installige jail sellesse kataloogi. Pärast jail'i tööle hakkamist tuleb seal teha samu toiminguid, mis põhissüsteemis kasutajate ja failidega /etc/login.conf, /etc/mac.conf.

Seadistamine

Enne vajalike etikettide seadmist soovitan paigaldada kõik vajalikud paketid; minu puhul märgitakse etiketid nende pakkide alusel:

mod_php73-7.3.4_1              PHP skriptikeel
php73-7.3.4_1                  PHP skriptikeel
php73-ctype-7.3.4_1            ctype jagatud laiendus php jaoks
php73-curl-7.3.4_1             curl jagatud laiendus php jaoks
php73-dom-7.3.4_1              dom jagatud laiendus php jaoks
php73-extensions-1.0           "meta-port" PHP laiendite installimiseks
php73-filter-7.3.4_1           filter jagatud laiendus php jaoks
php73-gd-7.3.4_1               gd jagatud laiendus php jaoks
php73-gettext-7.3.4_1          gettext jagatud laiendus php jaoks
php73-hash-7.3.4_1             hash jagatud laiendus php jaoks
php73-iconv-7.3.4_1            iconv jagatud laiendus php jaoks
php73-json-7.3.4_1             json jagatud laiendus php jaoks
php73-mysqli-7.3.4_1           mysqli jagatud laiendus php jaoks
php73-opcache-7.3.4_1          opcache jagatud laiendus php jaoks
php73-openssl-7.3.4_1          openssl jagatud laiendus php jaoks
php73-pdo-7.3.4_1              pdo jagatud laiendus php jaoks
php73-pdo_sqlite-7.3.4_1       pdo_sqlite jagatud laiendus php jaoks
php73-phar-7.3.4_1             phar jagatud laiendus php jaoks
php73-posix-7.3.4_1            posix jagatud laiendus php jaoks
php73-session-7.3.4_1          session jagatud laiendus php jaoks
php73-simplexml-7.3.4_1        simplexml jagatud laiendus php jaoks
php73-sqlite3-7.3.4_1          sqlite3 jagatud laiendus php jaoks
php73-tokenizer-7.3.4_1        tokenizer jagatud laiendus php jaoks
php73-xml-7.3.4_1              xml jagatud laiendus php jaoks
php73-xmlreader-7.3.4_1        xmlreader jagatud laiendus php jaoks
php73-xmlrpc-7.3.4_1           xmlrpc jagatud laiendus php jaoks
php73-xmlwriter-7.3.4_1        xmlwriter jagatud laiendus php jaoks
php73-xsl-7.3.4_1              xsl jagatud laiendus php jaoks
php73-zip-7.3.4_1              zip jagatud laiendus php jaoks
php73-zlib-7.3.4_1             zlib jagatud laiendus php jaoks
apache24-2.4.39 

Selles näites määratakse sildid arvesse võttes nende pakettide sõltuvusi. Tõepoolest, võiks asjad lihtsamaks teha, määrates sildid kataloogile \/usr\/local\/lib ning failidele, mis asuvad selles kataloogis, mls\/low, ning hiljem installitud paketid (nt php täiendavad laiendused) saavad sellele kataloogile ligipääsu, kuid minu arvates on parem anda ligipääs ainult neile failidele, mis on vajalikud. Peatage jail ja määrake kõikidele failidele sildid mls\/high:

setfmac -R mls\/high \/jail

Sildide määramisel peatub protsess, kui setfmac satub kõvade linkidega kokku, minu näites eemaldasin kõvad lingid järgmistest kataloogidest:

/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

Pärast siltide määramist on vajalik määrata apache'ile sildid mls\/low, esimesena tuleb välja selgitada, millised failid on apache'i käivitamiseks vajalikud:

ldd \/usr\/local\/sbin\/httpd

Pärast selle käsu täitmist kuvatakse ekraanile sõltuvused, kuid nendele failidele vajalike märgiste seadmine ei ole piisav, kuna kataloogid, kus need failid asuvad, on märgistatud mls/high, seega tuleb ka neile kataloogidele seadmiseks kasutada mls/low. Apache käivitamisel kuvab see ka failid, mis on vajalikud selle käivitamiseks, ja php sõltuvused on saadaval logifailis 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

Selles nimekirjas seatakse mls/low märgid kõikidele failidele, mis on vajalikud apache ja php koostöö korrektseks toimimiseks (kogu selle näite jaoks installitud paketid).

Viimase lihvina tuleb jail'i käivitamine seadistada mls/equal tasemel ja apache mls/low tasemel. Jail'i käivitamiseks on vajalikud muudatused skriptis /etc/rc.d/jail, leidke selle skripti funktsioon jail_start ning seadke muutuja command järgmisse vormi:

command="setpmac mls/equal $jail_program"

Käsk setpmac käivitab käitatava faili vajalikul mandaattasandil, antud juhul mls/equal, et pääseda ligi kõikidele siltidele. Apache'i puhul tuleb redigeerida käivitusskripti /usr/local/etc/rc.d/apache24. Tehke muudatused funktsioonis apache24_prestart:

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

Uues ametlikus juhendis on antud teine näide, kuid ma ei suutnud seda kasutada, kuna pidevalt ilmnes teade, et käsku setpmac ei saa kasutada.

Kokkuvõte

See juurdepääsutegevuse jaotamise meetod lisab apache'ile täiendava kaitsetaseme (kuigi see meetod sobib igasse teise tehnoloogiakupli), mis muuhulgas töötab jail'is, samal ajal toimub kõike seda administraatori jaoks läbipaistvalt ja märkamatult.

Allikate loetelu, mis aitasid mul selle publikatsiooni kirjutamisel:

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

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster