Введение
В данной публикации пойдёт речь о мандатной модели bsdextended, на handbook её описывают как брандмауэр файловой системы. Преимущество данного подхода над тем который я описывал в данном руководстве является тот факт, что не имеет значения какая файловая система используется, так как ограничения будут происходить не по меткам на файлах, а по uid и gid пользователей.
Подготовка
Все действия будут произведены в jail, поэтому необходимо изначально настроить jail. Данное руководство написано с учётом того, что jail установлен в каталог /jails/famp. Первым делом установим необходимые модули в «автозапуск», а также запустим их(данные действия необходимо проделывать не в jail) и установим возможность использовать порты 80, 443 пользователю www без root прав:
echo 'mac_portacl_load="YES"' >>/boot/loader.conf echo 'mac_bsdextended_load="YES"' >> /boot/loader.conf kldload mac_portacl.ko kldload mac_bsdextended.ko sysctl net.inet.ip.portrange.reservedlow=0 sysctl net.inet.ip.portrange.reservedhigh=0 sysctl security.mac.portacl.rules=uid:80:tcp:80,uid:80:tcp:443 echo 'net.inet.ip.portrange.reservedlow=0' >> /etc/sysctl.conf echo 'net.inet.ip.portrange.reservedhigh=0' >> /etc/sysctl.conf echo 'security.mac.portacl.rules=uid:80:tcp:80,uid:80:tcp:443' >> /etc/sysctl.conf
Далее в jail необходимо установить зависимости для сборки apache и php, а также установить порты:
pkg install apr autoconf autoconf-wrapper automake ca_root_nss cmake curl db5 dialog4ports expat fontconfig freetype2 gdbm gettext-runtime gettext-tools giflib gmake gmp gperf help2man indexinfo jbigkit jpeg-turbo jsoncpp libarchive libargon2 libffi libgcrypt libgd libgpg-error libiconv liblz4 libnghttp2 libtextstyle libtool libuv libxml2 libxslt libzip lzo2 m4 meson nasm ninja oniguruma p5-Locale-gettext p5-Locale-libintl p5-Text-Unidecode p5-Unicode-EastAsianWidth pcre pcre2 perl5 pkgconf png py37-Babel py37-Jinja2 py37-MarkupSafe py37-alabaster py37-asn1crypto py37-certifi py37-cffi py37-chardet py37-cryptography py37-cython py37-docutils py37-idna py37-imagesize py37-openssl py37-pycparser py37-pygments py37-pysocks py37-pystemmer py37-pytz py37-requests py37-setuptools py37-six py37-snowballstemmer py37-sphinx py37-sphinx_rtd_theme py37-sphinxcontrib-websupport py37-urllib3 python37 re2c readline rhash sqlite3 texinfo tiff webp openssl wget portsnap fetch extract
Сборка
Перейдём в каталог порта apache, в данном каталоге необходимо выполнить «конфигурирование» порта таким образом, что-бы он установился в каталог /famp:
mkdir /famp cd /usr/ports/www/apache24 make config make configure cd work cd httpd-2.4.43 ./configure --prefix=/famp cd ..//.. make BATCH=yes PREFIX=/famp install clean
После данных манипуляций apache установится в каталог /famp, php таким образом не установить, поэтому установим из исходного кода:
cd / wget https://www.php.net/distributions/php-7.4.5.tar.xz xz -d php-7.4.5.tar.xz tar -xvf php-7.4.5.tar cd php-7.4.5
После данных манипуляций необходимо выполнить сборку php указав корректный путь до apxs:
./configure --prefix=/famp --with-apxs2=/famp/sbin/apxs --with-openssl --with-zlib --with-curl --enable-mbstring --with-zip --enable-mysqlnd --enable-maintainer-zts --with-mysqli gmake install
Настройка
Дальнейшим действием будет корректная настройка httpd.conf (а также остальных необходимых «конифигов»), копирование каталога rc.d и создание необходимых каталогов:
mkdir /famp/log mkdir /famp/run cp -R /famp/etc/rc.d/ /usr/local/etc/rc.d #в скрипте инициализации /usr/local/etc/rc.d/apache24 необходимо отредактировать одну строку, для корректного использования pid`а процесса _pidprefix="/famp/run/httpd" #в httpd.conf отредактируйте следующие строки Mutex default:/famp/run PidFile "/famp/run/httpd.pid" ErrorLog "/famp/log/httpd-error.log" CustomLog "/famp/log/httpd-access.log #httpd-ssl.conf (также необходимо отредактировать пути до сертификатов) SSLSessionCache "shmcb:/famp/run/ssl_scache(512000)" DocumentRoot "/famp/www/apache24/data" ErrorLog "/famp/log/httpd-error.log" TransferLog "/famp/log/httpd-access.log" CustomLog "/famp/log/httpd-ssl_request.log" <Directory "/famp/www/apache24/cgi-bin">
Для того что-бы все процессы apache запускались из под имени www необходимо на файл httpd установить setuid бит, а также необходимо выставить рекурсивно владельца на каталог famp пользователю www и запустить apache:
chown -R www:www /famp chmod 4755 /famp/sbin/httpd
После того как apache будет запущен и созданы необходимые файлы логов, можно изменить права на необходимые каталоги и файлы, но перед эти необходимо отредактировать ldconfig. Данная утилита отвечает за пути до каталогов с различными библиотеками, после изменения прав на каталоги /lib, /usr/lib, usr/local/lib утилита ldconfig будет считать данные каталоги не легитимными, по этой причине данную утилиту необходимо запускать в не защищённом режиме. Для просмотра путей необходимо выполнить команду:
ldconfig -r
Для запуска ldconfig в не защищённом режиме необходимо запустить данную утилиту с ключём i:
ldconfig -iR /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/perl5/5.30/mach/CORE
Также необходимо скопировать файл /usr/local/lib/libnghttp2.so.14 в каталог /usr/lib (не совсем понятно почему apache его не видет в каталоге /usr/local/lib)
cp /usr/local/lib/libnghttp2.so.14 /usr/lib/libnghttp2.so.14
Изменим права на каталоги и файлы необходимые для корректной работы apache:
#необходимо выполнить не из jail chflags noschg /jails/famp/lib/libcrypt.so.5 chflags noschg /jails/famp/lib/libc.so.7 chflags noschg /jails/famp/lib/libthr.so.3 chflags noschg /jails/famp/usr/lib/librt.so.1 #необходимо выполнять из jail chown www:wheel / chown -R www:www /famp chown www:wheel /etc chown www:wheel /tmp chown -R www:wheel /dev chown www:wheel /etc/passwd chown www:wheel /etc/group chown www:wheel /etc/pwd.db chown www:wheel /lib chown www:wheel /usr chown www:wheel /usr/lib chown www:wheel /usr/local chown www:wheel /usr/local/lib chown -R www:wheel /lib chown -R www:wheel /usr/lib chown -R www:wheel /usr/local/lib sysrc apache24_enable="YES" service apache24 start
После данным манипуляций apache будет иметь доступ ко всем файл которые необходимы для его работы в изолированной среде, но на мой взгляд не совсем корректно то, что все эти файлы принадлежат пользователю www, по этой причине можно использовать флаги неизменяемости, данные флаги необходимо устанавливать не и из jail, так как по умолчанию jail запускается с ограниченными правами:
chflags schg /jails/famp chflags schg /jails/famp/etc chflags schg /jails/famp/etc/passwd chflags schg /jails/famp/etc/group chflags schg /jails/famp/etc/pwd.db chflags schg /jails/famp/lib chflags schg /jails/famp/usr chflags schg /jails/famp/usr/lib chflags schg /jails/famp/usr/local chflags schg /jails/famp/usr/local/lib chflags -R schg /jails/famp/lib chflags -R schg /jails/famp/usr/lib chflags -R schg /jails/famp/usr/local/lib chflags -R schg /jails/famp/famp #на данные каталоги не нужно устанавливать данные флаги, так как в них должны быть права на запись chflags -R noschg /jails/famp/famp/log chflags -R noschg /jails/famp/famp/run chflags -R noschg /jails/famp/famp/www/apache24/data/cache #Флаг sunlink запретит удалять каталоги, или файлы (в данном случаи каталоги tmp, cache, log, run не имеют флагов неизменяемости, по этому чисто теоретически apache имеет права на удалени данных каталогов) chflags sunlink /jails/famp/dev chflags sunlink /jails/famp/tmp chflags sunlink /jails/famp/famp/www/apache24/data/cache chflags -R sunlink /jails/famp/famp/log chflags sunlink /jails/famp/famp/run # Флаг sappend разрешает только дозапись в файл, т.е. в логи apache можно только дописывать данные, но не удалять и не редактировать. chflags -R sappend /jails/famp/famp/log
Предпоследним штрихом будет создание исполняемого файла для высталение необходимых прав и запуска apache, а также запуска ldconfig в не защищённом режиме(выполнить в jail):
touch /etc/rc.d/0 chmod +x /etc/rc.d/0 #следующие строки необходимо внести в данный файл ldconfig -iR /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/perl5/5.30/mach/CORE #Доступ в каталог в /dev необходим в том случаи если в системе установлен парамет sysctl для рандомизации pid`а и использования ssl chown -R www:wheel /dev service apache24 start
И наконец последним штрихом будет выставление параметра для bsdextended, также необходимо создать исполняемый файл для того что бы данные ограничения срабатывали при каждой загрузке системы (выполнять не в jail):
touch /etc/rc.d/0 chmod +x /etc/rc.d/0 #В данный файл поместите строку ugidfw set 2 subject uid www object ! uid www mode n #для немедленого применения ограничений выполните данную строку ugidfw set 2 subject uid www object ! uid www mode n
Данный парамет запретит пользователю www иметь доступ к файлам и каталогам которые принадлежат не пользователю www.
Вывод
Как видно из данной публикации такой метод для ограничения процессов приведёт к высокой степени защищённости вэб сервера (а также любого другого стека к которому будет применён данный метод).
Список источников которые мне очень помогли в написании данной публикации.
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac-bsdextended.html
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac-portacl.html
ссылка на оригинал статьи https://habr.com/ru/post/500280/
Добавить комментарий