Modelo de distribuição de direitos em FreeBSD

Introdução

Para garantir um nível adicional de segurança ao servidor, pode-se utilizar um modelo de mandato de distribuição de acesso. Neste artigo, descreveremos como executar o Apache em um jail com acesso apenas aos componentes necessários para o funcionamento adequado do Apache e PHP. Esse princípio pode ser aplicado não apenas ao Apache, mas também a qualquer outra pilha.

Preparação

Este método é adequado apenas para o sistema de arquivos UFS. Neste exemplo, utilizaremos ZFS no sistema principal e UFS no jail. A primeira coisa a fazer é recompilar o núcleo; ao instalar o FreeBSD, instale o código-fonte.
Depois que o sistema estiver instalado, edite o arquivo:

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

Neste arquivo, você precisará adicionar apenas uma linha:

options     MAC_MLS

A etiqueta mls/high terá uma posição dominante sobre a etiqueta mls/low; aplicações que forem iniciadas com a etiqueta mls/low não poderão acessar arquivos que possuem a etiqueta mls/high. Para mais informações sobre todas as etiquetas disponíveis no sistema FreeBSD, você pode consultar este guia.
Em seguida, vá para o diretório /usr/src:

cd /usr/src

Para iniciar a construção do núcleo, execute (na opção j, indique o número de núcleos do sistema):

make -j 4 buildkernel KERNCONF=GENERIC

Depois que o núcleo for compilado, você precisará instalá-lo:

make installkernel KERNCONF=GENERIC

Após a instalação do núcleo, não se apresse em reiniciar o sistema, pois você precisará mover os usuários para a classe de login, previamente configurando-a. Edite o arquivo /etc/login.conf e ajuste a classe de login padrão para o seguinte 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 que pertencem a esta classe acessem arquivos marcados com qualquer etiqueta (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 precisarem) nesta classe de login:

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

Para que a política se aplique apenas aos arquivos, é necessário editar o arquivo /etc/mac.conf, deixando apenas uma linha:

default_labels file ?mls

Também é necessário adicionar o módulo mac_mls.ko à inicialização automática:

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

Após isso, você pode reiniciar o sistema sem preocupações. Como criar jail pode ser lido em uma de minhas publicações. Mas antes de criar um jail, é necessário adicionar um disco rígido e criar um sistema de arquivos, ativando o multilabel, criando um sistema de arquivos ufs2 com um tamanho de bloco de 64kb:

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

Após criar o sistema de arquivos e adicionar multilabel, é necessário adicionar o disco rígido ao /etc/fstab, adicione a linha a este arquivo:

/dev/ada1               /jail  ufs     rw              0       1

No Mountpoint, indique o diretório no qual você irá montar o disco rígido; em Pass, obrigatoriamente indique 1 (a ordem em que a verificação deste disco rígido será realizada) — isso é necessário, pois o sistema de arquivos ufs é sensível a quedas súbitas de energia. Após essas ações, monte o disco:

mount /dev/ada1 /jail

Instale o jail neste diretório. Após o jail estar em funcionamento, devem ser feitas as mesmas manipulações que foram feitas no sistema principal com os usuários e arquivos /etc/login.conf, /etc/mac.conf.

Configuração

Antes de definir as etiquetas necessárias, recomendo instalar todos os pacotes necessários. No meu caso, as etiquetas serão definidas considerando os seguintes pacotes:

