Das mandatorische Berechtigungsmodell in FreeBSD

Einführung

Um eine zusätzliche Sicherheitsebene für den Server zu gewährleisten, kann man das mandatorische Modell der Zugriffskontrolle verwenden. In diesem Beitrag wird beschrieben, wie man Apache in einer Jail-Umgebung mit Zugang nur zu den Komponenten betreiben kann, die für den korrekten Betrieb von Apache und PHP erforderlich sind. Nach diesem Prinzip kann der Zugriff nicht nur für Apache, sondern auch für jeden anderen Stack eingeschränkt werden.

Vorbereitung

Diese Methode eignet sich nur für das UFS-Dateisystem. In diesem Beispiel wird im Hauptsystem ZFS verwendet, während in der Jail entsprechend UFS zum Einsatz kommt. Zunächst muss der Kernel neu kompiliert werden; bei der Installation von FreeBSD sollten Sie den Quellcode installieren.
Nachdem das System installiert ist, bearbeiten Sie die Datei:

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

Fügen Sie in diese Datei lediglich eine Zeile ein:

options     MAC_MLS

Das Label mls/high hat eine dominierende Stellung über das Label mls/low; Anwendungen, die mit dem Label mls/low gestartet werden, können nicht auf Dateien zugreifen, die das Label mls/high besitzen. Weitere Informationen zu den verfügbaren Labels im FreeBSD-System finden Sie in diesem Handbuch..
Navigieren Sie als Nächstes in das Verzeichnis /usr/src:

cd /usr/src

