Model pengagihan hak mandatori dalam FreeBSD

Pengenalan

Untuk menyediakan tahap tambahan keselamatan pelayan, anda boleh gunakan model mandat pengagihan akses. Penerbitan ini akan menerangkan cara anda boleh menjalankan apache dalam penjara dengan akses hanya kepada komponen yang memerlukan akses untuk apache dan php berfungsi dengan betul. Menggunakan prinsip ini, anda boleh mengehadkan bukan sahaja Apache, tetapi juga sebarang timbunan lain.

Latihan

Kaedah ini hanya sesuai untuk sistem fail ufs; dalam contoh ini, zfs akan digunakan dalam sistem utama, dan ufs dalam penjara, masing-masing. Langkah pertama ialah membina semula kernel; apabila memasang FreeBSD, pasang kod sumber.
Selepas sistem dipasang, edit fail:

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

Anda hanya perlu menambah satu baris pada fail ini:

options     MAC_MLS

Label mls/tinggi akan mempunyai kedudukan dominan ke atas label mls/rendah, aplikasi yang akan dilancarkan dengan label mls/rendah tidak akan dapat mengakses fail yang mempunyai label mls/tinggi. Butiran lanjut tentang semua tag yang tersedia dalam sistem FreeBSD boleh didapati dalam ini kepimpinan.
Seterusnya, pergi ke direktori /usr/src:

cd /usr/src

Untuk mula membina kernel, jalankan (dalam kekunci j, nyatakan bilangan teras dalam sistem):

make -j 4 buildkernel KERNCONF=GENERIC

Selepas kernel telah disusun, ia mesti dipasang:

make installkernel KERNCONF=GENERIC

Selepas memasang kernel, jangan tergesa-gesa untuk but semula sistem, kerana perlu untuk memindahkan pengguna ke kelas log masuk, setelah mengkonfigurasinya sebelum ini. Edit fail /etc/login.conf, dalam fail ini anda perlu mengedit kelas log masuk lalai, bawa ke borang:

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:

Baris :label=mls/equal akan membenarkan pengguna yang menjadi ahli kelas ini mengakses fail yang ditandakan dengan sebarang label (mls/rendah, mls/tinggi). Selepas manipulasi ini, anda perlu membina semula pangkalan data dan meletakkan pengguna root (serta mereka yang memerlukannya) dalam kelas log masuk ini:

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

Untuk membolehkan dasar itu digunakan hanya pada fail, anda perlu mengedit fail /etc/mac.conf, meninggalkan hanya satu baris di dalamnya:

default_labels file ?mls

Anda juga perlu menambah modul mac_mls.ko ke autorun:

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

Selepas ini, anda boleh but semula sistem dengan selamat. Bagaimana untuk mencipta penjara Anda boleh membacanya dalam salah satu penerbitan saya. Tetapi sebelum membuat penjara, anda perlu menambah cakera keras dan mencipta sistem fail padanya dan membolehkan multilabel padanya, mencipta sistem fail ufs2 dengan saiz kelompok 64kb:

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

Selepas mencipta sistem fail dan menambah multilabel, anda perlu menambah cakera keras ke /etc/fstab, tambah baris pada fail ini:

/dev/ada1               /jail  ufs     rw              0       1

Dalam Mountpoint, tentukan direktori di mana anda akan melekapkan cakera keras; dalam Pass, pastikan anda menyatakan 1 (dalam urutan apakah pemacu keras ini akan diperiksa) - ini perlu, kerana sistem fail ufs sensitif kepada pemadaman kuasa secara tiba-tiba . Selepas langkah ini, lekapkan cakera:

mount /dev/ada1 /jail

Pasang penjara dalam direktori ini. Selepas penjara berjalan, anda perlu melakukan manipulasi yang sama di dalamnya seperti dalam sistem utama dengan pengguna dan fail /etc/login.conf, /etc/mac.conf.

pelarasan

Sebelum memasang teg yang diperlukan, saya mengesyorkan memasang semua pakej yang diperlukan; dalam kes saya, teg akan ditetapkan dengan mengambil kira pakej ini:

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 

Dalam contoh ini, label akan ditetapkan dengan mengambil kira kebergantungan pakej ini. Sudah tentu, anda boleh melakukannya dengan lebih mudah: untuk folder /usr/local/lib dan fail yang terdapat dalam direktori ini, tetapkan label mls/low dan pakej yang dipasang berikutnya (contohnya, sambungan tambahan untuk php) akan dapat mengakses perpustakaan dalam direktori ini, tetapi nampaknya lebih baik bagi saya menyediakan akses hanya kepada fail yang diperlukan. Hentikan penjara dan tetapkan mls/label tinggi pada semua fail:

setfmac -R mls/high /jail

Apabila menetapkan tanda, proses akan dihentikan jika setfmac menemui pautan keras, dalam contoh saya, saya memadamkan pautan keras dalam direktori berikut:

/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

Selepas label telah ditetapkan, anda perlu menetapkan label mls/low untuk apache, perkara pertama yang perlu anda lakukan ialah mengetahui fail yang diperlukan untuk memulakan apache:

ldd /usr/local/sbin/httpd

Selepas melaksanakan arahan ini, kebergantungan akan dipaparkan pada skrin, tetapi menetapkan label yang diperlukan pada fail ini tidak akan mencukupi, kerana direktori di mana fail ini terletak mempunyai label mls/tinggi, jadi direktori ini juga perlu dilabel mls/rendah. Apabila bermula, apache juga akan mengeluarkan fail yang diperlukan untuk menjalankannya, dan untuk php kebergantungan ini boleh didapati dalam log 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

Senarai ini mengandungi tag mls/rendah untuk semua fail yang diperlukan untuk operasi yang betul bagi gabungan apache dan php (untuk pakej yang dipasang dalam contoh saya).

Sentuhan terakhir adalah untuk mengkonfigurasi penjara untuk dijalankan pada tahap mls/sama, dan apache pada tahap mls/rendah. Untuk memulakan penjara, anda perlu membuat perubahan pada skrip /etc/rc.d/jail, cari fungsi jail_start dalam skrip ini, tukar pembolehubah arahan kepada borang:

command="setpmac mls/equal $jail_program"

Perintah setpmac menjalankan fail boleh laku pada tahap keupayaan yang diperlukan, dalam kes ini mls/equal, untuk mempunyai akses kepada semua label. Dalam apache anda perlu mengedit skrip permulaan /usr/local/etc/rc.d/apache24. Tukar fungsi apache24_prestart:

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

Π’ rasmi Manual ini mengandungi contoh lain, tetapi saya tidak dapat menggunakannya kerana saya terus mendapat mesej tentang ketidakupayaan untuk menggunakan arahan setpmac.

Output

Kaedah pengedaran akses ini akan menambah tahap keselamatan tambahan kepada apache (walaupun kaedah ini sesuai untuk mana-mana timbunan lain), yang di samping itu berjalan dalam penjara, pada masa yang sama, untuk pentadbir semua ini akan berlaku secara telus dan tidak disedari.

Senarai sumber yang membantu saya dalam menulis penerbitan ini:

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

Sumber: www.habr.com

Tambah komen