Privalomas teisių platinimo modelis FreeBSD

įvedimas

Norėdami užtikrinti papildomą serverio saugumo lygį, galite naudoti mandato modelis prieigos paskirstymas. Šiame leidinyje aprašoma, kaip galite paleisti apache kalėjime su prieiga tik prie tų komponentų, kuriems reikalinga prieiga, kad apache ir php veiktų tinkamai. Naudodami šį principą galite apriboti ne tik Apache, bet ir bet kurį kitą krūvą.

Mokymai

Šis metodas tinka tik ufs failų sistemai; šiame pavyzdyje zfs bus naudojamas atitinkamai pagrindinėje sistemoje, o ufs - kalėjime. Pirmas žingsnis yra atstatyti branduolį; diegdami FreeBSD įdiekite šaltinio kodą.
Įdiegę sistemą, redaguokite failą:

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

Prie šio failo reikia pridėti tik vieną eilutę:

options     MAC_MLS

Etiketė „mls/high“ užims dominuojančią poziciją prieš „mls/low“ etiketę, o programos, kurios bus paleistos su „mls/low“ etikete, negalės pasiekti failų, turinčių „mls/high“ etiketę. Daugiau informacijos apie visas galimas žymas FreeBSD sistemoje rasite čia vadovavimas.
Tada eikite į /usr/src katalogą:

cd /usr/src

Norėdami pradėti kurti branduolį, paleiskite (rakte j nurodykite sistemos branduolių skaičių):

make -j 4 buildkernel KERNCONF=GENERIC

Sukūrus branduolį, jis turi būti įdiegtas:

make installkernel KERNCONF=GENERIC

Įdiegę branduolį, neskubėkite perkrauti sistemos, nes būtina perkelti vartotojus į prisijungimo klasę, prieš tai ją sukonfigūravus. Redaguokite /etc/login.conf failą, šiame faile turite redaguoti numatytąją prisijungimo klasę, perkelkite ją į formą:

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:

Eilutė :label=mls/equal leis vartotojams, kurie yra šios klasės nariai, pasiekti failus, pažymėtus bet kokia etikete (mls/low, mls/high). Atlikę šias manipuliacijas, turite iš naujo sukurti duomenų bazę ir įvesti pagrindinį vartotoją (taip pat tuos, kuriems to reikia) į šią prisijungimo klasę:

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

Kad politika būtų taikoma tik failams, turite redaguoti /etc/mac.conf failą, palikdami jame tik vieną eilutę:

default_labels file ?mls

Taip pat turite pridėti mac_mls.ko modulį prie automatinio paleidimo:

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

Po to galite saugiai paleisti sistemą iš naujo. Kaip sukurti kalėjimas Ją galite perskaityti viename iš mano leidinių. Tačiau prieš kurdami kalėjimą, turite pridėti standųjį diską ir sukurti jame failų sistemą bei įgalinti joje kelias etiketes, sukurti ufs2 failų sistemą, kurios klasterio dydis yra 64 kb:

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

Sukūrę failų sistemą ir pridėję kelias etiketes, turite pridėti standųjį diską prie /etc/fstab, pridėti eilutę prie šio failo:

/dev/ada1               /jail  ufs     rw              0       1

„Mountpoint“ nurodykite katalogą, kuriame montuosite standųjį diską; „Pass“ būtinai nurodykite 1 (kokia seka šis standusis diskas bus tikrinamas) - tai būtina, nes ufs failų sistema yra jautri staigiems elektros energijos tiekimo nutraukimams . Atlikę šiuos veiksmus, įdėkite diską:

mount /dev/ada1 /jail

Įdiekite kalėjimą šiame kataloge. Paleidus kalėjimą, joje reikia atlikti tas pačias manipuliacijas, kaip ir pagrindinėje sistemoje su vartotojais ir failais /etc/login.conf, /etc/mac.conf.

reguliavimas

Prieš diegiant reikiamas žymas, rekomenduoju įdiegti visus reikiamus paketus, mano atveju žymos bus nustatytos atsižvelgiant į šiuos paketus:

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 

Šiame pavyzdyje etiketės bus nustatytos atsižvelgiant į šių paketų priklausomybes. Žinoma, galite tai padaryti paprasčiau: aplankui /usr/local/lib ir šiame kataloge esantiems failams nustatykite mls/low etiketes ir vėlesni įdiegti paketai (pavyzdžiui, papildomi php plėtiniai) galės pasiekti bibliotekas šiame kataloge, bet man atrodo geriau suteikti prieigą tik prie tų failų, kurie yra būtini. Sustabdykite kalėjimą ir nustatykite mls/high etiketes visiems failams:

setfmac -R mls/high /jail

Nustatant žymes, procesas bus sustabdytas, jei setfmac susidurs su kietosiomis nuorodomis, mano pavyzdyje ištryniau kietąsias nuorodas šiuose kataloguose:

/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

Nustačius etiketes, reikia nustatyti apache mls/low etiketes. Pirmas dalykas, kurį reikia padaryti, tai išsiaiškinti, kokių failų reikia norint paleisti apache:

ldd /usr/local/sbin/httpd

Įvykdžius šią komandą ekrane bus rodomos priklausomybės, tačiau šiems failams nustatyti reikiamas etiketes neužteks, kadangi katalogai, kuriuose yra šie failai, turi etiketę mls/high, todėl šiuos katalogus taip pat reikia pažymėti mls/mažas. Paleidus, apache taip pat išves jai paleisti reikalingus failus, o php atveju šias priklausomybes galima rasti httpd-error.log žurnale.

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

Šiame sąraše yra mls/low žymės visiems failams, reikalingiems tinkamam apache ir php derinio veikimui (tiems paketams, kurie yra įdiegti mano pavyzdyje).

Paskutinis žingsnis bus sukonfigūruoti kalėjimą, kad jis veiktų mls / lygiu, o apache - mls / žemu lygiu. Norėdami pradėti jail, turite pakeisti scenarijų /etc/rc.d/jail, šiame scenarijuje rasti jail_start funkcijas, pakeisti komandos kintamąjį į formą:

command="setpmac mls/equal $jail_program"

Komanda setpmac paleidžia vykdomąjį failą reikiamu pajėgumų lygiu, šiuo atveju mls/equal, kad būtų galima pasiekti visas etiketes. Apache turite redaguoti paleisties scenarijų /usr/local/etc/rc.d/apache24. Pakeiskite apache24_prestart funkciją:

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

В oficialus Vadove yra dar vienas pavyzdys, bet aš negalėjau jo naudoti, nes vis gaudavau pranešimą apie negalėjimą naudoti komandą setpmac.

Produkcija

Šis prieigos paskirstymo būdas suteiks papildomo saugumo lygio apache (nors šis metodas tinka bet kokiam kitam stackui), kuris be to veikia kalėjime, tuo pačiu administratoriui visa tai vyks skaidriai ir nepastebimai.

Šaltinių, padėjusių man rašyti šį leidinį, sąrašas:

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

Šaltinis: www.habr.com

Добавить комментарий