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
      
      





カーネルを再構築する必要がない場合は、モジュールを使用できます。



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





その後、システムを安全に再起動できます。 刑務所を作成する方法は、私の出版物のいずれかに記載されています。 ただし、jailを作成する前に、ハードドライブを追加し、その上にファイルシステムを作成し、マルチラベルを有効にする必要があります。クラスターサイズが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をインストールします。 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の追加の拡張子)を設定し、このディレクトリのライブラリにアクセスできますが、必要なファイルにのみアクセスを許可します。 jailを停止し、すべてのファイルにmls / highラベルを設定します。これを行うには、たとえばmacという名前のファイルを作成し、1行追加します。



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







その後、次のコマンドを実行します。



 setfsmac -ef /mac /jail/*
      
      







ラベルを設定したら、Apacheのmls / lowラベルを設定する必要があります(実行中のjailからラベルを設定する必要があります)、最初にすることは、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ラベルが設定されています(私の例でインストールされているパッケージの場合)。



最後に、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



All Articles