Modello mandatorio di distribuzione dei diritti in FreeBSD

Introduzione

Per garantire un ulteriore livello di sicurezza al server è possibile utilizzare un modello di mandato per la distribuzione degli accessi. In questa pubblicazione verrà descritto come eseguire Apache in un jail con accesso solo a quei componenti necessari per il corretto funzionamento di Apache e PHP. Con questo principio, è possibile limitare non solo Apache, ma anche qualsiasi altro stack.

Preparazione

Questo metodo è adatto solo per il filesystem UFS; in questo esempio, il sistema principale utilizzerà ZFS, mentre nel jail si utilizzerà UFS. Prima di tutto, è necessario ricompilare il kernel; durante l'installazione di FreeBSD, installare i sorgenti del codice.
Dopo che il sistema sarà installato, modificare il file:

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

In questo file è necessario aggiungere solo una riga:

options     MAC_MLS

L'etichetta mls/high avrà un predominio sull'etichetta mls/low; le applicazioni lanciate con l'etichetta mls/low non potranno accedere ai file contrassegnati con l'etichetta mls/high. Maggiori dettagli su tutte le etichette disponibili nel sistema FreeBSD possono essere letti in questa guida.
Successivamente, spostarsi nella directory /usr/src:

cd /usr/src

Per avviare la compilazione del kernel, eseguire (nel parametro j indicare il numero di core nel sistema):

make -j 4 buildkernel KERNCONF=GENERIC

Una volta che il kernel è stato compilato, è necessario installarlo:

make installkernel KERNCONF=GENERIC

Dopo l'installazione del kernel, non affrettatevi a riavviare il sistema, poiché è necessario trasferire gli utenti nella classe di login, configurandola preventivamente. Modificate il file /etc/login.conf, in cui è necessario modificare la classe di login default, portandola alla seguente configurazione:

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 stringa :label=mls/equal permetterà agli utenti appartenenti a questo classe di accedere ai file contrassegnati da qualsiasi etichetta (mls/low, mls/high). Dopo queste operazioni, sarà necessario ricostruire il database e inserire l'utente root (e quelli che ne hanno bisogno) in questa classe di accesso:

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

Affinché la politica riguardi solo i file, è necessario modificare il file /etc/mac.conf, mantenendo solo una riga:

default_labels file ?mls

È anche necessario aggiungere il modulo mac_mls.ko all'avvio automatico:

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

Dopo di ciò, puoi riavviare il sistema senza problemi. Come creare jail puoi leggerlo in una delle mie pubblicazioni. Ma prima di creare una jail, è necessario aggiungere un disco rigido e creare su di esso un file system abilitando multilabel, crea 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, aggiungi la riga a questo file:

/dev/ada1               /jail  ufs     rw              0       1

In Mountpoint, specify the directory where you will mount the hard drive, and in Pass, be sure to indicate 1 (the sequence in which this hard drive will be checked) — this is necessary because the ufs file system is sensitive to sudden power cuts. After this, mount the disk:

mount /dev/ada1 /jail

Install the jail in this directory. Once the jail is up and running, you need to perform the same operations as in the main system with users and files /etc/login.conf, /etc/mac.conf.

Impostazione

Before setting the necessary labels, I recommend installing all required packages. In my case, the labels will be set considering these packages:

mod_php73-7.3.4_1              Linguaggio di scripting PHP
php73-7.3.4_1                  Linguaggio di scripting PHP
php73-ctype-7.3.4_1            L'estensione condivisa ctype per php
php73-curl-7.3.4_1             L'estensione condivisa curl per php
php73-dom-7.3.4_1              L'estensione condivisa dom per php
php73-extensions-1.0           "meta-port" per installare estensioni PHP
php73-filter-7.3.4_1           L'estensione condivisa filter per php
php73-gd-7.3.4_1               L'estensione condivisa gd per php
php73-gettext-7.3.4_1          L'estensione condivisa gettext per php
php73-hash-7.3.4_1             L'estensione condivisa hash per php
php73-iconv-7.3.4_1            L'estensione condivisa iconv per php
php73-json-7.3.4_1             L'estensione condivisa json per php
php73-mysqli-7.3.4_1           L'estensione condivisa mysqli per php
php73-opcache-7.3.4_1          L'estensione condivisa opcache per php
php73-openssl-7.3.4_1          L'estensione condivisa openssl per php
php73-pdo-7.3.4_1              L'estensione condivisa pdo per php
php73-pdo_sqlite-7.3.4_1       L'estensione condivisa pdo_sqlite per php
php73-phar-7.3.4_1             L'estensione condivisa phar per php
php73-posix-7.3.4_1            L'estensione condivisa posix per php
php73-session-7.3.4_1          L'estensione condivisa session per php
php73-simplexml-7.3.4_1        L'estensione condivisa simplexml per php
php73-sqlite3-7.3.4_1          L'estensione condivisa sqlite3 per php
php73-tokenizer-7.3.4_1        L'estensione condivisa tokenizer per php
php73-xml-7.3.4_1              L'estensione condivisa xml per php
php73-xmlreader-7.3.4_1        L'estensione condivisa xmlreader per php
php73-xmlrpc-7.3.4_1           L'estensione condivisa xmlrpc per php
php73-xmlwriter-7.3.4_1        L'estensione condivisa xmlwriter per php
php73-xsl-7.3.4_1              L'estensione condivisa xsl per php
php73-zip-7.3.4_1              L'estensione condivisa zip per php
php73-zlib-7.3.4_1             L'estensione condivisa zlib per php
apache24-2.4.39 

In questo esempio, le etichette saranno assegnate tenendo conto delle dipendenze dei pacchetti. Certo, si potrebbe procedere in modo più semplice, assegnando l'etichetta mls/low alla cartella /usr/local/lib e ai file presenti in essa, in modo che i pacchetti installati successivamente (come i moduli aggiuntivi per PHP) possano accedere alle librerie in questa cartella, ma penso sia meglio fornire accesso solo ai file necessari. Fermate jail e impostate l'etichetta mls/high su tutti i file:

setfmac -R mls/high /jail

Durante l'assegnazione delle etichette, il processo verrà interrotto se setfmac incontra link rigidi; nel mio esempio ho rimosso i link rigidi nelle seguenti cartelle:

/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, è necessario assegnare l'etichetta mls/low ad Apache; per prima cosa è necessario determinare quali file sono necessari per l'avvio di Apache:

ldd /usr/local/sbin/httpd

Dopo aver eseguito questo comando, verranno visualizzate le dipendenze, ma non sarà sufficiente impostare i tag necessari su questi file, poiché le cartelle in cui si trovano questi file hanno il tag mls/high. Pertanto, è necessario impostare il tag mls/low anche su queste cartelle. Durante l'avvio di Apache verranno elencati i file necessari per il suo avvio, e per PHP queste dipendenze possono essere verificate nel log 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 questo elenco vengono contrassegnati i file mls/low necessari per un corretto funzionamento dell'integrazione tra Apache e PHP (per i pacchetti installati nel mio esempio).

L'ultimo tocco sarà configurare l'esecuzione del jail al livello mls/equal e Apache al livello mls/low. Per avviare il jail, è necessario apportare modifiche allo script /etc/rc.d/jail, trovando nella suddetta funzione jail_start, e modificare la variabile command in questo modo:

command="setpmac mls/equal $jail_program"

Il comando setpmac avvia il file eseguibile al livello mandatorio necessario, 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. Apportare modifiche alla funzione apache24_prestart:

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

In sito ufficiale Nel manuale è fornito un altro esempio, ma non sono riuscito a utilizzarlo perché veniva costantemente visualizzato il messaggio di impossibilità di utilizzare il comando setpmac.

Risultato

Questo metodo di gestione dell'accesso aggiunge un ulteriore livello di sicurezza ad Apache (anche se si adatta a qualsiasi altro stack). Inoltre, viene eseguito in un jail, mentre per l'amministratore tutto ciò avviene in modo trasparente e impercettibile.

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

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

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster