Modelo de distribución de dereitos obrigatorios en FreeBSD

Introdución

Para proporcionar un nivel adicional de seguridade do servidor, pode usar modelo de mandato distribución de acceso. Esta publicación describirá como pode executar Apache nun cárcere con acceso só a aqueles compoñentes que requiren acceso para que apache e php funcionen correctamente. Usando este principio, pode limitar non só Apache, senón tamén calquera outra pila.

Adestramento

Este método só é adecuado para o sistema de ficheiros ufs; neste exemplo, zfs empregarase no sistema principal e ufs no cárcere, respectivamente. O primeiro paso é reconstruír o núcleo; ao instalar FreeBSD, instale o código fonte.
Despois de instalar o sistema, edite o ficheiro:

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

Só precisa engadir unha liña a este ficheiro:

options     MAC_MLS

A etiqueta mls/high terá unha posición dominante sobre a etiqueta mls/low, as aplicacións que se lanzarán coa etiqueta mls/low non poderán acceder aos ficheiros que teñan a etiqueta mls/high. Aquí pódense atopar máis detalles sobre todas as etiquetas dispoñibles no sistema FreeBSD liderado.
A continuación, vai ao directorio /usr/src:

cd /usr/src

Para comezar a construír o núcleo, execute (na tecla j, especifique o número de núcleos do sistema):

make -j 4 buildkernel KERNCONF=GENERIC

Despois de compilar o núcleo, debe instalarse:

make installkernel KERNCONF=GENERIC

Despois de instalar o núcleo, non se apresure a reiniciar o sistema, xa que é necesario transferir os usuarios á clase de inicio de sesión, tendo configurado previamente. Edite o ficheiro /etc/login.conf, neste ficheiro cómpre editar a clase de inicio de sesión predeterminada, traelo ao 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:

A liña :label=mls/equal permitirá aos usuarios que sexan membros desta clase acceder aos ficheiros marcados con calquera etiqueta (mls/low, mls/high). Despois destas manipulacións, cómpre reconstruír a base de datos e colocar o usuario root (así como os que o precisen) nesta clase de inicio de sesión:

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

Para que a política se aplique só aos ficheiros, cómpre editar o ficheiro /etc/mac.conf, deixando só unha liña:

default_labels file ?mls

Tamén cómpre engadir o módulo mac_mls.ko para a execución automática:

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

Despois diso, pode reiniciar o sistema con seguridade. Como crear prisión Podes lelo nunha das miñas publicacións. Pero antes de crear un cárcere, cómpre engadir un disco duro e crear un sistema de ficheiros nel e activar a multietiqueta nel, crear un sistema de ficheiros ufs2 cun tamaño de clúster de 64 kb:

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

Despois de crear o sistema de ficheiros e engadir multilabel, cómpre engadir o disco duro a /etc/fstab, engadir a liña a este ficheiro:

/dev/ada1               /jail  ufs     rw              0       1

En Mountpoint, especifique o directorio no que vai montar o disco duro; en Pass, asegúrese de especificar 1 (en que secuencia se comprobará este disco duro): isto é necesario, xa que o sistema de ficheiros ufs é sensible aos cortes de enerxía repentinos. . Despois destes pasos, monte o disco:

mount /dev/ada1 /jail

Instala jail neste directorio. Despois de que o cárcere estea funcionando, cómpre facer nela as mesmas manipulacións que no sistema principal cos usuarios e cos ficheiros /etc/login.conf, /etc/mac.conf.

axuste

Antes de instalar as etiquetas necesarias, recomendo instalar todos os paquetes necesarios; no meu caso, as etiquetas estableceranse tendo en conta estes 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 

Neste exemplo, estableceranse etiquetas tendo en conta as dependencias destes paquetes. Por suposto, pode facelo máis sinxelo: para o cartafol /usr/local/lib e os ficheiros que se atopan neste directorio, estableza as etiquetas mls/low e os paquetes instalados posteriores (por exemplo, extensións adicionais para php) poderán acceder as bibliotecas deste directorio, pero paréceme mellor proporcionar acceso só a aqueles ficheiros que sexan necesarios. Detén o cárcere e establece etiquetas mls/high en todos os ficheiros:

setfmac -R mls/high /jail

Ao establecer marcas, o proceso pararase se setfmac atopa ligazóns duras, no meu exemplo eliminei as ligazóns físicas nos seguintes 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

Despois de establecer as etiquetas, cómpre configurar as etiquetas mls/low para apache, o primeiro que debes facer é descubrir que ficheiros son necesarios para iniciar o apache:

ldd /usr/local/sbin/httpd

Despois de executar este comando, aparecerán as dependencias na pantalla, pero non será suficiente establecer as etiquetas necesarias nestes ficheiros, xa que os directorios nos que se atopan estes ficheiros teñen a etiqueta mls/high, polo que tamén hai que etiquetar estes directorios. ml/baixo. Ao iniciar, apache tamén mostrará os ficheiros necesarios para executalo, e para php estas dependencias pódense atopar no rexistro 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 contén etiquetas mls/low para todos os ficheiros que son necesarios para o correcto funcionamento da combinación apache e php (para aqueles paquetes que están instalados no meu exemplo).

O toque final será configurar o cárcere para que se execute no nivel mls/equal e apache no nivel mls/baixo. Para iniciar o cárcere, cómpre facer cambios no script /etc/rc.d/jail, buscar as funcións jail_start neste script, cambiar a variable de comando ao formulario:

command="setpmac mls/equal $jail_program"

O comando setpmac executa o ficheiro executable no nivel de capacidade necesario, neste caso mls/equal, para ter acceso a todas as etiquetas. En apache necesitas editar o script de inicio /usr/local/etc/rc.d/apache24. Cambia a función apache24_prestart:

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

В Oficial O manual contén outro exemplo, pero non puiden usalo porque seguía recibindo unha mensaxe sobre a imposibilidade de usar o comando setpmac.

Saída

Este método de distribución do acceso engadirá un nivel adicional de seguridade a apache (aínda que este método é apto para calquera outra pila), que ademais se executa nun cárcere, ao mesmo tempo, para o administrador todo isto sucederá de forma transparente e imperceptible.

Lista de fontes que me axudaron a escribir esta publicación:

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

Fonte: www.habr.com

Engadir un comentario