نموذج توزيع بيانات الاعتماد في FreeBSD v.2.0

المقدمة


في هذا المنشور ، سنتحدث عن نموذج بيانات الاعتماد bsdextended ؛ في الكتيب وصفه بأنه جدار حماية نظام الملفات. تكمن ميزة هذا النهج على الطريقة التي وصفتها في هذا الدليل في حقيقة أنه لا يهم نظام الملفات المستخدم ، لأن القيود لن تحدث بسبب العلامات على الملفات ، ولكن من خلال uid و gid للمستخدمين.

تدريب


سيتم تنفيذ جميع الإجراءات في السجن ، لذلك يجب عليك تكوين السجن في البداية. تمت كتابة هذا الدليل مع تثبيت السجن في الدليل / jails / famp. بادئ ذي بدء ، قم بتثبيت الوحدات الضرورية في "التشغيل التلقائي" ، وقم أيضًا بتشغيلها (يجب أن يتم تنفيذ هذه الإجراءات في السجن) وتعيين القدرة على استخدام المنافذ 80 ، 443 من مستخدم www بدون حقوق الجذر:

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


بعد ذلك ، في السجن ، تحتاج إلى تثبيت التبعيات لبناء apache و php ، بالإضافة إلى تثبيت المنافذ:

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

المجسم


دعنا نذهب إلى دليل منفذ أباتشي ، في هذا الدليل تحتاج إلى "تكوين" المنفذ بحيث يتم تثبيته في الدليل / 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

بعد هذه المعالجة ، سيتم تثبيت أباتشي في الدليل / famp ، لا يمكن تثبيت php بهذه الطريقة ، لذلك سنقوم بتثبيته من كود المصدر:

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

بعد هذه التلاعبات ، تحتاج إلى بناء php مع تحديد المسار الصحيح ل 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

التخصيص


ستكون الخطوة التالية هي التكوين الصحيح لـ httpd.conf (وكذلك بقية "config" الضرورية) ، ونسخ دليل rc.d وإنشاء الدلائل اللازمة:

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

لكي تبدأ جميع عمليات أباتشي من تحت اسم www ، تحتاج إلى تعيين بت setuid على ملف httpd ، وتحتاج أيضًا إلى تعيين المالك بشكل متكرر إلى ملف تعريف دليل مستخدم www وتشغيل apache:

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

بعد تشغيل أباتشي وإنشاء ملفات السجل الضرورية ، يمكنك تغيير حقوق الدلائل والملفات الضرورية ، ولكن قبل ذلك تحتاج إلى تحرير ldconfig. تعتبر هذه الأداة المساعدة مسؤولة عن مسارات الدلائل مع المكتبات المختلفة ، بعد تغيير الحقوق إلى الدلائل / lib ، / usr / lib ، usr / local / lib ، ستعتبر الأداة المساعدة ldconfig هذه الدلائل غير شرعية ، ولهذا السبب يجب تشغيل هذه الأداة في وضع غير محمي. لعرض المسارات ، يجب تشغيل الأمر:

ldconfig -r

لتشغيل ldconfig في وضع غير محمي ، يجب تشغيل هذه الأداة المساعدة باستخدام المفتاح 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

من الضروري أيضًا نسخ الملف /usr/local/lib/libnghttp2.so.14 إلى الدليل / usr / lib (ليس من الواضح لماذا لا يراه أباتشي في الدليل / usr / local / lib)

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

قم بتغيير حقوق الدلائل والملفات الضرورية لكي يعمل أباتشي بشكل صحيح:

#    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

بعد هذه التلاعبات ، سيتمكن أباتشي من الوصول إلى جميع الملفات اللازمة لتشغيله في بيئة معزولة ، ولكن في رأيي ليس من الصحيح تمامًا أن جميع هذه الملفات تنتمي إلى المستخدم www ، ولهذا السبب يمكن استخدام العلامات الثابتة ، لا يجب تعيين هذه العلامات و من السجن ، لأن السجن يبدأ افتراضيًا بحقوق محدودة:

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

اللمسة الأخيرة ستكون إنشاء ملف قابل للتنفيذ لإعداد الحقوق اللازمة وبدء اباتشي ، وكذلك بدء ldconfig في وضع غير محمي (تنفيذ في السجن):

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

وأخيرًا ، ستعمل اللمسة النهائية على تعيين المعلمة لـ bsdextended ، وتحتاج أيضًا إلى إنشاء ملف قابل للتنفيذ بحيث تعمل هذه القيود في كل مرة يتم فيها تشغيل النظام (ليس في السجن):

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

سيمنع هذا الخيار مستخدم www من الوصول إلى الملفات والأدلة التي لا يمتلكها مستخدم www.

استنتاج


كما يتبين من هذا المنشور ، فإن مثل هذه الطريقة للحد من العمليات ستؤدي إلى درجة عالية من الأمان لخادم الويب (بالإضافة إلى أي مكدس آخر سيتم تطبيق هذه الطريقة عليه).

قائمة المصادر التي ساعدتني كثيرًا في كتابة هذا المنشور.
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