Modeli mandatorial i shpërndarjes së të drejtave në FreeBSD

Hyrje

Për të siguruar një nivel të shtuar sigurie për serverin, mund të përdoret modeli mandatar i shpërndarjes së qasjes. Në këtë publikim do të përshkruhet se si mund të ekzekutohet apache në jail me qasje vetëm në ata komponentë që janë të nevojshëm për funksionimin korrekt të apache dhe php. Duke ndjekur këtë parim, mund të kufizoni jo vetëm apache-n, por gjithashtu çdo stak tjetër.

Përgatitja

Ky metod do të përshtatet vetëm për sistemin e skedarëve ufs; në këtë shembull, në sistemin kryesor do të përdoret zfs, ndërsa në jail përkatësisht ufs. Si fillim, është e nevojshme të rindërtohet bërthama, gjatë instalimit të FreeBSD, instaloni kodin burimor.
Pasi sistemi të jetë instaluar, redaktoni skedarin:

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

Në këtë skedar është e nevojshme të shtoni vetëm një rresht:

options     MAC_MLS

Shenja mls/high do të ketë një pozición dominuese mbi shenjën mls/low; aplikacionet që do të ekzekutohen me shenjën mls/low nuk do të kenë qasje në skedarët që kanë shenjën mls/high. Më shumë detaje mbi të gjitha shenjat e disponueshme në sistemin FreeBSD mund të lexohen në këtë udhëzimin.
Më pas kaloni në katalogun /usr/src:

cd /usr/src

Për të nisur ndërtimin e bërthamës, kryeni (në çelësin j, specifikoni numrin e bërthamave në sistem):

make -j 4 buildkernel KERNCONF=GENERIC

Pasi bërthama të jetë ndërtuar, është e nevojshme të instalohet:

make installkernel KERNCONF=GENERIC

Pas instalimit të bërthamës, mos u ngutni të ribleni sistemin, pasi është e nevojshme të kaloni përdoruesit në klasën e loginit, duke e konfiguruar atë paraprakisht. Redaktoni skedarin /etc/login.conf; në këtë skedar është e nevojshme të redaktoni klasën e loginit default, duke e sjellë atë në formën:

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:

Rreshti :label=mls/equal, do t'u japë mundësi përdoruesve që përfshihen në këtë klasë për të pasur qasje në skedarët që janë të shënuar me çdo etiketë (mls/low, mls/high). Pas këtyre manipulimeve, është e nevojshme të rindërtohet baza e të dhënave dhe të vendoset përdoruesi root (si dhe ata që e kërkojnë këtë) në këtë klasë logimi:

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

Për të siguruar që politika të prekje vetëm skedarët, është e nevojshme të redaktoni skedarin /etc/mac.conf; lini në të vetëm një rresht:

default_labels file ?mls

Gjithashtu është e nevojshme të shtoni modulin mac_mls.ko në auto-start:

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

Pas kësaj mund të ribleni sigurt sistemin. Si të krijoni jail mund të lexoni në një nga publikimet e mia. Por para se të krijoni jail, është e nevojshme të shtoni një disk të ngurtë dhe të krijoni në të një sistem skedarësh dhe të aktivizoni multilabel, krijoni një sistem skedarësh ufs2 me madhësinë e klasterit 64kb:

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

Pas krijimit të sistemit të skedarëve dhe shtimit të multilabel, është e nevojshme të shtoni diskun e ngurtë në /etc/fstab; shtoni rreshtin në këtë skedar:

/dev/ada1               /jail  ufs     rw              0       1

NĂ« Mountpoint shĂ«noni katalogun ku do tĂ« montoni disku e ngurtĂ«, nĂ« Pass sigurohuni tĂ« shĂ«noni 1 (nĂ« çfarĂ« rendi do tĂ« bĂ«het kontrolli i kĂ«tij disku tĂ« ngurtĂ«) — kjo Ă«shtĂ« e nevojshme, pasi sistemi i skedarĂ«ve ufs Ă«shtĂ« i ndjeshĂ«m ndaj ndĂ«rprerjeve tĂ« papritura tĂ« energjisĂ«. Pas kĂ«tyre veprimeve montoni diskun:

