Modelo de distribuição de direitos obrigatórios no FreeBSD

Introdução

Para fornecer um nível adicional de segurança do servidor, você pode usar modelo de mandato distribuição de acesso. Esta publicação descreverá como você pode executar o Apache em uma prisão com acesso apenas aos componentes que requerem acesso para que o Apache e o PHP funcionem corretamente. Usando este princípio, você pode limitar não apenas o Apache, mas também qualquer outra pilha.

Treinamento

Este método é adequado apenas para o sistema de arquivos ufs; neste exemplo, zfs será usado no sistema principal e 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ê só precisa adicionar uma linha a este arquivo:

options     MAC_MLS

O rótulo mls/high terá uma posição dominante sobre o rótulo mls/low, os aplicativos que serão lançados com o rótulo mls/low não poderão acessar arquivos que possuam o rótulo mls/high. Mais detalhes sobre todas as tags disponíveis no sistema FreeBSD podem ser encontrados neste guia.
Em seguida, vá para o diretório /usr/src:

cd /usr/src

Para começar a construir o kernel, execute (na tecla j, especifique o número de núcleos no sistema):

make -j 4 buildkernel KERNCONF=GENERIC

Após a compilação do kernel, ele deve ser instalado:

make installkernel KERNCONF=GENERIC

Após instalar o kernel, não tenha pressa em reinicializar o sistema, pois é necessário transferir os usuários para a classe de login, previamente configurada. Edite o arquivo /etc/login.conf, neste arquivo você precisa editar a classe de login padrão, coloque-a no formato:

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 linha :label=mls/equal permitirá que usuários membros desta 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 login:

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

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

default_labels file ?mls

Você também precisa adicionar o módulo mac_mls.ko à execução automática:

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

Depois disso, você pode reiniciar o sistema com segurança. Como criar prisão Você pode lê-lo em uma de minhas publicações. Mas antes de criar uma prisão, você precisa adicionar um disco rígido e criar um sistema de arquivos nele e habilitar multilabel nele, crie um sistema de arquivos ufs2 com um tamanho de cluster de 64kb:

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

Depois de criar o sistema de arquivos e adicionar multilabel, você precisa adicionar o disco rígido em /etc/fstab, adicione a linha a este arquivo:

/dev/ada1               /jail  ufs     rw              0       1

Em Mountpoint, especifique o diretório no qual você montará o disco rígido; em Pass, certifique-se de especificar 1 (em que sequência este disco rígido será verificado) - isso é necessário, pois o sistema de arquivos ufs é sensível a cortes repentinos de energia . Após estas etapas, monte o disco:

mount /dev/ada1 /jail

Instale o jail neste diretório. Após a execução da prisão, você precisa fazer as mesmas manipulações que no sistema principal com os usuários e os arquivos /etc/login.conf, /etc/mac.conf.

Fixação

Antes de instalar as tags necessárias, recomendo instalar todos os pacotes necessários, no meu caso as tags serão definidas levando em consideração estes 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. Claro, você pode fazer isso de forma mais simples: para a pasta /usr/local/lib e os arquivos localizados neste diretório, defina os rótulos mls/low e os pacotes instalados subsequentes (por exemplo, extensões adicionais para php) poderão acessar as bibliotecas neste diretório, mas me parece melhor fornecer acesso apenas aos arquivos que são necessários. Pare a prisão e defina rótulos mls/high em todos os arquivos:

setfmac -R mls/high /jail

Ao definir marcas, o processo será interrompido se o setfmac encontrar links físicos. No meu exemplo, excluí links físicos nos seguintes diretórios:

/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

Após os rótulos terem sido definidos, você precisa definir os rótulos mls/low para o apache, a primeira coisa que você precisa fazer é descobrir quais arquivos são necessários para iniciar o apache:

ldd /usr/local/sbin/httpd

Após a execução deste comando, as dependências serão exibidas na tela, mas definir os rótulos necessários nesses arquivos não será suficiente, pois os diretórios nos quais esses arquivos estão localizados possuem o rótulo mls/high, portanto esses diretórios também precisam ser rotulados ml/baixo. Ao iniciar, o apache também exibirá os arquivos necessários para executá-lo, e para 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

Esta lista contém tags mls/low para todos os arquivos necessários para o correto funcionamento da combinação apache e php (para os pacotes que estão instalados no meu exemplo).

O toque final será configurar o jail para rodar no nível mls/equal e o apache no nível mls/low. Para iniciar o jail, você precisa fazer alterações no script /etc/rc.d/jail, encontrar as funções jail_start neste script, alterar a variável de comando para o formato:

command="setpmac mls/equal $jail_program"

O comando setpmac executa o arquivo executável no nível de capacidade necessário, neste caso mls/equal, para ter acesso a todos os rótulos. No Apache você precisa editar o script de inicialização /usr/local/etc/rc.d/apache24. Altere a função apache24_prestart:

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

В oficial O manual contém outro exemplo, mas não consegui usá-lo porque recebia uma mensagem sobre a impossibilidade de usar o comando setpmac.

Jogar aviator online grátis: hack aviator funciona

Este método de distribuição de acesso adicionará um nível adicional de segurança ao apache (embora este método seja adequado para qualquer outra pilha), que além disso roda em jail, ao mesmo tempo, para o administrador tudo isso acontecerá de forma transparente e imperceptí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

Fonte: habr.com

Adicionar um comentário