Modelo de mandato para la distribución de derechos en FreeBSD

Introducción

Para proporcionar un nivel adicional de seguridad al servidor, se puede utilizar un modelo mandatorio de distribución de acceso. En esta publicación se describirá cómo se puede ejecutar apache en un jail con acceso solo a los componentes necesarios para el correcto funcionamiento de apache y php. Según este principio, se puede restringir no solo apache, sino también cualquier otra pila.

Preparación

Este método solo es adecuado para el sistema de archivos ufs. En este ejemplo, se utilizará zfs en el sistema principal y ufs en el jail. Primero, es necesario recompilar el núcleo; al instalar FreeBSD, instale el código fuente.
Una vez que el sistema esté instalado, edite el archivo:

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

En este archivo, solo es necesario agregar una línea:

options     MAC_MLS

La etiqueta mls/high tendrá un dominio superior sobre la etiqueta mls/low; las aplicaciones que se ejecuten con la etiqueta mls/low no podrán acceder a los archivos que tienen la etiqueta mls/high. Puede leer más sobre todas las etiquetas disponibles en el sistema FreeBSD en esta guía.
Luego, dirígete al directorio /usr/src:

cd /usr/src

Para iniciar la compilación del núcleo, ejecute (en el parámetro j indique la cantidad de núcleos en el sistema):

make -j 4 buildkernel KERNCONF=GENERIC

Después de que el núcleo haya sido compilado, es necesario instalarlo:

make installkernel KERNCONF=GENERIC

Después de la instalación del núcleo, no se apresure a reiniciar el sistema, ya que es necesario trasladar a los usuarios a una clase de inicio, configurándola previamente. Edite el archivo /etc/login.conf; en este archivo, es necesario modificar la clase de inicio default para que quede de la siguiente manera:

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 cadena :label=mls/equal permitirá a los usuarios que formen parte de esta clase acceder a archivos etiquetados con cualquier etiqueta (mls/low, mls/high). Después de estas manipulaciones, es necesario reconstruir la base de datos y colocar al usuario root (así como a aquellos que lo necesiten) en esta clase de inicio de sesión:

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

Para que la política se aplique solo a los archivos, es necesario editar el archivo /etc/mac.conf y dejar solo una línea en él:

default_labels file ?mls

También es necesario agregar el módulo mac_mls.ko al inicio automático:

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

Después de esto, se puede reiniciar el sistema sin problemas. Cómo crear jail puede leerse en una de mis publicaciones. Pero antes de crear un jail, es necesario agregar un disco duro y crear un sistema de archivos en él y habilitar multilabel, cree un sistema de archivos ufs2 con un tamaño de clúster de 64kb:

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

Después de crear el sistema de archivos y agregar multilabel, es necesario agregar el disco duro a /etc/fstab, agregue esta línea al archivo:

/dev/ada1               /jail  ufs     rw              0       1

En el Mountpoint, indique el directorio en el que montará el disco duro, en Pass asegúrese de indicar 1 (el orden en el que se realizará la verificación de este disco duro) — esto es necesario ya que el sistema de archivos ufs es sensible a cortes bruscos de energía. Después de estas acciones, monte el disco:

mount /dev/ada1 /jail

Instale el jail en este directorio. Después de que el jail funcione, es necesario realizar las mismas manipulaciones que en el sistema principal con los usuarios y los archivos /etc/login.conf, /etc/mac.conf.

Configuración

Antes de establecer las etiquetas necesarias, recomiendo instalar todos los paquetes necesarios, en mi caso las etiquetas se establecerán teniendo en cuenta estos paquetes:

mod_php73-7.3.4_1              Lenguaje de programación PHP
php73-7.3.4_1                  Lenguaje de programación PHP
php73-ctype-7.3.4_1            La extensión compartida ctype para php
php73-curl-7.3.4_1             La extensión compartida curl para php
php73-dom-7.3.4_1              La extensión compartida dom para php
php73-extensions-1.0           "meta-port" para instalar extensiones de PHP
php73-filter-7.3.4_1           La extensión compartida filter para php
php73-gd-7.3.4_1               La extensión compartida gd para php
php73-gettext-7.3.4_1          La extensión compartida gettext para php
php73-hash-7.3.4_1             La extensión compartida hash para php
php73-iconv-7.3.4_1            La extensión compartida iconv para php
php73-json-7.3.4_1             La extensión compartida json para php
php73-mysqli-7.3.4_1           La extensión compartida mysqli para php
php73-opcache-7.3.4_1          La extensión compartida opcache para php
php73-openssl-7.3.4_1          La extensión compartida openssl para php
php73-pdo-7.3.4_1              La extensión compartida pdo para php
php73-pdo_sqlite-7.3.4_1       La extensión compartida pdo_sqlite para php
php73-phar-7.3.4_1             La extensión compartida phar para php
php73-posix-7.3.4_1            La extensión compartida posix para php
php73-session-7.3.4_1          La extensión compartida session para php
php73-simplexml-7.3.4_1        La extensión compartida simplexml para php
php73-sqlite3-7.3.4_1          La extensión compartida sqlite3 para php
php73-tokenizer-7.3.4_1        La extensión compartida tokenizer para php
php73-xml-7.3.4_1              La extensión compartida xml para php
php73-xmlreader-7.3.4_1        La extensión compartida xmlreader para php
php73-xmlrpc-7.3.4_1           La extensión compartida xmlrpc para php
php73-xmlwriter-7.3.4_1        La extensión compartida xmlwriter para php
php73-xsl-7.3.4_1              La extensión compartida xsl para php
php73-zip-7.3.4_1              La extensión compartida zip para php
php73-zlib-7.3.4_1             La extensión compartida zlib para php
apache24-2.4.39 

En este ejemplo, las etiquetas se establecerán teniendo en cuenta las dependencias de estos paquetes. Se podría hacer más sencillo estableciendo etiquetas mls/low para la carpeta /usr/local/lib y los archivos en este directorio, permitiendo a los paquetes instalados posteriormente (como extensiones adicionales para php) acceder a las bibliotecas en esta carpeta, pero creo que es mejor proporcionar acceso solo a los archivos necesarios. Detenga el jail y establezca etiquetas mls/high para todos los archivos:

setfmac -R mls/high /jail

Al establecer etiquetas, el proceso se detendrá si setfmac encuentra enlaces duros; en mi ejemplo, eliminé enlaces duros en los siguientes directorios:

/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

Después de que se hayan establecido las etiquetas, es necesario establecer etiquetas mls/low para apache. Primero, es necesario averiguar qué archivos son necesarios para ejecutar apache:

ldd /usr/local/sbin/httpd

Después de ejecutar este comando, se mostrarán las dependencias en pantalla, pero no será suficiente establecer las etiquetas necesarias para estos archivos, ya que los directorios en los que se encuentran tienen la etiqueta mls/high, por lo que también es necesario establecer la etiqueta mls/low para estos directorios. Al iniciar Apache, también se mostrarán los archivos necesarios para su funcionamiento, y para PHP, estas dependencias se pueden verificar en el registro 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

En esta lista, se establecen las etiquetas mls/low para todos los archivos que son necesarios para el correcto funcionamiento de la combinación de Apache y PHP (para los paquetes que están instalados en mi ejemplo).

El último paso será configurar el inicio del jail en el nivel mls/equal y Apache en el nivel mls/low. Para iniciar el jail, es necesario realizar cambios en el script /etc/rc.d/jail, localizar en este script las funciones jail_start, y ajustar la variable command a la siguiente forma:

command="setpmac mls/equal $jail_program"

El comando setpmac ejecuta el archivo ejecutable en el nivel de mandato requerido, en este caso mls/equal, para tener acceso a todas las etiquetas. En Apache, es necesario editar el script de inicio /usr/local/etc/rc.d/apache24. Realice cambios en la función apache24_prestart:

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

En oficial en la guía se proporciona otro ejemplo, pero no pude usarlo ya que constantemente aparecía un mensaje de que no se podía usar el comando setpmac.

Salida

Este método de distribución de acceso añadirá un nivel adicional de seguridad a Apache (aunque este método puede aplicarse a cualquier otra pila), que además se ejecuta en un jail, mientras que para el administrador todo esto sucederá de manera transparente y sin ser notado.

La lista de fuentes que me ayudaron en la redacción de esta publicación:

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

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster