introduction
Pour fournir un niveau supplémentaire de sécurité du serveur, vous pouvez utiliser
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
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
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}
}
В
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 :
Source: habr.com