Mandatory rights distribution model sa FreeBSD

Pagpapakilala

Upang magbigay ng karagdagang antas ng seguridad ng server, maaari mong gamitin modelo ng mandato pamamahagi ng access. Ilalarawan ng publikasyong ito kung paano mo mapapatakbo ang apache sa isang kulungan na may access lamang sa mga bahaging iyon na nangangailangan ng access para gumana nang tama ang apache at php. Gamit ang prinsipyong ito, maaari mong limitahan hindi lamang ang Apache, kundi pati na rin ang anumang iba pang stack.

Pagsasanay

Ang pamamaraang ito ay angkop lamang para sa ufs file system; sa halimbawang ito, ang zfs ay gagamitin sa pangunahing sistema, at ufs sa kulungan, ayon sa pagkakabanggit. Ang unang hakbang ay muling itayo ang kernel; kapag nag-i-install ng FreeBSD, i-install ang source code.
Pagkatapos ma-install ang system, i-edit ang file:

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

Kailangan mo lamang magdagdag ng isang linya sa file na ito:

options     MAC_MLS

Magkakaroon ng dominanteng posisyon ang mls/high label sa mls/low label, ang mga application na ilulunsad na may mls/low label ay hindi makaka-access ng mga file na may mls/high label. Higit pang mga detalye tungkol sa lahat ng magagamit na mga tag sa sistema ng FreeBSD ay matatagpuan dito gabay.
Susunod, pumunta sa /usr/src na direktoryo:

cd /usr/src

Upang simulan ang pagbuo ng kernel, tumakbo (sa j key, tukuyin ang bilang ng mga core sa system):

make -j 4 buildkernel KERNCONF=GENERIC

Matapos ma-compile ang kernel, dapat itong mai-install:

make installkernel KERNCONF=GENERIC

Pagkatapos i-install ang kernel, huwag magmadali upang i-reboot ang system, dahil kinakailangan na ilipat ang mga gumagamit sa klase ng pag-login, na dati nang na-configure ito. I-edit ang /etc/login.conf file, sa file na ito kailangan mong i-edit ang default login class, dalhin ito sa 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:

Ang linyang :label=mls/equal ay magbibigay-daan sa mga user na miyembro ng klase na ito na ma-access ang mga file na minarkahan ng anumang label (mls/low, mls/high). Pagkatapos ng mga manipulasyong ito, kailangan mong buuin muli ang database at ilagay ang root user (pati na rin ang mga nangangailangan nito) sa login class na ito:

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

Upang ang patakaran ay malapat lamang sa mga file, kailangan mong i-edit ang /etc/mac.conf file, mag-iwan lamang ng isang linya dito:

default_labels file ?mls

Kailangan mo ring idagdag ang mac_mls.ko module sa autorun:

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

Pagkatapos nito, maaari mong ligtas na i-reboot ang system. Paano lumikha bilangguan Mababasa mo ito sa isa sa aking mga publikasyon. Ngunit bago lumikha ng isang kulungan, kailangan mong magdagdag ng isang hard drive at lumikha ng isang file system dito at paganahin ang multilabel dito, lumikha ng isang ufs2 file system na may laki ng kumpol na 64kb:

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

Pagkatapos gumawa ng file system at magdagdag ng multilabel, kailangan mong idagdag ang hard drive sa /etc/fstab, idagdag ang linya sa file na ito:

/dev/ada1               /jail  ufs     rw              0       1

Sa Mountpoint, tukuyin ang direktoryo kung saan mo i-mount ang hard drive; sa Pass, siguraduhing tukuyin ang 1 (sa anong pagkakasunud-sunod ang hard drive na ito ay susuriin) - ito ay kinakailangan, dahil ang ufs file system ay sensitibo sa biglaang pagkawala ng kuryente . Pagkatapos ng mga hakbang na ito, i-mount ang disk:

mount /dev/ada1 /jail

