Ένας διακομιστής εργαστηρίου, τρεις ρόλοι εμπιστοσύνης, ένα πεδίο αστοχίας
Μια είσοδος VPN, ιδιωτικές υπηρεσίες και εργασίες CI χρειάζονται ξεχωριστά προνόμια ακόμα και σε έναν διακομιστή. Διαχώρισε τους ρόλους, απομόνωσε τα δίκτυα, κράτησε την ανάκτηση από κονσόλα.
Όλα δουλεύουν μέχρι ο εκτελεστής κατασκευής να χρειαστεί τον ίδιο υποδοχέα κεντρικού υπολογιστή που χρησιμοποιεί ο επισκέπτης VPN, και τότε κανείς δεν μπορεί να εξηγήσει γιατί μια εργασία μπορεί να διαβάσει τα κλειδιά της πύλης. Τα πάντα εγκαταστάθηκαν σε ένα μηχάνημα επειδή χωρούσαν, και κάθε επισκέπτης πήρε ευρεία πρόσβαση επειδή ήταν ο ταχύτερος τρόπος να δουλέψει. Το αποτέλεσμα είναι ένας κεντρικός υπολογιστής του οποίου το όριο εμπιστοσύνης είναι το καλώδιο τροφοδοσίας. Ο διαχωρισμός των ρόλων είναι λιγότερη δουλειά απ’ ό,τι ακούγεται, και ξεκινά με το να τους δώσεις όνομα.
Τρεις ρόλοι που τώρα μοιράζονται τα πάντα
Μια είσοδος VPN, ένα σύνολο ιδιωτικών υπηρεσιών και ένας εκτελεστής κατασκευής θέλουν διαφορετικά πράγματα. Ο πρώτος χρειάζεται δημόσια θύρα και στενό δίκτυο στην ιδιωτική πλευρά. Ο δεύτερος χρειάζεται μόνιμη αποθήκευση και μυστικά εφαρμογής. Ο τρίτος εκτελεί κώδικα που έγραψε κάποιος άλλος.
Το ότι και οι τρεις παίρνουν την ίδια πρόσβαση είναι αυτό που κάνει το σύμπτωμα μπερδεμένο, γιατί τότε οποιοσδήποτε από αυτούς μπορεί να επηρεάσει τους άλλους. Μια εργασία κατασκευής που φτάνει στον υποδοχέα του hypervisor είναι μια εργασία που μπορεί να σταματήσει το VPN. Ένας επισκέπτης υπηρεσιών με διαδρομή προς το δίκτυο διαχείρισης μπορεί να αλλάξει τη διαμόρφωση του μεταγωγέα. Τα προνόμια είναι το πρόβλημα, και η λίστα διεργασιών είναι μόνο το σημείο όπου φαίνεται. Το να ονομάσεις πρώτα τους ρόλους δίνει σε κάθε προνόμιο ένα μέρος να ζήσει.
Το σκίτσο παρακάτω είναι αφετηρία για αυτόν τον διαχωρισμό και όχι υπόσχεση υψηλής διαθεσιμότητας. Αντιμετώπισέ το ως υπόθεση προς επαλήθευση, όχι ως ολοκληρωμένο σχέδιο.
Χώρισε τρεις ρόλους, όχι τρεις διεργασίες
Τρεις επισκέπτες σε έναν κεντρικό υπολογιστή δίνουν τρία σύνολα προνομίων και τρεις θέσεις δικτύου. Δεν δίνουν τρία πεδία αστοχίας, και το σχέδιο πρέπει να το πει δυνατά.
Ο διαχωρισμός βοηθά μόνο αν μια παραβίαση σε έναν επισκέπτη δεν δίνει αυτόματα προνόμια στους άλλους, και αυτό είναι ρύθμιση του hypervisor και όχι σύμβαση ονοματοδοσίας. Το να ονομάσεις μια VM πύλη δεν εμποδίζει έναν άλλο επισκέπτη να φτάσει τον κεντρικό υπολογιστή. Διάβασε τη διαμόρφωση του εικονικού μεταγωγέα αντί για το όνομα κεντρικού υπολογιστή και μετά επιβεβαίωσε ότι κάθε επισκέπτης κάθεται εκεί που νομίζεις.
host
├─ vpn-gw 10.60.10.2/24 public 51820/udp only
├─ services 10.60.0.10/24 no route to the management network
└─ ci-runner 10.60.20.2/24 outbound only, no host socket
Γράψε την τοπολογία και μετά επαλήθευσέ την με τα εργαλεία που την κατέχουν. Ένας επισκέπτης που εμφανίζεται στη λάθος γέφυρα είναι εύρημα και όχι λεπτομέρεια. Διόρθωσε το δίκτυο πριν αλλάξεις οποιαδήποτε διαμόρφωση υπηρεσίας.
Άφησε τον επισκέπτη VPN να ανοίγει μόνο τις πόρτες που του ανήκουν
Δημοσίευσε τη θύρα της σήραγγας στον δρομολογητή και τίποτε άλλο. Οι θύρες διαχείρισης επισκεπτών ανήκουν σε μια διαδρομή διαχείρισης, όχι στο διαδίκτυο, και η ίδια η διεπαφή του hypervisor ανήκει εκεί επίσης.
Το δίκτυο στην ιδιωτική πλευρά πρέπει να φτάνει τις υπηρεσίες που χρειάζονται οι απομακρυσμένοι χρήστες και να σταματά εκεί. Η πιστοποίηση εφαρμογής μένει ενεργή, γιατί η σήραγγα είναι μεταφορά και όχι σύνδεση. Κράτησε τον πίνακα δρομολόγησης του επισκέπτη VPN αρκετά μικρό ώστε να περιγράφεται με μία πρόταση. Αν δεν μπορείς να τον περιγράψεις τόσο απλά, το όριο έχει ήδη θολώσει.
virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'
Ό,τι ακούει στον κεντρικό υπολογιστή και δεν χρειάζεται για διαχείριση δεν θα έπρεπε να ακούει καθόλου. Αυτό περιλαμβάνει το API του hypervisor, που είναι εύκολο να μείνει εκτεθειμένο σε δημόσια διεπαφή.
Οι εργασίες κατασκευής χρειάζονται άλλο είδος ορίου
Μια εργασία CI εκτελεί εντολές που ελέγχει το αποθετήριο, άρα η εμπιστοσύνη της εξαρτάται από το ποιος μπορεί να ανεβάσει κώδικα. Ένας εκτελεστής κελύφους τρέχει αυτές τις εντολές ως ο χρήστης του εκτελεστή στον κεντρικό υπολογιστή, και αυτό είναι το ευρύτερο διαθέσιμο όριο.
Οι εκτελεστές κοντέινερ είναι στενότεροι, και ένα προνομιακό κοντέινερ δεν είναι από τους στενούς. Κράτησε τον εκτελεστή στον δικό του επισκέπτη με το δικό του εύρος δικτύου, και δώσε του μόνο την πρόσβαση σε τεχνουργήματα και ανάπτυξη που χρειάζονται οι εργασίες. Οι αναλώσιμοι εργάτες μειώνουν την κατάσταση που διατηρείται, αλλά δεν μειώνουν την προσβασιμότητα ούτε την έκθεση μυστικών. Και τα δύο χρειάζονται ακόμη ρητά όρια.
Ο επισκέπτης υπηρεσιών κατέχει τα δεδομένα, άρα το σχέδιο αντιγράφων ασφαλείας του είναι αυτό που πρέπει να δουλέψει. Κράτησε τα αποθετήρια, τα ανεβάσματα και τη βάση δεδομένων στο ίδιο χρονοδιάγραμμα. Δοκίμασε μια επαναφορά αντί να διαβάζεις την κατάσταση της εργασίας.
Σχεδίασε την αστοχία που μοιράζονται και οι τρεις
Ένας κεντρικός υπολογιστής είναι ένα πεδίο αστοχίας. Μια επανεκκίνηση αφαιρεί τη σήραγγα και κάθε ιδιωτική υπηρεσία την ίδια στιγμή, και τότε ακριβώς μια δίοδος προς τα μέσα μετράει περισσότερο.
Κράτησε πρόσβαση κονσόλας που δεν εξαρτάται από τον επισκέπτη VPN, είτε είναι φυσική κονσόλα, είτε διεπαφή διαχείρισης εκτός ζώνης, είτε κονσόλα παρόχου. Ένα στιγμιότυπο που αποθηκεύεται στον ίδιο δίσκο δεν είναι ανεξάρτητο αντίγραφο, και ούτε ένα αντίγραφο ασφαλείας που τρέχει μέσα στον επισκέπτη που προστατεύει. Μετά δοκίμασε την ψυχρή εκκίνηση ως ακολουθία και όχι ως λίστα ελέγχου: κεντρικός υπολογιστής, εικονικά δίκτυα, διαδρομή σήραγγας και μία ονομασμένη εφαρμογή υπό έναν συνηθισμένο λογαριασμό.
virsh list --all
systemctl is-active libvirtd
curl -sS -m 5 -o /dev/null -w '%{http_code}\n' https://10.60.0.10/
ss -ltnp | grep -E ':51820|:443'
Η σειρά εκκίνησης των διεργασιών δεν αποδεικνύει τίποτε για διαδρομές και DNS, άρα δοκίμασε τη διαδρομή και όχι τις καταστάσεις των μονάδων. Η διαδρομή είναι αυτό που χρειάζεται πραγματικά ένας απομακρυσμένος χρήστης.