Das Mandatmodell zur Verteilung von Rechten in FreeBSD

Einführung

Um ein zusätzliches Sicherheitsniveau für den Server zu gewährleisten, kann man ein mandatiertes Modell für den Zugriff verwenden. In dieser Veröffentlichung wird beschrieben, wie man Apache in einer Jail-Umgebung ausführt, mit Zugang nur zu den Komponenten, die für den ordnungsgemäßen Betrieb von Apache und PHP erforderlich sind. Nach diesem Prinzip kann man nicht nur Apache, sondern auch jeden anderen Stack einschränken.

Vorbereitung

Diese Methode eignet sich nur für das Dateisystem UFS; in diesem Beispiel wird im Hauptsystem ZFS verwendet, während in der Jail entsprechend UFS genutzt wird. Zuerst muss der Kernel neu kompiliert werden. Bei der Installation von FreeBSD sollte der Quellcode installiert werden.
Nachdem das System installiert ist, bearbeiten Sie die Datei:

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

In diese Datei muss nur eine Zeile hinzugefügt werden:

options     MAC_MLS

Das Label mls/high wird über dem Label mls/low dominieren, Anwendungen, die mit dem Label mls/low gestartet werden, können nicht auf Dateien zugreifen, die das Label mls/high besitzen. Näheres zu allen verfügbaren Labels im FreeBSD-System kann in diesem Handbuch.
Wechseln Sie dann in das Verzeichnis /usr/src:

cd /usr/src

Um die Kernel-Kompilation zu starten, führen Sie aus (geben Sie in dem Schlüssel j 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 beeilen Sie sich nicht, das System neu zu starten, denn die Benutzer müssen zunächst in die Login-Klasse übertragen werden, nachdem sie entsprechend konfiguriert wurde. Bearbeiten Sie die Datei /etc/login.conf, in dieser Datei muss die Login-Klasse default bearbeitet werden, bringen Sie sie in die folgende Form:

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 es Benutzern, die in dieser Klasse sind, auf Dateien zuzugreifen, die mit jedem Label (mls/low, mls/high) gekennzeichnet sind. Nach diesen Anpassungen muss die Datenbank neu kompiliert werden und der Benutzer root (sowie diejenigen, die es benötigen) muss in diese Login-Klasse aufgenommen werden:

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

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

default_labels file ?mls

Sie müssen auch das Modul mac_mls.ko beim Start hinzufügen:

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

Nach diesem Schritt können Sie das System bedenkenlos neu starten. Wie man ein jail erstellen kann, können Sie in einem meiner Artikel nachlesen. Aber bevor Sie ein jail erstellen, müssen Sie eine Festplatte hinzufügen und ein Dateisystem darauf erstellen sowie multilabel aktivieren. Erstellen Sie ein UFS2-Dateisystem mit einer Clustergröße von 64kB:

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

Nach der Erstellung des Dateisystems und der Aktivierung von multilabel müssen Sie die Festplatte in /etc/fstab hinzufügen. Fügen Sie folgende Zeile zu dieser Datei hinzu:

/dev/ada1               /jail  ufs     rw              0       1

Im Mountpoint geben Sie das Verzeichnis an, in das Sie die Festplatte einbinden möchten. In Pass geben Sie unbedingt 1 an (in welcher Reihenfolge die Überprüfung dieser Festplatte erfolgt) — das ist notwendig, da das UFS-Dateisystem empfindlich auf plötzliche Stromausfälle reagiert. Nach diesen Schritten montieren Sie die Festplatte:

mount /dev/ada1 /jail

In diesem Verzeichnis installieren Sie das jail. Nachdem das jail aktiv ist, müssen Sie die gleichen Vorgänge wie im Hauptsystem mit den Benutzern und Dateien /etc/login.conf, /etc/mac.conf durchführen.

Einstellungen

Bevor Sie die erforderlichen Labels festlegen, 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", um PHP-Erweiterungen zu installieren
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 dieser Pakete gesetzt. Man könnte natürlich einfacher verfahren und für den Ordner /usr/local/lib sowie die Dateien, die sich in diesem Verzeichnis befinden, die Labels mls/low setzen, sodass die nachträglich installierten Pakete (z. B. zusätzliche Erweiterungen für PHP) Zugang zu den Bibliotheken in diesem Verzeichnis haben, aber ich denke, es ist besser, nur den Zugang zu den benötigten Dateien zu gewähren. Stoppen Sie das Jail und setzen Sie die Labels mls/high für alle Dateien:

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 harte Links in den 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 wurden, müssen die Labels mls/low für Apache gesetzt werden. Zuerst muss ermittelt werden, welche Dateien für den Start von Apache erforderlich sind:

ldd /usr/local/sbin/httpd

Nach der Ausführung dieses Befehls werden die Abhängigkeiten auf dem Bildschirm angezeigt, aber es reicht 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 festgelegt werden. Beim Starten von Apache werden auch die Dateien angezeigt, die für seinen Start erforderlich sind, und für PHP können diese Abhängigkeiten im Log httpd-error.log eingesehen werden.

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 die Labels mls/low für alle Dateien festgelegt, die für den ordnungsgemäßen Betrieb der Kombination von Apache und PHP erforderlich sind (für die Pakete, die in meinem Beispiel installiert sind).

Der letzte Schritt besteht darin, den Jail-Start auf der Ebene mls/equal und Apache auf der Ebene mls/low einzustellen. Um den Jail zu starten, müssen Sie Änderungen im Skript /etc/rc.d/jail vornehmen, suchen Sie in diesem Skript die Funktion jail_start, und setzen Sie die Variable command wie folgt:

command="setpmac mls/equal $jail_program"

Der Befehl setpmac startet die ausführbare Datei auf der erforderlichen Mandatsebene, in diesem Fall mls/equal, um Zugriff auf alle Labels zu haben. Bei Apache müssen Sie das Start-Skript /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 der offiziellen Im Handbuch wird ein anderes Beispiel angegeben, aber ich konnte es nicht verwenden, da ständig die Meldung erschien, dass der Befehl setpmac nicht verwendet werden kann.

Ausgabe

Dieses Zugriffsverteilungssystem fügt Apache eine zusätzliche Sicherheitsstufe hinzu (obwohl dieses Verfahren auch für jeden anderen Stack geeignet ist), der zudem in einem Jail ausgeführt wird, während es für den Administrator transparent und unauffällig bleibt.

Liste von Quellen, die mir bei der Erstellung dieser Veröffentlichung geholfen haben:

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

Quelle: habr.com

60GB SSD 8Gb DDR4