Um den Kernel-Build zu starten, führen Sie folgendes aus (bei -j geben Sie 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

Nach der Installation des Kernels sollten Sie nicht eilig neu starten, da es erforderlich ist, die Benutzer in die Login-Klasse zu übertragen, nachdem diese konfiguriert wurde. Bearbeiten Sie die Datei /etc/login.conf und ändern Sie die Login-Klasse default wie folgt:

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 in dieser Klasse den Zugriff auf Dateien, die mit einem beliebigen Tag (mls/low, mls/high) gekennzeichnet sind. Nach diesen Änderungen muss die Datenbank neu erstellt und der Benutzer root (sowie alle, die es benötigen) in diese Login-Klasse eingetragen werden:

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

Damit die Richtlinie nur für Dateien gilt, muss die Datei /etc/mac.conf bearbeitet werden. Lassen Sie nur eine Zeile stehen:

default_labels file ?mls

Außerdem muss das Modul mac_mls.ko zum Autostart hinzugefügt werden:

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

Nach diesem Schritt kann das System sicher neu gestartet werden. Wie man ein Jail kann in einem meiner Artikel nachgelesen werden. Aber bevor Sie ein Jail erstellen, müssen Sie eine Festplatte hinzufügen, ein Dateisystem darauf erstellen und multilabel 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

Nach der Erstellung des Dateisystems und der Aktivierung von multilabel muss die Festplatte in /etc/fstab hinzugefügt werden. Fügen Sie die Zeile in diese Datei ein:

/dev/ada1               /jail  ufs     rw              0       1

Geben Sie im Mountpoint das Verzeichnis an, in dem Sie die Festplatte einbinden möchten. Im Pass müssen Sie unbedingt 1 angeben (in welcher Reihenfolge die Überprüfung dieser Festplatte erfolgt) — das ist notwendig, da das Dateisystem ufs empfindlich auf plötzliche Stromunterbrechungen reagiert. Nach diesen Schritten montieren Sie die Festplatte:

mount /dev/ada1 /jail

Installieren Sie jail in dieses Verzeichnis. Nachdem jail funktioniert, müssen Sie die gleichen Schritte wie im Hauptsystem mit den Benutzern und den Dateien /etc/login.conf, /etc/mac.conf durchführen.

Konfiguration

Bevor Sie die erforderlichen Labels setzen, empfehle ich, alle notwendigen Pakete zu installieren. In meinem Fall werden die Labels unter Berücksichtigung dieser Pakete gesetzt:

mod_php73-7.3.4_1              PHP-Skriptsprache
php73-7.3.4_1                  PHP-Skriptsprache
php73-ctype-7.3.4_1            Die ctype Shared-Erweiterung für PHP
php73-curl-7.3.4_1             Die curl Shared-Erweiterung für PHP
php73-dom-7.3.4_1              Die dom Shared-Erweiterung für PHP
php73-extensions-1.0           "Meta-Port" zur Installation von PHP-Erweiterungen
php73-filter-7.3.4_1           Die filter Shared-Erweiterung für PHP
php73-gd-7.3.4_1               Die gd Shared-Erweiterung für PHP
php73-gettext-7.3.4_1          Die gettext Shared-Erweiterung für PHP
php73-hash-7.3.4_1             Die hash Shared-Erweiterung für PHP
php73-iconv-7.3.4_1            Die iconv Shared-Erweiterung für PHP
php73-json-7.3.4_1             Die json Shared-Erweiterung für PHP
php73-mysqli-7.3.4_1           Die mysqli Shared-Erweiterung für PHP
php73-opcache-7.3.4_1          Die opcache Shared-Erweiterung für PHP
php73-openssl-7.3.4_1          Die openssl Shared-Erweiterung für PHP
php73-pdo-7.3.4_1              Die pdo Shared-Erweiterung für PHP
php73-pdo_sqlite-7.3.4_1       Die pdo_sqlite Shared-Erweiterung für PHP
php73-phar-7.3.4_1             Die phar Shared-Erweiterung für PHP
php73-posix-7.3.4_1            Die posix Shared-Erweiterung für PHP
php73-session-7.3.4_1          Die session Shared-Erweiterung für PHP
php73-simplexml-7.3.4_1        Die simplexml Shared-Erweiterung für PHP
php73-sqlite3-7.3.4_1          Die sqlite3 Shared-Erweiterung für PHP
php73-tokenizer-7.3.4_1        Die tokenizer Shared-Erweiterung für PHP
php73-xml-7.3.4_1              Die xml Shared-Erweiterung für PHP
php73-xmlreader-7.3.4_1        Die xmlreader Shared-Erweiterung für PHP
php73-xmlrpc-7.3.4_1           Die xmlrpc Shared-Erweiterung für PHP
php73-xmlwriter-7.3.4_1        Die xmlwriter Shared-Erweiterung für PHP
php73-xsl-7.3.4_1              Die xsl Shared-Erweiterung für PHP
php73-zip-7.3.4_1              Die zip Shared-Erweiterung für PHP
php73-zlib-7.3.4_1             Die zlib Shared-Erweiterung für PHP
apache24-2.4.39 

In diesem Beispiel werden die Labels unter Berücksichtigung der Abhängigkeiten der Pakete festgelegt. Man könnte es natürlich einfacher machen und für den Ordner /usr/local/lib sowie die darin befindlichen Dateien das Label mls/low setzen. Folglich könnten die danach installierten Pakete (z.B. zusätzliche Erweiterungen für PHP) auf die Bibliotheken in diesem Ordner zugreifen. Ich glaube jedoch, dass es besser ist, den Zugriff nur auf die Dateien zu gewähren, die tatsächlich benötigt werden. Stoppen Sie das Jail und setzen Sie auf alle Dateien das Label mls/high:

setfmac -R mls/high /jail

Beim Setzen der Labels wird der Prozess gestoppt, wenn setfmac auf harte Links stößt. In meinem Beispiel habe ich die harten Links in folgenden Verzeichnissen entfernt:

/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 gesetzt sind, müssen die Labels mls/low für Apache gesetzt werden. Zuerst ist es notwendig, herauszufinden, welche Dateien für den Start von Apache benötigt werden:

ldd /usr/local/sbin/httpd

Nach Ausführung dieses Befehls werden die Abhängigkeiten auf dem Bildschirm angezeigt, jedoch reicht es nicht aus, die erforderlichen Labels für diese Dateien festzulegen, da die Verzeichnisse, in denen sich diese Dateien befinden, das Label mls/high haben. Daher muss auch für diese Verzeichnisse das Label mls/low gesetzt werden. Beim Starten von Apache werden außerdem die Dateien angezeigt, die für den Start erforderlich sind, und für PHP können diese Abhängigkeiten im Logfile httpd-error.log ermittelt werden.

setfmac mls/low /nsetfmac 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-Tags für alle Dateien festgelegt, die für das ordnungsgemäße Funktionieren der Verbindung von Apache und PHP erforderlich sind (für die Pakete, die in meinem Beispiel installiert sind).

Der letzte Schliff besteht darin, jail auf die Ebene mls/equal und Apache auf die Ebene mls/low zu konfigurieren. Um jail zu starten, müssen Änderungen am Skript /etc/rc.d/jail vorgenommen werden. Suchen Sie in diesem Skript nach der Funktion jail_start und ändern Sie die Variable command wie folgt:

command="setpmac mls/equal $jail_program"

Der Befehl setpmac startet die ausführbare Datei auf der erforderlichen mandatorischen Ebene, 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. Nehmen Sie Änderungen an der Funktion apache24_prestart vor:

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

In offiziellen Das offizielle Handbuch enthält ein anderes Beispiel, aber ich konnte es nicht verwenden, da ständig die Meldung angezeigt wurde, dass der Befehl setpmac nicht verwendet werden kann.

Fazit

Diese Zugriffsverteilung bietet eine zusätzliche Sicherheitsebene für Apache (obwohl diese Methode auch mit jedem anderen Stack funktioniert), der zudem in einem Jail ausgeführt wird. Für den Administrator bleibt dies dabei jedoch transparent und unauffällig.

Hier ist eine Liste der Quellen, die mir bei der Erstellung dieses Beitrags geholfen haben:

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

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster