מבוא
כדי לספק רמה נוספת של אבטחת שרת, אתה יכול להשתמש הפצת גישה. פרסום זה יתאר כיצד אתה יכול להריץ אפאצ'י בכלא עם גישה רק לאותם רכיבים שדורשים גישה כדי ש-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 (אם כי שיטה זו מתאימה לכל מחסנית אחרת), שבנוסף פועלת בכלא, במקביל, עבור המנהל כל זה יקרה בשקיפות ובאופן בלתי מורגש.
רשימת מקורות שעזרו לי בכתיבת פרסום זה:
מקור: www.habr.com
