Verteilungsmodell für Berechtigungsnachweise in FreeBSD v.2.0

Einführung


In dieser Veröffentlichung werden wir über das bsdextended-Anmeldeinformationsmodell sprechen, das im Handbuch als Dateisystem-Firewall beschrieben wird. Der Vorteil dieses Ansatzes gegenüber dem in diesem Handbuch beschriebenen ist die Tatsache, dass es keine Rolle spielt, welches Dateisystem verwendet wird, da Einschränkungen nicht für die Beschriftungen der Dateien, sondern für die UID und GID der Benutzer auftreten.

Ausbildung


Alle Aktionen werden im Gefängnis ausgeführt , daher müssen Sie das Gefängnis zunächst konfigurieren. Dieses Handbuch wurde mit dem im Verzeichnis / jails / famp installierten Gefängnis geschrieben. Installieren Sie zunächst die erforderlichen Module in "autorun" und führen Sie sie auch aus (diese Aktionen dürfen nicht im Gefängnis ausgeführt werden) und legen Sie die Möglichkeit fest, die Ports 80, 443 des WWW-Benutzers ohne Root-Rechte zu verwenden:

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


Als nächstes müssen Sie im Gefängnis die Abhängigkeiten zum Erstellen von Apache und PHP sowie die Ports installieren:

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

Versammlung


Gehen wir zum Apache-Port-Verzeichnis. In diesem Verzeichnis müssen Sie den Port so "konfigurieren", dass er im Verzeichnis / famp installiert ist:

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

Nach diesen Manipulationen wird Apache im Verzeichnis / famp installiert. PHP kann nicht auf diese Weise installiert werden. Daher installieren wir es aus dem Quellcode:

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

Nach diesen Manipulationen müssen Sie PHP erstellen und den richtigen Pfad zu apxs angeben:

./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

Anpassung


Der nächste Schritt ist die korrekte Konfiguration von httpd.conf (sowie der restlichen erforderlichen "Konfiguration"), das Kopieren des Verzeichnisses rc.d und das Erstellen der erforderlichen Verzeichnisse:

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">

Damit alle Apache-Prozesse unter dem Namen www beginnen können, muss das setuid-Bit in der httpd-Datei gesetzt werden. Außerdem muss der Eigentümer rekursiv auf das famp-Verzeichnis für den Benutzer www gesetzt und apache ausgeführt werden:

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

Nachdem Apache gestartet und die erforderlichen Protokolldateien erstellt wurden, können Sie die Rechte an den erforderlichen Verzeichnissen und Dateien ändern. Zuvor müssen Sie jedoch ldconfig bearbeiten. Dieses Dienstprogramm ist für die Pfade zu Verzeichnissen mit verschiedenen Bibliotheken verantwortlich. Nachdem die Rechte an den Verzeichnissen / lib, / usr / lib, usr / local / lib geändert wurden, betrachtet das Dienstprogramm ldconfig diese Verzeichnisse als unzulässig. Aus diesem Grund muss dieses Dienstprogramm im ungeschützten Modus ausgeführt werden. Führen Sie den folgenden Befehl aus, um die Pfade anzuzeigen:

ldconfig -r

Um ldconfig im ungeschützten Modus auszuführen, müssen Sie dieses Dienstprogramm mit der Taste i ausführen:

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

Es ist auch erforderlich, die Datei /usr/local/lib/libnghttp2.so.14 in das Verzeichnis / usr / lib zu kopieren (es ist nicht klar, warum Apache sie nicht im Verzeichnis / usr / local / lib sieht).

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

Ändern Sie die Rechte an Verzeichnissen und Dateien, die erforderlich sind, damit Apache ordnungsgemäß funktioniert:

#    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

Nach diesen Manipulationen hat Apache Zugriff auf alle Dateien, die für den Betrieb in einer isolierten Umgebung erforderlich sind. Meiner Meinung nach ist es jedoch nicht ganz richtig, dass alle diese Dateien dem Benutzer www gehören. Aus diesem Grund können unveränderliche Flags verwendet werden, diese Flags dürfen nicht gesetzt werden und aus dem Gefängnis, da das Gefängnis standardmäßig mit eingeschränkten Rechten beginnt:

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

Die vorletzte Berührung ist die Erstellung einer ausführbaren Datei zum Einrichten der erforderlichen Rechte und zum Starten von Apache sowie zum Starten von ldconfig im ungeschützten Modus (im Gefängnis ausführen):

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

Zum Schluss wird der Parameter für bsdextended festgelegt. Außerdem müssen Sie eine ausführbare Datei erstellen, damit diese Einschränkungen bei jedem Systemstart (nicht im Gefängnis) funktionieren:

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

Diese Option verhindert, dass der WWW-Benutzer auf Dateien und Verzeichnisse zugreift, die nicht dem WWW-Benutzer gehören.

Fazit


Wie aus dieser Veröffentlichung hervorgeht, führt eine solche Methode zur Begrenzung von Prozessen zu einem hohen Maß an Sicherheit für den Webserver (sowie für jeden anderen Stapel, auf den diese Methode angewendet wird).

Liste der Quellen, die mir beim Schreiben dieser Veröffentlichung sehr geholfen haben.
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