Mô hình phân phối quyền bắt buộc trong FreeBSD

Giới thiệu

Để cung cấp mức độ bảo mật máy chủ bổ sung, bạn có thể sử dụng mô hình ủy quyền phân phối truy cập. Ấn phẩm này sẽ mô tả cách bạn có thể chạy apache trong tù với quyền chỉ truy cập vào những thành phần yêu cầu quyền truy cập để apache và php hoạt động chính xác. Sử dụng nguyên tắc này, bạn có thể giới hạn không chỉ Apache mà còn bất kỳ ngăn xếp nào khác.

Đào tạo

Phương pháp này chỉ phù hợp với hệ thống tập tin ufs; trong ví dụ này, zfs sẽ được sử dụng tương ứng trong hệ thống chính và ufs trong jail. Bước đầu tiên là xây dựng lại kernel; khi cài đặt FreeBSD, hãy cài đặt mã nguồn.
Sau khi hệ thống được cài đặt, hãy chỉnh sửa tệp:

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

Bạn chỉ cần thêm một dòng vào tệp này:

options     MAC_MLS

Nhãn mls/nhãn cao sẽ có vị trí vượt trội so với nhãn mls/nhãn thấp, các ứng dụng sẽ được khởi chạy với nhãn mls/nhãn thấp sẽ không thể truy cập các tệp có nhãn mls/nhãn cao. Bạn có thể tìm thêm thông tin chi tiết về tất cả các thẻ có sẵn trong hệ thống FreeBSD trong phần này khả năng lãnh đạo.
Tiếp theo, vào thư mục /usr/src:

cd /usr/src

Để bắt đầu xây dựng kernel, hãy chạy (trong phím j, chỉ định số lõi trong hệ thống):

make -j 4 buildkernel KERNCONF=GENERIC

Sau khi kernel đã được biên dịch, nó phải được cài đặt:

make installkernel KERNCONF=GENERIC

Sau khi cài đặt kernel, đừng vội khởi động lại hệ thống, vì cần phải chuyển người dùng sang lớp đăng nhập đã cấu hình trước đó. Chỉnh sửa file /etc/login.conf, trong file này bạn cần chỉnh sửa class đăng nhập mặc định, đưa về dạng:

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:

Dòng :label=mls/equal sẽ cho phép người dùng là thành viên của lớp này truy cập các tệp được đánh dấu bằng bất kỳ nhãn nào (mls/low, mls/high). Sau những thao tác này, bạn cần xây dựng lại cơ sở dữ liệu và đặt người dùng root (cũng như những người cần nó) vào lớp đăng nhập này:

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

Để chính sách chỉ áp dụng cho các tệp, bạn cần chỉnh sửa tệp /etc/mac.conf, chỉ để lại một dòng trong đó:

default_labels file ?mls

Bạn cũng cần thêm mô-đun mac_mls.ko để tự động chạy:

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

Sau này, bạn có thể khởi động lại hệ thống một cách an toàn. Làm thế nào để tạo ra Bạn có thể đọc nó trong một trong những ấn phẩm của tôi. Nhưng trước khi tạo một jail, bạn cần thêm một ổ cứng và tạo một hệ thống file trên đó và kích hoạt multilabel trên đó, tạo một hệ thống file ufs2 với cluster size là 64kb:

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

Sau khi tạo hệ thống file và thêm multilabel, bạn cần thêm ổ cứng vào /etc/fstab, thêm dòng vào file này:

/dev/ada1               /jail  ufs     rw              0       1

Trong Mountpoint, chỉ định thư mục mà bạn sẽ gắn ổ cứng; trong Pass, hãy nhớ chỉ định 1 (ổ cứng này sẽ được kiểm tra theo trình tự nào) - điều này là cần thiết, vì hệ thống tệp ufs rất nhạy cảm với việc cắt điện đột ngột . Sau các bước này, gắn đĩa:

mount /dev/ada1 /jail

Cài đặt jail trong thư mục này. Sau khi jail đang chạy, bạn cần thực hiện các thao tác tương tự trong đó như trong hệ thống chính với người dùng và các tệp /etc/login.conf, /etc/mac.conf.

điều chỉnh

Trước khi cài đặt các thẻ cần thiết, tôi khuyên bạn nên cài đặt tất cả các gói cần thiết; trong trường hợp của tôi, các thẻ sẽ được thiết lập có tính đến các gói sau:

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 

Trong ví dụ này, nhãn sẽ được đặt có tính đến sự phụ thuộc của các gói này. Tất nhiên, bạn có thể làm điều đó đơn giản hơn: đối với thư mục /usr/local/lib và các tệp nằm trong thư mục này, hãy đặt nhãn mls/low và các gói được cài đặt tiếp theo (ví dụ: các tiện ích mở rộng bổ sung cho php) sẽ có thể truy cập các thư viện trong thư mục này, nhưng có vẻ tốt hơn tôi chỉ cung cấp quyền truy cập vào những tệp cần thiết. Dừng tù và đặt mls/nhãn cao trên tất cả các tệp:

setfmac -R mls/high /jail

Khi thiết lập dấu, quá trình sẽ bị dừng nếu setfmac gặp các liên kết cứng, trong ví dụ của tôi, tôi đã xóa các liên kết cứng trong các thư mục sau:

/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

Sau khi đã đặt nhãn, bạn cần đặt nhãn mls/low cho apache, việc đầu tiên bạn cần làm là tìm hiểu xem cần có những tập tin nào để khởi động apache:

ldd /usr/local/sbin/httpd

Sau khi thực hiện lệnh này, các phần phụ thuộc sẽ được hiển thị trên màn hình, nhưng việc đặt các nhãn cần thiết trên các tệp này sẽ không đủ, vì các thư mục chứa các tệp này có nhãn mls/high, vì vậy các thư mục này cũng cần được gắn nhãn ml/thấp. Khi khởi động, Apache cũng sẽ xuất ra các tệp cần thiết để chạy nó và đối với php, những phần phụ thuộc này có thể được tìm thấy trong nhật ký 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

Danh sách này chứa các thẻ mls/low cho tất cả các tệp cần thiết cho hoạt động chính xác của tổ hợp apache và php (đối với các gói được cài đặt trong ví dụ của tôi).

Bước cuối cùng sẽ là cấu hình jail để chạy ở mức mls/bằng và apache ở mức mls/mức thấp. Để bắt đầu jail, bạn cần thực hiện các thay đổi đối với tập lệnh /etc/rc.d/jail, tìm các hàm jail_start trong tập lệnh này, thay đổi biến lệnh thành dạng:

command="setpmac mls/equal $jail_program"

Lệnh setpmac chạy tệp thực thi ở mức khả năng được yêu cầu, trong trường hợp này là mls/bằng, để có quyền truy cập vào tất cả các nhãn. Trong apache bạn cần chỉnh sửa tập lệnh khởi động /usr/local/etc/rc.d/apache24. Thay đổi hàm Apache24_prestart:

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

В chính thức Hướng dẫn sử dụng có một ví dụ khác, nhưng tôi không thể sử dụng nó vì tôi liên tục nhận được thông báo về việc không thể sử dụng lệnh setpmac.

Đầu ra

Phương pháp phân phối quyền truy cập này sẽ bổ sung thêm một mức độ bảo mật cho apache (mặc dù phương pháp này phù hợp với bất kỳ ngăn xếp nào khác), ngoài ra nó còn chạy trong tù, đồng thời, đối với quản trị viên, tất cả điều này sẽ diễn ra một cách minh bạch và không được chú ý.

Danh sách các nguồn đã giúp tôi viết ấn phẩm này:

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

Nguồn: www.habr.com

Thêm một lời nhận xét