Wajib Model Distribusi Hak di FreeBSD

Pendahuluan


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

Persiapan


Metode ini hanya cocok untuk sistem file ufs, dalam contoh ini, zfs akan digunakan di sistem utama, dan ufs di penjara, masing-masing. Langkah pertama adalah membangun kembali kernel, ketika menginstal FreeBSD, instal kode sumber.

Setelah sistem diinstal, edit file:

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

Anda hanya perlu menambahkan satu baris ke file ini:

 options MAC_MLS 

Ml / mark tinggi akan mendominasi ml / mark rendah, aplikasi yang berjalan dengan ml / mark rendah tidak akan dapat mengakses file yang memiliki ml / mark tinggi. Anda dapat membaca lebih lanjut tentang semua label yang tersedia di sistem FreeBSD dalam panduan ini.
Selanjutnya, buka direktori / usr / src:

 cd /usr/src 

Untuk memulai rakitan kernel, lakukan (pada tombol j, tentukan jumlah core untuk prosesor):

 make -j 4 buildkernel KERNCONF=GENERIC 

Setelah kernel dirakit, itu harus diinstal:

 make installkernel KERNCONF=GENERIC 

Setelah menginstal kernel, jangan buru-buru untuk reboot sistem, karena itu perlu untuk mentransfer pengguna ke kelas login, setelah mengaturnya terlebih dahulu. Edit file /etc/login.conf, dalam file ini Anda perlu mengedit default kelas login, bawa ke form:

 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 / sama, akan memungkinkan pengguna yang berada di kelas ini untuk mengakses file yang ditandai dengan label apa pun (mls / rendah, mls / tinggi). Setelah manipulasi ini, perlu untuk 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 menyangkut file, Anda perlu mengedit file /etc/mac.conf, sisakan hanya satu baris di dalamnya:

 default_labels file ?mls 

Jika tidak ada keinginan untuk membangun kembali kernel, maka Anda dapat menggunakan modul:

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

Setelah itu, Anda dapat me-reboot sistem dengan aman. Cara membuat penjara dapat ditemukan di salah satu publikasi saya. Tetapi sebelum membuat jail, Anda perlu menambahkan hard disk dan membuat sistem file di atasnya dan mengaktifkan multilabel di atasnya, membuat 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 yang diberikan akan diperiksa) - ini diperlukan, karena sistem file ufs sensitif terhadap pemadaman listrik yang tiba-tiba. Setelah langkah-langkah ini, pasang disk:

 mount /dev/ada1 /jail 

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

Kustomisasi


Sebelum mengatur label yang diperlukan, saya sarankan untuk menginstal semua paket yang diperlukan, dalam kasus saya label akan ditetapkan 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 dependensi dari paket-paket ini. Tentu saja, lebih mudah untuk melakukan ini, untuk folder / usr / local / lib dan untuk file yang ada di direktori ini, atur mls / label rendah dan paket yang diinstal berikutnya (misalnya, ekstensi tambahan untuk php), akan dapat mengakses perpustakaan di direktori ini, tetapi menurut saya lebih baik berikan akses hanya ke file-file yang diperlukan. Hentikan jail dan atur label mls / high pada semua file, untuk melakukan ini, buat file dengan nama, misalnya, mac dan tambahkan satu baris ke dalamnya:

 touche /mac echo '.* mls/high' > /mac 


Setelah itu, jalankan perintah:

 setfsmac -ef /mac /jail/* 


Setelah label diatur, Anda perlu mengatur mls / label rendah untuk apache (Anda perlu mengatur label dari menjalankan jail), hal pertama yang harus dilakukan adalah mencari tahu file apa yang diperlukan untuk menjalankan apache:

 ldd /usr/local/sbin/httpd 

Setelah menjalankan perintah ini, dependensi akan ditampilkan pada layar, tetapi menempatkan label yang diperlukan pada file-file ini tidak akan cukup, karena direktori di mana file-file ini berada memiliki ml / label tinggi, jadi Anda juga perlu meletakkan ml / label rendah pada direktori ini. Ketika Anda memulai apache juga akan memberikan 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 

Dalam daftar ini, mls / label rendah diatur untuk semua file yang diperlukan agar apache dan bundel php berfungsi dengan benar (untuk paket-paket yang diinstal pada contoh saya).

Sentuhan terakhir adalah mengkonfigurasi jail agar dijalankan pada level mls / equal, dan apache pada level mls / low. Untuk menjalankan jail, Anda perlu membuat perubahan pada skrip /etc/rc.d/jail, temukan fungsi jail_start dalam skrip ini, bawa variabel perintah ke berikut ini:

 command="setpmac mls/equal $jail_program" 

Perintah setpmac menjalankan executable pada tingkat kredensial yang diperlukan, dalam hal ini mls / equals, untuk memiliki akses ke semua label. Di apache, Anda perlu mengedit skrip start /usr/local/etc/rc.d/apache24. Buat perubahan pada fungsi apache24_prestart:

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

Dalam manual resmi , contoh lain diindikasikan, tetapi saya tidak dapat menggunakannya karena saya terus menerima pesan tentang ketidakmampuan untuk menggunakan perintah setpmac.

Kesimpulan


Metode distribusi akses ini akan menambah tingkat keamanan apache tambahan (meskipun metode ini cocok untuk tumpukan lainnya), yang, selain itu, berjalan di penjara, sedangkan untuk administrator, semua ini akan terjadi secara transparan dan tidak terasa.

Daftar sumber yang membantu saya menulis publikasi ini:

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

Source: https://habr.com/ru/post/id448642/


All Articles