Introducción
Para proporcionar un nivel adicional de seguridad al servidor, se puede utilizar 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 .
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 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 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:
Fuente: habr.com
