Pengenalan
Untuk menyediakan tahap tambahan keselamatan pelayan, anda boleh gunakan
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
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
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}
}
Π
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:
Sumber: www.habr.com