Мандатна модель розподілу прав у FreeBSD

Запровадження

Для забезпечення додаткового рівня безпеки сервера можна використовувати мандатну модель розподіл доступу. У даній публікації буде описано як можна запускати apache в jail з доступом тільки до тих компонентів, до яких необхідний доступ для коректної роботи apache і php. За цим принципом можна обмежувати не тільки apache, а також будь-який інший стек.

Підготовка

Даний метод підійде тільки для файлової системи ufs, в даному прикладі в основній системі буде використовуватися zfs, а jail відповідно ufs. Насамперед необхідно перезбирати ядро, при встановленні FreeBSD встановіть вихідний код.
Після того, як система буде встановлена, відредагуйте файл:

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

У цей файл необхідно додати лише один рядок:

options     MAC_MLS

Мітка mls/high матиме домінуюче положення над міткою mls/low, програми, які будуть запущені з міткою mls/low, не зможуть отримати доступ до файлів, які мають мітку mls/high. Більш детально про всі доступні мітка в системі FreeBSD можна прочитати в даному керівництві.
Далі перейдіть до каталогу /usr/src:

cd /usr/src

Для запуску складання ядра виконайте (у ключі j вкажіть кількість ядер у системі):

make -j 4 buildkernel KERNCONF=GENERIC

Після того, як ядро ​​буде зібране, його необхідно встановити:

make installkernel KERNCONF=GENERIC

Після інсталяції ядра не поспішайте перезавантажувати систему, оскільки необхідно перевести користувачів в логін клас, попередньо його налаштувавши. Відредагуйте файл /etc/login.conf, в даному файлі необхідно відредагувати логін клас default, приведіть його до вигляду:

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:

Рядок :label=mls/equal, дасть можливість користувачам які складаються в даному класі отримувати доступ до файлів, які позначені будь-якою міткою (mls/low, mls/high). Після даних маніпуляцій необхідно перезбирати базу даних і помістити користувача root (а також тих, яким це необхідно) в даний логін клас:

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

Для того щоб політика стосувалася тільки файлів необхідно відредагувати файл /etc/mac.conf, залиште в ньому тільки один рядок:

default_labels file ?mls

Також необхідно додати модуль mac_mls.ko до автозапуску:

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

Після цього можна сміливо перезавантажити систему. Як створити в'язниця можна прочитати в одній із моїх публікацій. Але перед тим, як створювати jail, необхідно додати жорсткий диск і створити на ньому файлову систему і включити на ньому multilabel, створіть файлову систему ufs2 з розміром кластера 64kb:

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

Після створення файлової системи та додавання multilabel необхідно додати жорсткий диск до /etc/fstab, додайте рядок у цей файл:

/dev/ada1               /jail  ufs     rw              0       1

У Mountpoint вкажіть каталог у який Ви монтуватимете жорсткий диск, в Pass обов'язково вкажіть 1 (у якій послідовності буде проведена перевірка цього жорсткого диска) — це необхідно, оскільки файлова система ufs чутлива до різких обривів електроживлення. Після цих дій змонтуйте диск:

mount /dev/ada1 /jail

У цей каталог встановіть jail. Після того, як jail запрацює, в ньому необхідно виконати ті ж маніпуляції, що і в основній системі з користувачами та файлами /etc/login.conf, /etc/mac.conf.

Налаштування

Перед тим як встановити необхідні мітки, рекомендую встановити всі необхідні пакети, в моєму випадку мітки будуть виставлені з урахуванням даних пакетів:

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 

У цьому прикладі мітки будуть виставлені з урахуванням залежностей даних пакетів. Можна звичайно вчинити простіше, для папки /usr/local/lib і файлів які знаходяться в даному каталозі виставити мітки mls/low та наступні встановлені пакети (наприклад додаткові розширення для php), зможуть отримати доступ до бібліотек у даному каталозі, але мені здається краще надати доступ тільки до тих файлів, які необхідні. Зупиніть jail та встановіть на всі файли мітки mls/high:

setfmac -R mls/high /jail

При виставленні міток, процес буде зупинений, якщо setfmac наткнеться на жорсткі посилання, в моєму прикладі я видаляв жорсткі посилання в наступних каталогах:

/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

Після того як мітки будуть встановлені, необхідно виставити мітки mls/low для apache, насамперед необхідно з'ясувати, які файли необхідні для запуску apache:

ldd /usr/local/sbin/httpd

Після виконання цієї команди на екрані відобразяться залежності, але виставити на дані файли необхідні мітки буде мало, оскільки каталоги в яких дані файли знаходяться мають мітку mls/high, тому на дані каталоги також необхідно виставити мітку mls/low. При запуску apache також видасть файли, які необхідні для його запуску, а для php ці залежності можна дізнатися в логі 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

У цьому списку виставляються мітки mls/low на всі файли, необхідні для коректної роботи зв'язки apache і php (для тих пакетів, які встановлені в моєму прикладі).

Останнім штрихом буде налаштування запуску jail лише на рівні mls/equal, а apache лише на рівні mls/low. Для запуску jail необхідно внести зміни до скрипту /etc/rc.d/jail, знайдіть у цьому скрипті функції jail_start, змінну command приведіть до вигляду:

command="setpmac mls/equal $jail_program"

Команда setpmac запускає виконуваний файл на необхідному мандатному рівні, в даному випадку mls/equal, щоб мати доступ до всіх міток. В apache необхідно відредагувати стартовий скрипт /usr/local/etc/rc.d/apache24. Внесіть зміни до функції apache24_prestart:

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

В офіційному посібнику вказано інший приклад, але мені вдалося його використовувати оскільки постійно видавалося повідомлення про неможливість використовувати команду setpmac.

Висновок

Даний спосіб розподілу доступу додасть додатковий рівень захищеності apache (хоча цей спосіб підійде до будь-якого іншого стеку), який, крім цього, запускається в jail, в той же час для адміністратора все це відбуватиметься прозоро і не помітно.

Список джерелом, які мені допомогли в написанні даної публікації:

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

Джерело: habr.com

Додати коментар або відгук