Mandmodel voor de verdeling van rechten in FreeBSD

Inleiding

Om een extra niveau van beveiliging voor de server te waarborgen, kan men gebruikmaken van een mandaatmodel voor het verdelen van toegang. In deze publicatie zal worden beschreven hoe Apache kan worden uitgevoerd in een jail met toegang alleen tot die componenten die nodig zijn voor de correcte werking van Apache en PHP. Dit principe kan worden toegepast niet alleen op Apache, maar ook op elke andere stack.

Voorbereiding

Deze methode is alleen geschikt voor het UFS-bestandssysteem, in dit voorbeeld zal het hoofdagent systeem ZFS gebruiken, terwijl in de jail UFS zal worden gebruikt. Eerst moet de kernel worden herbouwd tijdens de installatie van FreeBSD, installeer de broncode.
Nadat het systeem is geïnstalleerd, bewerk dan het bestand:

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

In dit bestand moet je slechts één regel toevoegen:

options     MAC_MLS

Het label mls/high zal dominanter zijn dan het label mls/low, toepassingen die worden uitgevoerd met het label mls/low zullen geen toegang hebben tot bestanden met het label mls/high. Meer gedetailleerde informatie over alle beschikbare labels in het FreeBSD-systeem kan worden gelezen in deze handleiding.
Ga vervolgens naar de map /usr/src:

cd /usr/src

Om de kernelbouw te starten, voer je uit (in de optie j geef je het aantalcores in het systeem op):

make -j 4 buildkernel KERNCONF=GENERIC

Nadat de kernel is gebouwd, moet je deze installeren:

make installkernel KERNCONF=GENERIC

Na de installatie van de kernel, haast je niet om het systeem opnieuw op te starten, omdat het nodig is om de gebruikers naar de login-class te verplaatsen, nadat je deze eerst hebt ingesteld. Bewerk het bestand /etc/login.conf, in dit bestand moet je de login-class default bewerken en deze aanpassen naar:

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:

De regel :label=mls/equal, zal gebruikers die tot deze klasse behoren in staat stellen toegang te krijgen tot bestanden die met elk label zijn gemarkeerd (mls/low, mls/high). Na deze aanpassingen is het nodig om de databank opnieuw op te bouwen en de gebruiker root (en degenen voor wie dit nodig is) in deze login-class te plaatsen:

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

Om ervoor te zorgen dat het beleid alleen op bestanden van toepassing is, moet het bestand /etc/mac.conf worden bewerkt, laat alleen deze regel over:

default_labels file ?mls

Daarnaast moet de module mac_mls.ko aan de opstartprocedure worden toegevoegd:

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

Daarna kan het systeem zonder problemen opnieuw worden opgestart. Hoe je een jail kunt maken, kun je lezen in een van mijn publicaties. Maar voordat je een jail maakt, moet je een harde schijf toevoegen en daarop een bestandssysteem creëren en multilabel inschakelen; maak een ufs2-bestandssysteem met een cluster grootte van 64kb:

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

Na het aanmaken van het bestandssysteem en het toevoegen van multilabel, moet de harde schijf worden toegevoegd aan /etc/fstab; voeg de volgende regel toe aan dit bestand:

/dev/ada1               /jail  ufs     rw              0       1

Bij Mountpoint geef je de map op waarin je de harde schijf gaat koppelen; bij Pass geef je verplicht 1 op (in welke volgorde de controle van deze harde schijf zal plaatsvinden) — dit is noodzakelijk, aangezien het ufs-bestandssysteem gevoelig is voor plotselinge stroomuitval. Na deze stappen koppel je de schijf:

mount /dev/ada1 /jail

Installeer de jail in deze map. Nadat de jail functioneert, moeten dezelfde handelingen worden uitgevoerd als in het hoofd systeem met gebruikers en bestanden /etc/login.conf, /etc/mac.conf.

Instellingen

Voordat je de benodigde labels instelt, raad ik aan alle benodigde pakketten te installeren; in mijn geval zullen de labels worden ingesteld op basis van deze pakketten:

mod_php73-7.3.4_1              PHP-scripttaal
php73-7.3.4_1                  PHP-scripttaal
php73-ctype-7.3.4_1            De ctype gedeelde extensie voor php
php73-curl-7.3.4_1             De curl gedeelde extensie voor php
php73-dom-7.3.4_1              De dom gedeelde extensie voor php
php73-extensions-1.0           "meta-port" om PHP-extensies te installeren
php73-filter-7.3.4_1           De filter gedeelde extensie voor php
php73-gd-7.3.4_1               De gd gedeelde extensie voor php
php73-gettext-7.3.4_1          De gettext gedeelde extensie voor php
php73-hash-7.3.4_1             De hash gedeelde extensie voor php
php73-iconv-7.3.4_1            De iconv gedeelde extensie voor php
php73-json-7.3.4_1             De json gedeelde extensie voor php
php73-mysqli-7.3.4_1           De mysqli gedeelde extensie voor php
php73-opcache-7.3.4_1          De opcache gedeelde extensie voor php
php73-openssl-7.3.4_1          De openssl gedeelde extensie voor php
php73-pdo-7.3.4_1              De pdo gedeelde extensie voor php
php73-pdo_sqlite-7.3.4_1       De pdo_sqlite gedeelde extensie voor php
php73-phar-7.3.4_1             De phar gedeelde extensie voor php
php73-posix-7.3.4_1            De posix gedeelde extensie voor php
php73-session-7.3.4_1          De session gedeelde extensie voor php
php73-simplexml-7.3.4_1        De simplexml gedeelde extensie voor php
php73-sqlite3-7.3.4_1          De sqlite3 gedeelde extensie voor php
php73-tokenizer-7.3.4_1        De tokenizer gedeelde extensie voor php
php73-xml-7.3.4_1              De xml gedeelde extensie voor php
php73-xmlreader-7.3.4_1        De xmlreader gedeelde extensie voor php
php73-xmlrpc-7.3.4_1           De xmlrpc gedeelde extensie voor php
php73-xmlwriter-7.3.4_1        De xmlwriter gedeelde extensie voor php
php73-xsl-7.3.4_1              De xsl gedeelde extensie voor php
php73-zip-7.3.4_1              De zip gedeelde extensie voor php
php73-zlib-7.3.4_1             De zlib gedeelde extensie voor php
apache24-2.4.39 

In dit voorbeeld worden labels ingesteld rekening houdend met de afhankelijkheden van deze pakketten. Je kunt het natuurlijk eenvoudiger maken door voor de map /usr/local/lib en de bestanden die zich in deze map bevinden labels mls/low in te stellen. Alle volgende geïnstalleerde pakketten (bijvoorbeeld extra extensies voor php) kunnen dan toegang krijgen tot de bibliotheken in deze map, maar ik denk dat het beter is alleen toegang te geven tot de bestanden die echt nodig zijn. Stop de jail en stel labels mls/high in voor alle bestanden.

setfmac -R mls/high /jail

Bij het instellen van labels zal het proces stoppen als setfmac tegen harde links aanloopt. In mijn voorbeeld heb ik harde links verwijderd in de volgende mappen:

/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

Nadat de labels zijn ingesteld, moet je labels mls/low instellen voor apache. Als eerste moet je uitzoeken welke bestanden nodig zijn voor het starten van apache:

ldd /usr/local/sbin/httpd

Na het uitvoeren van dit commando worden de afhankelijkheden op het scherm weergegeven, maar het volstaat niet om de benodigde labels op deze bestanden in te stellen, omdat de mappen waarin deze bestanden zich bevinden het label mls/high hebben. Daarom moeten we voor deze mappen ook het label mls/low instellen. Bij het starten van apache worden ook de bestanden weergegeven die nodig zijn voor de opstart, en voor php kunnen deze afhankelijkheden worden geraadpleegd in het logbestand httpd-error.log.

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 deze lijst worden de labels mls/low ingesteld op alle bestanden die nodig zijn voor de correcte werking van de combinatie van apache en php (voor de pakketten die in mijn voorbeeld zijn geïnstalleerd).

De laatste handeling zal het instellen van de jail op niveau mls/equal zijn, en apache op niveau mls/low. Voor het starten van de jail moeten er wijzigingen worden aangebracht in het script /etc/rc.d/jail, zoek in dit script naar de functie jail_start, en pas de variabele command aan naar:

command="setpmac mls/equal $jail_program"

De setpmac-opdracht start het uitvoerbare bestand op het vereiste mandaatniveau, in dit geval mls/equal, om toegang te krijgen tot alle labels. Bij apache moet het opstartscript /usr/local/etc/rc.d/apache24 worden bewerkt. Breng wijzigingen aan in de functie apache24_prestart:

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

In officiële In de handleiding wordt een ander voorbeeld gegeven, maar ik kon het niet gebruiken omdat er voortdurend een bericht verscheen dat de setpmac-opdracht niet kon worden uitgevoerd.

Uitslag

Deze manier van toegang verdelen zal een extra beveiligingslaag aan apache toevoegen (hoewel deze methode ook voor elke andere stack geschikt is), die daarnaast in een jail wordt uitgevoerd, terwijl voor de beheerder dit allemaal transparant en onopgemerkt zal gebeuren.

Lijst van bronnen die me hebben geholpen bij het schrijven van deze publicatie:

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

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster