Model mandatu podziału praw w FreeBSD

Wprowadzenie

Aby zapewnić dodatkowy poziom bezpieczeństwa serwera, można zastosować model mandatowy rozproszony dostęp. W tym artykule opisano, jak uruchomić apache w jail z dostępem tylko do tych komponentów, które są niezbędne do poprawnego działania apache i php. Zgodnie z tym zasadą można ograniczyć nie tylko apache, ale także dowolny inny stos.

Przygotowanie

Ta metoda nadaje się tylko dla systemu plików ufs; w tym przykładzie w systemie głównym będzie używany zfs, a w jail odpowiednio ufs. Najpierw należy przebrać jądro, podczas instalacji FreeBSD zainstaluj kod źródłowy.
Po zainstalowaniu systemu edytuj plik:

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

Do tego pliku należy dodać tylko jeden wiersz:

options     MAC_MLS

Etykieta mls/high będzie miała dominującą pozycję nad etykietą mls/low; aplikacje, które zostaną uruchomione z etykietą mls/low, nie będą miały dostępu do plików z etykietą mls/high. Więcej informacji o wszystkich dostępnych etykietach w systemie FreeBSD można znaleźć w tym przewodniku.
Następnie przejdź do katalogu /usr/src:

cd /usr/src

Aby uruchomić budowę jądra, wykonaj (w flagi j wskaź ilość rdzeni w systemie):

make -j 4 buildkernel KERNCONF=GENERIC

Po tym, jak jądro zostanie zbudowane, trzeba je zainstalować:

make installkernel KERNCONF=GENERIC

Po zainstalowaniu jądra nie spiesz się z ponownym uruchomieniem systemu; najpierw musisz przenieść użytkowników do klasy login, wcześniej ją konfigurując. Edytuj plik /etc/login.conf; w tym pliku należy edytować klasę login default, przekształcając ją w formę:

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:

Linia :label=mls/equal umożliwi użytkownikom należącym do tej klasy dostęp do plików oznaczonych dowolną etykietą (mls/low, mls/high). Po tych operacjach konieczne jest przebudowanie bazy danych i umieszczenie użytkownika root (a także tych, którzy tego potrzebują) w tej klasie logowania:

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

Aby polityka dotyczyła tylko plików, należy edytować plik /etc/mac.conf, pozostawiając w nim tylko jedną linię:

default_labels file ?mls

Należy również dodać moduł mac_mls.ko do autostartu:

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

Po tym można bezpiecznie zrestartować system. Jak stworzyć jail można przeczytać w jednej z moich publikacji. Ale przed utworzeniem jail należy dodać dysk twardy, stworzyć na nim system plików i włączyć multilabel, utwórz system plików ufs2 o rozmiarze klastra 64kb:

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

Po utworzeniu systemu plików i dodaniu multilabel należy dodać dysk twardy do /etc/fstab, dodaj linię do tego pliku:

/dev/ada1               /jail  ufs     rw              0       1

W Mountpoint określ katalog, w który zamontujesz dysk twardy, w Pass koniecznie podaj 1 (w jakiej kolejności będzie przeprowadzana kontrola tego dysku twardego) — jest to konieczne, ponieważ system plików ufs jest wrażliwy na nagłe przerwy w zasilaniu. Po tych działaniach zamontuj dysk:

mount /dev/ada1 /jail

W tym katalogu zainstaluj jail. Po uruchomieniu jail należy wykonać te same operacje, co w głównym systemie z użytkownikami i plikami /etc/login.conf, /etc/mac.conf.

Konfiguracja

Przed ustawieniem niezbędnych etykiet zalecam zainstalowanie wszystkich wymaganych pakietów, w moim przypadku etykiety będą ustawione z uwzględnieniem tych pakietów:

mod_php73-7.3.4_1              Język skryptowy PHP
php73-7.3.4_1                  Język skryptowy PHP
php73-ctype-7.3.4_1            Wspólne rozszerzenie ctype dla php
php73-curl-7.3.4_1             Wspólne rozszerzenie curl dla php
php73-dom-7.3.4_1              Wspólne rozszerzenie dom dla php
php73-extensions-1.0           "meta-port" do instalacji rozszerzeń PHP
php73-filter-7.3.4_1           Wspólne rozszerzenie filter dla php
php73-gd-7.3.4_1               Wspólne rozszerzenie gd dla php
php73-gettext-7.3.4_1          Wspólne rozszerzenie gettext dla php
php73-hash-7.3.4_1             Wspólne rozszerzenie hash dla php
php73-iconv-7.3.4_1            Wspólne rozszerzenie iconv dla php
php73-json-7.3.4_1             Wspólne rozszerzenie json dla php
php73-mysqli-7.3.4_1           Wspólne rozszerzenie mysqli dla php
php73-opcache-7.3.4_1          Wspólne rozszerzenie opcache dla php
php73-openssl-7.3.4_1          Wspólne rozszerzenie openssl dla php
php73-pdo-7.3.4_1              Wspólne rozszerzenie pdo dla php
php73-pdo_sqlite-7.3.4_1       Wspólne rozszerzenie pdo_sqlite dla php
php73-phar-7.3.4_1             Wspólne rozszerzenie phar dla php
php73-posix-7.3.4_1            Wspólne rozszerzenie posix dla php
php73-session-7.3.4_1          Wspólne rozszerzenie session dla php
php73-simplexml-7.3.4_1        Wspólne rozszerzenie simplexml dla php
php73-sqlite3-7.3.4_1          Wspólne rozszerzenie sqlite3 dla php
php73-tokenizer-7.3.4_1        Wspólne rozszerzenie tokenizer dla php
php73-xml-7.3.4_1              Wspólne rozszerzenie xml dla php
php73-xmlreader-7.3.4_1        Wspólne rozszerzenie xmlreader dla php
php73-xmlrpc-7.3.4_1           Wspólne rozszerzenie xmlrpc dla php
php73-xmlwriter-7.3.4_1        Wspólne rozszerzenie xmlwriter dla php
php73-xsl-7.3.4_1              Wspólne rozszerzenie xsl dla php
php73-zip-7.3.4_1              Wspólne rozszerzenie zip dla php
php73-zlib-7.3.4_1             Wspólne rozszerzenie zlib dla php
apache24-2.4.39 

W tym przykładzie etykiety będą ustawione z uwzględnieniem zależności tych pakietów. Oczywiście można postąpić łatwiej, ustawiając etykiety mls/low dla folderu /usr/local/lib i plików znajdujących się w tym katalogu, co pozwoliłoby na dostęp do bibliotek w tym katalogu dla następnie instalowanych pakietów (np. dodatkowych rozszerzeń dla php), ale wydaje mi się, że lepiej jest przyznać dostęp tylko do tych plików, które są rzeczywiście potrzebne. Zatrzymaj jail i ustaw etykiety mls/high dla wszystkich plików:

setfmac -R mls/high /jail

Podczas ustawiania etykiet, proces zostanie zatrzymany, jeśli setfmac napotka twarde linki, w moim przykładzie usuwałem twarde linki w następujących katalogach:

/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

Po ustawieniu etykiet, należy ustawić etykiety mls/low dla apache, najpierw trzeba ustalić, które pliki są potrzebne do uruchomienia apache:

ldd /usr/local/sbin/httpd

Po wykonaniu tej komendy na ekranie wyświetlą się zależności, jednak ustawienie odpowiednich etykiet na te pliki nie będzie wystarczające, ponieważ katalogi, w których te pliki się znajdują, mają etykietę mls/high, dlatego również na te katalogi należy ustawić etykietę mls/low. Przy uruchamianiu apache pojawią się także pliki potrzebne do jego uruchomienia, a dla php te zależności można znaleźć w logu 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

Na tej liście ustawiane są etykiety mls/low dla wszystkich plików, które są niezbędne do prawidłowego działania połączenia apache i php (dla tych pakietów, które są zainstalowane w moim przykładzie).

Ostatnim krokiem będzie konfiguracja uruchomienia jail na poziomie mls/equal, a apache na poziomie mls/low. Aby uruchomić jail, należy wprowadzić zmiany w skrypcie /etc/rc.d/jail, znajdź w tym skrypcie funkcję jail_start, a zmień zmienną command na:

command="setpmac mls/equal $jail_program"

Polecenie setpmac uruchamia plik wykonywalny na wymaganym poziomie mandatu, w tym przypadku mls/equal, aby mieć dostęp do wszystkich etykiet. W apache należy edytować skrypt uruchamiający /usr/local/etc/rc.d/apache24. Wprowadź zmiany w funkcji apache24_prestart:

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

W oficjalnym w przewodniku podany jest inny przykład, ale nie mogłem go użyć, ponieważ ciągle pojawiało się powiadomienie o niemożności użycia polecenia setpmac.

Wnioski

Taki sposób przydzielania dostępu doda dodatkowy poziom bezpieczeństwa apache (choć ten sposób nada się również do każdego innego stosu), który dodatkowo działa w jail, a jednocześnie dla administratora wszystko to będzie przebiegać w sposób przezroczysty i niezauważalny.

Lista źródeł, które pomogły mi w napisaniu tej publikacji:

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

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster