Εφαρμογή υποχρεωτικού ελέγχου πρόσβασης με το SELinux ή το AppArmor στο Linux


Για να ξεπεραστούν οι περιορισμοί και να αυξηθούν οι μηχανισμοί ασφαλείας που παρέχονται από τις τυπικές άδειες ugo/rwx και τις λίστες ελέγχου πρόσβασης, η Εθνική Υπηρεσία Ασφαλείας των Ηνωμένων Πολιτειών (NSA) επινόησε μια ευέλικτη Υποχρεωτική μέθοδος ελέγχου πρόσβασης (MAC) γνωστή ως SELinux (συντομογραφία του Security Enhanced Linux), προκειμένου να περιοριστεί, μεταξύ άλλων, η δυνατότητα των διαδικασιών να πρόσβαση ή εκτέλεση άλλων λειτουργιών σε αντικείμενα συστήματος (όπως αρχεία, καταλόγους, θύρες δικτύου, κ.λπ.) με την ελάχιστη δυνατή άδεια, επιτρέποντας ωστόσο μεταγενέστερες τροποποιήσεις σε αυτό το μοντέλο.

Ένα άλλο δημοφιλές και ευρέως χρησιμοποιούμενο MAC είναι το AppArmor, το οποίο εκτός από τις δυνατότητες που παρέχονται από το SELinux, περιλαμβάνει μια λειτουργία εκμάθησης που επιτρέπει στο σύστημα να \μάθει<” πώς συμπεριφέρεται μια συγκεκριμένη εφαρμογή και να ορίσετε όρια διαμορφώνοντας προφίλ για ασφαλή χρήση της εφαρμογής.

Στο CentOS 7, το SELinux είναι ενσωματωμένο στον ίδιο τον πυρήνα και είναι ενεργοποιημένο στη λειτουργία Ενίσχυση από προεπιλογή (περισσότερα για αυτό στην επόμενη ενότητα). σε αντίθεση με το openSUSE και το Ubuntu που χρησιμοποιούν το AppArmor.

Σε αυτό το άρθρο θα εξηγήσουμε τα βασικά στοιχεία του SELinux και του AppArmor και πώς να χρησιμοποιήσετε ένα από αυτά τα εργαλεία προς όφελός σας, ανάλογα με τη διανομή που έχετε επιλέξει.

Εισαγωγή στο SELinux και πώς να το χρησιμοποιήσετε στο CentOS 7

Το Linux Enhanced Security μπορεί να λειτουργήσει με δύο διαφορετικούς τρόπους:

  1. Εφαρμογή: Το SELinux αρνείται την πρόσβαση βάσει κανόνων πολιτικής SELinux, ένα σύνολο οδηγιών που ελέγχουν τη μηχανή ασφαλείας.
  2. Επιτρεπτό: Το SELinux δεν αρνείται την πρόσβαση, αλλά οι αρνήσεις καταγράφονται για ενέργειες που θα είχαν απορριφθεί εάν εκτελούνταν σε λειτουργία επιβολής.

Το SELinux μπορεί επίσης να απενεργοποιηθεί. Παρόλο που δεν είναι από μόνη της τρόπος λειτουργίας, εξακολουθεί να είναι μια επιλογή. Ωστόσο, είναι καλύτερο να μάθετε πώς να χρησιμοποιείτε αυτό το εργαλείο από το να το αγνοείτε. Εχε το στο νου!

Για να εμφανίσετε την τρέχουσα λειτουργία του SELinux, χρησιμοποιήστε το getenforce. Εάν θέλετε να αλλάξετε τον τρόπο λειτουργίας, χρησιμοποιήστε setenforce 0 (για να το ορίσετε σε Επιτρεπτό) ή setenforce 1 (Εφαρμογή ισχυρή>).

Επειδή αυτή η αλλαγή δεν θα επιβιώσει από επανεκκίνηση, θα χρειαστεί να επεξεργαστείτε το αρχείο /etc/selinux/config και να ορίσετε τη μεταβλητή SELINUX σε οποιοδήποτε επιβολή, επιτρεπτό ή απενεργοποιημένο προκειμένου να επιτευχθεί επιμονή στις επανεκκινήσεις:

Σε μια δευτερεύουσα σημείωση, εάν το getenforce επιστρέψει Απενεργοποιημένο, θα πρέπει να επεξεργαστείτε το /etc/selinux/config με τον επιθυμητό τρόπο λειτουργίας και να κάνετε επανεκκίνηση. Διαφορετικά, δεν θα μπορείτε να ρυθμίσετε (ή να αλλάξετε) τον τρόπο λειτουργίας με το setenforce.

Μία από τις τυπικές χρήσεις του setenforce συνίσταται στην εναλλαγή μεταξύ των λειτουργιών SELinux (από επιβολή σε επιτρεπτή ή το αντίστροφο) για την αντιμετώπιση προβλημάτων μιας εφαρμογής που συμπεριφέρεται σωστά ή δεν λειτουργεί όπως αναμένεται. Εάν λειτουργεί αφού ρυθμίσετε το SELinux σε λειτουργία Επιτρεπτή, μπορείτε να είστε βέβαιοι ότι εξετάζετε ένα ζήτημα δικαιωμάτων SELinux.

Δύο κλασικές περιπτώσεις όπου πιθανότατα θα πρέπει να αντιμετωπίσουμε το SELinux είναι:

  1. Αλλαγή της προεπιλεγμένης θύρας όπου ακούει ένας δαίμονας.
  2. Ρύθμιση της οδηγίας DocumentRoot για έναν εικονικό κεντρικό υπολογιστή εκτός του /var/www/html.

