Modèle de distribution des droits obligatoires dans FreeBSD

introduction

Pour fournir un niveau supplémentaire de sécurité du serveur, vous pouvez utiliser modèle de mandat accès à la distribution. Cette publication décrira comment exécuter Apache dans une prison avec un accès uniquement aux composants qui nécessitent un accès pour qu'Apache et PHP fonctionnent correctement. En utilisant ce principe, vous pouvez limiter non seulement Apache, mais également toute autre pile.

Formation

Cette méthode ne convient qu'au système de fichiers ufs ; dans cet exemple, zfs sera utilisé dans le système principal et ufs dans la prison, respectivement. La première étape consiste à reconstruire le noyau ; lors de l'installation de FreeBSD, installez le code source.
Une fois le système installé, modifiez le fichier :

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

Il vous suffit d'ajouter une ligne à ce fichier :

options     MAC_MLS

Le label mls/high aura une position dominante sur le label mls/low, les applications qui seront lancées avec le label mls/low ne pourront pas accéder aux fichiers qui portent le label mls/high. Plus de détails sur toutes les balises disponibles dans le système FreeBSD peuvent être trouvés dans ce guide.
Ensuite, allez dans le répertoire /usr/src :

cd /usr/src

Pour commencer à construire le noyau, exécutez (dans la touche j, précisez le nombre de cœurs du système) :

make -j 4 buildkernel KERNCONF=GENERIC

Une fois le noyau compilé, il faut l'installer :

make installkernel KERNCONF=GENERIC

Après avoir installé le noyau, ne vous précipitez pas pour redémarrer le système, car il est nécessaire de transférer les utilisateurs vers la classe de connexion, après l'avoir préalablement configuré. Modifiez le fichier /etc/login.conf, dans ce fichier vous devez modifier la classe de connexion par défaut, amenez-la sous le formulaire :

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 ligne :label=mls/equal permettra aux utilisateurs membres de cette classe d'accéder aux fichiers marqués de n'importe quelle étiquette (mls/low, mls/high). Après ces manipulations, il faut reconstruire la base de données et placer l'utilisateur root (ainsi que ceux qui en ont besoin) dans cette classe de login :

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

Pour que la politique s'applique uniquement aux fichiers, vous devez modifier le fichier /etc/mac.conf en n'y laissant qu'une seule ligne :

default_labels file ?mls

Vous devez également ajouter le module mac_mls.ko à l'exécution automatique :

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

Après cela, vous pouvez redémarrer le système en toute sécurité. Comment créer prison Vous pouvez le lire dans une de mes publications. Mais avant de créer une prison, vous devez ajouter un disque dur et créer un système de fichiers dessus et activer le multilabel dessus, créer un système de fichiers ufs2 avec une taille de cluster de 64 Ko :

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

Après avoir créé le système de fichiers et ajouté multilabel, vous devez ajouter le disque dur à /etc/fstab, ajouter la ligne à ce fichier :

/dev/ada1               /jail  ufs     rw              0       1

Dans Mountpoint, spécifiez le répertoire dans lequel vous monterez le disque dur ; dans Pass, assurez-vous de spécifier 1 (dans quel ordre ce disque dur sera vérifié) - cela est nécessaire, car le système de fichiers ufs est sensible aux coupures de courant soudaines . Après ces étapes, montez le disque :

mount /dev/ada1 /jail

Installez jail dans ce répertoire. Une fois la prison exécutée, vous devez y effectuer les mêmes manipulations que dans le système principal avec les utilisateurs et les fichiers /etc/login.conf, /etc/mac.conf.

réglage

Avant d'installer les balises nécessaires, je recommande d'installer tous les packages nécessaires ; dans mon cas, les balises seront définies en tenant compte de ces packages :

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 

Dans cet exemple, les étiquettes seront définies en tenant compte des dépendances de ces packages. Bien sûr, vous pouvez faire plus simple : pour le dossier /usr/local/lib et les fichiers situés dans ce répertoire, définissez les étiquettes mls/low et les packages installés ultérieurement (par exemple, des extensions supplémentaires pour php) pourront accéder les bibliothèques de ce répertoire, mais il me semble préférable de ne donner accès qu'aux fichiers nécessaires. Arrêtez la prison et définissez les étiquettes mls/high sur tous les fichiers :

setfmac -R mls/high /jail

Lors de la définition des marques, le processus sera arrêté si setfmac rencontre des liens physiques, dans mon exemple j'ai supprimé les liens physiques dans les répertoires suivants :

/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

Une fois les étiquettes définies, vous devez définir les étiquettes mls/low pour Apache. La première chose à faire est de déterminer quels fichiers sont nécessaires pour démarrer Apache :

ldd /usr/local/sbin/httpd

Après avoir exécuté cette commande, les dépendances seront affichées à l'écran, mais définir les étiquettes nécessaires sur ces fichiers ne suffira pas, car les répertoires dans lesquels se trouvent ces fichiers ont l'étiquette mls/high, donc ces répertoires doivent également être étiquetés mls/faible. Au démarrage, Apache affichera également les fichiers nécessaires à son exécution, et pour PHP, ces dépendances peuvent être trouvées dans le journal 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

Cette liste contient les balises mls/low pour tous les fichiers nécessaires au bon fonctionnement de la combinaison apache et php (pour les packages installés dans mon exemple).

La touche finale sera de configurer Jail pour qu'il s'exécute au niveau mls/equal et Apache au niveau mls/low. Pour démarrer jail, vous devez apporter des modifications au script /etc/rc.d/jail, rechercher les fonctions jail_start dans ce script, modifier la variable de commande sous la forme :

command="setpmac mls/equal $jail_program"

La commande setpmac exécute le fichier exécutable au niveau de capacité requis, dans ce cas mls/equal, afin d'avoir accès à toutes les étiquettes. Dans Apache, vous devez modifier le script de démarrage /usr/local/etc/rc.d/apache24. Modifiez la fonction apache24_prestart :

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

В officiel Le manuel contient un autre exemple, mais je n'ai pas pu l'utiliser car je recevais constamment un message concernant l'impossibilité d'utiliser la commande setpmac.

conclusion

Cette méthode de distribution d'accès ajoutera un niveau de sécurité supplémentaire à Apache (bien que cette méthode convienne à toute autre pile), qui en plus s'exécute en prison, en même temps, pour l'administrateur, tout cela se passera de manière transparente et imperceptible.

Liste des sources qui m'ont aidé à rédiger cette publication :

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

Source: habr.com

Ajouter un commentaire