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

來源: www.habr.com

添加評論