Einführung
Um ein zusätzliches Maß an Serversicherheit bereitzustellen, können Sie verwenden
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
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
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}
}
В
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:
Source: habr.com