Obligatorisches Modell für die Verteilung von Rechten in FreeBSD

Einführung


Um ein zusätzliches Maß an Serversicherheit bereitzustellen, können Sie das obligatorische Zugriffsverteilungsmodell verwenden . In dieser Veröffentlichung wird beschrieben, wie Sie Apache im Gefängnis mit Zugriff nur auf die Komponenten ausführen können, die Zugriff für den korrekten Betrieb von Apache und PHP benötigen. Durch dieses Prinzip können Sie nicht nur Apache, sondern auch jeden anderen Stapel einschränken.

Vorbereitung


Diese Methode ist nur für das ufs-Dateisystem geeignet. In diesem Beispiel wird zfs im Hauptsystem und ufs im Gefängnis verwendet. Der erste Schritt besteht darin, den Kernel neu zu erstellen. Installieren Sie bei der Installation von FreeBSD den Quellcode.

Bearbeiten Sie nach der Installation des Systems die Datei:

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

Sie müssen dieser Datei nur eine Zeile hinzufügen:

 options MAC_MLS 

Die mls / high-Markierung dominiert die mls / low-Markierung. Anwendungen, die mit der mls / low-Markierung ausgeführt werden, können nicht auf Dateien mit der mls / high-Markierung zugreifen. Weitere Informationen zu allen verfügbaren Labels im FreeBSD-System finden Sie in diesem Handbuch .
Wechseln Sie als Nächstes in das Verzeichnis / usr / src:

 cd /usr/src 

Gehen Sie wie folgt vor, um die Kernel-Assembly zu starten (geben Sie in der Taste j die Anzahl der Kerne für den Prozessor an):

 make -j 4 buildkernel KERNCONF=GENERIC 

Nachdem der Kernel zusammengebaut wurde, muss er installiert werden:

 make installkernel KERNCONF=GENERIC 

Beeilen Sie sich nach der Installation des Kernels nicht, das System neu zu starten, da Benutzer nach dem erstmaligen Einrichten in die Anmeldeklasse übertragen werden müssen. Bearbeiten Sie die Datei /etc/login.conf. In dieser Datei müssen Sie die Standardeinstellung der Anmeldeklasse bearbeiten und in das folgende Formular einfügen:

 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: 

Zeile: label = mls / gleich, ermöglicht Benutzern dieser Klasse den Zugriff auf Dateien, die mit einem beliebigen Label (mls / niedrig, mls / hoch) gekennzeichnet sind. Nach diesen Manipulationen muss die Datenbank neu erstellt und der Root-Benutzer (sowie diejenigen, die ihn benötigen) in diese Anmeldeklasse eingefügt werden:

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

Damit die Richtlinie nur Dateien betrifft, müssen Sie die Datei /etc/mac.conf bearbeiten und nur eine Zeile darin belassen:

 default_labels file ?mls 

Wenn Sie den Kernel nicht neu erstellen möchten, können Sie das folgende Modul verwenden:

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

Danach können Sie das System sicher neu starten. Wie man ein Gefängnis erstellt, finden Sie in einer meiner Veröffentlichungen. Bevor Sie jedoch ein Gefängnis erstellen, müssen Sie eine Festplatte hinzufügen, ein Dateisystem darauf erstellen und Multilabel darauf aktivieren. Erstellen Sie ein ufs2-Dateisystem mit einer Clustergröße von 64 KB:

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

Nachdem Sie das Dateisystem erstellt und ein Multilabel hinzugefügt haben, müssen Sie die Festplatte zu / etc / fstab hinzufügen und die Zeile zu dieser Datei hinzufügen:

 /dev/ada1 /jail ufs rw 0 1 

Geben Sie in Mountpoint das Verzeichnis an, in dem Sie die Festplatte bereitstellen möchten. Geben Sie in Pass 1 an (in welcher Reihenfolge die angegebene Festplatte überprüft wird). Dies ist erforderlich, da das ufs-Dateisystem empfindlich auf plötzliche Stromausfälle reagiert. Hängen Sie nach diesen Schritten die Festplatte ein:

 mount /dev/ada1 /jail 

Installieren Sie das Gefängnis in diesem Verzeichnis. Nachdem das Gefängnis funktioniert hat, müssen die gleichen Manipulationen wie im Hauptsystem mit den Benutzern und Dateien /etc/login.conf, /etc/mac.conf durchgeführt werden.

Anpassung


Bevor Sie die erforderlichen Etiketten festlegen, empfehle ich, alle erforderlichen Pakete zu installieren. In meinem Fall werden die Etiketten unter Berücksichtigung der folgenden Pakete festgelegt:

 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 


In diesem Beispiel werden die Beschriftungen unter Berücksichtigung der Abhängigkeiten dieser Pakete festgelegt. Dies ist natürlich einfacher, da für den Ordner / usr / local / lib und die Dateien in diesem Verzeichnis die mls / low-Labels festgelegt werden und nachfolgende installierte Pakete (z. B. zusätzliche Erweiterungen für PHP) auf die Bibliotheken in diesem Verzeichnis zugreifen können, aber es scheint mir besser Gewähren Sie nur Zugriff auf die benötigten Dateien. Stoppen Sie das Gefängnis und setzen Sie das mls / high-Label für alle Dateien. Erstellen Sie dazu eine Datei mit dem Namen, z. B. mac, und fügen Sie eine Zeile hinzu:

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


Führen Sie danach den folgenden Befehl aus:

 setfsmac -ef /mac /jail/* 


Nachdem die Labels festgelegt wurden, müssen Sie die mls / low-Labels für Apache festlegen (Sie müssen die Labels aus dem laufenden Gefängnis festlegen). Als Erstes müssen Sie herausfinden, welche Dateien zum Ausführen von Apache erforderlich sind:

 ldd /usr/local/sbin/httpd 

Nach dem Ausführen dieses Befehls werden Abhängigkeiten auf dem Bildschirm angezeigt, aber das Einfügen der erforderlichen Beschriftungen in diese Dateien reicht nicht aus, da die Verzeichnisse, in denen sich diese Dateien befinden, die Bezeichnung mls / high haben. Daher müssen Sie auch die Bezeichnung mls / low in diesen Verzeichnissen festlegen. Wenn Sie Apache starten, werden auch die Dateien ausgegeben, die zum Ausführen benötigt werden. Für PHP finden Sie diese Abhängigkeiten im Protokoll 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 

In dieser Liste werden mls / low-Labels für alle Dateien festgelegt, die erforderlich sind, damit das Apache- und PHP-Bundle ordnungsgemäß funktioniert (für die in meinem Beispiel installierten Pakete).

Der letzte Schliff besteht darin, das Gefängnis so zu konfigurieren, dass es auf der Ebene mls / gleich und Apache auf der Ebene mls / low ausgeführt wird. Um Jail auszuführen, müssen Sie Änderungen am Skript /etc/rc.d/jail vornehmen, die Funktion jail_start in diesem Skript suchen und die Befehlsvariable wie folgt ändern:

 command="setpmac mls/equal $jail_program" 

Der Befehl setpmac führt die ausführbare Datei auf der erforderlichen Berechtigungsstufe aus, in diesem Fall mls / gleich, um Zugriff auf alle Beschriftungen zu erhalten. In Apache müssen Sie das Startskript /usr/local/etc/rc.d/apache24 bearbeiten. Nehmen Sie Änderungen an der Funktion apache24_prestart vor:

 apache24_prestart() { apache24_checkfib apache24_precmd eval "setpmac mls/low" ${command} ${apache24_flags} } 

Im offiziellen Handbuch ist ein anderes Beispiel angegeben, aber ich konnte es nicht verwenden, da ich ständig eine Nachricht über die Unfähigkeit erhielt, den Befehl setpmac zu verwenden.

Fazit


Diese Methode der Zugriffsverteilung erhöht die Apache-Sicherheit zusätzlich (obwohl diese Methode für jeden anderen Stapel geeignet ist), die zusätzlich im Gefängnis ausgeführt wird, während dies für den Administrator transparent und nicht merklich geschieht.

Liste der Quellen, die mir beim Schreiben dieser Veröffentlichung geholfen haben:

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

Source: https://habr.com/ru/post/de448642/


All Articles