Model distribusi hak wajib di FreeBSD

pengenalan

Untuk memberikan tingkat keamanan server tambahan, Anda dapat menggunakan model mandat distribusi akses. Publikasi ini akan menjelaskan bagaimana Anda dapat menjalankan apache di jail dengan akses hanya ke komponen-komponen yang memerlukan akses agar apache dan php dapat berfungsi dengan benar. Dengan menggunakan prinsip ini, Anda tidak hanya dapat membatasi Apache, tetapi juga tumpukan lainnya.

Latihan

Metode ini hanya cocok untuk sistem file ufs; dalam contoh ini, zfs akan digunakan di sistem utama, dan ufs di jail. Langkah pertama adalah membangun kembali kernel; ketika menginstal FreeBSD, instal kode sumbernya.
Setelah sistem diinstal, edit file:

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

Anda hanya perlu menambahkan satu baris ke file ini:

options     MAC_MLS

Label mls/tinggi akan memiliki posisi dominan terhadap label mls/rendah, aplikasi yang diluncurkan dengan label mls/rendah tidak akan dapat mengakses file yang memiliki label mls/tinggi. Detail lebih lanjut tentang semua tag yang tersedia di sistem FreeBSD dapat ditemukan di sini kepemimpinan.
Selanjutnya, masuk ke direktori /usr/src:

cd /usr/src

Untuk mulai membangun kernel, jalankan (pada tombol j, tentukan jumlah inti dalam sistem):

make -j 4 buildkernel KERNCONF=GENERIC

Setelah kernel dikompilasi, kernel harus diinstal:

make installkernel KERNCONF=GENERIC

Setelah menginstal kernel, jangan buru-buru me-reboot sistem, karena pengguna perlu dipindahkan ke kelas login, setelah mengkonfigurasinya terlebih dahulu. Edit file /etc/login.conf, di file ini Anda perlu mengedit kelas login default, bawa ke formulir:

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 memungkinkan pengguna yang menjadi anggota kelas ini untuk mengakses file yang ditandai dengan label apa pun (mls/rendah, mls/tinggi). Setelah manipulasi ini, Anda perlu membangun kembali database dan menempatkan pengguna root (serta mereka yang membutuhkannya) di kelas login ini:

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

Agar kebijakan hanya berlaku pada file, Anda perlu mengedit file /etc/mac.conf, hanya menyisakan satu baris di dalamnya:

default_labels file ?mls

Anda juga perlu menambahkan modul mac_mls.ko ke autorun:

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

Setelah ini, Anda dapat me-reboot sistem dengan aman. Cara membuat penjara Anda dapat membacanya di salah satu publikasi saya. Namun sebelum membuat jail, Anda perlu menambahkan hard drive dan membuat sistem file di dalamnya dan mengaktifkan multilabel di dalamnya, buat sistem file ufs2 dengan ukuran cluster 64kb:

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

Setelah membuat sistem file dan menambahkan multilabel, Anda perlu menambahkan hard drive ke /etc/fstab, tambahkan baris ke file ini:

/dev/ada1               /jail  ufs     rw              0       1

Di Mountpoint, tentukan direktori tempat Anda akan memasang hard drive; di Pass, pastikan untuk menentukan 1 (dalam urutan apa hard drive ini akan diperiksa) - ini perlu, karena sistem file ufs sensitif terhadap pemadaman listrik mendadak . Setelah langkah-langkah ini, pasang disk:

mount /dev/ada1 /jail

Instal jail di direktori ini. Setelah jail berjalan, Anda perlu melakukan manipulasi yang sama seperti di sistem utama dengan pengguna dan file /etc/login.conf, /etc/mac.conf.

pengaturan

Sebelum memasang tag yang diperlukan, saya sarankan untuk menginstal semua paket yang diperlukan; dalam kasus saya, tag akan disetel dengan mempertimbangkan paket-paket 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 mempertimbangkan ketergantungan paket-paket ini. Tentu saja, Anda dapat melakukannya dengan lebih sederhana: untuk folder /usr/local/lib dan file yang terletak di direktori ini, atur label mls/low dan paket yang diinstal selanjutnya (misalnya, ekstensi tambahan untuk php) akan dapat mengakses perpustakaan di direktori ini, tetapi menurut saya lebih baik memberikan akses hanya ke file-file yang diperlukan. Hentikan jail dan atur mls/label tinggi pada semua file:

setfmac -R mls/high /jail

Saat mengatur tanda, proses akan dihentikan jika setfmac menemukan hard link, dalam contoh saya, saya menghapus hard link di 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

Setelah label sudah diatur, Anda perlu mengatur label mls/low untuk apache, hal pertama yang perlu Anda lakukan adalah mencari tahu file apa yang diperlukan untuk memulai apache:

ldd /usr/local/sbin/httpd

Setelah menjalankan perintah ini, dependensi akan ditampilkan di layar, tetapi mengatur label yang diperlukan pada file-file ini tidak akan cukup, karena direktori di mana file-file ini berada memiliki label mls/high, sehingga direktori ini juga perlu diberi label. ml/rendah. Saat memulai, Apache juga akan menampilkan file yang diperlukan untuk menjalankannya, dan untuk php dependensi ini dapat ditemukan di 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

Daftar ini berisi tag mls/low untuk semua file yang diperlukan agar kombinasi Apache dan php berfungsi dengan benar (untuk paket yang diinstal dalam contoh saya).

Sentuhan terakhir adalah mengkonfigurasi jail agar berjalan pada level mls/equal, dan apache pada level mls/rendah. Untuk memulai jail, Anda perlu melakukan perubahan pada skrip /etc/rc.d/jail, temukan fungsi jail_start di skrip ini, ubah variabel perintah menjadi bentuk:

command="setpmac mls/equal $jail_program"

Perintah setpmac menjalankan file yang dapat dieksekusi pada tingkat kemampuan yang diperlukan, dalam hal ini mls/equal, untuk memiliki akses ke semua label. Di Apache Anda perlu mengedit skrip startup /usr/local/etc/rc.d/apache24. Ubah fungsi Apache24_prestart:

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

Π’ resmi Manual berisi contoh lain, tetapi saya tidak dapat menggunakannya karena saya terus menerima pesan tentang ketidakmampuan menggunakan perintah setpmac.

Keluaran

Metode pendistribusian akses ini akan menambah tingkat keamanan tambahan pada Apache (walaupun metode ini cocok untuk tumpukan lainnya), yang selain berjalan di penjara, pada saat yang sama, bagi administrator, semua ini akan terjadi secara transparan dan tanpa disadari.

Daftar sumber yang membantu saya dalam menulis publikasi ini:

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

Sumber: www.habr.com

Tambah komentar