Obligatorisk rettighetsdistribusjonsmodell i FreeBSD

Innledning

For å gi et ekstra nivå av serversikkerhet, kan du bruke mandatmodell tilgangsdistribusjon. Denne publikasjonen vil beskrive hvordan du kan kjøre apache i et fengsel med tilgang kun til de komponentene som krever tilgang for at apache og php skal fungere riktig. Ved å bruke dette prinsippet kan du begrense ikke bare Apache, men også enhver annen stabel.

Trening

Denne metoden er kun egnet for ufs-filsystemet; i dette eksemplet vil zfs bli brukt i hovedsystemet, og ufs i fengselet. Det første trinnet er å gjenoppbygge kjernen; når du installerer FreeBSD, installer kildekoden.
Etter at systemet er installert, rediger filen:

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

Du trenger bare å legge til én linje i denne filen:

options     MAC_MLS

mls/høy-etiketten vil ha en dominerende posisjon over mls/lav-etiketten, applikasjoner som vil bli lansert med mls/lav-etiketten vil ikke kunne få tilgang til filer som har mls/høy-etiketten. Mer detaljer om alle tilgjengelige tagger i FreeBSD-systemet finner du i denne ledelse.
Gå deretter til katalogen /usr/src:

cd /usr/src

For å begynne å bygge kjernen, kjør (i j-tasten, spesifiser antall kjerner i systemet):

make -j 4 buildkernel KERNCONF=GENERIC

Etter at kjernen er kompilert, må den installeres:

make installkernel KERNCONF=GENERIC

Etter å ha installert kjernen, ikke skynd deg å starte systemet på nytt, siden det er nødvendig å overføre brukere til påloggingsklassen etter å ha konfigurert den tidligere. Rediger filen /etc/login.conf, i denne filen må du redigere standard påloggingsklassen, ta den til skjemaet:

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:

Linjen :label=mls/equal vil tillate brukere som er medlemmer av denne klassen å få tilgang til filer som er merket med en hvilken som helst etikett (mls/low, mls/high). Etter disse manipulasjonene må du gjenoppbygge databasen og plassere rotbrukeren (så vel som de som trenger det) i denne påloggingsklassen:

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

For at policyen bare skal gjelde for filer, må du redigere filen /etc/mac.conf, og la bare én linje stå i den:

default_labels file ?mls

Du må også legge til mac_mls.ko-modulen for å kjøre automatisk:

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

Etter dette kan du trygt starte systemet på nytt. Hvordan lage fengsel Du kan lese den i en av mine publikasjoner. Men før du oppretter et fengsel, må du legge til en harddisk og opprette et filsystem på den og aktivere multilabel på den, lage et ufs2-filsystem med en klyngestørrelse på 64kb:

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

Etter å ha opprettet filsystemet og lagt til multilabel, må du legge til harddisken i /etc/fstab, legg til linjen i denne filen:

/dev/ada1               /jail  ufs     rw              0       1

I Mountpoint, spesifiser katalogen der du vil montere harddisken; i Pass, sørg for å spesifisere 1 (i hvilken rekkefølge denne harddisken vil bli sjekket) - dette er nødvendig, siden ufs-filsystemet er følsomt for plutselige strømbrudd . Etter disse trinnene, monter disken:

mount /dev/ada1 /jail

Installer fengsel i denne katalogen. Etter at fengselet kjører, må du gjøre de samme manipulasjonene i det som i hovedsystemet med brukere og filene /etc/login.conf, /etc/mac.conf.

justering

Før du installerer de nødvendige kodene, anbefaler jeg at du installerer alle nødvendige pakker; i mitt tilfelle vil kodene settes med hensyn til disse pakkene:

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 dette eksemplet vil etiketter settes under hensyntagen til avhengighetene til disse pakkene. Selvfølgelig kan du gjøre det enklere: for /usr/local/lib-mappen og filene som ligger i denne katalogen, setter du mls/low-etikettene og påfølgende installerte pakker (for eksempel ekstra utvidelser for php) vil få tilgang til bibliotekene i denne katalogen, men det virker bedre for meg å gi tilgang bare til de filene som er nødvendige. Stopp fengsel og sett mls/høye etiketter på alle filer:

setfmac -R mls/high /jail

Når du setter inn merker, vil prosessen stoppes hvis setfmac støter på harde lenker, i mitt eksempel slettet jeg harde lenker i følgende 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

Etter at etikettene er satt, må du angi mls/low-etikettene for apache, det første du må gjøre er å finne ut hvilke filer som trengs for å starte apache:

ldd /usr/local/sbin/httpd

Etter å ha utført denne kommandoen vil avhengigheter vises på skjermen, men å sette de nødvendige etikettene på disse filene vil ikke være nok, siden katalogene som disse filene ligger i har etiketten mls/high, så disse katalogene må også merkes mls/lav. Når du starter, vil apache også sende ut filene som er nødvendige for å kjøre den, og for php kan disse avhengighetene finnes 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

Denne listen inneholder mls/low-tagger for alle filer som er nødvendige for riktig drift av apache og php-kombinasjonen (for de pakkene som er installert i mitt eksempel).

Den siste detaljen vil være å konfigurere fengselet til å kjøre på mls/likt nivå, og apache på mls/lavt nivå. For å starte jail, må du gjøre endringer i /etc/rc.d/jail-skriptet, finne jail_start-funksjonene i dette skriptet, endre kommandovariabelen til skjemaet:

command="setpmac mls/equal $jail_program"

Setpmac-kommandoen kjører den kjørbare filen på det nødvendige evnenivået, i dette tilfellet mls/equal, for å ha tilgang til alle etiketter. I apache må du redigere oppstartsskriptet /usr/local/etc/rc.d/apache24. Endre apache24_prestart-funksjonen:

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

В offisielt Håndboken inneholder et annet eksempel, men jeg kunne ikke bruke den fordi jeg stadig fikk en melding om manglende evne til å bruke setpmac-kommandoen.

Utgang

Denne metoden for å distribuere tilgang vil legge til et ekstra sikkerhetsnivå til apache (selv om denne metoden er egnet for enhver annen stabel), som i tillegg kjører i et fengsel, samtidig for administratoren vil alt dette skje transparent og ubemerket.

Liste over kilder som hjalp meg med å skrive denne publikasjonen:

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

Kilde: www.habr.com

Legg til en kommentar