Einführung
Um ein zusätzliches Sicherheitsniveau für den Server zu gewährleisten, kann man 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 .
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 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 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:
Quelle: habr.com
