Modèle de distribution des droits dans FreeBSD

Introduction

Pour assurer un niveau de sécurité supplémentaire au serveur, il est possible d'utiliser un modèle de mandat de répartition d'accès. Ce document décrit comment exécuter Apache dans un jail avec un accès uniquement aux composants nécessaires au bon fonctionnement d'Apache et de PHP. Ce principe peut être appliqué non seulement à Apache, mais également à toute autre pile.

Préparation

Cette méthode ne convient qu'au système de fichiers UFS, dans cet exemple, le système principal utilisera ZFS, tandis que le jail utilisera UFS. Tout d'abord, il est nécessaire de recompiler le noyau ; lors de l'installation de FreeBSD, installez le code source.
Après l'installation du système, éditez le fichier :

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

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

options     MAC_MLS

L'étiquette mls/high sera dominante par rapport à l'étiquette mls/low, les applications exécutées avec l'étiquette mls/low ne pourront pas accéder aux fichiers portant l'étiquette mls/high. Pour en savoir plus sur toutes les étiquettes disponibles dans le système FreeBSD, vous pouvez consulter ce guide.
Ensuite, allez dans le répertoire /usr/src :

cd /usr/src

Pour lancer la compilation du noyau, exécutez (dans l'option j, indiquez le nombre de cœurs du système) :

make -j 4 buildkernel KERNCONF=GENERIC

Une fois que le noyau est compilé, il doit être installé :

make installkernel KERNCONF=GENERIC

Après l'installation du noyau, ne vous précipitez pas pour redémarrer le système, car il est nécessaire de transférer les utilisateurs dans une classe de connexion, après l'avoir configurée. Éditez le fichier /etc/login.conf et modifiez la classe de connexion par défaut, comme suit :

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 de cette classe d'accéder aux fichiers marqués par n'importe quel label (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, il faut éditer le fichier /etc/mac.conf, en laissant seulement une ligne :

default_labels file ?mls

Il est également nécessaire d'ajouter le module mac_mls.ko au démarrage automatique :

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

Après cela, vous pouvez redémarrer le système en toute confiance. Comment créer jail peut être lu dans l'une de mes publications. Mais avant de créer une jail, il est nécessaire d'ajouter un disque dur et de créer un système de fichiers sur celui-ci, en activant multilabel, créez un système de fichiers ufs2 avec une taille de cluster de 64kb :

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

Après avoir créé le système de fichiers et ajouté multilabel, le disque dur doit être ajouté à /etc/fstab, ajoutez la ligne suivante dans ce fichier :

/dev/ada1               /jail  ufs     rw              0       1

Dans Mountpoint, indiquez le répertoire dans lequel vous allez monter le disque dur, dans Pass, indiquez obligatoirement 1 (dans quel ordre le disque dur sera vérifié) — c'est nécessaire, car le système de fichiers ufs est sensible aux coupures brusques d'alimentation. Après ces actions, montez le disque :

mount /dev/ada1 /jail

Installez la jail dans ce répertoire. Une fois la jail opérationnelle, il est nécessaire d'effectuer les mêmes manipulations qu'avec le système principal concernant les utilisateurs et les fichiers /etc/login.conf, /etc/mac.conf.

Configuration

Avant d'installer les labels requis, je recommande d'installer tous les paquets nécessaires, dans mon cas, les labels seront définis en tenant compte de ces paquets :

mod_php73-7.3.4_1              Langage de script PHP
php73-7.3.4_1                  Langage de script PHP
php73-ctype-7.3.4_1            L'extension partagée ctype pour php
php73-curl-7.3.4_1             L'extension partagée curl pour php
php73-dom-7.3.4_1              L'extension partagée dom pour php
php73-extensions-1.0           "meta-port" pour installer des extensions PHP
php73-filter-7.3.4_1           L'extension partagée filter pour php
php73-gd-7.3.4_1               L'extension partagée gd pour php
php73-gettext-7.3.4_1          L'extension partagée gettext pour php
php73-hash-7.3.4_1             L'extension partagée hash pour php
php73-iconv-7.3.4_1            L'extension partagée iconv pour php
php73-json-7.3.4_1             L'extension partagée json pour php
php73-mysqli-7.3.4_1           L'extension partagée mysqli pour php
php73-opcache-7.3.4_1          L'extension partagée opcache pour php
php73-openssl-7.3.4_1          L'extension partagée openssl pour php
php73-pdo-7.3.4_1              L'extension partagée pdo pour php
php73-pdo_sqlite-7.3.4_1       L'extension partagée pdo_sqlite pour php
php73-phar-7.3.4_1             L'extension partagée phar pour php
php73-posix-7.3.4_1            L'extension partagée posix pour php
php73-session-7.3.4_1          L'extension partagée session pour php
php73-simplexml-7.3.4_1        L'extension partagée simplexml pour php
php73-sqlite3-7.3.4_1          L'extension partagée sqlite3 pour php
php73-tokenizer-7.3.4_1        L'extension partagée tokenizer pour php
php73-xml-7.3.4_1              L'extension partagée xml pour php
php73-xmlreader-7.3.4_1        L'extension partagée xmlreader pour php
php73-xmlrpc-7.3.4_1           L'extension partagée xmlrpc pour php
php73-xmlwriter-7.3.4_1        L'extension partagée xmlwriter pour php
php73-xsl-7.3.4_1              L'extension partagée xsl pour php
php73-zip-7.3.4_1              L'extension partagée zip pour php
php73-zlib-7.3.4_1             L'extension partagée zlib pour php
apache24-2.4.39 

Dans cet exemple, les labels seront appliqués en tenant compte des dépendances de ces paquets. On peut bien sûr simplifier les choses, en attribuant les labels mls/low pour le dossier /usr/local/lib et les fichiers qui y sont présents, permettant ainsi aux paquets installés par la suite (par exemple des extensions supplémentaires pour php) d'accéder aux bibliothèques dans ce répertoire. Mais je pense qu'il est préférable de donner accès uniquement aux fichiers nécessaires. Arrêtez le jail et appliquez le label mls/high à tous les fichiers :

setfmac -R mls/high /jail

Lors de l'application des labels, le processus sera arrêté si setfmac rencontre des liens durs. Dans mon exemple, j'ai supprimé les liens durs 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

Après l'application des labels, il est nécessaire d'appliquer le label mls/low pour apache. Tout d'abord, il faut déterminer quels fichiers sont nécessaires pour lancer apache :

ldd /usr/local/sbin/httpd

Après l'exécution de cette commande, les dépendances seront affichées à l'écran, mais il ne sera pas suffisant d'attribuer les étiquettes nécessaires à ces fichiers, car les répertoires dans lesquels se trouvent ces fichiers portent l'étiquette mls/high, il est donc également nécessaire d'attribuer l'étiquette mls/low à ces répertoires. Lors du démarrage d'Apache, il affichera également les fichiers nécessaires à son démarrage, et pour PHP, ces dépendances peuvent être consulté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 attribue des étiquettes mls/low à tous les fichiers nécessaires pour le bon fonctionnement de l'association Apache et PHP (pour les packages installés dans mon exemple).

La dernière étape consistera à configurer le lancement de jail au niveau mls/equal et Apache au niveau mls/low. Pour lancer le jail, il est nécessaire de modifier le script /etc/rc.d/jail, recherchez dans ce script la fonction jail_start, et changez la variable command comme suit :

command="setpmac mls/equal $jail_program"

La commande setpmac exécute le fichier exécutable au niveau de mandat requis, dans ce cas mls/equal, pour avoir accès à toutes les étiquettes. Il est nécessaire d'éditer le script de démarrage d'Apache /usr/local/etc/rc.d/apache24. Modifiez la fonction apache24_prestart :

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

Dans officiel le guide indique un autre exemple, mais je n'ai pas pu l'utiliser car il renvoyait constamment un message d'impossibilité d'utiliser la commande setpmac.

Sortie

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 de plus s'exécute dans un jail, tout en étant transparente et imperceptible pour l'administrateur.

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

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster