Modelo de distribuição de credenciais de direitos no FreeBSD v.2.0

Introdução


Nesta publicação, falaremos sobre o modelo de credencial estendido bs; no manual, ele é descrito como um firewall do sistema de arquivos. A vantagem dessa abordagem sobre a que descrevi neste guia é o fato de que não importa qual sistema de arquivos é usado, pois as restrições ocorrerão não pelos rótulos dos arquivos, mas pelo uid e gid dos usuários.

Treinamento


Todas as ações serão executadas na prisão , portanto, você deve inicialmente configurar a prisão. Este guia foi escrito com a cadeia instalada no diretório / jails / famp. Primeiro, instale os módulos necessários na “execução automática” e execute-os (essas ações não devem ser presas) e defina a capacidade de usar as portas 80, 443 do usuário www sem direitos de root:

echo 'mac_portacl_load="YES"' >>/boot/loader.conf
echo 'mac_bsdextended_load="YES"' >> /boot/loader.conf

kldload mac_portacl.ko
kldload mac_bsdextended.ko

sysctl net.inet.ip.portrange.reservedlow=0 
sysctl net.inet.ip.portrange.reservedhigh=0
sysctl security.mac.portacl.rules=uid:80:tcp:80,uid:80:tcp:443

echo 'net.inet.ip.portrange.reservedlow=0' >> /etc/sysctl.conf 
echo 'net.inet.ip.portrange.reservedhigh=0' >> /etc/sysctl.conf
echo 'security.mac.portacl.rules=uid:80:tcp:80,uid:80:tcp:443' >> /etc/sysctl.conf


Em seguida, na prisão, você precisa instalar as dependências para a construção de apache e php, além de instalar as portas:

pkg install apr autoconf autoconf-wrapper automake ca_root_nss cmake curl db5 dialog4ports expat fontconfig freetype2 gdbm gettext-runtime gettext-tools giflib gmake gmp gperf help2man indexinfo jbigkit jpeg-turbo jsoncpp libarchive libargon2 libffi libgcrypt libgd libgpg-error libiconv liblz4 libnghttp2 libtextstyle libtool libuv libxml2 libxslt libzip lzo2 m4 meson nasm ninja oniguruma p5-Locale-gettext p5-Locale-libintl p5-Text-Unidecode p5-Unicode-EastAsianWidth pcre pcre2 perl5 pkgconf png py37-Babel py37-Jinja2 py37-MarkupSafe py37-alabaster py37-asn1crypto py37-certifi py37-cffi py37-chardet py37-cryptography py37-cython py37-docutils py37-idna py37-imagesize py37-openssl py37-pycparser py37-pygments py37-pysocks py37-pystemmer py37-pytz py37-requests py37-setuptools py37-six py37-snowballstemmer py37-sphinx py37-sphinx_rtd_theme py37-sphinxcontrib-websupport py37-urllib3 python37 re2c readline rhash sqlite3 texinfo tiff webp openssl wget

portsnap fetch extract

Montagem


Vamos para o diretório apache port, neste diretório você precisa "configurar" a porta para que ela seja instalada no diretório / famp:

mkdir /famp
cd /usr/ports/www/apache24
make config
make configure
cd work
cd httpd-2.4.43
./configure --prefix=/famp
cd ..//..
make BATCH=yes PREFIX=/famp install clean

Após essas manipulações, o apache será instalado no diretório / famp, o php não poderá ser instalado dessa maneira, portanto, o instalaremos a partir do código-fonte:

cd /
wget https://www.php.net/distributions/php-7.4.5.tar.xz
xz -d php-7.4.5.tar.xz
tar -xvf php-7.4.5.tar
cd php-7.4.5

Após essas manipulações, você precisa criar o php especificando o caminho correto para o apxs:

./configure --prefix=/famp --with-apxs2=/famp/sbin/apxs --with-openssl --with-zlib --with-curl --enable-mbstring --with-zip --enable-mysqlnd --enable-maintainer-zts --with-mysqli

gmake install

Costumização


A próxima etapa será a configuração correta do httpd.conf (assim como o restante da "configuração" necessária), copiando o diretório rc.d e criando os diretórios necessários:

mkdir /famp/log
mkdir /famp/run

cp -R /famp/etc/rc.d/ /usr/local/etc/rc.d
#   /usr/local/etc/rc.d/apache24    ,    pid` 
_pidprefix="/famp/run/httpd"

# httpd.conf   

Mutex default:/famp/run
PidFile "/famp/run/httpd.pid"
ErrorLog "/famp/log/httpd-error.log"
CustomLog "/famp/log/httpd-access.log

#httpd-ssl.conf (     )
SSLSessionCache        "shmcb:/famp/run/ssl_scache(512000)"
DocumentRoot "/famp/www/apache24/data"
ErrorLog "/famp/log/httpd-error.log"
TransferLog "/famp/log/httpd-access.log"
CustomLog "/famp/log/httpd-ssl_request.log"
<Directory "/famp/www/apache24/cgi-bin">

Para que todos os processos apache iniciem com o nome www, é necessário definir o bit setuid no arquivo httpd e também definir o proprietário recursivamente para o diretório de usuário www famp e executar o apache:

chown -R www:www /famp
chmod 4755 /famp/sbin/httpd

Depois que o apache é iniciado e os arquivos de log necessários são criados, você pode alterar os direitos para os diretórios e arquivos necessários, mas antes disso você precisa editar o ldconfig. Esse utilitário é responsável pelos caminhos para os diretórios com várias bibliotecas. Depois de alterar os direitos dos diretórios / lib, / usr / lib, usr / local / lib, o utilitário ldconfig considerará esses diretórios como não legítimos, por esse motivo, esse utilitário deve ser executado no modo desprotegido. Para visualizar os caminhos, você deve executar o comando:

ldconfig -r

Para executar o ldconfig no modo desprotegido, você deve executar este utilitário com a tecla i:

ldconfig -iR /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/perl5/5.30/mach/CORE

Também é necessário copiar o arquivo /usr/local/lib/libnghttp2.so.14 no diretório / usr / lib (não está claro por que o apache não o vê no diretório / usr / local / lib)

cp /usr/local/lib/libnghttp2.so.14 /usr/lib/libnghttp2.so.14

Altere os direitos para diretórios e arquivos necessários para o apache funcionar corretamente:

#    jail
chflags noschg /jails/famp/lib/libcrypt.so.5
chflags noschg /jails/famp/lib/libc.so.7
chflags noschg /jails/famp/lib/libthr.so.3
chflags noschg /jails/famp/usr/lib/librt.so.1

#   jail
chown www:wheel /
chown -R www:www /famp
chown www:wheel /etc
chown www:wheel /tmp
chown -R www:wheel /dev
chown www:wheel /etc/passwd
chown www:wheel /etc/group
chown www:wheel /etc/pwd.db
chown www:wheel /lib
chown www:wheel /usr
chown www:wheel /usr/lib
chown www:wheel /usr/local
chown www:wheel /usr/local/lib
chown -R www:wheel /lib
chown -R www:wheel /usr/lib
chown -R www:wheel /usr/local/lib

sysrc apache24_enable="YES"
service apache24 start

Após essas manipulações, o apache terá acesso a todos os arquivos necessários para sua operação em um ambiente isolado, mas, na minha opinião, não é totalmente correto que todos esses arquivos pertençam ao usuário www, por esse motivo, sinalizadores imutáveis ​​podem ser usados, esses sinalizadores não devem ser definidos e da prisão, já que, por padrão, a prisão começa com direitos limitados:

chflags schg /jails/famp
chflags schg /jails/famp/etc
chflags schg /jails/famp/etc/passwd
chflags schg /jails/famp/etc/group
chflags schg /jails/famp/etc/pwd.db

chflags schg /jails/famp/lib
chflags schg /jails/famp/usr
chflags schg /jails/famp/usr/lib
chflags schg /jails/famp/usr/local
chflags schg /jails/famp/usr/local/lib

chflags -R schg /jails/famp/lib
chflags -R schg /jails/famp/usr/lib
chflags -R schg /jails/famp/usr/local/lib

chflags -R schg /jails/famp/famp
#       ,         
chflags -R noschg /jails/famp/famp/log
chflags -R noschg /jails/famp/famp/run
chflags -R noschg /jails/famp/famp/www/apache24/data/cache

# sunlink   ,   (    tmp, cache, log, run    ,     apache      ) 
chflags sunlink /jails/famp/dev
chflags sunlink /jails/famp/tmp
chflags sunlink /jails/famp/famp/www/apache24/data/cache
chflags -R sunlink /jails/famp/famp/log
chflags sunlink /jails/famp/famp/run

#  sappend     , ..   apache    ,      .
chflags -R sappend /jails/famp/famp/log

O penúltimo toque será a criação de um arquivo executável para configurar os direitos necessários e iniciar o apache, além de iniciar o ldconfig no modo desprotegido (executar na prisão):

touch /etc/rc.d/0
chmod +x /etc/rc.d/0
#      
ldconfig -iR /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/perl5/5.30/mach/CORE
#    /dev          sysctl   pid`   ssl
chown -R www:wheel /dev
service apache24 start

Por fim, o toque final definirá o parâmetro para bsdextended, você também precisará criar um arquivo executável para que essas restrições funcionem sempre que o sistema inicializar (não na cadeia):

touch /etc/rc.d/0
chmod +x /etc/rc.d/0
#    
ugidfw set 2 subject uid www object ! uid www mode n
#      
ugidfw set 2 subject uid www object ! uid www mode n

Esta opção impedirá que o usuário www acesse arquivos e diretórios que não pertencem ao usuário www.

Conclusão


Como pode ser visto nesta publicação, esse método para limitar processos levará a um alto grau de segurança para o servidor da Web (assim como qualquer outra pilha à qual esse método será aplicado).

Lista de fontes que me ajudaram muito a escrever esta publicação.
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac-bsdextended.html
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac-portacl.html

All Articles