Modèle de distribution obligatoire des droits dans FreeBSD

Présentation


Pour fournir un niveau supplémentaire de sécurité du serveur, vous pouvez utiliser le modèle de distribution d'accès obligatoire . Cette publication décrira comment vous pouvez exécuter apache en prison avec un accès uniquement aux composants qui ont besoin d'accès pour le bon fonctionnement d'apache et de php. Par ce principe, vous pouvez limiter non seulement Apache, mais aussi toute autre pile.

La préparation


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 en 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 

Vous devez ajouter une seule ligne à ce fichier:

 options MAC_MLS 

Le mls / high mark dominera le mls / low mark, les applications qui s'exécutent avec le mls / low mark ne pourront pas accéder aux fichiers qui ont le mls / high mark. Vous pouvez en savoir plus sur toutes les étiquettes disponibles dans le système FreeBSD dans ce guide .
Ensuite, allez dans le répertoire / usr / src:

 cd /usr/src 

Pour démarrer l'assemblage du noyau, faites (dans la clé j, spécifiez le nombre de cœurs pour le processeur):

 make -j 4 buildkernel KERNCONF=GENERIC 

Une fois le noyau assemblé, il doit être installé:

 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 configuré en premier. Modifiez le fichier /etc/login.conf, dans ce fichier, vous devez modifier la classe de connexion par défaut, apportez-la au 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: 

Ligne: label = mls / equal, permettra aux utilisateurs qui sont dans cette classe d'accéder aux fichiers qui sont marqués avec n'importe quelle étiquette (mls / low, mls / high). Après ces manipulations, il est nécessaire de reconstruire la base de données et de placer l'utilisateur root (ainsi que ceux qui en ont besoin) dans cette classe de connexion:

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

Pour que la politique ne concerne que les fichiers, vous devez modifier le fichier /etc/mac.conf, ne laisser qu'une seule ligne:

 default_labels file ?mls 

Si vous ne souhaitez pas reconstruire le noyau, vous pouvez utiliser le module:

 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 une prison peut être trouvé 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 multi-étiquette dessus, créez 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é plusieurs étiquettes, 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 le disque dur donné 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. Après que la prison fonctionne, il est nécessaire de faire les mêmes manipulations que dans le système principal avec les utilisateurs et les fichiers /etc/login.conf, /etc/mac.conf.

Personnalisation


Avant de définir les étiquettes nécessaires, je recommande d'installer tous les packages nécessaires, dans mon cas, les étiquettes 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, il est plus facile de le faire, pour le dossier / usr / local / lib et pour les fichiers qui se trouvent dans ce répertoire, définissez les étiquettes mls / low et les packages installés suivants (par exemple, des extensions supplémentaires pour php), pourront accéder aux bibliothèques de ce répertoire, mais il me semble mieux n'accordez l'accès qu'aux fichiers nécessaires. Arrêtez la prison et définissez l'étiquette mls / high sur tous les fichiers, pour ce faire, créez un fichier avec le nom, par exemple, mac et ajoutez-y une ligne:

 touche /mac echo '.* mls/high' > /mac 


Après cela, exécutez la commande:

 setfsmac -ef /mac /jail/* 


Une fois les étiquettes définies, vous devez définir les étiquettes ml / low pour apache (vous devez définir les étiquettes à partir de la prison en cours d'exécution), la première chose à faire est de savoir quels fichiers sont nécessaires pour exécuter apache:

 ldd /usr/local/sbin/httpd 

Après avoir exécuté cette commande, les dépendances seront affichées à l'écran, mais mettre les étiquettes nécessaires sur ces fichiers ne suffira pas, car les répertoires dans lesquels ces fichiers se trouvent ont le mls / high label, vous devez donc également mettre le mls / low label sur ces répertoires. Lorsque vous démarrez apache, vous recevrez é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 

Dans cette liste, les étiquettes mls / low sont définies pour tous les fichiers nécessaires au bon fonctionnement du bundle apache et php (pour les packages installés dans mon exemple).

La touche finale sera de configurer la prison pour qu'elle s'exécute au niveau ml / égal et apache au niveau ml / bas. Pour exécuter jail, vous devez apporter des modifications au script /etc/rc.d/jail, trouver la fonction jail_start dans ce script et apporter la variable de commande à ce qui suit:

 command="setpmac mls/equal $jail_program" 

La commande setpmac exécute l'exécutable au niveau d'informations d'identification requis, dans ce cas mls / equal, pour avoir accès à toutes les étiquettes. Dans apache, vous devez modifier le script de démarrage /usr/local/etc/rc.d/apache24. Apportez des modifications à la fonction apache24_prestart:

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

Dans le manuel officiel , un autre exemple est indiqué, mais je n'ai pas pu l'utiliser car j'ai constamment reçu un message sur l'impossibilité d'utiliser la commande setpmac.

Conclusion


Cette méthode de distribution d'accès ajoutera un niveau supplémentaire de sécurité Apache (bien que cette méthode soit adaptée à toute autre pile), qui, en outre, s'exécute en prison, tandis que pour l'administrateur, tout cela se produira de manière transparente et non perceptible.

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

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

Source: https://habr.com/ru/post/fr448642/


All Articles