מודל חלוקת זכויות חובה ב- FreeBSD

מבוא

כדי לספק רמה נוספת של אבטחת שרת, אתה יכול להשתמש מודל מנדט הפצת גישה. פרסום זה יתאר כיצד אתה יכול להריץ אפאצ'י בכלא עם גישה רק לאותם רכיבים שדורשים גישה כדי ש-apache ו-php יפעלו כהלכה. באמצעות עיקרון זה, אתה יכול להגביל לא רק את אפאצ'י, אלא גם כל מחסנית אחרת.

הדרכה

שיטה זו מתאימה רק למערכת הקבצים ufs; בדוגמה זו, ה-zfs ישמשו במערכת הראשית, ו-ufs בכלא, בהתאמה. הצעד הראשון הוא לבנות מחדש את הליבה; בעת התקנת FreeBSD, התקן את קוד המקור.
לאחר התקנת המערכת, ערוך את הקובץ:

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

אתה רק צריך להוסיף שורה אחת לקובץ הזה:

options     MAC_MLS

לתווית mls/high תהיה עמדה דומיננטית על פני התווית mls/low, אפליקציות שיושקו עם התווית mls/low לא יוכלו לגשת לקבצים בעלי התווית mls/high. פרטים נוספים על כל התגים הזמינים במערכת FreeBSD ניתן למצוא כאן מדריך.
לאחר מכן, עבור אל ספריית /usr/src:

cd /usr/src

כדי להתחיל לבנות את הליבה, הפעל (במפתח j, ציין את מספר הליבות במערכת):

make -j 4 buildkernel KERNCONF=GENERIC

לאחר הידור של הקרנל, יש להתקין אותו:

make installkernel KERNCONF=GENERIC

לאחר התקנת הליבה, אל תמהר לאתחל את המערכת, מכיוון שיש צורך להעביר משתמשים למחלקת הכניסה, לאחר שהגדיר אותה בעבר. ערוך את הקובץ /etc/login.conf, בקובץ הזה אתה צריך לערוך את מחלקת הכניסה המוגדרת כברירת מחדל, הבא אותו לטופס:

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:

השורה :label=mls/equal תאפשר למשתמשים החברים בכיתה זו לגשת לקבצים המסומנים בתווית כלשהי (mls/low, mls/high). לאחר המניפולציות הללו, עליך לבנות מחדש את מסד הנתונים ולמקם את משתמש השורש (כמו גם את אלו שזקוקים לו) במחלקת ההתחברות הזו:

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

כדי שהמדיניות תחול רק על קבצים, עליך לערוך את הקובץ /etc/mac.conf, ולהשאיר בו רק שורה אחת:

default_labels file ?mls

אתה גם צריך להוסיף את מודול mac_mls.ko להפעלה אוטומטית:

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

לאחר מכן, אתה יכול לאתחל את המערכת בבטחה. איך ליצור כלא אתה יכול לקרוא אותו באחד הפרסומים שלי. אבל לפני יצירת כלא, אתה צריך להוסיף כונן קשיח וליצור עליו מערכת קבצים ולאפשר בו ריבוי תוויות, ליצור מערכת קבצים ufs2 עם גודל אשכול של 64kb:

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

לאחר יצירת מערכת הקבצים והוספת ריבוי תווית, עליך להוסיף את הכונן הקשיח ל-/etc/fstab, הוסף את השורה לקובץ הזה:

/dev/ada1               /jail  ufs     rw              0       1

ב-Mountpoint, ציין את הספרייה שבה תעלה את הכונן הקשיח; ב-Pass, הקפד לציין 1 (באיזה רצף הכונן הקשיח הזה ייבדק) - זה הכרחי, מכיוון שמערכת הקבצים ufs רגישה להפסקות חשמל פתאומיות . לאחר השלבים הבאים, התקן את הדיסק:

mount /dev/ada1 /jail

התקן את הכלא בספרייה זו. לאחר שהכלא פועל, עליך לבצע בו את אותן מניפולציות כמו במערכת הראשית עם המשתמשים והקבצים /etc/login.conf, /etc/mac.conf.

התאמה

לפני התקנת התגים הדרושים, אני ממליץ להתקין את כל החבילות הדרושות; במקרה שלי, התגים יוגדרו תוך התחשבות בחבילות הבאות:

mod_php73-7.3.4_1              PHP Scripting Language
php73-7.3.4_1                  PHP Scripting Language
php73-ctype-7.3.4_1            The ctype shared extension for php
php73-curl-7.3.4_1             The curl shared extension for php
php73-dom-7.3.4_1              The dom shared extension for php
php73-extensions-1.0           "meta-port" to install PHP extensions
php73-filter-7.3.4_1           The filter shared extension for php
php73-gd-7.3.4_1               The gd shared extension for php
php73-gettext-7.3.4_1          The gettext shared extension for php
php73-hash-7.3.4_1             The hash shared extension for php
php73-iconv-7.3.4_1            The iconv shared extension for php
php73-json-7.3.4_1             The json shared extension for php
php73-mysqli-7.3.4_1           The mysqli shared extension for php
php73-opcache-7.3.4_1          The opcache shared extension for php
php73-openssl-7.3.4_1          The openssl shared extension for php
php73-pdo-7.3.4_1              The pdo shared extension for php
php73-pdo_sqlite-7.3.4_1       The pdo_sqlite shared extension for php
php73-phar-7.3.4_1             The phar shared extension for php
php73-posix-7.3.4_1            The posix shared extension for php
php73-session-7.3.4_1          The session shared extension for php
php73-simplexml-7.3.4_1        The simplexml shared extension for php
php73-sqlite3-7.3.4_1          The sqlite3 shared extension for php
php73-tokenizer-7.3.4_1        The tokenizer shared extension for php
php73-xml-7.3.4_1              The xml shared extension for php
php73-xmlreader-7.3.4_1        The xmlreader shared extension for php
php73-xmlrpc-7.3.4_1           The xmlrpc shared extension for php
php73-xmlwriter-7.3.4_1        The xmlwriter shared extension for php
php73-xsl-7.3.4_1              The xsl shared extension for php
php73-zip-7.3.4_1              The zip shared extension for php
php73-zlib-7.3.4_1             The zlib shared extension for php
apache24-2.4.39 

בדוגמה זו, תוויות יוגדרו תוך התחשבות בתלות של חבילות אלו. כמובן, אתה יכול לעשות את זה פשוט יותר: עבור התיקיה /usr/local/lib והקבצים הממוקמים בספרייה זו, הגדר את התוויות mls/low וחבילות שהותקנו לאחר מכן (לדוגמה, הרחבות נוספות עבור php) יוכלו לגשת הספריות בספרייה הזו, אבל נראה לי שעדיף לספק גישה רק לקבצים הנחוצים. עצור את הכלא והגדר תוויות mls/high בכל הקבצים:

setfmac -R mls/high /jail

בעת הגדרת סימנים, התהליך יופסק אם setfmac נתקל בקישורים קשיחים, בדוגמה שלי מחקתי קישורים קשיחים בספריות הבאות:

/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

לאחר הגדרת התוויות, עליך להגדיר את התוויות mls/low עבור apache, הדבר הראשון שאתה צריך לעשות הוא לברר אילו קבצים נדרשים כדי להפעיל את apache:

ldd /usr/local/sbin/httpd

לאחר ביצוע פקודה זו, תלותיות יוצגו על המסך, אך הגדרת התוויות הדרושות בקבצים אלו לא תספיק, מאחר ולספריות בהן ממוקמים קבצים אלו יש את התווית mls/high, כך שגם ספריות אלו צריכות להיות מתויגות mls/נמוך. בעת ההפעלה, apache תוציא גם את הקבצים הדרושים להפעלתו, ועבור php ניתן למצוא את התלות הללו ביומן 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

רשימה זו מכילה תגיות mls/low עבור כל הקבצים הנחוצים לפעולה נכונה של השילוב של apache ו-php (עבור אותן חבילות שמותקנות בדוגמה שלי).

המגע האחרון יהיה להגדיר את הכלא לרוץ ברמת mls/שווה, ו-apache ברמת mls/נמוכה. כדי להתחיל את הכלא, עליך לבצע שינויים בסקריפט /etc/rc.d/jail, למצוא את פונקציות jail_start בסקריפט זה, לשנות את משתנה הפקודה לצורה:

command="setpmac mls/equal $jail_program"

הפקודה setpmac מריצה את קובץ ההפעלה ברמת היכולת הנדרשת, במקרה זה mls/equal, על מנת לקבל גישה לכל התוויות. ב-apache אתה צריך לערוך את סקריפט האתחול /usr/local/etc/rc.d/apache24. שנה את הפונקציה apache24_prestart:

apache24_prestart() {
        apache24_checkfib
        apache24_precmd
        eval "setpmac mls/low" ${command} ${apache24_flags}
}

В רשמית המדריך מכיל דוגמה נוספת, אך לא הצלחתי להשתמש בו כי כל הזמן קיבלתי הודעה על חוסר היכולת להשתמש בפקודה setpmac.

פלט

שיטה זו של הפצת גישה תוסיף רמת אבטחה נוספת ל-apache (אם כי שיטה זו מתאימה לכל מחסנית אחרת), שבנוסף פועלת בכלא, במקביל, עבור המנהל כל זה יקרה בשקיפות ובאופן בלתי מורגש.

רשימת מקורות שעזרו לי בכתיבת פרסום זה:

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

מקור: www.habr.com

הוספת תגובה