Modèle de distribution des droits d'accès dans FreeBSD v.2.0

introduction


Dans cette publication, nous parlerons du modèle d'informations d'identification bsdextended; dans le manuel, il est décrit comme un pare-feu de système de fichiers. L'avantage de cette approche par rapport à celle que j'ai décrite dans ce guide est le fait que peu importe le système de fichiers utilisé, car les restrictions ne se produiront pas sur les étiquettes des fichiers, mais sur l'uid et le gid des utilisateurs.

Entraînement


Toutes les actions seront effectuées en prison , vous devez donc d'abord configurer la prison. Ce guide est écrit avec jail installé dans le répertoire / jails / famp. Tout d'abord, installez les modules nécessaires en «autorun», et exécutez-les également (ces actions doivent être effectuées pas en prison) et définissez la possibilité d'utiliser les ports 80, 443 de l'utilisateur www sans droits root:

echo 'mac_portacl_load="YES"' >>/boot/loader.conf
echo 'mac_bsdextended_load="YES"' >> /boot/loader.conf

kldload mac_portacl.ko
kldload mac_bsdextended.ko

sysctl net.inet.ip.portrange.reservedlow=0 
sysctl net.inet.ip.portrange.reservedhigh=0
sysctl security.mac.portacl.rules=uid:80:tcp:80,uid:80:tcp:443

echo 'net.inet.ip.portrange.reservedlow=0' >> /etc/sysctl.conf 
echo 'net.inet.ip.portrange.reservedhigh=0' >> /etc/sysctl.conf
echo 'security.mac.portacl.rules=uid:80:tcp:80,uid:80:tcp:443' >> /etc/sysctl.conf


Ensuite, en prison, vous devez installer les dépendances pour construire apache et php, ainsi que d'installer les ports:

pkg install apr autoconf autoconf-wrapper automake ca_root_nss cmake curl db5 dialog4ports expat fontconfig freetype2 gdbm gettext-runtime gettext-tools giflib gmake gmp gperf help2man indexinfo jbigkit jpeg-turbo jsoncpp libarchive libargon2 libffi libgcrypt libgd libgpg-error libiconv liblz4 libnghttp2 libtextstyle libtool libuv libxml2 libxslt libzip lzo2 m4 meson nasm ninja oniguruma p5-Locale-gettext p5-Locale-libintl p5-Text-Unidecode p5-Unicode-EastAsianWidth pcre pcre2 perl5 pkgconf png py37-Babel py37-Jinja2 py37-MarkupSafe py37-alabaster py37-asn1crypto py37-certifi py37-cffi py37-chardet py37-cryptography py37-cython py37-docutils py37-idna py37-imagesize py37-openssl py37-pycparser py37-pygments py37-pysocks py37-pystemmer py37-pytz py37-requests py37-setuptools py37-six py37-snowballstemmer py37-sphinx py37-sphinx_rtd_theme py37-sphinxcontrib-websupport py37-urllib3 python37 re2c readline rhash sqlite3 texinfo tiff webp openssl wget

portsnap fetch extract

Assemblée


Allons dans le répertoire du port apache, dans ce répertoire vous devez "configurer" le port pour qu'il soit installé dans le répertoire / famp:

mkdir /famp
cd /usr/ports/www/apache24
make config
make configure
cd work
cd httpd-2.4.43
./configure --prefix=/famp
cd ..//..
make BATCH=yes PREFIX=/famp install clean

Après ces manipulations, apache sera installé dans le répertoire / famp, php ne peut pas être installé de cette façon, nous allons donc l'installer à partir du code source:

cd /
wget https://www.php.net/distributions/php-7.4.5.tar.xz
xz -d php-7.4.5.tar.xz
tar -xvf php-7.4.5.tar
cd php-7.4.5

Après ces manipulations, vous devez construire php en spécifiant le chemin correct vers les apx:

./configure --prefix=/famp --with-apxs2=/famp/sbin/apxs --with-openssl --with-zlib --with-curl --enable-mbstring --with-zip --enable-mysqlnd --enable-maintainer-zts --with-mysqli

gmake install

Personnalisation


La prochaine étape sera la configuration correcte de httpd.conf (ainsi que le reste de la "config" nécessaire), en copiant le répertoire rc.d et en créant les répertoires nécessaires:

mkdir /famp/log
mkdir /famp/run

cp -R /famp/etc/rc.d/ /usr/local/etc/rc.d
#   /usr/local/etc/rc.d/apache24    ,    pid` 
_pidprefix="/famp/run/httpd"

# httpd.conf   

Mutex default:/famp/run
PidFile "/famp/run/httpd.pid"
ErrorLog "/famp/log/httpd-error.log"
CustomLog "/famp/log/httpd-access.log

#httpd-ssl.conf (     )
SSLSessionCache        "shmcb:/famp/run/ssl_scache(512000)"
DocumentRoot "/famp/www/apache24/data"
ErrorLog "/famp/log/httpd-error.log"
TransferLog "/famp/log/httpd-access.log"
CustomLog "/famp/log/httpd-ssl_request.log"
<Directory "/famp/www/apache24/cgi-bin">

Pour que tous les processus apache démarrent sous le nom www, vous devez définir le bit setuid sur le fichier httpd, et vous devez également définir le propriétaire de manière récursive sur le répertoire utilisateur www famp et exécuter apache:

chown -R www:www /famp
chmod 4755 /famp/sbin/httpd

Après le lancement d'apache et la création des fichiers journaux nécessaires, vous pouvez modifier les droits sur les répertoires et fichiers nécessaires, mais avant cela, vous devez modifier ldconfig. Cet utilitaire est responsable des chemins d'accès aux répertoires avec diverses bibliothèques, après avoir modifié les droits sur les répertoires / lib, / usr / lib, usr / local / lib, l'utilitaire ldconfig considérera ces répertoires comme non légitimes, pour cette raison, cet utilitaire doit être exécuté en mode non protégé. Pour afficher les chemins, vous devez exécuter la commande:

ldconfig -r

Pour exécuter ldconfig en mode non protégé, vous devez exécuter cet utilitaire avec la clé i:

ldconfig -iR /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/perl5/5.30/mach/CORE

Il est également nécessaire de copier le fichier /usr/local/lib/libnghttp2.so.14 dans le répertoire / usr / lib (on ne sait pas pourquoi apache ne le voit pas dans le répertoire / usr / local / lib)

cp /usr/local/lib/libnghttp2.so.14 /usr/lib/libnghttp2.so.14

Modifiez les droits sur les répertoires et les fichiers nécessaires au bon fonctionnement d'Apache:

#    jail
chflags noschg /jails/famp/lib/libcrypt.so.5
chflags noschg /jails/famp/lib/libc.so.7
chflags noschg /jails/famp/lib/libthr.so.3
chflags noschg /jails/famp/usr/lib/librt.so.1

#   jail
chown www:wheel /
chown -R www:www /famp
chown www:wheel /etc
chown www:wheel /tmp
chown -R www:wheel /dev
chown www:wheel /etc/passwd
chown www:wheel /etc/group
chown www:wheel /etc/pwd.db
chown www:wheel /lib
chown www:wheel /usr
chown www:wheel /usr/lib
chown www:wheel /usr/local
chown www:wheel /usr/local/lib
chown -R www:wheel /lib
chown -R www:wheel /usr/lib
chown -R www:wheel /usr/local/lib

sysrc apache24_enable="YES"
service apache24 start

Après ces manipulations, apache aura accès à tous les fichiers nécessaires à son fonctionnement dans un environnement isolé, mais à mon avis il n'est pas tout à fait correct que tous ces fichiers appartiennent à l'utilisateur www, pour cette raison des drapeaux immuables peuvent être utilisés, ces drapeaux ne doivent pas être définis et depuis la prison, car par défaut la prison commence avec des droits limités:

chflags schg /jails/famp
chflags schg /jails/famp/etc
chflags schg /jails/famp/etc/passwd
chflags schg /jails/famp/etc/group
chflags schg /jails/famp/etc/pwd.db

chflags schg /jails/famp/lib
chflags schg /jails/famp/usr
chflags schg /jails/famp/usr/lib
chflags schg /jails/famp/usr/local
chflags schg /jails/famp/usr/local/lib

chflags -R schg /jails/famp/lib
chflags -R schg /jails/famp/usr/lib
chflags -R schg /jails/famp/usr/local/lib

chflags -R schg /jails/famp/famp
#       ,         
chflags -R noschg /jails/famp/famp/log
chflags -R noschg /jails/famp/famp/run
chflags -R noschg /jails/famp/famp/www/apache24/data/cache

# sunlink   ,   (    tmp, cache, log, run    ,     apache      ) 
chflags sunlink /jails/famp/dev
chflags sunlink /jails/famp/tmp
chflags sunlink /jails/famp/famp/www/apache24/data/cache
chflags -R sunlink /jails/famp/famp/log
chflags sunlink /jails/famp/famp/run

#  sappend     , ..   apache    ,      .
chflags -R sappend /jails/famp/famp/log

L'avant-dernière touche sera la création d'un fichier exécutable pour configurer les droits nécessaires et démarrer apache, ainsi que pour démarrer ldconfig en mode non protégé (exécuter en prison):

touch /etc/rc.d/0
chmod +x /etc/rc.d/0
#      
ldconfig -iR /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/perl5/5.30/mach/CORE
#    /dev          sysctl   pid`   ssl
chown -R www:wheel /dev
service apache24 start

Enfin, la touche finale définira le paramètre pour bsdextended, vous devez également créer un fichier exécutable afin que ces restrictions fonctionnent à chaque démarrage du système (pas en prison):

touch /etc/rc.d/0
chmod +x /etc/rc.d/0
#    
ugidfw set 2 subject uid www object ! uid www mode n
#      
ugidfw set 2 subject uid www object ! uid www mode n

Cette option empêchera l'utilisateur www d'accéder aux fichiers et répertoires qui n'appartiennent pas à l'utilisateur www.

Conclusion


Comme on peut le voir dans cette publication, une telle méthode pour limiter les processus conduira à un haut niveau de sécurité pour le serveur Web (ainsi que pour toute autre pile à laquelle cette méthode sera appliquée).

Liste des sources qui m'ont beaucoup aidé à rédiger cette publication.
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac-bsdextended.html
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac-portacl.html

All Articles