Modello di distribuzione dei diritti obbligatori in FreeBSD

Introduzione

Per fornire un ulteriore livello di sicurezza del server, è possibile utilizzare modello di mandato distribuzione degli accessi. Questa pubblicazione descriverà come eseguire apache in una jail con accesso solo a quei componenti che richiedono l'accesso affinché apache e php funzionino correttamente. Usando questo principio, puoi limitare non solo Apache, ma anche qualsiasi altro stack.

Formazione

Questo metodo è adatto solo per il file system ufs; in questo esempio, zfs verrà utilizzato rispettivamente nel sistema principale e ufs nella jail. Il primo passo è ricostruire il kernel; quando installi FreeBSD, installa il codice sorgente.
Dopo aver installato il sistema, modificare il file:

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

Devi solo aggiungere una riga a questo file:

options     MAC_MLS

L'etichetta mls/high avrà una posizione dominante sull'etichetta mls/low, le applicazioni che verranno avviate con l'etichetta mls/low non potranno accedere ai file che hanno l'etichetta mls/high. Maggiori dettagli su tutti i tag disponibili nel sistema FreeBSD possono essere trovati qui guida.
Successivamente, vai alla directory /usr/src:

cd /usr/src

Per iniziare a costruire il kernel, esegui (nel tasto j, specifica il numero di core nel sistema):

make -j 4 buildkernel KERNCONF=GENERIC

Dopo che il kernel è stato compilato, deve essere installato:

make installkernel KERNCONF=GENERIC

Dopo aver installato il kernel, non affrettarti a riavviare il sistema, poiché è necessario trasferire gli utenti alla classe di login, dopo averla precedentemente configurata. Modifica il file /etc/login.conf, in questo file devi modificare la classe di login predefinita, portala nel modulo:

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:

La riga :label=mls/equal consentirà agli utenti che sono membri di questa classe di accedere ai file contrassegnati con qualsiasi etichetta (mls/low, mls/high). Dopo queste manipolazioni, è necessario ricostruire il database e posizionare l'utente root (così come coloro che ne hanno bisogno) in questa classe di accesso:

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

Affinché la policy si applichi solo ai file, è necessario modificare il file /etc/mac.conf, lasciando al suo interno solo una riga:

default_labels file ?mls

Devi anche aggiungere il modulo mac_mls.ko all'esecuzione automatica:

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

Successivamente, puoi riavviare in sicurezza il sistema. Come creare carcere Puoi leggerlo in una delle mie pubblicazioni. Ma prima di creare una jail, devi aggiungere un disco rigido e creare un file system su di esso e abilitare il multilabel su di esso, creare un file system ufs2 con una dimensione del cluster di 64kb:

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

Dopo aver creato il file system e aggiunto multilabel, è necessario aggiungere il disco rigido a /etc/fstab, aggiungere la riga a questo file:

/dev/ada1               /jail  ufs     rw              0       1

In Mountpoint, specifica la directory in cui monterai il disco rigido; in Pass, assicurati di specificare 1 (in quale sequenza verrà controllato questo disco rigido): questo è necessario, poiché il file system ufs è sensibile alle improvvise interruzioni di corrente . Dopo questi passaggi, monta il disco:

mount /dev/ada1 /jail

Installa jail in questa directory. Dopo che la prigione è in esecuzione, è necessario eseguire le stesse manipolazioni del sistema principale con gli utenti e i file /etc/login.conf, /etc/mac.conf.

registrazione

Prima di installare i tag necessari, consiglio di installare tutti i pacchetti necessari; nel mio caso i tag verranno impostati tenendo conto di questi pacchetti:

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 questo esempio, le etichette verranno impostate tenendo conto delle dipendenze di questi pacchetti. Certo, puoi farlo in modo più semplice: per la cartella /usr/local/lib e i file che si trovano in questa directory, imposta le etichette mls/low e i successivi pacchetti installati (ad esempio, estensioni aggiuntive per php) potranno accedere le librerie in questa directory, ma mi sembra meglio fornire l'accesso solo ai file necessari. Interrompi il jail e imposta etichette mls/high su tutti i file:

setfmac -R mls/high /jail

Quando si impostano i contrassegni, il processo verrà interrotto se setfmac incontra collegamenti reali, nel mio esempio ho eliminato collegamenti reali nelle seguenti directory:

/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

Dopo che le etichette sono state impostate, devi impostare le etichette mls/low per apache, la prima cosa che devi fare è scoprire quali file sono necessari per avviare apache:

ldd /usr/local/sbin/httpd

Dopo aver eseguito questo comando, le dipendenze verranno visualizzate sullo schermo, ma impostare le etichette necessarie su questi file non sarà sufficiente, poiché le directory in cui si trovano questi file hanno l'etichetta mls/high, quindi anche queste directory devono essere etichettate ml/basso. All'avvio, Apache genererà anche i file necessari per eseguirlo e per php queste dipendenze possono essere trovate nel registro 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

Questo elenco contiene i tag mls/low per tutti i file necessari per il corretto funzionamento della combinazione apache e php (per quei pacchetti installati nel mio esempio).

Il tocco finale sarà configurare jail in modo che venga eseguito al livello mls/uguale e apache al livello mls/basso. Per avviare jail, devi apportare modifiche allo script /etc/rc.d/jail, trovare le funzioni jail_start in questo script, modificare la variabile del comando nella forma:

command="setpmac mls/equal $jail_program"

Il comando setpmac esegue il file eseguibile al livello di capacità richiesto, in questo caso mls/equal, per avere accesso a tutte le etichette. In Apache è necessario modificare lo script di avvio /usr/local/etc/rc.d/apache24. Modifica la funzione apache24_prestart:

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

В ufficiale Il manuale contiene un altro esempio, ma non sono riuscito a utilizzarlo perché continuavo a ricevere un messaggio relativo all'impossibilità di utilizzare il comando setpmac.

conclusione

Questo metodo di distribuzione dell'accesso aggiungerà un ulteriore livello di sicurezza ad apache (sebbene questo metodo sia adatto a qualsiasi altro stack), che inoltre gira in jail, allo stesso tempo, per l'amministratore tutto ciò avverrà in modo trasparente e impercettibile.

Elenco delle fonti che mi hanno aiutato nella stesura di questa pubblicazione:

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

Fonte: habr.com

Aggiungi un commento