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