mount /dev/ada1 /jail

Në këtë katalog vendosni jail. Pasi jail të fillojë, është e nevojshme të bëni të njëjtat manipulime që keni bërë në sistemin e kryesor me përdoruesit dhe skedarët /etc/login.conf, /etc/mac.conf.

Konfigurimi

Përpara se të vendosni etiketat e nevojshme, rekomandoj të instaloni të gjitha paketat e nevojshme; në rastin tim, etiketat do të vendosen duke marrë parasysh këto paketa:

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ë këtë shembull, etiketat do të caktohen duke marrë parasysh varësitë e këtyre pakove. Sigurisht, mund të veproni më thjesht, duke caktuar etiketat mls/low për folderin /usr/local/lib dhe skedarët që ndodhen në këtë katalog, duke lejuar paketat e ardhshme të kenë akses në bibliotekat në këtë katalog, por mendoj se është më mirë të ofrohet qasje vetëm për skedarët e nevojshëm. Nd stoppni jail dhe caktoni etiketat mls/high për të gjithë skedarët:

setfmac -R mls/high /jail

Kur caktohen etiketat, procesi do të ndalet nëse setfmac ndesh në lidhje të ngurta, në shembullin tim hiqja lidhjet e ngurta në katalogët e mëposhtëm:

/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

Pasi të caktohen etiketat, është e nevojshme të caktohen etiketat mls/low për apache. E para është të zbulohet cilat skedarë janë të nevojshëm për të nisur apache:

ldd /usr/local/sbin/httpd

Pasi të ekzekutohet kjo komandë, do të shfaqen varësitë, por thjesht caktimi i etiketave të nevojshme për këto skedarë nuk do të jetë e mjaftueshme, pasi katalogët në të cilët ndodhen këto skedarë kanë etiketën mls/high, prandaj është e nevojshme që këtyre katalogëve të caktohen etiketat mls/low. Kur apache të nisë, gjithashtu do të tregojë skedarët që janë të nevojshëm për nisjen e tij, dhe për php këto varësi mund të merren në logun 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/
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

Në këtë listë caktohen etiketat mls/low për të gjithë skedarët që janë të nevojshëm për funksionimin e saktë të lidhjes mes apache dhe php (për paketat që janë instaluar në shembullin tim).

Hapi i fundit do të jetë konfigurimi i nisjes së jail në nivelin mls/equal, dhe apache në nivelin mls/low. Për të nisur jail është e nevojshme të bëhen ndryshime në skenarin /etc/rc.d/jail, gjeni në këtë skenar funksionet jail_start, dhe vendosni variablën command në formën:

command="setpmac mls/equal $jail_program"

Ekipi setpmac запусĐșа njĂ« skedar ekzekutiv nĂ« nivelin e nevojshĂ«m tĂ« mandatit, nĂ« kĂ«tĂ« rast mls/equal, pĂ«r tĂ« pasur qasje nĂ« tĂ« gjitha etiketat. NĂ« apache, duhet tĂ« redaktoni skriptin e nisjes /usr/local/etc/rc.d/apache24. BĂ«ni ndryshimet nĂ« funksionin apache24_prestart:

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

Në zyrtaresh mhb gjihet një shembull tjetër në udhëzues, por nuk arrita ta përdor sepse vazhdimisht shfaqej një mesazh për mos përdorimin e komandës setpmac.

Përfundim

Ky mënyrë e shpërndarjes së aksesit do të shtojë një nivel shtesë sigurie për apache (edhe pse kjo qasje mund të përdoret për çdo stak tjetër), që gjithashtu ekzekutohet në jail, në të njëjtën kohë për administratorin, gjithçka do të ndodhi në mënyrë transparente dhe pa u vënë re.

Lista e burimeve që më ndihmuan në shkrimin e këtij publikimi:

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

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster