FreeBSD中的强制性权利分配模型

引言


为了提供更高级别的服务器安全性,您可以使用强制访问分配模型 。 本出版物将描述如何在监狱中运行apache,并且仅访问那些需要对apache和php进行正确操作的组件。 根据这一原则,您不仅可以限制apache,还可以限制任何其他堆栈。

准备工作


此方法仅适用于ufs文件系统,在本示例中,将在主系统中使用zfs,在jail中使用ufs。 第一步是重建内核;在安装FreeBSD时,请安装源代码。

安装系统后,编辑文件:

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

您只需要向该文件添加一行:

 options MAC_MLS 

mls /高标记将主导mls /低标记,以mls /低标记运行的应用程序将无法访问带有mls /高标记的文件。 您可以在本指南中阅读有关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)标记的文件。 经过这些操作之后,有必要重建数据库并将根用户(以及需要它的用户)放置在此登录类中:

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

为了使该策略仅涉及文件,您需要编辑/etc/mac.conf文件,在其中仅保留一行:

 default_labels file ?mls 

如果不想重建内核,则可以使用以下模块:

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

之后,您可以安全地重新引导系统。 如何创建监狱可以在我的出版物之一中找到。 但是在创建监狱之前,您需要添加硬盘并在其上创建文件系统并在其上启用多标签,然后创建一个簇大小为64kb的ufs2文件系统:

 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 

在这个目录中安装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标签,为此,请创建一个名称为例如mac的文件,并在其中添加一行:

 touche /mac echo '.* mls/high' > /mac 


之后,运行命令:

 setfsmac -ef /mac /jail/* 


设置标签后,您需要为apache设置mls /低标签(您需要从正在运行的监狱中设置标签),首先要做的是找出运行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 

在此列表中,为apache和php捆绑包正常工作所需的所有文件(对于在我的示例中安装的那些软件包)设置了mls / low标签。

最后一点是将监狱配置为以毫升/相等级别运行,将Apache配置为以毫升/低级别运行。 要运行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

Source: https://habr.com/ru/post/zh-CN448642/


All Articles