Ας ρίξουμε μια ματιά σε αυτές τις δύο περιπτώσεις χρησιμοποιώντας τα ακόλουθα παραδείγματα.

Ένα από τα πρώτα πράγματα που κάνουν οι περισσότεροι διαχειριστές συστήματος για να ασφαλίσουν τους διακομιστές τους είναι να αλλάξουν τη θύρα όπου ακούει ο δαίμονας SSH, κυρίως για να αποθαρρύνουν τους σαρωτές θυρών και τους εξωτερικούς εισβολείς. Για να το κάνουμε αυτό, χρησιμοποιούμε την οδηγία Port στο /etc/ssh/sshd_config ακολουθούμενη από τον νέο αριθμό θύρας ως εξής (θα χρησιμοποιήσουμε τη θύρα 9999 σε αυτήν την περίπτωση):

Port 9999

Αφού προσπαθήσουμε να επανεκκινήσουμε την υπηρεσία και ελέγξουμε την κατάστασή της, θα δούμε ότι απέτυχε να ξεκινήσει:

# systemctl restart sshd
# systemctl status sshd

Αν ρίξουμε μια ματιά στο /var/log/audit/audit.log, θα δούμε ότι το sshd δεν μπορούσε να ξεκινήσει στη θύρα 9999 από το SELinux επειδή αυτή είναι μια δεσμευμένη θύρα για την υπηρεσία JBoss Management (τα μηνύματα αρχείου καταγραφής SELinux περιλαμβάνουν τη λέξη “AVC” ώστε να είναι εύκολα που προσδιορίζεται από άλλα μηνύματα):

# cat /var/log/audit/audit.log | grep AVC | tail -1

Σε αυτό το σημείο, οι περισσότεροι άνθρωποι πιθανότατα θα απενεργοποιούσαν το SELinux, αλλά δεν θα το κάνουμε. Θα δούμε ότι υπάρχει ένας τρόπος για το SELinux και το sshd να ακούν σε διαφορετική θύρα, να ζήσουν αρμονικά μαζί. Βεβαιωθείτε ότι έχετε εγκαταστήσει και εκτελείτε το πακέτο policycoreutils-python:

# yum install policycoreutils-python

Για να δείτε μια λίστα με τις θύρες στις οποίες το SELinux επιτρέπει στο sshd να ακούει. Στην παρακάτω εικόνα μπορούμε επίσης να δούμε ότι η θύρα 9999 είχε δεσμευτεί για άλλη υπηρεσία και επομένως δεν μπορούμε να τη χρησιμοποιήσουμε για την εκτέλεση άλλης υπηρεσίας προς το παρόν:

# semanage port -l | grep ssh

Φυσικά θα μπορούσαμε να επιλέξουμε άλλη θύρα για SSH, αλλά αν είμαστε σίγουροι ότι δεν θα χρειαστεί να χρησιμοποιήσουμε αυτό το συγκεκριμένο μηχάνημα για υπηρεσίες που σχετίζονται με το JBoss, μπορούμε στη συνέχεια να τροποποιήσουμε τον υπάρχοντα κανόνα SELinux και να εκχωρήσουμε αυτήν τη θύρα στο SSH:

# semanage port -m -t ssh_port_t -p tcp 9999

Μετά από αυτό, μπορούμε να χρησιμοποιήσουμε την πρώτη εντολή semanage για να ελέγξουμε εάν η θύρα έχει εκχωρηθεί σωστά ή τις επιλογές -lC (συντομογραφία για προσαρμοσμένη λίστα):

# semanage port -lC
# semanage port -l | grep ssh

Μπορούμε τώρα να επανεκκινήσουμε το SSH και να συνδεθούμε στην υπηρεσία χρησιμοποιώντας τη θύρα 9999. Σημειώστε ότι αυτή η αλλαγή ΘΑ επιβιώσει μετά την επανεκκίνηση.

Εάν πρέπει να ρυθμίσετε έναν εικονικό κεντρικό υπολογιστή Apache χρησιμοποιώντας έναν κατάλογο διαφορετικό από τον /var/www/html ως DocumentRoot (π.χ., για παράδειγμα, /websrv/sites /gabriel/public_html):

DocumentRoot “/websrv/sites/gabriel/public_html”

Ο Apache θα αρνηθεί να προβάλει το περιεχόμενο επειδή το index.html έχει επισημανθεί με τον τύπο default_t SELinux, στον οποίο ο Apache δεν έχει πρόσβαση:

# wget http://localhost/index.html
# ls -lZ /websrv/sites/gabriel/public_html/index.html

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

# cat /var/log/audit/audit.log | grep AVC | tail -1

Για να αλλάξετε την ετικέτα του /websrv/sites/gabriel/public_html αναδρομικά σε httpd_sys_content_t, κάντε τα εξής:

# semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

Η παραπάνω εντολή θα εκχωρήσει στον Apache πρόσβαση μόνο για ανάγνωση σε αυτόν τον κατάλογο και τα περιεχόμενά του.

Τέλος, για να εφαρμόσετε την πολιτική (και να εφαρμόσετε άμεσα την αλλαγή ετικέτας), κάντε τα εξής:

# restorecon -R -v /websrv/sites/gabriel/public_html

Τώρα θα πρέπει να έχετε πρόσβαση στον κατάλογο:

# wget http://localhost/index.html

Για περισσότερες πληροφορίες σχετικά με το SELinux, ανατρέξτε στον οδηγό Fedora 22 SELinux και διαχειριστή.