Запровадження
Для забезпечення додаткового рівня безпеки сервера можна використовувати
Підготовка
Даний метод підійде тільки для файлової системи 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
Після цього можна сміливо перезавантажити систему. Як створити
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}
}
В
Висновок
Даний спосіб розподілу доступу додасть додатковий рівень захищеності apache (хоча цей спосіб підійде до будь-якого іншого стеку), який, крім цього, запускається в jail, в той же час для адміністратора все це відбуватиметься прозоро і не помітно.
Список джерелом, які мені допомогли в написанні даної публікації:
Джерело: habr.com