Mag-install ng kulungan sa direktoryong ito. Matapos tumakbo ang kulungan, kailangan mong gawin ang parehong mga manipulasyon dito tulad ng sa pangunahing sistema kasama ang mga user at ang mga file /etc/login.conf, /etc/mac.conf.

pag-aayos

Bago i-install ang mga kinakailangang tag, inirerekumenda ko ang pag-install ng lahat ng kinakailangang mga pakete; sa aking kaso, ang mga tag ay itatakda na isinasaalang-alang ang mga paketeng ito:

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 

Sa halimbawang ito, itatakda ang mga label na isinasaalang-alang ang mga dependency ng mga paketeng ito. Siyempre, magagawa mo ito nang mas simple: para sa folder na /usr/local/lib at ang mga file na matatagpuan sa direktoryo na ito, itakda ang mls/low label at ang mga kasunod na naka-install na pakete (halimbawa, ang mga karagdagang extension para sa php) ay makaka-access ang mga aklatan sa direktoryong ito, ngunit tila mas mainam sa akin na magbigay lamang ng access sa mga file na iyon na kinakailangan. Itigil ang kulungan at magtakda ng mls/high label sa lahat ng file:

setfmac -R mls/high /jail

Kapag nagtatakda ng mga marka, ang proseso ay ititigil kung ang setfmac ay nakatagpo ng mga hard link, sa aking halimbawa ay tinanggal ko ang mga hard link sa mga sumusunod na direktoryo:

/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

Matapos maitakda ang mga label, kailangan mong itakda ang mls/mababang mga label para sa apache, ang unang bagay na kailangan mong gawin ay alamin kung anong mga file ang kailangan upang simulan ang apache:

ldd /usr/local/sbin/httpd

Pagkatapos isagawa ang utos na ito, ang mga dependency ay ipapakita sa screen, ngunit ang pagtatakda ng mga kinakailangang label sa mga file na ito ay hindi sapat, dahil ang mga direktoryo kung saan matatagpuan ang mga file na ito ay may mls/high label, kaya ang mga direktoryo na ito ay kailangan ding lagyan ng label mls/mababa. Kapag nagsimula, ilalabas din ng apache ang mga file na kinakailangan upang patakbuhin ito, at para sa php ang mga dependency na ito ay makikita sa httpd-error.log 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

Ang listahang ito ay naglalaman ng mls/mababang mga tag para sa lahat ng mga file na kinakailangan para sa tamang operasyon ng apache at php na kumbinasyon (para sa mga pakete na naka-install sa aking halimbawa).

Ang huling pagpindot ay ang pag-configure ng kulungan upang tumakbo sa mls/equal level, at apache sa mls/low level. Upang simulan ang kulungan, kailangan mong gumawa ng mga pagbabago sa /etc/rc.d/jail script, hanapin ang jail_start function sa script na ito, baguhin ang command variable sa form:

command="setpmac mls/equal $jail_program"

Ang setpmac command ay nagpapatakbo ng executable file sa kinakailangang antas ng kakayahan, sa kasong ito mls/equal, upang magkaroon ng access sa lahat ng mga label. Sa apache kailangan mong i-edit ang startup script /usr/local/etc/rc.d/apache24. Baguhin ang apache24_prestart function:

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

Π’ opisyal Ang manwal ay naglalaman ng isa pang halimbawa, ngunit hindi ko ito nagamit dahil patuloy akong nakakakuha ng mensahe tungkol sa kawalan ng kakayahang gamitin ang setpmac command.

Pagbubuhos

Ang pamamaraang ito ng pamamahagi ng access ay magdaragdag ng karagdagang antas ng seguridad sa apache (bagaman ang pamamaraang ito ay angkop para sa anumang iba pang stack), na bilang karagdagan ay tumatakbo sa isang kulungan, sa parehong oras, para sa administrator ang lahat ng ito ay mangyayari nang malinaw at hindi napapansin.

Listahan ng mga mapagkukunan na nakatulong sa akin sa pagsulat ng publikasyong ito:

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

Pinagmulan: www.habr.com

Magdagdag ng komento