Obligatorisches Rechteverteilungsmodell in FreeBSD

Einführung

Um ein zusätzliches Maß an Serversicherheit bereitzustellen, können Sie verwenden Mandatsmodell Zugangsverteilung. In dieser Veröffentlichung wird beschrieben, wie Sie Apache in einem Gefängnis ausführen können, wobei Sie nur auf die Komponenten zugreifen können, die Zugriff benötigen, damit Apache und PHP ordnungsgemäß funktionieren. Mit diesem Prinzip können Sie nicht nur Apache, sondern auch jeden anderen Stack einschränken.

Training

Diese Methode ist nur für das ufs-Dateisystem geeignet; in diesem Beispiel wird zfs im Hauptsystem bzw. ufs im Jail verwendet. Der erste Schritt besteht darin, den Kernel neu zu erstellen; bei der Installation von FreeBSD installieren Sie 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

Das Label „mls/high“ hat gegenüber dem Label „mls/low“ eine dominante Stellung. Anwendungen, die mit dem Label „mls/low“ gestartet werden, können nicht auf Dateien mit dem Label „mls/high“ zugreifen. Weitere Details zu allen verfügbaren Tags im FreeBSD-System finden Sie hier leiten.
Gehen Sie als Nächstes in das Verzeichnis /usr/src:

cd /usr/src

Um mit dem Aufbau des Kernels zu beginnen, führen Sie Folgendes aus (geben Sie im j-Schlüssel die Anzahl der Kerne im System an):

make -j 4 buildkernel KERNCONF=GENERIC

Nachdem der Kernel kompiliert 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 vorheriger Konfiguration in die Anmeldeklasse übertragen werden müssen. Bearbeiten Sie die Datei /etc/login.conf. In dieser Datei müssen Sie die Standard-Anmeldeklasse bearbeiten und in das Formular bringen:

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:

Die Zeile :label=mls/equal ermöglicht Benutzern, die Mitglieder dieser Klasse sind, den Zugriff auf Dateien, die mit einem beliebigen Label (mls/low, mls/high) gekennzeichnet sind. Nach diesen Manipulationen müssen Sie die Datenbank neu erstellen und den Root-Benutzer (sowie diejenigen, die ihn benötigen) in diese Anmeldeklasse einordnen:

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

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

default_labels file ?mls

Sie müssen außerdem das Modul mac_mls.ko zu Autorun hinzufügen:

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

Danach können Sie das System sicher neu starten. So erstellen Sie Gefängnis Sie können es in einer meiner Publikationen lesen. Bevor Sie jedoch ein Gefängnis erstellen, müssen Sie eine Festplatte hinzufügen und darauf ein Dateisystem 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 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 mounten möchten; geben Sie in Pass unbedingt 1 an (in welcher Reihenfolge diese Festplatte überprüft wird) – dies ist notwendig, da das ufs-Dateisystem empfindlich auf plötzliche Stromausfälle reagiert . Mounten Sie nach diesen Schritten die Festplatte:

mount /dev/ada1 /jail

Installieren Sie Jail in diesem Verzeichnis. Nachdem das Gefängnis ausgeführt wurde, müssen Sie darin die gleichen Manipulationen wie im Hauptsystem mit Benutzern und den Dateien /etc/login.conf, /etc/mac.conf durchführen.

Einstellung

Vor der Installation der notwendigen Tags empfehle ich die Installation aller notwendigen Pakete; in meinem Fall werden die Tags unter Berücksichtigung dieser Pakete gesetzt:

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 Labels unter Berücksichtigung der Abhängigkeiten dieser Pakete festgelegt. Natürlich geht es auch einfacher: Legen Sie für den Ordner /usr/local/lib und die in diesem Verzeichnis befindlichen Dateien die mls/low-Label fest, und nachfolgend installierte Pakete (z. B. zusätzliche Erweiterungen für PHP) können darauf zugreifen die Bibliotheken in diesem Verzeichnis, aber es scheint mir besser, den Zugriff nur auf die Dateien zu gewähren, die notwendig sind. Jail stoppen und mls/high-Label für alle Dateien festlegen:

setfmac -R mls/high /jail

Beim Setzen von Markierungen wird der Vorgang gestoppt, wenn setfmac auf Hardlinks stößt. In meinem Beispiel habe ich Hardlinks in den folgenden Verzeichnissen gelöscht:

/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

Nachdem die Labels festgelegt wurden, müssen Sie die mls/low-Labels für Apache festlegen. Als Erstes müssen Sie herausfinden, welche Dateien zum Starten von Apache benötigt werden:

ldd /usr/local/sbin/httpd

Nach der Ausführung dieses Befehls werden Abhängigkeiten auf dem Bildschirm angezeigt. Das Festlegen der erforderlichen Beschriftungen für diese Dateien reicht jedoch nicht aus, da die Verzeichnisse, in denen sich diese Dateien befinden, die Bezeichnung mls/high haben und diese Verzeichnisse daher ebenfalls beschriftet werden müssen mls/niedrig. Beim Start gibt Apache auch die Dateien aus, die zum Ausführen erforderlich sind, und für PHP sind diese Abhängigkeiten im Protokoll httpd-error.log zu finden.

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

Diese Liste enthält mls/low-Tags für alle Dateien, die für den korrekten Betrieb der Apache- und PHP-Kombination erforderlich sind (für die Pakete, die in meinem Beispiel installiert sind).

Der letzte Schliff besteht darin, Jail so zu konfigurieren, dass es auf der Ebene mls/equal und Apache auf der Ebene mls/low ausgeführt wird. Um Jail zu starten, müssen Sie Änderungen am Skript /etc/rc.d/jail vornehmen, die jail_start-Funktionen in diesem Skript finden und die Befehlsvariable in die Form ändern:

command="setpmac mls/equal $jail_program"

Der Befehl setpmac führt die ausführbare Datei mit der erforderlichen Fähigkeitsstufe aus, in diesem Fall mls/equal, um Zugriff auf alle Labels zu haben. In Apache müssen Sie das Startskript /usr/local/etc/rc.d/apache24 bearbeiten. Ändern Sie die Funktion apache24_prestart:

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

В offiziell Das Handbuch enthält ein weiteres Beispiel, das ich jedoch nicht verwenden konnte, da ich immer wieder die Meldung erhielt, dass der Befehl setpmac nicht verwendet werden könne.

Abschluss

Diese Methode der Zugriffsverteilung fügt Apache eine zusätzliche Sicherheitsebene hinzu (obwohl diese Methode für jeden anderen Stack geeignet ist), der außerdem in einem Jail läuft. Gleichzeitig geschieht dies für den Administrator transparent und unbemerkt.

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: habr.com

Kommentar hinzufügen