FreeBSD 中的强制权限分配模型

介绍

要提供额外级别的服务器安全性,您可以使用 授权模式 访问分配。 本出版物将描述如何在监狱中运行 apache,并且仅访问那些需要访问 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:
        :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

之后,您可以安全地重新启动系统。 如何创建 监狱 您可以在我的一本出版物中阅读它。 但在创建监狱之前,您需要添加一个硬盘并在其上创建一个文件系统并启用多标签,创建一个簇大小为 2kb 的 ufs64 文件系统:

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

创建文件系统并添加多标签后,您需要将硬盘添加到 /etc/fstab 中,将此行添加到该文件中:

/dev/ada1               /jail  ufs     rw              0       1

在 Mountpoint 中,指定要在其中安装硬盘驱动器的目录;在 Pass 中,请务必指定 1(将按照什么顺序检查该硬盘驱动器) - 这是必要的,因为 ufs 文件系统对突然断电很敏感。 完成这些步骤后,挂载磁盘:

mount /dev/ada1 /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的附加扩展)就可以访问该目录中的库,但对我来说,最好只提供对那些必要文件的访问。 停止监狱并在所有文件上设置 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

设置标签后,您需要为apache设置mls/low标签,您需要做的第一件事是找出启动apache需要哪些文件:

ldd /usr/local/sbin/httpd

执行此命令后,屏幕上将显示依赖关系,但为这些文件设置必要的标签是不够的,因为这些文件所在的目录有mls/high标签,所以这些目录也需要标签毫升/低。 启动时,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

此列表包含 apache 和 php 组合正确操作所需的所有文件的 mls/low 标签(对于我的示例中安装的那些软件包)。

最后一步是将 Jail 配置为在 mls/equal 级别运行,将 apache 配置为在 mls/low 级别运行。 要启动jail,需要更改/etc/rc.d/jail脚本,找到该脚本中的jail_start函数,将命令变量更改为以下形式:

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 添加额外的安全级别(尽管此方法适用于任何其他堆栈),此外,它还在监狱中运行,同时,对于管理员来说,所有这一切都将透明且不易察觉地发生。

帮助我撰写本出版物的来源列表:

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

来源: habr.com

添加评论