Modelo de Distribuição Obrigatória de Direitos no FreeBSD

1. Introdução


Para fornecer um nível adicional de segurança do servidor, você pode usar o modelo de distribuição de acesso obrigatório . Esta publicação descreverá como você pode executar o apache na cadeia com acesso apenas aos componentes que precisam de acesso para que o apache e o php funcionem corretamente. Por esse princípio, você pode limitar não apenas o apache, mas também qualquer outra pilha.

Preparação


Este método é adequado apenas para o sistema de arquivos ufs; neste exemplo, o zfs será usado no sistema principal e os ufs na prisão, respectivamente. O primeiro passo é reconstruir o kernel; ao instalar o FreeBSD, instale o código fonte.

Após a instalação do sistema, edite o arquivo:

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

Você precisa adicionar apenas uma linha a este arquivo:

 options MAC_MLS 

A marca mls / high dominará a marca mls / low, os aplicativos executados com a marca mls / low não poderão acessar os arquivos que possuem a marca mls / high. Você pode ler mais sobre todos os rótulos disponíveis no sistema FreeBSD neste guia .
Em seguida, vá para o diretório / usr / src:

 cd /usr/src 

Para iniciar a montagem do kernel, faça (na chave j, especifique o número de núcleos para o processador):

 make -j 4 buildkernel KERNCONF=GENERIC 

Após a montagem do kernel, ele deve ser instalado:

 make installkernel KERNCONF=GENERIC 

Após a instalação do kernel, não se apresse em reiniciar o sistema, pois é necessário transferir usuários para a classe de login, depois de configurá-lo primeiro. Edite o arquivo /etc/login.conf. Nesse arquivo, você precisa editar o padrão da classe de login, trazê-lo para o formulário:

 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: 

Linha: label = mls / equal, permitirá que os usuários dessa classe acessem arquivos marcados com qualquer rótulo (mls / low, mls / high). Após essas manipulações, é necessário reconstruir o banco de dados e colocar o usuário root (assim como aqueles que precisam dele) nesta classe de logon:

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

Para que a política se refira apenas aos arquivos, você precisa editar o arquivo /etc/mac.conf, deixe apenas uma linha:

 default_labels file ?mls 

Se não houver desejo de reconstruir o kernel, você poderá usar o módulo:

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

Depois disso, você pode reiniciar o sistema com segurança. Como criar prisão pode ser encontrado em uma das minhas publicações. Porém, antes de criar a prisão, você precisa adicionar um disco rígido, criar um sistema de arquivos e habilitar várias etiquetas nele, criar um sistema de arquivos ufs2 com um tamanho de cluster de 64kb:

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

Após criar o sistema de arquivos e adicionar etiquetas múltiplas, você precisa adicionar o disco rígido ao / etc / fstab, adicionar a linha a este arquivo:

 /dev/ada1 /jail ufs rw 0 1 

No Mountpoint, especifique o diretório em que você montará o disco rígido, no Pass, certifique-se de especificar 1 (em que ordem o disco rígido especificado será verificado) - isso é necessário, pois o sistema de arquivos ufs é sensível a falhas de energia repentinas. Após estas etapas, monte o disco:

 mount /dev/ada1 /jail 

Instale a prisão neste diretório. Depois que a prisão estiver funcionando, é necessário fazer as mesmas manipulações que no sistema principal com usuários e arquivos /etc/login.conf, /etc/mac.conf.

Personalização


Antes de definir os rótulos necessários, recomendo instalar todos os pacotes necessários; no meu caso, os rótulos serão definidos levando em consideração os seguintes pacotes:

 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, os rótulos serão definidos levando em consideração as dependências desses pacotes. Obviamente, é mais fácil fazer isso, pois a pasta / usr / local / lib e os arquivos localizados neste diretório definem os rótulos mls / low e os pacotes instalados subsequentes (por exemplo, extensões adicionais para php), poderão acessar as bibliotecas desse diretório, mas me parece melhor conceda acesso apenas aos arquivos necessários. Pare a prisão e defina o rótulo mls / high em todos os arquivos. Para isso, crie um arquivo com o nome, por exemplo, mac e adicione uma linha a ele:

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


Depois disso, execute o comando:

 setfsmac -ef /mac /jail/* 


Depois que os rótulos são definidos, você precisa definir os rótulos mls / low para o apache (é necessário definir os rótulos da cadeia em execução), antes de tudo, descubra quais arquivos são necessários para executar o apache:

 ldd /usr/local/sbin/httpd 

Após executar este comando, as dependências serão exibidas na tela, mas colocar os rótulos necessários nesses arquivos não será suficiente, uma vez que os diretórios nos quais esses arquivos estão localizados possuem o rótulo mls / high, portanto, você também precisa definir o rótulo mls / low nesses diretórios. Quando você inicia, o apache também fornece os arquivos necessários para executá-lo, e para o php essas dependências podem ser encontradas no log 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 

Nesta lista, mls / low labels são definidos para todos os arquivos necessários para que o pacote apache e php funcione corretamente (para os pacotes instalados no meu exemplo).

O toque final será configurar a cadeia para executar no nível mls / igual e apache no nível mls / baixo. Para executar a prisão, é necessário fazer alterações no script /etc/rc.d/jail, encontrar a função jail_start nesse script, trazer a variável de comando para o seguinte:

 command="setpmac mls/equal $jail_program" 

O comando setpmac executa o executável no nível de credencial necessário, neste caso mls / equal, para ter acesso a todos os rótulos. No apache, você precisa editar o script de início /usr/local/etc/rc.d/apache24. Faça alterações na função apache24_prestart:

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

No manual oficial , outro exemplo é indicado, mas não pude usá-lo porque recebia constantemente uma mensagem sobre a incapacidade de usar o comando setpmac.

Conclusão


Esse método de distribuição de acesso adicionará um nível adicional de segurança apache (embora esse método seja adequado para qualquer outra pilha), que, além disso, é executado na prisão, enquanto para o administrador, tudo isso acontece de forma transparente e não perceptível.

Lista de fontes que me ajudaram a escrever esta publicação:

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

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


All Articles