Μοντέλο διανομής υποχρεωτικών δικαιωμάτων στο FreeBSD

Εισαγωγή

Για να παρέχετε ένα επιπλέον επίπεδο ασφάλειας διακομιστή, μπορείτε να χρησιμοποιήσετε μοντέλο εντολής διανομή πρόσβασης. Αυτή η δημοσίευση θα περιγράψει πώς μπορείτε να εκτελέσετε το apache σε μια φυλακή με πρόσβαση μόνο σε εκείνα τα στοιχεία που απαιτούν πρόσβαση για να λειτουργούν σωστά ο apache και η php. Χρησιμοποιώντας αυτήν την αρχή, μπορείτε να περιορίσετε όχι μόνο τον Apache, αλλά και οποιαδήποτε άλλη στοίβα.

Εκπαίδευση

Αυτή η μέθοδος είναι κατάλληλη μόνο για το σύστημα αρχείων ufs· σε αυτό το παράδειγμα, το zfs θα χρησιμοποιηθεί στο κύριο σύστημα και το ufs στη φυλακή, αντίστοιχα. Το πρώτο βήμα είναι να δημιουργήσετε ξανά τον πυρήνα· κατά την εγκατάσταση του FreeBSD, εγκαταστήστε τον πηγαίο κώδικα.
Αφού εγκατασταθεί το σύστημα, επεξεργαστείτε το αρχείο:

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

Χρειάζεται μόνο να προσθέσετε μία γραμμή σε αυτό το αρχείο:

options     MAC_MLS

Η ετικέτα mls/high θα έχει δεσπόζουσα θέση πάνω από την ετικέτα mls/low, οι εφαρμογές που θα ξεκινήσουν με την ετικέτα mls/low δεν θα έχουν πρόσβαση σε αρχεία που έχουν την ετικέτα mls/high. Περισσότερες λεπτομέρειες σχετικά με όλες τις διαθέσιμες ετικέτες στο σύστημα FreeBSD μπορείτε να βρείτε σε αυτό οδηγός.
Στη συνέχεια, μεταβείτε στον κατάλογο /usr/src:

cd /usr/src

Για να ξεκινήσετε τη δημιουργία του πυρήνα, εκτελέστε (στο πλήκτρο j, καθορίστε τον αριθμό των πυρήνων στο σύστημα):

make -j 4 buildkernel KERNCONF=GENERIC

Αφού ολοκληρωθεί η μεταγλώττιση του πυρήνα, πρέπει να εγκατασταθεί:

make installkernel KERNCONF=GENERIC

Μετά την εγκατάσταση του πυρήνα, μην βιαστείτε να επανεκκινήσετε το σύστημα, καθώς είναι απαραίτητο να μεταφέρετε τους χρήστες στην κλάση σύνδεσης, έχοντας προηγουμένως ρυθμίσει τις παραμέτρους του. Επεξεργαστείτε το αρχείο /etc/login.conf, σε αυτό το αρχείο πρέπει να επεξεργαστείτε την προεπιλεγμένη κλάση σύνδεσης, να το φέρετε στη φόρμα:

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:

Η γραμμή :label=mls/equal θα επιτρέψει στους χρήστες που είναι μέλη αυτής της κλάσης να έχουν πρόσβαση σε αρχεία που επισημαίνονται με οποιαδήποτε ετικέτα (mls/low, mls/high). Μετά από αυτούς τους χειρισμούς, πρέπει να δημιουργήσετε ξανά τη βάση δεδομένων και να τοποθετήσετε τον χρήστη root (καθώς και αυτούς που τον χρειάζονται) σε αυτήν την κλάση σύνδεσης:

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

Προκειμένου η πολιτική να ισχύει μόνο για αρχεία, πρέπει να επεξεργαστείτε το αρχείο /etc/mac.conf, αφήνοντας μόνο μία γραμμή σε αυτό:

default_labels file ?mls

Πρέπει επίσης να προσθέσετε τη λειτουργική μονάδα mac_mls.ko στην αυτόματη εκτέλεση:

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

Μετά από αυτό, μπορείτε να επανεκκινήσετε με ασφάλεια το σύστημα. Πώς να δημιουργήσετε φυλακή Μπορείτε να το διαβάσετε σε μια από τις δημοσιεύσεις μου. Αλλά πριν δημιουργήσετε ένα jail, πρέπει να προσθέσετε έναν σκληρό δίσκο και να δημιουργήσετε ένα σύστημα αρχείων σε αυτόν και να ενεργοποιήσετε το multilabel σε αυτό, να δημιουργήσετε ένα σύστημα αρχείων ufs2 με μέγεθος συμπλέγματος 64 kb:

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

Μετά τη δημιουργία του συστήματος αρχείων και την προσθήκη πολλαπλών ετικετών, πρέπει να προσθέσετε τον σκληρό δίσκο στο /etc/fstab, προσθέστε τη γραμμή σε αυτό το αρχείο:

/dev/ada1               /jail  ufs     rw              0       1

Στο Mountpoint, καθορίστε τον κατάλογο στον οποίο θα τοποθετήσετε τον σκληρό δίσκο, στο Pass, βεβαιωθείτε ότι έχετε καθορίσει 1 (με ποια σειρά θα ελεγχθεί αυτός ο σκληρός δίσκος) - αυτό είναι απαραίτητο, καθώς το σύστημα αρχείων ufs είναι ευαίσθητο σε ξαφνικές διακοπές ρεύματος . Μετά από αυτά τα βήματα, προσαρτήστε το δίσκο:

mount /dev/ada1 /jail

Εγκαταστήστε το jail σε αυτόν τον κατάλογο. Μετά την εκτέλεση του jail, πρέπει να κάνετε τους ίδιους χειρισμούς σε αυτό όπως στο κύριο σύστημα με τους χρήστες και τα αρχεία /etc/login.conf, /etc/mac.conf.

προσαρμογή

Πριν εγκαταστήσετε τις απαραίτητες ετικέτες, συνιστώ να εγκαταστήσετε όλα τα απαραίτητα πακέτα· στην περίπτωσή μου, οι ετικέτες θα οριστούν λαμβάνοντας υπόψη αυτά τα πακέτα:

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 

Σε αυτό το παράδειγμα, οι ετικέτες θα οριστούν λαμβάνοντας υπόψη τις εξαρτήσεις αυτών των πακέτων. Φυσικά, μπορείτε να το κάνετε πιο απλά: για το φάκελο /usr/local/lib και τα αρχεία που βρίσκονται σε αυτόν τον κατάλογο, ορίστε τις ετικέτες mls/low και τα επόμενα εγκατεστημένα πακέτα (για παράδειγμα, πρόσθετες επεκτάσεις για php) θα έχουν πρόσβαση τις βιβλιοθήκες σε αυτόν τον κατάλογο, αλλά μου φαίνεται καλύτερο να παρέχω πρόσβαση μόνο σε εκείνα τα αρχεία που είναι απαραίτητα. Σταματήστε το jail και ορίστε mls/high labels σε όλα τα αρχεία:

setfmac -R mls/high /jail

Όταν ορίζετε σημάδια, η διαδικασία θα σταματήσει εάν το setfmac συναντήσει σκληρούς συνδέσμους, στο παράδειγμά μου διέγραψα σκληρούς συνδέσμους στους ακόλουθους καταλόγους:

/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

Αφού οριστούν οι ετικέτες, πρέπει να ορίσετε τις ετικέτες mls/low για το apache, το πρώτο πράγμα που πρέπει να κάνετε είναι να μάθετε ποια αρχεία χρειάζονται για να ξεκινήσετε το apache:

ldd /usr/local/sbin/httpd

Μετά την εκτέλεση αυτής της εντολής, οι εξαρτήσεις θα εμφανιστούν στην οθόνη, αλλά η ρύθμιση των απαραίτητων ετικετών σε αυτά τα αρχεία δεν θα είναι αρκετή, καθώς οι κατάλογοι στους οποίους βρίσκονται αυτά τα αρχεία έχουν την ετικέτα mls/high, επομένως και αυτοί οι κατάλογοι πρέπει να έχουν ετικέτα mls/χαμηλό. Κατά την εκκίνηση, ο apache θα εξάγει επίσης τα αρχεία που είναι απαραίτητα για την εκτέλεσή του και για php αυτές οι εξαρτήσεις μπορούν να βρεθούν στο αρχείο καταγραφής 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

Αυτή η λίστα περιέχει ετικέτες mls/low για όλα τα αρχεία που είναι απαραίτητα για τη σωστή λειτουργία του συνδυασμού apache και php (για εκείνα τα πακέτα που είναι εγκατεστημένα στο παράδειγμά μου).

Η τελευταία πινελιά θα είναι να διαμορφώσετε το jail ώστε να εκτελείται σε επίπεδο mls/ίσο και το apache στο επίπεδο mls/χαμηλό. Για να ξεκινήσετε το jail, πρέπει να κάνετε αλλαγές στο σενάριο /etc/rc.d/jail, να βρείτε τις συναρτήσεις jail_start σε αυτό το σενάριο, να αλλάξετε τη μεταβλητή εντολής στη φόρμα:

command="setpmac mls/equal $jail_program"

Η εντολή setpmac εκτελεί το εκτελέσιμο αρχείο στο απαιτούμενο επίπεδο ικανότητας, σε αυτήν την περίπτωση mls/equal, προκειμένου να έχει πρόσβαση σε όλες τις ετικέτες. Στο apache πρέπει να επεξεργαστείτε το σενάριο εκκίνησης /usr/local/etc/rc.d/apache24. Αλλάξτε τη συνάρτηση apache24_prestart:

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

В επίσημη Το εγχειρίδιο περιέχει ένα άλλο παράδειγμα, αλλά δεν μπόρεσα να το χρησιμοποιήσω επειδή λαμβάνω συνέχεια ένα μήνυμα σχετικά με την αδυναμία χρήσης της εντολής setpmac.

Παραγωγή

Αυτή η μέθοδος διανομής πρόσβασης θα προσθέσει ένα επιπλέον επίπεδο ασφάλειας στον apache (αν και αυτή η μέθοδος είναι κατάλληλη για οποιαδήποτε άλλη στοίβα), η οποία επιπλέον εκτελείται σε μια φυλακή, την ίδια στιγμή, για τον διαχειριστή όλα αυτά θα συμβαίνουν διαφανώς και απαρατήρητα.

Κατάλογος των πηγών που με βοήθησαν στη συγγραφή αυτής της δημοσίευσης:

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

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο