Modelo de distribución de derechos obligatorios en FreeBSD

introducción

Para proporcionar un nivel adicional de seguridad del servidor, puede utilizar modelo de mandato distribución de acceso. Esta publicación describirá cómo puede ejecutar Apache en una cárcel con acceso sólo a aquellos componentes que requieren acceso para que Apache y PHP funcionen correctamente. Usando este principio, puedes limitar no solo Apache, sino también cualquier otra pila.

Formación

Este método solo es adecuado para el sistema de archivos ufs; en este ejemplo, se usará zfs en el sistema principal y ufs en el jail, respectivamente. El primer paso es reconstruir el kernel; al instalar FreeBSD, instale el código fuente.
Una vez instalado el sistema, edite el archivo:

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

Sólo necesitas agregar una línea a este archivo:

options     MAC_MLS

La etiqueta mls/high tendrá una posición dominante sobre la etiqueta mls/low, las aplicaciones que se inicien con la etiqueta mls/low no podrán acceder a los archivos que tengan la etiqueta mls/high. Se pueden encontrar más detalles sobre todas las etiquetas disponibles en el sistema FreeBSD en este guia.
A continuación, vaya al directorio /usr/src:

cd /usr/src

Para comenzar a construir el kernel, ejecute (en la tecla j, especifique la cantidad de núcleos en el sistema):

make -j 4 buildkernel KERNCONF=GENERIC

Una vez compilado el kernel, se debe instalar:

make installkernel KERNCONF=GENERIC

Después de instalar el kernel, no se apresure a reiniciar el sistema, ya que es necesario transferir a los usuarios a la clase de inicio de sesión, habiéndolo configurado previamente. Edite el archivo /etc/login.conf, en este archivo necesita editar la clase de inicio de sesión predeterminada, llévela al formulario:

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 línea :label=mls/equal permitirá a los usuarios que sean miembros de esta clase acceder a archivos marcados con cualquier etiqueta (mls/low, mls/high). Después de estas manipulaciones, debe reconstruir la base de datos y colocar al usuario root (así como a aquellos que lo necesitan) 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, debe editar el archivo /etc/mac.conf, dejando solo una línea en él:

default_labels file ?mls

También necesita agregar el módulo mac_mls.ko para que se ejecute automáticamente:

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

Después de esto, puede reiniciar el sistema de forma segura. Como crear la cárcel Puedes leerlo en una de mis publicaciones. Pero antes de crear una cárcel, necesita agregar un disco duro y crear un sistema de archivos en él y habilitar etiquetas múltiples, crear un sistema de archivos ufs2 con un tamaño de clúster de 64 kb:

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

Después de crear el sistema de archivos y agregar etiquetas múltiples, debe agregar el disco duro a /etc/fstab, agregar la línea a este archivo:

/dev/ada1               /jail  ufs     rw              0       1

En Mountpoint, especifique el directorio en el que montará el disco duro; en Pass, asegúrese de especificar 1 (en qué secuencia se verificará este disco duro); esto es necesario, ya que el sistema de archivos ufs es sensible a cortes repentinos de energía. . Después de estos pasos, monte el disco:

mount /dev/ada1 /jail

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

Ajuste

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

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 

En este ejemplo, las etiquetas se establecerán teniendo en cuenta las dependencias de estos paquetes. Por supuesto, puede hacerlo de manera más simple: para la carpeta /usr/local/lib y los archivos ubicados en este directorio, configure las etiquetas mls/low y los paquetes instalados posteriores (por ejemplo, extensiones adicionales para php) podrán acceder las bibliotecas en este directorio, pero me parece mejor brindar acceso solo a aquellos archivos que sean necesarios. Detenga el jail y establezca etiquetas mls/high en todos los archivos:

setfmac -R mls/high /jail

Al configurar marcas, el proceso se detendrá si setfmac encuentra enlaces físicos; en mi ejemplo, eliminé enlaces físicos 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

Una vez configuradas las etiquetas, debe configurar las etiquetas mls/low para Apache. Lo primero que debe hacer es averiguar qué archivos se necesitan para iniciar Apache:

ldd /usr/local/sbin/httpd

Después de ejecutar este comando, las dependencias se mostrarán en la pantalla, pero establecer las etiquetas necesarias en estos archivos no será suficiente, ya que los directorios en los que se encuentran estos archivos tienen la etiqueta mls/high, por lo que estos directorios también deben estar etiquetados. ml/bajo. Al iniciar, Apache también generará los archivos necesarios para ejecutarlo, y para PHP estas dependencias se pueden encontrar 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

Esta lista contiene etiquetas mls/low para todos los archivos que son necesarios para el correcto funcionamiento de la combinación apache y php (para aquellos paquetes que están instalados en mi ejemplo).

El toque final será configurar jail para que se ejecute en el nivel mls/equal y apache en el nivel mls/low. Para iniciar jail, necesita realizar cambios en el script /etc/rc.d/jail, buscar las funciones jail_start en este script, cambiar la variable de comando al formato:

command="setpmac mls/equal $jail_program"

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

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

В oficial El manual contiene otro ejemplo, pero no pude usarlo porque seguía recibiendo un mensaje sobre la imposibilidad de usar el comando setpmac.

conclusión

Este método de distribución de acceso agregará un nivel adicional de seguridad a Apache (aunque este método es adecuado para cualquier otra pila), que además se ejecuta en una cárcel, al mismo tiempo, para el administrador todo esto sucederá de forma transparente y imperceptible.

Lista de fuentes que me ayudaron a escribir esta publicación:

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

Fuente: habr.com

Añadir un comentario