Modelo obligatorio de distribución de derechos en FreeBSD

Introduccion


Para proporcionar un nivel adicional de seguridad del servidor, puede utilizar el modelo de distribución de acceso obligatorio . Esta publicación describirá cómo puede ejecutar apache en la cárcel con acceso solo a aquellos componentes que necesitan acceso para el correcto funcionamiento de apache y php. Por este principio, puede limitar no solo apache, sino también cualquier otra pila.

Preparación


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

Después de instalar el sistema, edite el archivo:

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

Necesita agregar solo una línea a este archivo:

 options MAC_MLS 

La marca mls / high dominará la marca mls / low, las aplicaciones que se ejecutarán con la marca mls / low no podrán acceder a los archivos que tienen la marca mls / high. Puede leer más sobre todas las etiquetas disponibles en el sistema FreeBSD en esta guía .
A continuación, vaya al directorio / usr / src:

 cd /usr/src 

Para iniciar el ensamblaje del núcleo, haga (en la tecla j, especifique el número de núcleos para el procesador):

 make -j 4 buildkernel KERNCONF=GENERIC 

Después de ensamblar el núcleo, debe instalarse:

 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, después de configurarlo primero. Edite el archivo /etc/login.conf, en este archivo necesita editar la clase de inicio de sesión predeterminada, tráigala 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: 

Línea: etiqueta = mls / igual, permitirá a los usuarios que están en esta clase acceder a los archivos marcados con cualquier etiqueta (mls / bajo, mls / alto). Después de estas manipulaciones, es necesario reconstruir la base de datos y colocar al usuario raíz (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 refiera solo a los archivos, debe editar el archivo /etc/mac.conf, dejar solo una línea en él:

 default_labels file ?mls 

Si no desea reconstruir el núcleo, puede usar el módulo:

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

Después de eso, puede reiniciar el sistema de forma segura. Cómo crear la cárcel se puede encontrar en una de mis publicaciones. Pero antes de crear la cárcel, debe agregar un disco duro y crear un sistema de archivos en él y habilitar múltiples etiquetas, cree 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 múltiples etiquetas, debe agregar el disco duro a / etc / fstab, agregue 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é orden se verificará el disco duro dado); esto es necesario, ya que el sistema de archivos ufs es sensible a cortes de energía repentinos. Después de estos pasos, monte el disco:

 mount /dev/ada1 /jail 

Instalar cárcel en este directorio. Después de que la cárcel está funcionando, es necesario hacer las mismas manipulaciones en ella que en el sistema principal con los usuarios y archivos /etc/login.conf, /etc/mac.conf.

Personalización


Antes de configurar 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, es más fácil hacer esto, para la carpeta / usr / local / lib y para los archivos que están en este directorio, configure las etiquetas mls / low y los paquetes instalados posteriores (por ejemplo, extensiones adicionales para php), podrán acceder a las bibliotecas en este directorio, pero me parece mejor conceda acceso solo a los archivos que sean necesarios. Detenga la cárcel y configure la etiqueta mls / high en todos los archivos, para hacer esto, cree un archivo con el nombre, por ejemplo, mac y agréguele una línea:

 touche /mac echo '.* mls/high' > /mac 


Después de eso, ejecute el comando:

 setfsmac -ef /mac /jail/* 


Después de configurar las etiquetas, debe configurar las etiquetas mls / low para apache (debe configurar las etiquetas desde la cárcel en ejecución), lo primero que debe hacer es averiguar qué archivos se necesitan para ejecutar apache:

 ldd /usr/local/sbin/httpd 

Después de ejecutar este comando, las dependencias se mostrarán en la pantalla, pero colocar 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 también debe colocar la etiqueta mls / low en estos directorios. Cuando inicie apache también le dará 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 

En esta lista, las etiquetas mls / low se establecen para todos los archivos que son necesarios para que el paquete apache y php funcione correctamente (para los paquetes que están instalados en mi ejemplo).

El toque final será configurar la cárcel para que se ejecute en el nivel mls / equal, y apache en el nivel mls / low. Para ejecutar la cárcel, debe realizar cambios en el script /etc/rc.d/jail, encontrar la función jail_start en este script, llevar la variable de comando a lo siguiente:

 command="setpmac mls/equal $jail_program" 

El comando setpmac ejecuta el ejecutable en el nivel de credencial requerido, en este caso mls / equal, para tener acceso a todas las etiquetas. En apache, debe 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 el manual oficial , se indica otro ejemplo, pero no pude usarlo porque recibí constantemente 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 de apache (aunque este método se adaptará a cualquier otra pila), que, además, se ejecuta en la cárcel, mientras que para el administrador, todo esto sucederá de manera transparente y no notable.

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

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

Source: https://habr.com/ru/post/448642/


All Articles