Introduzione
Per fornire un ulteriore livello di sicurezza del server, è possibile utilizzare di controllo degli accessi. In questa pubblicazione verrà descritto come è possibile eseguire apache in un jail con accesso solo ai componenti necessari per il corretto funzionamento di apache e php. Seguendo questo principio, è possibile limitare non solo apache, ma anche qualsiasi altro stack.
Preparazione
Questo metodo è adatto solo per il file system ufs; in questo esempio, nel sistema principale sarà utilizzato zfs, mentre nel jail sarà utilizzato ufs. Prima di tutto, è necessario ricompilare il kernel; durante l'installazione di FreeBSD, installare il codice sorgente.
Dopo che il sistema sarà stato 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à predominanza sull'etichetta mls/low; le applicazioni che vengono eseguite con l'etichetta mls/low non potranno accedere ai file che hanno l'etichetta mls/high. Maggiori dettagli su tutte le etichette disponibili nel sistema FreeBSD possono essere letti in questo .
Poi passare alla directory /usr/src:
cd /usr/src
Per avviare la compilazione del kernel, eseguire (nel flag j specificare il numero di core nel sistema):
make -j 4 buildkernel KERNCONF=GENERIC
Dopo che il kernel sarà 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 accesso, configurandola in precedenza. Modificare il file /etc/login.conf; in questo file è necessario modificare la classe di accesso 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 questa classe di accedere ai file contrassegnati con qualsiasi etichetta (mls/low, mls/high). Dopo queste manipolazioni, sarà necessario ricostruire il database e inserire l'utente root (e anche coloro che ne hanno bisogno) in questa classe di login:
cap_mkdb /etc/login.conf
pw usermod root -L default
Affinché la politica si applichi solo ai file, è necessario modificare il file /etc/mac.conf, lasciando solo una riga al suo interno:
default_labels file ?mls
È inoltre necessario aggiungere il modulo mac_mls.ko all'avvio automatico:
echo 'mac_mls_load="YES"' >> /boot/loader.conf
Dopo ciò, puoi riavviare il sistema senza preoccupazioni. Come creare puoi leggere in una delle mie pubblicazioni. Ma prima di creare un jail, è necessario aggiungere un disco rigido e creare su di esso un filesystem abilitato per multilabel, crea un filesystem ufs2 con una dimensione di cluster di 64kb:
newfs -O 2 -b 64kb /dev/ada1
tunefs -l enable /dev/ada1
Dopo aver creato il filesystem e aggiunto multilabel, è necessario aggiungere il disco rigido in /etc/fstab, aggiungi la riga a questo file:
/dev/ada1 /jail ufs rw 0 1
Nel Mountpoint specifica la directory in cui monterai il disco rigido, in Pass assicurati di indicare 1 (in quale ordine verrà eseguita la verifica di questo disco rigido) — questo è necessario, poiché il filesystem ufs è sensibile a interruzioni improvvise di alimentazione. Dopo queste azioni, monta il disco:
mount /dev/ada1 /jail
Installa il jail in questa directory. Dopo che il jail è attivo, è necessario eseguire le stesse manipolazioni riguardo agli utenti e ai file /etc/login.conf, /etc/mac.conf come nel sistema principale.
Configurazione
Prima di impostare le etichette necessarie, consiglio di installare tutti i pacchetti necessari; nel mio caso, le etichette saranno impostate tenendo conto di questi pacchetti:
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 le 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 impostate tenendo conto delle dipendenze di questi pacchetti. È possibile, certo, procedere in modo più semplice, impostando le etichette mls/low per la cartella /usr/local/lib e per i file presenti in questa directory; ciò consentirebbe ai pacchetti successivamente installati (ad esempio, estensioni aggiuntive per php) di accedere alle librerie in questa directory, ma penso sia meglio fornire accesso solo ai file necessari. Fermare il jail e impostare le etichette mls/high su tutti i file:
setfmac -R mls/high /jail
Quando si impostano le etichette, il processo si fermerà se setfmac incontra link simbolici; nel mio esempio, ho rimosso i link simbolici 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, è necessario impostare le etichette mls/low per apache; per prima cosa è necessario scoprire quali file sono necessari per l'avvio di apache:
ldd /usr/local/sbin/httpd
Dopo l'esecuzione di questo comando, verranno visualizzate le dipendenze, ma impostare i tag necessari per questi file non sarà sufficiente, poiché le directory in cui si trovano questi file hanno il tag mls/high; quindi è necessario impostare il tag mls/low anche per queste directory. Durante l'avvio di Apache verranno anche mostrati i file necessari al suo avvio, e per PHP queste dipendenze possono essere trovate 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 impostati i tag mls/low su tutti i file necessari per il corretto funzionamento della combinazione tra Apache e PHP (per i pacchetti installati nel mio esempio).
L'ultimo tocco sarà configurare l'avvio 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, trovare nella suddetta script la 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 necessario livello di mandato, 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 nel manuale è indicato un altro esempio, ma non sono riuscito a utilizzarlo poiché veniva costantemente visualizzato un messaggio di impossibilità di utilizzare il comando setpmac.
Conclusione
Questo metodo di distribuzione dell'accesso aggiungerà un ulteriore livello di sicurezza ad Apache (anche se questo metodo si adatta a qualsiasi altro stack), che oltre a questo viene eseguito all'interno del jail, nel frattempo per l'amministratore tutto ciò avverrà in modo trasparente e impercettibile.
Elenco delle fonti che mi hanno aiutato nella scrittura di questa pubblicazione:
Fonte: habr.com
