<-- Documentation Project $FreeBSD: doc/el_GR.ISO8859-7/books/handbook/jails/chapter.sgml,v 1.1 2007/11/02 16:14:23 keramida Exp $ --> Matteo Riondato Συνεισφορά από τον Jails jails Σύνοψη Το κεφάλαιο αυτό εξηγεί τι είναι τα jails (φυλακές) του &os; και πως χρησιμοποιούνται. Τα jails, που ορισμένες φορές αναφέρονται σαν μια ενισχυμένη εναλλακτική λύση για περιβάλλοντα chroot , είναι ένα ισχυρό εργαλείο για διαχειριστές συστημάτων, αλλά η βασική τους χρήση μπορεί να επίσης να είναι χρήσιμη σε προχωρημένους χρήστες. Αφού διαβάσετε αυτό το κεφάλαιο, θα ξέρετε: Τι είναι το jail και τι σκοπό μπορεί να εξυπηρετήσει σε εγκαταστάσεις &os;. Πως να φτιάξετε, να εκκινήσετε, και να σταματήσετε ένα jail. Τα βασικά της διαχείρισης του jail, τόσο μέσα, όσο και έξω από αυτό. Άλλες πηγές χρήσιμων πληροφοριών σχετικά με τα jails είναι: Η σελίδα manual του &man.jail.8;. Περιέχει πλήρη αναφορά του βοηθητικού προγράμματος jail — του διαχειριστικού εργαλείου που μπορεί να χρησιμοποιηθεί στο &os; για την εκκίνηση, διακοπή και έλεγχο των jails. Οι λίστες ταχυδρομείου και τα αρχεία τους. Τα αρχεία από την &a.questions.name; και άλλες λίστες που εξυπηρετούνται από τον &a.mailman.lists; περιέχουν πλήρη οδηγό για τα jails. Είναι πάντοτε ενδιαφέρον να ψάχνετε τα αρχεία ή να δημοσιεύετε νέες ερωτήσεις στη λίστα &a.questions.name;. Όροι του Jails Για να κατανοήσετε καλύτερα το πως οι εσωτερικές λειτουργίες του &os; σχετίζονται με το jails και πως αυτές αλληλεπιδρούν με τα υπόλοιπα μέρη του &os;, θα χρησιμοποιήσουμε εκτενώς τους παρακάτω όρους: &man.chroot.2; (εντολή) Ένα system call του &os;, το οποίο αλλάζει τον γονικό κατάλογο (root directory) μιας διεργασίας και όλων των άλλων διεργασιών που εξαρτώνται από αυτή. &man.chroot.2; (περιβάλλον) Το περιβάλλον μια διεργασίας που τρέχει μέσω του chroot. Αυτό περιλαμβάνει τους πόρους όπως το μέρος του συστήματος που είναι ορατό, τα ID του χρήστη και της ομάδας, τις διεπαφές δικτύου (network interfaces), τους μηχανισμούς IPC κλπ. &man.jail.8; (εντολή) Το πρόγραμμα που σας επιτρέπει να διαχειρίζεστε το σύστημα σας και να ξεκινάτε διεργασίες σε περιβάλλον jail. host (σύστημα (system), διεργασία (process), χρήστης (user), κλπ.) Το σύστημα ελέγχου για το περιβάλλον jail. Το host system έχει πρόσβαση σε όλο το διαθέσιμο υλικό, και μπορεί να ελέγξει διεργασίες τόσο μέσα όσο και έξω από το περιβάλλον του jail. Μία από τις σημαντικότερες διαφορές μεταξύ του host system και του jail είναι ότι οι περιορισμοί που εφαρμόζονται στις διεργασίες του χρήστη root μέσα στο περιβάλλον jail, δεν ισχύουν για τις διεργασίες στο host system. hosted (σύστημα (system), διεργασία (process), χρήστης (user), κλπ.) Μια διεργασία, ένας χρήστης ή κάποια άλλη οντότητα, όπου η πρόσβαση στους πόρους του συστήματος είναι περιορισμένη μέσων από ένα jail. Εισαγωγή Μιας και η διαχείριση ενός συστήματος μπορεί να είναι δύσκολη και περίπλοκη, αναπτύχθηκαν αρκετά εργαλεία τα οποία μπορούν να κάνουν τη ζωή ενός διαχειριστή πολύ πιο εύκολη. Τα εργαλεία αυτά προσφέρουν κάποια προσθετικά στοιχεία στον τρόπο εγκατάστασης, ρύθμισης και συντήρησης ενός συστήματος. Ένα από τα πράγματα που περιμένει κάποιος από έναν διαχειριστή συστήματος, είναι να ρυθμίσει και να ασφαλίσει σωστά το σύστημα, προκειμένου να προσφέρει τις υπηρεσίες για τις οποίες έχει προγραμματιστεί χωρίς να επιτρέπει συμβιβασμό στην ασφάλεια. Ένα από τα εργαλεία που μπορούν να ενισχύσουν την ασφάλεια ενός συστήματος &os; είναι τα jails. Τα Jails πρωτοεμφανίστηκαν στο &os; 4.X από τον &a.phk;, και βελτιώθηκαν πολύ περισσότερο στην έκδοση &os; 5.X, προκειμένου να προσφέρουν περισσότερες δυνατότητες και να είναι περισσότερο ευέλικτα. Η ανάπτυξή τους συνεχίζεται ακόμη, με τη βελτίωση στους τομείς της ευχρηστίας, της απόδοσης, τις αξιοπιστίας και της ασφάλειας που πρέπει να παρέχουν. Τι είναι ένα Jail Τα λειτουργικά συστήματα βασισμένα στο BSD, παρέχουν το &man.chroot.2; από την εποχή του 4.2BSD. Η εντολή &man.chroot.8; μπορεί να χρησιμοποιηθεί για να αλλάξει τον γονικό κατάλογο μιας ομάδας διεργασιών, δημιουργώντας ένα ασφαλές περιβάλλον, ξεχωριστό από το υπόλοιπο σύστημα. Όσες διεργασίες δημιουργούνται σε έναν τέτοιο περιβάλλον, δεν έχουν πρόσβαση σε αρχεία και πόρους έξω από αυτό. Για αυτό το λόγο, εάν μια υπηρεσία τρέχει μέσα σε ένα τέτοιο περιβάλλον, και κάποιος εισβολέας καταφέρει να διεισδύσει σε αυτή, δε θα του επιτραπεί η πρόσβαση στο υπόλοιπο σύστημα. Η εντολή &man.chroot.8; είναι πολύ καλή για απλές εργασίες οι οποίες δε χρειάζονται να είναι πολύ ευέλικτες ή πολύπλοκες με προηγμένα χαρακτηριστικά. Από την αρχή της ιδέα του chroot, βρέθηκαν αρκετοί τρόποι για να μπορέσει κάποιος να ξεφύγει από το περιβάλλον αυτό. Παρ' όλο που έχουν διορθωθεί πολλά σφάλματα στις πρόσφατες εκδόσεις του πυρήνα του &os;, ήταν ξεκάθαρο ότι η &man.chroot.2; δεν ήταν η ιδανική λύση για την ασφάλιση υπηρεσιών. Ένα νέο σύστημα έπρεπε να υλοποιηθεί. Αυτός είναι ο κύριος λόγος για την ανάπτυξη των jails. Τα jails βελτίωσαν με διάφορους τρόπους την ιδέα του παραδοσιακού περιβάλλοντος του &man.chroot.2;. Στο τυπικό περιβάλλον του &man.chroot.2;, οι διεργασίες περιθωριοποιούνται στο μέρος του συστήματος όπου μπορούν να έχουν πρόσβαση. Οι υπόλοιποι πόροι του συστήματος (όπως οι χρήστες, οι τρέχοντες εργασίες, οι δικτυακές λειτουργίες) μπορούν να γίνουν προσβάσιμες μέσω των διεργασιών του περιβάλλοντος chroot και των διεργασιών του host system. Τα Jails επεκτείνουν αυτό το μοντέλο με το να εικονοποιούνε όχι μόνο τη πρόσβαση στο σύστημα αρχείων, αλλά επίσης στους διάφορους χρήστες, τις δικτυακές λειτουργίες του πυρήνα του &os; και μερικά ακόμη. Περισσότερα για τις διαθέσιμες εντολές που μπορούν να ρυθμίσουν και να ελέγξουν ένα περιβάλλον jail, δείτε το κεφάλαιο . Το Jail έχει τέσσερα κύρια στοιχεία: Έναν κατάλογο με δική του δομή — το αρχικό σημείο από το οποίο εισάγεται ένα jail. Από τη στιγμή που μια διεργασία βρίσκεται μέσα σε ένα jail, δεν επιτρέπεται να βγει έξω από αυτό. Τα προβλήματα που ταλαιπωρούσαν τον σχεδιασμό του &man.chroot.2; δεν επηρεάζουν τα jails του &os;. Ένα hostname — το hostname το οποίο θα χρησιμοποιηθεί μέσα στο jail. Τα jails χρησιμοποιούνται κυρίως για την εξυπηρέτηση δικτυακών υπηρεσιών, επομένως το να υπάρχει ένα χαρακτηριστικό hostname που να περιγράφει ταυτόχρονα και τη χρήση του, μπορεί να βοηθήσει αρκετά έναν διαχειριστή συστήματος. Μια διεύθυνση IP — αυτή η διεύθυνση θα αντιστοιχεί σε ένα jail και δεν θα μπορεί να αλλάξει κατά τη διάρκεια ζωής ενός jail. Η διεύθυνση IP ενός jail είναι συνήθως μία διεύθυνση τύπου alias για μια ήδη υπάρχουσα διεπαφή δικτύου (network interface), αλλά κάτι τέτοιο δεν είναι απαραίτητο. Μία εντολή — το μονοπάτι ενός εκτελέσιμου το οποίο θα τρέχει μέσα στο jail. Αυτό είναι κάτι σχετικό με το γονικό κατάλογο του περιβάλλοντος του jail, και μπορεί να διαφέρει πολύ από jail σε jail αναλόγως με το κάθε περιβάλλον. Εκτός αυτών, τα jails μπορούν να έχουν τις δικές τους ομάδες χρηστών και τον δικό τους χρήστη root. Εκ του φυσικού, τον έλεγχο που έχει ο χρήστης root περιορίζεται μέσα στο περιβάλλον του jail, και από την οπτική γωνία του host system, ο root του jail δεν είναι παντοδύναμος. Επιπλέον, ο χρήστης root του jail, δεν επιτρέπεται έξω από το περιβάλλον του &man.jail.8; να εκτελεί λειτουργίες οι οποίες είναι κριτικής σημασίας. Περισσότερες πληροφορίες σχετικά τις δυνατότητες και τις απαγορεύσεις του root θα συζητηθούν στο κεφάλαιο below. Δημιουργώντας και ελέγχοντας Jails Μερικοί διαχειριστές συστημάτων κατηγοριοποιούν τα jails σε δύο ενότητες: τα complete jails, τα οποία μιμούνται είναι πραγματικό σύστημα &os;, και τα service jails, τα οποία χρησιμοποιούνται για μια εφαρμογή ή υπηρεσία, που πιθανόν τρέχει με ειδικές άδειες. Αυτός είναι ένας νοητικός διαχωρισμός και δεν επιδρά στη διαδικασία δημιουργίας ενός jail. Η σελίδα man του &man.jail.8; περιέχει κατατοπιστικές πληροφορίες για τη διαδικασία δημιουργίας ενός jail: &prompt.root; setenv D /here/is/the/jail &prompt.root; mkdir -p $D &prompt.root; cd /usr/src &prompt.root; make world DESTDIR=$D &prompt.root; cd etc/ This step is not required on &os; 6.0 and later. &prompt.root; make distribution DESTDIR=$D &prompt.root; mount_devfs devfs $D/dev Το να επιλέξετε μια διαδρομή για το jail σας είναι ο καλύτερος τρόπος για να ξεκινήσετε. Εκεί είναι που θα βρίσκεται ουσιαστικά το jail όσον αφορά το σύστημα σας. Μια καλή ιδέα είναι το /usr/jail/jailname, όπου jailname το hostname με το οποίο θα αναγνωρίζεται το jail. Το σύστημα αρχείων του /usr/ έχει συνήθως αρκετό χώρο για ένα complete jail που ουσιαστικά είναι ένας κλώνος της υπάρχουσας εγκατάστασης του &os;. Η εντολή αυτή θα εμπλουτίσει τον κατάλογο που θα επιλέξετε για το jail με όλα τα απαραίτητα αρχεία, βιβλιοθήκες, σελίδες βοήθειας κλπ. Όλα γίνονται με τον τυπικό τρόπο του &os; — αρχικά τα πάντα μεταγλωττίζονται και στη συνέχεια εγκαθίστανται στη διαδρομή που έχετε επιλέξει. Το distribution target του make εγκαθιστά όλα τα αρχεία ρυθμίσεων. Με απλά λόγια, εγκαθιστά κάθε αρχείο από το /usr/src/etc/ στο /etc του καταλόγου όπου θα βρίσκεται το περιβάλλον του jail: $D/etc/. Δε χρειάζεται να προσαρτήσετε το &man.devfs.8; στο περιβάλλον του jail. Από την άλλη όμως, όλες, ή σχεδόν όλες, οι εφαρμογές χρειάζονται πρόσβαση σε τουλάχιστον μία συσκευή, αναλόγως με τον σκοπό της εφαρμογής. Είναι πολύ σημαντικό να ελέγχεται η πρόσβαση στις συσκευές μέσα στο jail, καθώς οι μη σωστές ρυθμίσεις μπορεί να επιτρέψουν σε κάποιον εισβολές να κάνει 'άσχημα παιχνίδια' μέσα στο jail. Ο έλεγχος του &man.devfs.8; γίνεται μέσω ενός συνόλου κανόνων οι οποίοι περιγράφονται στις σελίδες βοήθειας του &man.devfs.8; και του &man.devfs.conf.5;. Όταν έχετε εγκαταστήσει το jail, μπορεί να εκκινηθεί με τη χρήση της εντολής &man.jail.8;. Η &man.jail.8; δέχεται τέσσερις απαραίτητες παραμέτρους οι οποίες περιγράφονται στο . Μπορούν να δοθούν και άλλοι παράμετροι, π.χ., για να τρέξετε μια διεργασία στο περιβάλλον του jail με τις άδειες ενός συγκεκριμένου χρήστη. Η παράμετρος εξαρτάται στον τύπο του jail. Για ένα εικονικό σύστημα, το /etc/rc είναι μια καλή επιλογή, μιας και στην ουσία θα κλωνοποιήσει την διαδικασία εκκίνησης ενός πραγματικού συστήματος &os;. Για ένα service jail, εξαρτάται από την υπηρεσία ή την εφαρμογή που θα τρέχει μέσα στο jail. Τα jails συνήθως ξεκινούν κατά την εκκίνηση και ο μηχανισμός rc του &os; παρέχει έναν εύκολο τρόπο για να γίνει κάτι τέτοιο. Η λίστα με τα jails που θέλετε να ξεκινάνε κατά την εκκίνηση θα πρέπει να προστεθούν στο αρχείο &man.rc.conf.5;: jail_enable="YES" # Set to NO to disable starting of any jails jail_list="www" # Space separated list of names of jails Για κάθε jail που υπάρχει στο jail_list, θα πρέπει να προστεθεί μια ομάδα από ρυθμίσεις του &man.rc.conf.5;, οι οποίες θα περιγράφουν το συγκεκριμένα jail: jail_www_rootdir="/usr/jail/www" # jail's root directory jail_www_hostname="www.example.org" # jail's hostname jail_www_ip="192.168.0.10" # jail's IP address jail_www_devfs_enable="YES" # mount devfs in the jail jail_www_devfs_ruleset="www_ruleset" # devfs ruleset to apply to jail Η προεπιλεγμένη εκκίνηση του jails στο &man.rc.conf.5;, θα ξεκινήσει το script του jail /etc/rc, το οποίο θα υποθέσει ότι το jail είναι ένα ολοκληρωμένο εικονικό σύστημα. Για service jails, η προεπιλεγμένη εκκίνηση καλό θα είναι να αλλάξει, με το να ορίσετε σωστά την επιλογή jail_jailname_exec_start. Για μια ολόκληρη λίστα των διαθέσιμων επιλογών, δείτε το &man.rc.conf.5;. Το script /etc/rc.d/jail μπορεί να χρησιμοποιηθεί για να ξεκινήσει ή να σταματήσει κάποιο jail χειροκίνητα. Αρκεί όμως να υπάρχει η αντίστοιχη ρύθμιση στο rc.conf: &prompt.root; /etc/rc.d/jail start www &prompt.root; /etc/rc.d/jail stop www Για την ώρα δεν υπάρχει κάποιος απολύτως σωστός τρόπος για να τερματίσετε κάποιο &man.jail.8;. Αυτό συμβαίνει διότι οι εντολές συνήθως που χρησιμοποιούνται για να τερματίσουν με ασφάλεια ένα σύστημα δεν είναι διαθέσιμες μέσα στο περιβάλλον ενός jail. Ο καλύτερος τρόπος για να τερματίσετε ένα jail είναι με το να τρέξετε την ακόλουθη εντολή μέσα από το ίδιο το jail ή με τη χρήση του &man.jexec.8; εκτός του jail: &prompt.root; sh /etc/rc.shutdown Περισσότερες πληροφορίες σχετικά με αυτή τη διαδικασία μπορούν να βρεθούν στη σελίδα βοηθείας του &man.jail.8; Σωστή ρύθμιση και διαχείριση Υπάρχουν αρκετές επιλογές που μπορούν να εφαρμοστούν σε ένα jail, και υπάρχουν διάφοροι τρόποι για να συνδυαστεί ένα jail με το &os; προκειμένου να παράγουν εφαρμογές υψηλού επιπέδου. Η ενότητα αυτή παρουσιάζει: Μερικές από τις διαθέσιμες επιλογές για τις ρυθμίσεις και την ασφάλεια όπως αυτές υλοποιούνται από την εγκατάσταση ενός jail. Μερικές εφαρμογές υψηλού επιπέδου για τη διαχείριση jail, οι οποίες είναι διαθέσιμες μέσω του &os; Ports Collection, και μπορούν να χρησιμοποιηθούν στην υλοποίηση ολοκληρωμένων λύσεων με τη χρήση jails. Εργαλεία συστήματος του &os; για τη ρύθμιση jails Η σωστή ρύθμιση ενός jail γίνεται κατά κύριο λόγο μέσω των μεταβλητών του &man.sysctl.8;. Υπάρχει ένα ειδικό subtree του sysctl το οποίο αποτελεί τη βάση για την οργάνωση όλων των σχετικών επιλογών: η ιεραρχία του security.jail.* στις επιλογές του πυρήνα του &os;. Παρακάτω βρίσκεται μια λίστα με τα κύρια sysctl που σχετίζονται με κάποιο jail και έχουνε πάρει και συγκεκριμένες τιμές. Τα ονόματα θα πρέπει να εξηγούν από μόνα τους περί τίνος πρόκειται. Για περισσότερες πληροφορίες μπορείς να δείτε τις σελίδες βοήθειας των &man.jail.8; και &man.sysctl.8;. security.jail.set_hostname_allowed: 1 security.jail.socket_unixiproute_only: 1 security.jail.sysvipc_allowed: 0 security.jail.enforce_statfs: 2 security.jail.allow_raw_sockets: 0 security.jail.chflags_allowed: 0 security.jail.jailed: 0 Οι μεταβλητές αυτές μπορούν να χρησιμοποιηθούν από τον διαχειριστή του host system προκειμένου να προσθέσει ή να αφαιρέσει περιορισμούς οι οποίοι μπορεί να υπάρχουν εξ αρχής από τον χρήστη root. Υπάρχουν όμως και κάποιοι περιορισμοί οι οποίοι δεν μπορούν να αφαιρεθούν. Ο χρήστης root δεν επιτρέπεται να προσαρτίζει ή να απο-προσαρτίζει ένα σύστημα αρχείων με τη χρήση του &man.jail.8;. Ο root μέσα σε ένα jail ίσως επιτρέπει να φορτώσει ή να αποφορτώσει τους κανόνες (rulesets) του &man.devfs.8;, το firewall, και άλλες διάφορες εργασίες διαχείρισης οι οποίες χρειάζονται τροποποίηση των δεδομένων του πυρήνα, όπως για παράδειγμα να οριστεί το securelevel του πυρήνα. Το βασικό σύστημα του &os; περιέχει τα βασικά εργαλεία για τη προβολή πληροφοριών σχετικά με ένα ενεργό jail, και επίσης για τη ανάθεση συγκεκριμένων εντολών διαχείρισης σε κάποιο jail. Οι εντολές &man.jls.8; και &man.jexec.8; αποτελούν μέρος του βασικού συστήματος του &os;, και μπορούν να χρησιμοποιηθούν για να τις παρακάτω απλές εργασίες: Προβολή λίστας των ενεργών jails και τον αντίστοιχων χαρακτηριστικών τους - jail identifier (JID), διεύθυνση IP, hostname και path. Προσκόλληση σε κάποιο ενεργό jail, από το host system, και εκτέλεση κάποιας εντολής μέσα στο jail ή η εκτέλεση εργασιών διαχείρισης μέσα στο jail. Κάτι τέτοιο είναι ιδιαίτερα χρήσιμο όταν ο χρήστης root τερματίσει με ασφάλεια κάποιο jail. Η εντολή &man.jexec.8; μπορεί να χρησιμοποιηθεί επίσης για να τρέξει κάποιο shell μέσα στο jail προκειμένου να εκτελέσει εργασίες διαχείρισης, για πραάδειγμα: &prompt.root; jexec 1 tcsh Εργαλεία διαχείρισης υψηλού επιπέδου στο &os; Ports Collection Ανάμεσα στις διάφορες εφαρμογές τρίτων κατασκευαστών για τη διαχείριση των jails, ένα από τα ποιο ολοκληρωμένα και χρήσιμα πακέτα είναι το sysutils/jailutils. Αποτελεί ένα σύνολο μικρών εφαρμογών οι οποίες συνεισφέρουν στη διαχείριση του&man.jail.8;. Για περισσότερες πληροφορίες δείτε στον δικτυακό του τόπο. Εφαρμογή των Jails Daniel Gerzo Συνεισφορά του Service Jails Η ενότητα αυτή είναι βασισμένη στην ιδέα που παρουσιάστηκε από τον &a.simon; στο , και από ένα ανανεομένο άρθρο Ken Tom locals@gmail.com. Σε αυτή την ενότητα περιγράφεται πως να ρυθμίσετε το &os; προκειμένου να προσθέστε ένα επιπλέον επίπεδο ασφάλειας, με τη χρήση του &man.jail.8;. Υποθέτουμε όμως ότι το σύστημα τρέχει τουλάχιστον RELENG_6_0 και ότι όλες οι προηγούμενες πληροφορίες του κεφαλαίου έχουν κατανοηθεί. Σχεδιασμός Ένα από τα σημαντικότερα προβλήματα με τα jails είναι η διαδικασία των αναβαθμίσεων. Αυτό τείνει να είναι ένα πρόβλημα διότι το κάθε jail θα πρέπει να ξανά δημιουργηθεί από την αρχή. H διαδικασία αναβάθμισης είναι σχετικά εύκολη, αλλά μπορεί να σας πάρει πολύ χρόνο ένα έχετε πολλά jails. Οι παρακάτω ρυθμίσεις προϋποθέτουν εμπειρία με το &os; και τη χρήση των διάφορων χαρακτηριστικών του. Εάν τα παρακάτω βήματα σας φαίνονται πολύ περίπλοκα, τότε είναι καλύτερα να ρίξετε μια ματιά σε κάτι ποιο απλό όπως το sysutils/ezjail, το οποίο παρέχει έναν ευκολότερο τρόπο διαχείρισης των jails του &os; και δεν είναι τόσο προχωρημένο όσο οι παρακάτω ρυθμίσεις. Αυτή η ιδέα έχει παρουσιαστεί για να λύσει τέτοιου είδους προβλήματα με το να μοιράζεστε όσο το δυνατόν περισσότερο μεταξύ των jails, με έναν ασφαλή όμως τρόπο — χρησιμοποιώντας χωρίς τη δυνατότητα εγγραφής τις προσαρτήσεις &man.mount.nullfs.8;, έτσι ώστε η αναβάθμιση να είναι ευκολότερη, και το να τοποθετείτε συγκεκριμένες υπηρεσίας μέσα σε μεμονωμένα jails είναι πολύ πιο επιθυμητό. Επιπλέον, παρέχει έναν απλό τρόπο για να προσθέσετε και να αφαιρέσετε jails όπως επίσης και να τα αναβαθμίσετε. Οι υπηρεσίες που χρησιμοποιούμε στα παραδείγματα μας είναι: ένας HTTP server, ένας DNS server, ένας SMTP server, κλπ. Οι στόχοι των παρακάτω ρυθμίσεων είναι: Δημιουργία απλών και κατανοητών jails. Αυτό σημαίνει ότι δεν θα τρέξουμε ένα ολόκληρο installworld σε κάθε jail. Εύκολη πρόσθεση και αφαίρεση jails. Εύκολη αναβάθμιση υπαρχόντων jails. Δημιουργία παραμετροποιημένου τμήματος του &os;. Όσο περισσότερη ασφάλεια είναι δυνατόν. Όσο το δυνατόν λιγότερη χρήση του χώρου και των inodes. Όπως έχουμε ήδη πει, ο σχεδιασμός εξαρτάται πολύ από την ύπαρξη ενός αρχικού template στο οποίο δεν επιτρέπει η εγγραφή δεδομένων (γνωστό ως nullfs) και πρέπει να έχει προσαρτηθεί σε κάθε jail όπως επίσης και στο να υπάρχει μια συσκευή για κάθε jail όπου να επιτρέπει τόσο την ανάγνωση όσο και την εγγραφή. Μια συσκευή μπορεί να είναι κάποιος ξεχωριστός φυσικός δίσκος, μια κατάτμηση, ή κάποια συσκευή vnode &man.md.4;. Στο παρακάτω παράδειγμα, θα χρησιμοποιήσουμε αναγνώσιμες και εγγράψιμες προσαρτήσεις τύπου nullfs. Το σύστημα αρχείων περιγράφεται με τον παρακάτω τρόπο: Κάθε jail θα προσαρτίζεται κάτω από τον κατάλογο /home/j. Το /home/j/mroot είναι το template για το κάθε jail και η μόνο αναγνώσιμη κατάτμηση για όλα τα jails. Ένας κενός κατάλογος θα δημιουργηθεί για κάθε jail κάτω από τον κατάλογο /home/j. Κάθε jail θα έχει έναν κατάλογο /s, ο οποίος θα είναι ένας σύνδεσμος στο εγγράψιμο μέρος του συστήματος. Κάθε jail θα έχει το δικό εγγράψιμο μέρος το οποίο θα βιασίζεται στο /home/j/skel. Κάθε jailspace (το εγγράψιμο μέρος κάθε jail) θα πρέπει να δημιουργηθεί στον κατάλογο /home/js. Όλα αυτά προϋποθέτουν ότι τα jails βρίσκονται κάτω από τον κατάλογο /home. Αυτό βέβαια μπορεί να αλλάξει σε οτιδήποτε εσείς θέλετε, αλλά θα επηρεάσει όλα τα παρακάτω παραδείγματα. Δημιουργώντας το Template Η ενότητα αυτή θα περιγράψει τα βήματα που χρειάζονται προκειμένου να δημιουργήσετε ένα πρωταρχικό template το οποίο θα είναι το μόνο αναγνώσιμο κομμάτι των jails. Είναι πάντα μια καλή ηδέα να αναβαθμίζεται το &os; στη τελευταία έκδοση -RELEASE. Ελέγξτε το αντίστοιχο Κεφάλαιο προκειμένου να πραγματοποιήσετε κάτι τέτοιο. Στη περίπτωση όπου η αναβάθμιση δεν είναι εφικτή, θα χρειαστεί το buildworld για να μπορέσετε να συνεχίσετε. Επιπλέον θα χρειαστείτε το πακέτο sysutils/cpdup. Θα χρησιμοποιήσουμε την εντολή &man.portsnap.8; για να κατεβάσουμε το &os; Ports Collection. Το Κεφάλαιο Portsnap είναι πάντα ένα καλό ανάγνωσμα για τους νέους νεοεισερχόμενους. Αρχικά, δημιουργήστε έναν σωστά δομημένο κατάλογο στον οποίο δεν θα επιτρέπονται οι εγγραφές, και θα περιέχει τα binaries του &os; για τα jails. Στη συνέχεια πηγαίνετε στον κατάλογο όπου βρίσκονται τα αρχεία του &os; και εγκαταστήστε τα αντίστοιχα αρχεία στο jail template:: &prompt.root; mkdir /home/j /home/j/mroot &prompt.root; cd /usr/src &prompt.root; make installworld DESTDIR=/home/j/mroot Επόμενο βήμα είναι να προετοιμάσετε το &os; Ports Collection για τα jails όπως επίσης ένα &os; source tree, το οποίο θα χρειαστεί για το mergemaster: &prompt.root; cd /home/j/mroot &prompt.root; mkdir usr/ports &prompt.root; portsnap -p /home/j/mroot/usr/ports fetch extract &prompt.root; cpdup /usr/src /home/j/mroot/usr/src Δημιουργήστε το σκελετό για το μέρος του συστήματος όπου επιτρέπονται οι εγγραφές: &prompt.root; mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles &prompt.root; mv etc /home/j/skel &prompt.root; mv usr/local /home/j/skel/usr-local &prompt.root; mv tmp /home/j/skel &prompt.root; mv var /home/j/skel &prompt.root; mv root /home/j/skel Χρησιμοποιείστε το mergemaster για να εγκαταστήσετε αρχεία των ρυθμίσεων που λείπουν. Στη συνέχεια διαγράψτε όλους τους καταλόγους που δημιουργεί το mergemaster: &prompt.root; mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i &prompt.root; cd /home/j/skel &prompt.root; rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev Τώρα, δημιουργείστε συνδέσμους από τον κατάλογο όπου επιτρέπονται οι εγγραφές στον κατάλογο όπου απαγορεύονται. Βεβαιωθείτε ότι οι σύνδεσμοι έχουν δημιουργηθεί στο σωστό μέρος s/. Πραγματικοί κατάλογοι ή δημιουργία καταλόγων σε λάθος μέρος θα κάνουν την εγκατάσταση να αποτύχει. &prompt.root; cd /home/j/mroot &prompt.root; mkdir s &prompt.root; ln -s s/etc etc &prompt.root; ln -s s/home home &prompt.root; ln -s s/root root &prompt.root; ln -s ../s/usr-local usr/local &prompt.root; ln -s ../s/usr-X11R6 usr/X11R6 &prompt.root; ln -s ../../s/distfiles usr/ports/distfiles &prompt.root; ln -s s/tmp tmp &prompt.root; ln -s s/var var Σαν τελευταίο βήμα, δημιουργήστε το αρχείο /home/j/skel/etc/make.conf με τα παρακάτω δεδομένα: WRKDIRPREFIX?= /s/portbuild Έχοντας ορίσει το WRKDIRPREFIX με αυτόν τον τρόπο, θα μας επιτρέψει να μεταγλωττίσουμε τα &os; ports μέσα στο κάθε jail. Θυμηθείτε ότι ο κατάλογος των ports είναι μέρος του καταλόγου όπου δεν επιτρέπονται οι εγγραφές. directory is part of the read-only system. Η εναλλακτική διαδρομή για το WRKDIRPREFIX επιτρέπει την δημιουργία και εγκατάσταση αρχείων στο εγγράψιμο μέρος του κάθε jail. Δημιουργώντας Jails Τώρα που έχουμε ένα ολοκληρωμένο &os; jail template, μπορούμε να εγκαταστήσουμε και να ρυθμίσουμε τα jails στο /etc/rc.conf. Το παράδειγμα αυτό δείχνει τη δημιουργία τριών jails: NS, MAIL και WWW. Εισάγετε τις παρακάτω γραμμές στο αρχείο /etc/fstab, ώστε το αναγνώσιμο template για τα jails και ο εγγράψιμος χόρος να είναι διαθέσιμα στα αντίστοιχα jails: /home/j/mroot /home/j/ns nullfs ro 0 0 /home/j/mroot /home/j/mail nullfs ro 0 0 /home/j/mroot /home/j/www nullfs ro 0 0 /home/js/ns /home/j/ns/s nullfs rw 0 0 /home/js/mail /home/j/mail/s nullfs rw 0 0 /home/js/www /home/j/www/s nullfs rw 0 0 Οι κατατμήσεις που είναι σημειωμένες με 0 pass number δεν ελέγχονται κατά την εκκίνηση από το &man.fsck.8;, και οι κατατμήσεις σημειωμένες με 0 dump number δεν έχουν τα δεδομένα τους σωμένα από το &man.dump.8;. Εμείς δεν θέλουμε το fsck να ελέγχει τα nullfs που έχουμε ούτε το dump να κρατά αντίγραφα από το αναγνώσιμο σύστημα αρχείων nullfs. Αυτός είναι ο λόγος που είναι σημειωμένα με 0 0 στις δύο τελευταίες στήλες της κάθε εγγραφής του fstab. Ρυθμίστε τα jails στο /etc/rc.conf: jail_enable="YES" jail_set_hostname_allow="NO" jail_list="ns mail www" jail_ns_hostname="ns.example.org" jail_ns_ip="192.168.3.17" jail_ns_rootdir="/home/j/ns" jail_ns_devfs_enable="YES" jail_mail_hostname="mail.example.org" jail_mail_ip="192.168.3.18" jail_mail_rootdir="/home/j/mail" jail_mail_devfs_enable="YES" jail_www_hostname="www.example.org" jail_www_ip="62.123.43.14" jail_www_rootdir="/home/j/www" jail_www_devfs_enable="YES" Δημιουργείστε τα απαραίτητα σημεία προσαρτήσεων για το αναγνώσιμο μέρος του κάθε jail: &prompt.root; mkdir /home/j/ns /home/j/mail /home/j/www Εγκαταστήστε το εγγράψιμο template μέσα στο κάθε jail. Προσέξτε εδώ τη χρήση του sysutils/cpdup, το οποίο επιβεβαιώνει ότι υπάρχουν τα σωστά αντίγραφα του κάθε καταλόγου: &prompt.root; mkdir /home/js &prompt.root; cpdup /home/j/skel /home/js/ns &prompt.root; cpdup /home/j/skel /home/js/mail &prompt.root; cpdup /home/j/skel /home/js/www Σε αυτή τη φάση, τα jails έχουνε δημιουργηθεί και είναι έτοιμα να ξεκινήσουν. Πρώτα όμως, πρέπει να προσαρτίσετε το σωστό σύστημα αρχείων για το κάθε jail, και στη συνέχεια να τα εκκινήσετε με τη χρήση του /etc/rc.d/jail: &prompt.root; mount -a &prompt.root; /etc/rc.d/jail start Τα jails θα πρέπει τώρα να τρέχουν κανονικά. Γα να ελέγξετε εάν έχουν ξεκινήσει σωστά, χρησιμοποιείστε την εντολή &man.jls.8;. Θα πρέπει να τυπώσει δεδομένα παραπλήσια με τα παρακάτω: &prompt.root; jls JID IP Address Hostname Path 3 192.168.3.17 ns.example.org /home/j/ns 2 192.168.3.18 mail.example.org /home/j/mail 1 62.123.43.14 www.example.org /home/j/www Σε αυτό το σημείο, θα πρέπει να μπορείτε να συνδεθείτε σε κάθε jail, να προσθέσετε νέους χρήστες ή να ρυθμίσετε υπηρεσίες. Η στήλη JID δηλώνει το χαρακτηριστικό αριθμό διεργασίας του κάθε ενεργού jail. Χρησιμοποιείστε τη παρακάτω εντολή προκειμένου να εκτελέσετε εργασίες σχετικά με τη διαχείριση του jail, του οποίου το JID είναι 3: &prompt.root; jexec 3 tcsh Αναβάθμιση Κάποια στιγμή, θα χρειαστεί να αναβαθμίσετε το σύστημά σας σε μια νέα έκδοση του &os;. Είτε για λόγους ασφάλειας, είτε γιατί υπάρχουν νέα χαρακτηριστικά στη νέα έκδοση τα οποία είναι χρήσιμα για τα jails που ήδη έχετε. Η παρακάτω διαδικασία σας παρέχει έναν εύκολο τρόπο να αναβαθμίσετε τα υπάρχοντα jails. Επιπλέον, ελαχιστοποιεί το χρόνο αποσύνδεσης των jails, μιας και θα βρεθούν εκτός σύνδεσης μόνο για μερικά λεπτά. Επίσης, παρέχει έναν τρόπο να γυρίσετε σε παλαιότερες εκδόσεις εάν προκόψουν τα οποιαδήποτε σφάλματα. Το πρώτο βήμα είναι να αναβαθμίσετε το σύστημα στο οποίο φιλοξενούνται τα jails. Στη συνέχεια δημιουργήστε ένα νέο προσωρινό template κατάλογο, χωρίς τη δυνατότητα εγγραφής δεδομένων σε αυτόν, στο /home/j/mroot2. &prompt.root; mkdir /home/j/mroot2 &prompt.root; cd /usr/src &prompt.root; make installworld DESTDIR=/home/j/mroot2 &prompt.root; cd /home/j/mroot2 &prompt.root; cpdup /usr/src usr/src &prompt.root; mkdir s Το installworld δημιουργεί μερικούς καταλόγους που δε χρειάζονται πραγματικά και θα πρέπει να διαγραφούν: &prompt.root; chflags -R 0 var &prompt.root; rm -R etc var root usr/local tmp Ξανά δημιουργήστε τους συνδέσμους μεταξύ του εγγράψιμου μέρους: &prompt.root; ln -s s/etc etc &prompt.root; ln -s s/root root &prompt.root; ln -s s/home home &prompt.root; ln -s ../s/usr-local usr/local &prompt.root; ln -s ../s/usr-X11R6 usr/X11R6 &prompt.root; ln -s s/tmp tmp &prompt.root; ln -s s/var var Τώρα είναι η σωστή στιγμή για να σταματήσετε τα jails: &prompt.root; /etc/rc.d/jail stop Αποπροσαρτίστε τα προσαρτησμένα συστήματα αρχείων: &prompt.root; umount /home/j/ns/s &prompt.root; umount /home/j/ns &prompt.root; umount /home/j/mail/s &prompt.root; umount /home/j/mail &prompt.root; umount /home/j/www/s &prompt.root; umount /home/j/www Τα αναγνώσιμα μέρη είναι προσαρτημένα στο αναγνώσιμο κατάλογο και θα πρέπει να αποπροσαρτηθούν πρώτα.(/s). Μετακινήστε τον παλιό αναγνώσιμο κατάλογο και αντικαταστήστε τον με τον καινούργιο. Αυτός θα κρατάει τα αντίγραφα ασφαλείας και θα αρχειοθετεί το παλαιό αναγνώσιμο σύστημα αρχείων σε περίπτωση που το χρειαστείτε. Ο τρόπος ονομασίας που ακολουθήσαμε εδώ αντιστοιχεί στο πότε δημιουργήσαμε ένα νέο αναγνώσιμο σύστημα αρχείων. Μετακινήστε το αρχικό &os; Ports Collection στο νέο σύστημα αρχείων προκειμένου να σώσετε χόρο και inodes: &prompt.root; cd /home/j &prompt.root; mv mroot mroot.20060601 &prompt.root; mv mroot2 mroot &prompt.root; mv mroot.20060601/usr/ports mroot/usr Σε αυτό το σημείο το αναγνώσιμο template είναι έτοιμο, οπότε το μόνο που απομένει είναι να προσαρτίσετε ξανά το σύστημα αρχείων και να ξεκινήσετε τα jails: &prompt.root; mount -a &prompt.root; /etc/rc.d/jail start Χρησιμοποιείτε την εντολή &man.jls.8; για να ελέγξετε εάν τα jails ξεκίνησαν σωστά. Μην ξεχάσετε να τρέξετε το mergemaster για το κάθε jail. Τα αρχεία ρυθμίσεων θα χρειαστεί να έχουν αναβαθμιστεί όπως επίσης και τα rc.d scripts.