Obligatorisk rättighetsdistributionsmodell i FreeBSD

Inledning

För att ge en extra nivå av serversäkerhet kan du använda mandatmodell åtkomstdistribution. Den här publikationen kommer att beskriva hur du kan köra apache i ett fängelse med endast åtkomst till de komponenter som kräver åtkomst för att apache och php ska fungera korrekt. Med den här principen kan du begränsa inte bara Apache utan även vilken annan stack som helst.

Utbildning

Denna metod är endast lämplig för ufs-filsystemet; i det här exemplet kommer zfs att användas i huvudsystemet respektive ufs i fängelset. Det första steget är att bygga om kärnan; när du installerar FreeBSD, installera källkoden.
När systemet har installerats, redigera filen:

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

Du behöver bara lägga till en rad i den här filen:

options     MAC_MLS

Etiketten mls/hög kommer att ha en dominerande ställning över etiketten mls/låg, applikationer som kommer att startas med etiketten mls/låg kommer inte att kunna komma åt filer som har etiketten mls/höga. Mer information om alla tillgängliga taggar i FreeBSD-systemet kan hittas i detta ledarskap.
Gå sedan till katalogen /usr/src:

cd /usr/src

För att börja bygga kärnan, kör (i j-nyckeln, ange antalet kärnor i systemet):

make -j 4 buildkernel KERNCONF=GENERIC

Efter att kärnan har kompilerats måste den installeras:

make installkernel KERNCONF=GENERIC

Efter att ha installerat kärnan, skynda inte att starta om systemet, eftersom det är nödvändigt att överföra användare till inloggningsklassen efter att ha konfigurerat den tidigare. Redigera filen /etc/login.conf, i den här filen måste du redigera standardinloggningsklassen, ta den till formuläret:

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:

Raden :label=mls/equal tillåter användare som är medlemmar i denna klass att komma åt filer som är markerade med valfri etikett (mls/low, mls/high). Efter dessa manipulationer måste du bygga om databasen och placera rotanvändaren (liksom de som behöver den) i denna inloggningsklass:

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

För att policyn endast ska gälla för filer måste du redigera filen /etc/mac.conf och bara lämna kvar en rad i den:

default_labels file ?mls

Du måste också lägga till modulen mac_mls.ko för att köra automatiskt:

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

Efter detta kan du säkert starta om systemet. Hur man skapar fängelse Du kan läsa den i en av mina publikationer. Men innan du skapar ett fängelse måste du lägga till en hårddisk och skapa ett filsystem på den och aktivera multilabel på den, skapa ett ufs2-filsystem med en klusterstorlek på 64kb:

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

Efter att ha skapat filsystemet och lagt till multilabel måste du lägga till hårddisken till /etc/fstab, lägg till raden i den här filen:

/dev/ada1               /jail  ufs     rw              0       1

I Mountpoint, ange i vilken katalog du ska montera hårddisken; i Pass, se till att ange 1 (i vilken ordning denna hårddisk kommer att kontrolleras) - detta är nödvändigt eftersom ufs-filsystemet är känsligt för plötsliga strömavbrott . Efter dessa steg, montera disken:

mount /dev/ada1 /jail

Installera jail i den här katalogen. Efter att fängelset har körts måste du göra samma manipulationer i det som i huvudsystemet med användare och filerna /etc/login.conf, /etc/mac.conf.

justering

Innan du installerar de nödvändiga taggarna rekommenderar jag att du installerar alla nödvändiga paket; i mitt fall kommer taggarna att ställas in med hänsyn till dessa paket:

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 

I det här exemplet kommer etiketter att ställas in med hänsyn till beroenden för dessa paket. Naturligtvis kan du göra det enklare: för mappen /usr/local/lib och filerna som finns i den här katalogen, ställ in mls/low-etiketterna och efterföljande installerade paket (till exempel ytterligare tillägg för php) kommer att kunna komma åt biblioteken i den här katalogen, men det verkar bättre för mig att endast ge åtkomst till de filer som är nödvändiga. Stoppa fängelse och ställ in mls/high-etiketter på alla filer:

setfmac -R mls/high /jail

När du ställer in markeringar kommer processen att stoppas om setfmac stöter på hårda länkar, i mitt exempel tog jag bort hårda länkar i följande kataloger:

/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

Efter att etiketterna har ställts in måste du ställa in mls/low-etiketterna för apache, det första du behöver göra är att ta reda på vilka filer som behövs för att starta apache:

ldd /usr/local/sbin/httpd

Efter att du har kört detta kommando kommer beroenden att visas på skärmen, men det räcker inte att ställa in de nödvändiga etiketterna på dessa filer, eftersom katalogerna där dessa filer finns har etiketten mls/high, så dessa kataloger måste också märkas mls/låg. När du startar kommer apache också att mata ut de filer som är nödvändiga för att köra den, och för php kan dessa beroenden hittas i httpd-error.log-loggen.

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

Den här listan innehåller mls/low-taggar för alla filer som är nödvändiga för korrekt funktion av kombinationen apache och php (för de paket som är installerade i mitt exempel).

Den sista handen blir att konfigurera jail att köra på mls/lika nivå och apache på mls/låg nivå. För att starta jail måste du göra ändringar i /etc/rc.d/jail-skriptet, hitta jail_start-funktionerna i det här skriptet, ändra kommandovariabeln till formen:

command="setpmac mls/equal $jail_program"

Kommandot setpmac kör den körbara filen på den nödvändiga kapacitetsnivån, i detta fall mls/equal, för att få tillgång till alla etiketter. I apache måste du redigera startskriptet /usr/local/etc/rc.d/apache24. Ändra apache24_prestart-funktionen:

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

В officiell Manualen innehåller ett annat exempel, men jag kunde inte använda den eftersom jag hela tiden fick ett meddelande om oförmågan att använda kommandot setpmac.

Utgång

Denna metod för att distribuera åtkomst kommer att lägga till en extra säkerhetsnivå till apache (även om den här metoden är lämplig för alla andra stack), som dessutom körs i ett fängelse, samtidigt, för administratören kommer allt detta att ske transparent och omärkligt.

Lista över källor som hjälpte mig att skriva denna publikation:

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

Källa: will.com

Lägg en kommentar