รูปแบบการเผยแพร่สิทธิ์ภาคบังคับใน FreeBSD

การแนะนำ

คุณสามารถใช้เพื่อเพิ่มระดับความปลอดภัยของเซิร์ฟเวอร์ได้ แบบจำลองอาณัติ การกระจายการเข้าถึง เอกสารนี้จะอธิบายวิธีที่คุณสามารถเรียกใช้ apache ในคุกโดยมีสิทธิ์เข้าถึงเฉพาะส่วนประกอบที่ต้องการการเข้าถึงเพื่อให้ apache และ php ทำงานได้อย่างถูกต้อง เมื่อใช้หลักการนี้ คุณจะไม่เพียงจำกัด Apache เท่านั้น แต่ยังจำกัดสแต็กอื่นๆ ได้ด้วย

การอบรม

วิธีการนี้เหมาะสำหรับระบบไฟล์ 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

หลังจากนี้คุณสามารถรีบูทระบบได้อย่างปลอดภัย วิธีการสร้าง คุก คุณสามารถอ่านได้ในสิ่งพิมพ์ของฉัน แต่ก่อนที่จะสร้างคุก คุณต้องเพิ่มฮาร์ดไดรฟ์และสร้างระบบไฟล์ในนั้นและเปิดใช้งาน multilabel ในนั้น สร้างระบบไฟล์ ufs2 ที่มีขนาดคลัสเตอร์ 64kb:

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

หลังจากสร้างระบบไฟล์และเพิ่ม multilabel แล้ว คุณต้องเพิ่มฮาร์ดไดรฟ์ไปที่ /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 ดังนั้นไดเร็กทอรีเหล่านี้จึงต้องมีป้ายกำกับด้วย มล./ต่ำ เมื่อเริ่มต้น 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

ที่มา: will.com

เพิ่มความคิดเห็น