Въведение
За допълнителен слой сигурност на сървъра може да се използва разпределение на достъпа. В тази публикация ще бъде описано как може да се стартира 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 Сценарен език
php73-7.3.4_1 PHP Сценарен език
php73-ctype-7.3.4_1 Споделено разширение ctype за php
php73-curl-7.3.4_1 Споделено разширение curl за php
php73-dom-7.3.4_1 Споделено разширение dom за php
php73-extensions-1.0 "мета-порт" за инсталиране на PHP разширения
php73-filter-7.3.4_1 Споделено разширение filter за php
php73-gd-7.3.4_1 Споделено разширение gd за php
php73-gettext-7.3.4_1 Споделено разширение gettext за php
php73-hash-7.3.4_1 Споделено разширение hash за php
php73-iconv-7.3.4_1 Споделено разширение iconv за php
php73-json-7.3.4_1 Споделено разширение json за php
php73-mysqli-7.3.4_1 Споделено разширение mysqli за php
php73-opcache-7.3.4_1 Споделено разширение opcache за php
php73-openssl-7.3.4_1 Споделено разширение openssl за php
php73-pdo-7.3.4_1 Споделено разширение pdo за php
php73-pdo_sqlite-7.3.4_1 Споделено разширение pdo_sqlite за php
php73-phar-7.3.4_1 Споделено разширение phar за php
php73-posix-7.3.4_1 Споделено разширение posix за php
php73-session-7.3.4_1 Споделено разширение session за php
php73-simplexml-7.3.4_1 Споделено разширение simplexml за php
php73-sqlite3-7.3.4_1 Споделено разширение sqlite3 за php
php73-tokenizer-7.3.4_1 Споделено разширение tokenizer за php
php73-xml-7.3.4_1 Споделено разширение xml за php
php73-xmlreader-7.3.4_1 Споделено разширение xmlreader за php
php73-xmlrpc-7.3.4_1 Споделено разширение xmlrpc за php
php73-xmlwriter-7.3.4_1 Споделено разширение xmlwriter за php
php73-xsl-7.3.4_1 Споделено разширение xsl за php
php73-zip-7.3.4_1 Споделено разширение zip за php
php73-zlib-7.3.4_1 Споделено разширение zlib за php
apache24-2.4.39
В този пример маркерите ще бъдат зададени, като се вземат предвид зависимостите на тези пакети. Разбира се, можете да подходите по-просто, като зададете маркери mls/low за папката /usr/local/lib и файловете, които се намират в този каталог, и следващите инсталирани пакети (например допълнителни разширения за 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, докато за администратора всичко това ще се случва прозрачно и незабелязано.
Списък на източниците, които ми помогнаха при написването на тази публикация:
Източник: habr.com