mod_php73-7.3.4_1              Linguagem de Scripting PHP
php73-7.3.4_1                  Linguagem de Scripting PHP
php73-ctype-7.3.4_1            A extensão compartilhada ctype para php
php73-curl-7.3.4_1             A extensão compartilhada curl para php
php73-dom-7.3.4_1              A extensão compartilhada dom para php
php73-extensions-1.0           "meta-port" para instalar extensões PHP
php73-filter-7.3.4_1           A extensão compartilhada filter para php
php73-gd-7.3.4_1               A extensão compartilhada gd para php
php73-gettext-7.3.4_1          A extensão compartilhada gettext para php
php73-hash-7.3.4_1             A extensão compartilhada hash para php
php73-iconv-7.3.4_1            A extensão compartilhada iconv para php
php73-json-7.3.4_1             A extensão compartilhada json para php
php73-mysqli-7.3.4_1           A extensão compartilhada mysqli para php
php73-opcache-7.3.4_1          A extensão compartilhada opcache para php
php73-openssl-7.3.4_1          A extensão compartilhada openssl para php
php73-pdo-7.3.4_1              A extensão compartilhada pdo para php
php73-pdo_sqlite-7.3.4_1       A extensão compartilhada pdo_sqlite para php
php73-phar-7.3.4_1             A extensão compartilhada phar para php
php73-posix-7.3.4_1            A extensão compartilhada posix para php
php73-session-7.3.4_1          A extensão compartilhada session para php
php73-simplexml-7.3.4_1        A extensão compartilhada simplexml para php
php73-sqlite3-7.3.4_1          A extensão compartilhada sqlite3 para php
php73-tokenizer-7.3.4_1        A extensão compartilhada tokenizer para php
php73-xml-7.3.4_1              A extensão compartilhada xml para php
php73-xmlreader-7.3.4_1        A extensão compartilhada xmlreader para php
php73-xmlrpc-7.3.4_1           A extensão compartilhada xmlrpc para php
php73-xmlwriter-7.3.4_1        A extensão compartilhada xmlwriter para php
php73-xsl-7.3.4_1              A extensão compartilhada xsl para php
php73-zip-7.3.4_1              A extensão compartilhada zip para php
php73-zlib-7.3.4_1             A extensão compartilhada zlib para php
apache24-2.4.39 

Neste exemplo, as etiquetas serão definidas considerando as dependências desses pacotes. Pode-se, é claro, optar por uma abordagem mais simples, definindo etiquetas mls/low para a pasta /usr/local/lib e para os arquivos contidos neste diretório, permitindo que pacotes instalados posteriormente (como extensões adicionais para php) tenham acesso às bibliotecas desse diretório, mas eu acho que é melhor fornecer acesso apenas aos arquivos necessários. Pare o jail e defina etiquetas mls/high para todos os arquivos:

setfmac -R mls/high /jail

Ao definir as etiquetas, o processo será interrompido se o setfmac encontrar links duros; no meu exemplo, eu removi links duros dos 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

Depois que as etiquetas forem definidas, é necessário definir etiquetas mls/low para o apache; primeiro, é preciso 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 apenas marcar esses arquivos não será suficiente, pois os diretórios onde esses arquivos estão localizados têm a etiqueta mls/high; portanto, também é necessário marcar esses diretórios como mls/low. Ao iniciar o apache, ele também listará os arquivos necessários para sua execução e as dependências do php podem ser verificadas 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, são atribuídas etiquetas mls/low a todos os arquivos necessários para o funcionamento adequado da combinação apache e php (para os pacotes que estão instalados no meu exemplo).

A última etapa será configurar a execução do jail no nível mls/equal e o apache no nível mls/low. Para iniciar o jail, é necessário fazer alterações no script /etc/rc.d/jail, encontre neste script a função jail_start e ajuste a variável command para:

command="setpmac mls/equal $jail_program"

O comando setpmac executa o arquivo executável no nível de mandato necessário, neste caso mls/equal, para ter acesso a todos os rótulos. No apache, é necessário editar o script de inicialização /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}
}

Em oficial O guia fornece outro exemplo, mas não consegui utilizá-lo pois constantemente aparecia a mensagem de que não era possível usar o comando setpmac.

Saída

Esse método de distribuição de acesso adicionará um nível extra de segurança ao apache (embora esse método possa ser aplicado a qualquer outro stack), que além disso é executado em jail, ao mesmo tempo em que para o administrador tudo isso ocorrerá de forma transparente e imperceptível.

A lista de fontes que me ajudaram na elaboração desta publicação:

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

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster