Ιστολόγιο

Ένας Πρακτικός Οδηγός Ασφάλειας Απομόνωσης Docker για Φιλοξενία Πολλαπλών Ενοικιαστών

Ασφαλίστε τη φιλοξενία Docker πολλαπλών ενοικιαστών σας με αυτόν τον πρακτικό οδηγό που καλύπτει μη-διαχειριστικούς χρήστες, δυνατότητες, seccomp, χώρους ονομάτων χρηστών, όρια πόρων και συστήματα αρχείων μόνο για ανάγνωση.

Σύνοψη

Η φιλοξενία Docker πολλαπλών ενοικιαστών απαιτεί ισχυρή απομόνωση για την αποτροπή διαφυγών από κοντέινερ. Αυτό το άρθρο παρέχει έναν πρακτικό οδηγό ασφάλειας που καλύπτει έξι βασικούς τομείς: εκτέλεση ως μη-διαχειριστής, αφαίρεση δυνατοτήτων, εφαρμογή προφίλ seccomp, ενεργοποίηση αντιστοίχισης χώρου ονομάτων χρηστών, ορισμός ορίων πόρων και χρήση συστημάτων αρχείων μόνο για ανάγνωση. Κάθε βήμα περιλαμβάνει ένα συγκεκριμένο παράδειγμα διαμόρφωσης για το Docker Compose. Θα μάθετε επίσης συνήθεις παγίδες, όπως ζητήματα συμβατότητας πυρήνα με χώρους ονομάτων χρηστών και αντισταθμίσεις απόδοσης κατά την εφαρμογή seccomp. Ακολουθώντας αυτόν τον οδηγό, μπορείτε να μειώσετε σημαντικά την επιφάνεια επίθεσης χωρίς να προσθέσετε περιττή πολυπλοκότητα. Το άρθρο καταλήγει με μια προτεινόμενη βασική διαμόρφωση για παραγωγικά περιβάλλοντα πολλαπλών ενοικιαστών.

Αν διαχειρίζεστε ένα περιβάλλον Docker πολλαπλών ενοικιαστών, ο φόβος μιας επίθεσης διαφυγής από κοντέινερ σας κρατά ξύπνιους τα βράδια. Μια εκμετάλλευση του πυρήνα μπορεί να σπάσει την απομόνωση ενός κοντέινερ και να δώσει στον επιτιθέμενο απεριόριστη πρόσβαση στον κεντρικό υπολογιστή και σε όλα τα δεδομένα των άλλων ενοικιαστών. Ενώ το Docker παρέχει ισχυρές δυνατότητες απομόνωσης—χώρους ονομάτων, cgroups και δυνατότητες—η κακή διαμόρφωση αφήνει κενά. Αυτό το άρθρο παρουσιάζει έναν βήμα-προς-βήμα οδηγό ασφάλειας που μπορείτε να εφαρμόσετε σήμερα. Κάθε βήμα περιλαμβάνει ένα λειτουργικό απόσπασμα Docker Compose και βασικές προειδοποιήσεις. Στο τέλος, θα έχετε μια ενισχυμένη βασική γραμμή που ισορροπεί ασφάλεια και απόδοση.

1. Εκτέλεση Κοντέινερ ως Μη-Διαχειριστικός Χρήστης

Από προεπιλογή, τα κοντέινερ εκτελούνται ως διαχειριστής (root) μέσα στο κοντέινερ. Εάν ένας επιτιθέμενος αποκτήσει δικαιώματα διαχειριστή στο κοντέινερ, έχει προβάδισμα για διαφυγή. Ορίζετε πάντα έναν μη-διαχειριστικό χρήστη στο Dockerfile σας.

FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

Στο Compose, μπορείτε επίσης να ορίσετε απευθείας τον χρήστη:

services:
  app:
    image: myapp
    user: "1000:1000"

Προειδοποίηση: Κάποιες εφαρμογές απαιτούν δικαιώματα διαχειριστή για νόμιμες λειτουργίες (π.χ., σύνδεση σε θύρες κάτω από το 1024). Χρησιμοποιήστε το CAP_NET_BIND_SERVICE αντί να εκτελείτε ολόκληρο το κοντέινερ ως διαχειριστής. Για μια βαθύτερη ματιά στα βασικά στοιχεία απομόνωσης, δείτε τον οδηγό μας για την επίτευξη πραγματικής απομόνωσης πολλαπλών ενοικιαστών στο Docker.

2. Αφαίρεση Όλων των Δυνατοτήτων και Προσθήκη Μόνο Όσων Χρειάζονται

Οι δυνατότητες Linux παρέχουν στα κοντέινερ λεπτομερή προνόμια. Από προεπιλογή, το Docker χορηγεί ένα σύνολο δυνατοτήτων. Αφαιρέστε τα πάντα και παραχωρήστε μόνο όσες απαιτούνται.

services:
  app:
    image: myapp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE  # αν χρειάζεται

Προειδοποίηση: Δυνατότητες όπως SYS_ADMIN ή NET_RAW σπάνια χρειάζονται. Ελέγξτε την εφαρμογή σας για να προσδιορίσετε το ελάχιστο σύνολο. Η αφαίρεση όλων των δυνατοτήτων αποκλείει πολλούς φορείς διαφυγής.

3. Εφαρμογή Προφίλ Seccomp

Το Seccomp (secure computing mode) φιλτράρει τις κλήσεις συστήματος που είναι διαθέσιμες σε ένα κοντέινερ. Το Docker συνοδεύεται από ένα προεπιλεγμένο προφίλ seccomp που αποκλείει επικίνδυνες κλήσεις συστήματος όπως το clone με ορισμένες σημαίες. Μπορείτε να το προσαρμόσετε περαιτέρω.

services:
  app:
    image: myapp
    security_opt:
      - seccomp=/path/to/custom-profile.json

Ένα ενισχυμένο προφίλ μπορεί να αποκλείει τα unshare, ptrace, και mount. Ξεκινήστε με την προεπιλογή του Docker και περιορίστε περισσότερο. Προειδοποίηση: Υπερβολικά αυστηρά προφίλ μπορεί να σπάσουν εφαρμογές. Δοκιμάστε διεξοδικά σε περιβάλλον δοκιμών. Για περισσότερες πληροφορίες σχετικά με την άμυνα έναντι διαφυγών από κοντέινερ, διαβάστε υπεράσπιση έναντι διαφυγής από κοντέινερ.

4. Ενεργοποίηση Αντιστοίχισης Χώρου Ονομάτων Χρηστών

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

Ενεργοποιήστε το στον δαίμονα Docker επεξεργάζοντας το /etc/docker/daemon.json:

{
  "userns-remap": "default"
}

Στη συνέχεια, επανεκκινήστε το Docker. Προειδοποίηση: Η αντιστοίχιση χώρου ονομάτων χρηστών έχει δύο μειονεκτήματα: σπάει τις προσαρτήσεις τόμων όταν δεν διαμορφωθεί προσεκτικά (τα αρχεία ανήκουν στον αντιστοιχισμένο χρήστη) και είναι ασύμβατη με ορισμένους οδηγούς αποθήκευσης όπως το overlay2 σε παλαιότερους πυρήνες. Δοκιμάστε διεξοδικά.

5. Ορισμός Ορίων Πόρων με Cgroups

Τα όρια πόρων αποτρέπουν ένα παραβιασμένο κοντέινερ από το να εξαπολύσει επίθεση άρνησης υπηρεσίας στον κεντρικό υπολογιστή. Χρησιμοποιήστε cgroups για να περιορίσετε CPU, μνήμη και I/O δίσκου.

services:
  app:
    image: myapp
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

Για Docker Compose v3, χρησιμοποιήστε την ενότητα deploy (λειτουργεί με swarm ή compose v2). Για απλό Docker, χρησιμοποιήστε --memory και --cpus. Προειδοποίηση: Ο πολύ χαμηλός ορισμός ορίων μπορεί να προκαλέσει τερματισμούς OOM. Παρακολουθήστε τη χρήση και προσαρμόστε ανάλογα.

6. Χρήση Συστήματος Αρχείων Μόνο για Ανάγνωση

Ένα σύστημα αρχείων μόνο για ανάγνωση αποτρέπει τους επιτιθέμενους από το να γράψουν κακόβουλα δυαδικά ή να τροποποιήσουν αρχεία διαμόρφωσης μέσα στο κοντέινερ.

services:
  app:
    image: myapp
    read_only: true
    tmpfs:
      - /tmp:noexec,nosuid,size=64m

Προσαρτήστε tmpfs σε καταλόγους που χρειάζονται δικαιώματα εγγραφής (όπως /tmp). Αυτό αναγκάζει όλα τα εγγράψιμα δεδομένα να είναι προσωρινά. Προειδοποίηση: Κάποιες εφαρμογές απαιτούν μόνιμη αποθήκευση· χρησιμοποιήστε ονομασμένους τόμους για αυτό.

Συνήθεις Παγίδες

  • Συμβατότητα πυρήνα: Η αντιστοίχιση χώρου ονομάτων χρηστών και ορισμένοι κανόνες seccomp απαιτούν σύγχρονο πυρήνα Linux (4.14+). Ελέγξτε την έκδοση του πυρήνα σας.
  • Επίδραση στην απόδοση: Το Seccomp και οι χώροι ονομάτων χρηστών προσθέτουν ένα μικρό επιπλέον φορτίο, αλλά είναι αμελητέο για τα περισσότερα φορτία εργασίας. Κάντε συγκριτική αξιολόγηση της συγκεκριμένης εφαρμογής σας.
  • Πολυπλοκότητα: Η προσθήκη και των έξι μέτρων ταυτόχρονα μπορεί να προκαλέσει προβλήματα. Εφαρμόστε τα ένα-ένα, δοκιμάζοντας κάθε αλλαγή.

Για μια ευρύτερη εικόνα των προτύπων ενορχήστρωσης, δείτε τον οδηγό μας για τον σχεδιασμό μιας αρχιτεκτονικής Docker πολλαπλών ενοικιαστών.

Συμπέρασμα

Ένας ασφαλής κεντρικός υπολογιστής Docker πολλαπλών ενοικιαστών δεν απαιτεί εξωτικά εργαλεία—μόνο σωστή χρήση των ενσωματωμένων δυνατοτήτων του Docker. Ξεκινήστε με έναν μη-διαχειριστικό χρήστη, αφαιρέστε όλες τις δυνατότητες, εφαρμόστε ένα προφίλ seccomp, ενεργοποιήστε την αντιστοίχιση χώρου ονομάτων χρηστών, ορίστε όρια πόρων και χρησιμοποιήστε ένα σύστημα αρχείων μόνο για ανάγνωση. Αυτός ο οδηγός αποτελεί μια ισχυρή βασική γραμμή που αποκλείει τις πιο κοινές τεχνικές διαφυγής. Μετά την εφαρμογή, εκτελέστε εργαλεία ασφάλειας όπως το docker-bench-security για να επαληθεύσετε τη διαμόρφωσή σας. Θυμηθείτε: η ασφάλεια είναι μια διαδικασία, όχι ένα προϊόν. Καθώς προκύπτουν νέες ευπάθειες πυρήνα, επανεξετάστε τις ρυθμίσεις σας. Για αυτοματοποιημένες σελίδες προορισμού που προβάλλουν την υπηρεσία φιλοξενίας σας, χρησιμοποιήστε το Pagenza για να ζωντανέψει ο ιστότοπός σας σε λίγα λεπτά.

Sources (5)