Modelo de distribución de credenciales de derechos en FreeBSD v.2.0

Introducción


En esta publicación, hablaremos sobre el modelo de credenciales bsdextended; en el manual se describe como un firewall del sistema de archivos. La ventaja de este enfoque sobre el que describí en esta guía es el hecho de que no importa qué sistema de archivos se use, ya que no se aplicarán restricciones en las etiquetas de los archivos, sino en el uid y gid de los usuarios.

Formación


Todas las acciones se realizarán en la cárcel , por lo que inicialmente debe configurar la cárcel. Esta guía está escrita con la cárcel instalada en el directorio / jails / famp. En primer lugar, instale los módulos necesarios en "ejecución automática", y también ejecútelos (estas acciones no deben realizarse en la cárcel) y configure la capacidad de usar los puertos 80, 443 del usuario www sin derechos 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


A continuación, en la cárcel, debe instalar las dependencias para construir apache y php, así como instalar los puertos:

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

Montaje


Vayamos al directorio del puerto apache, en este directorio debe "configurar" el puerto para que se instale en el directorio / 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

Después de estas manipulaciones, apache se instalará en el directorio / famp, php no se puede instalar de esta manera, por lo que lo instalaremos desde el código fuente:

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

Después de estas manipulaciones, debe construir php especificando la ruta correcta a 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

Personalización


El siguiente paso será la configuración correcta de httpd.conf (así como el resto de la "configuración" necesaria), copiando el directorio rc.d y creando los directorios necesarios:

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 los procesos de apache comiencen con el nombre www, es necesario establecer el bit setuid en el archivo httpd, y también es necesario establecer el propietario de forma recursiva en el directorio famp para el usuario www y ejecutar apache:

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

Después de que se inicia Apache y se crean los archivos de registro necesarios, puede cambiar los derechos de los directorios y archivos necesarios, pero antes de eso debe editar ldconfig. Esta utilidad es responsable de las rutas a directorios con varias bibliotecas, después de cambiar los derechos a los directorios / lib, / usr / lib, usr / local / lib, la utilidad ldconfig considerará estos directorios como no legítimos, por esta razón esta utilidad debe ejecutarse en modo desprotegido. Para ver las rutas, debe ejecutar el comando:

ldconfig -r

Para ejecutar ldconfig en modo desprotegido, debe ejecutar esta utilidad con la 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

También es necesario copiar el archivo /usr/local/lib/libnghttp2.so.14 en el directorio / usr / lib (no está claro por qué apache no lo ve en el directorio / usr / local / lib)

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

Cambie los derechos a los directorios y archivos necesarios para que apache funcione correctamente:

#    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

Después de estas manipulaciones, apache tendrá acceso a todos los archivos que son necesarios para su funcionamiento en un entorno aislado, pero en mi opinión, no es del todo correcto que todos estos archivos pertenezcan al usuario www, por esta razón se pueden usar banderas inmutables, estas banderas no se deben configurar y de la cárcel, ya que por defecto la cárcel comienza con derechos 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

El penúltimo toque será la creación de un archivo ejecutable para configurar los derechos necesarios e iniciar apache, así como iniciar ldconfig en modo desprotegido (ejecutar en la cárcel):

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

Finalmente, el toque final será configurar el parámetro para bsdextended, también debe crear un archivo ejecutable para que estas restricciones funcionen cada vez que el sistema se inicie (no en la cárcel):

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 opción evitará que el usuario www acceda a archivos y directorios que no son propiedad del usuario www.

Conclusión


Como puede verse en esta publicación, dicho método para limitar los procesos conducirá a un alto grado de seguridad para el servidor web (así como a cualquier otra pila a la que se aplicará este método).

Lista de fuentes que me ayudaron mucho a escribir esta publicación.
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