Introduction
Pour assurer un niveau de sécurité supplémentaire au serveur, il est possible d'utiliser 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 .
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 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 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 :
Source : habr.com
