FreeBSD の必須権利配布モデル

導入

追加レベルのサーバー セキュリティを提供するには、次を使用できます。 委任モデル アクセス分布。この出版物では、Apache と PHP が正しく動作するためにアクセスを必要とするコンポーネントにのみアクセスできる状態で、Jail 内で Apache を実行する方法について説明します。この原則を使用すると、Apache だけでなく、他のスタックも制限できます。

訓練

この方法は ufs ファイル システムにのみ適しています。この例では、メイン システムでは zfs が、jail では ufs がそれぞれ使用されます。最初のステップはカーネルを再構築することであり、FreeBSD をインストールするときにソース コードをインストールします。
システムのインストール後、ファイルを編集します。

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

このファイルに追加する必要があるのは 1 行だけです。

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 ファイルを編集して、ファイル内に 1 行だけを残す必要があります。

default_labels file ?mls

自動実行するには mac_mls.ko モジュールを追加する必要もあります。

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

この後、システムを安全に再起動できます。作成方法 刑務所 私の出版物で読むことができます。ただし、jail を作成する前に、ハードドライブを追加してその上にファイルシステムを作成し、その上でマルチラベルを有効にし、クラスターサイズが 2kb の ufs64 ファイルシステムを作成する必要があります。

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

ファイル システムを作成してマルチラベルを追加した後、ハード ドライブを /etc/fstab に追加し、このファイルに次の行を追加する必要があります。

/dev/ada1               /jail  ufs     rw              0       1

[マウントポイント] で、ハード ドライブをマウントするディレクトリを指定します。 [パス] では、必ず 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 ラベルを設定します。

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 に追加のセキュリティ レベルを追加します (ただし、この方法は他のスタックにも適しています)。さらに、jail 内で実行され、同時に管理者にとってこれらすべてが透過的かつ気付かれずに行われます。

この出版物の執筆に役立った情報源のリスト:

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

出所: habr.com

コメントを追加します