Πώς να χρησιμοποιήσετε την εντολή chroot στο Linux

Η εντολή chroot μπορεί να σας στείλει στη φυλακή, να διατηρήσει τα περιβάλλοντα ανάπτυξης ή δοκιμής σας απομονωμένα ή απλώς να βελτιώσει την ασφάλεια του συστήματός σας. Σας δείχνουμε τον πιο εύκολο τρόπο να το χρησιμοποιήσετε.

Τι είναι το chroot;

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

Σε συζητήσεις με χρήστες Linux – αυτοπροσώπως και σε φόρουμ – φαίνεται ότι η εντολή chroot είναι μια εντολή που χαρακτηρίζεται ως δύσκολη στη χρήση ή πολύ κουραστική και κουραστική στη ρύθμιση. Φαίνεται ότι αυτό το καταπληκτικό βοηθητικό πρόγραμμα δεν χρησιμοποιείται όσο θα μπορούσε να χρησιμοποιηθεί.

Με το chroot μπορείτε να ρυθμίσετε και εκτελέστε προγράμματα ή διαδραστικά κελύφη όπως το Bash σε ένα ενθυλακωμένο σύστημα αρχείων που δεν επιτρέπεται να αλληλεπιδρά με το κανονικό σας σύστημα αρχείων. Τα πάντα μέσα στο περιβάλλον chroot είναι γραμμένα και περιέχονται. Τίποτα στο περιβάλλον chroot δεν μπορεί να δει έξω από τον δικό του, ειδικό, ριζικό κατάλογο χωρίς να κλιμακωθεί σε δικαιώματα root. Αυτό έχει κερδίσει αυτό το είδος περιβάλλοντος το παρατσούκλι του chroot jail. Ο όρος «φυλακή» δεν πρέπει να συγχέεται με του FreeBSD εντολή jail, η οποία δημιουργεί ένα περιβάλλον chroot αυτό είναι πιο ασφαλές από το συνηθισμένο περιβάλλον chroot.

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

Πότε πρέπει να χρησιμοποιήσετε ένα chroot;

Ένα περιβάλλον chroot παρέχει λειτουργικότητα παρόμοια με αυτή μιας εικονικής μηχανής, αλλά είναι μια πιο ελαφριά λύση. Το δεσμευμένο σύστημα δεν χρειάζεται hypervisor για εγκατάσταση και διαμόρφωση, όπως π.χ VirtualBox ή Διευθυντής εικονικής μηχανής. Ούτε χρειάζεται να έχει εγκατεστημένο πυρήνα στο δεσμευμένο σύστημα. Το δεσμευμένο σύστημα μοιράζεται τον υπάρχοντα πυρήνα σας.

Από ορισμένες απόψεις, τα περιβάλλοντα chroot είναι πιο κοντά σε δοχεία όπως π.χ LXC παρά σε εικονικές μηχανές. Είναι ελαφριά, γρήγορα στην ανάπτυξη και η δημιουργία και η εκτόξευση ενός μπορεί να αυτοματοποιηθεί. Όπως και τα κοντέινερ, ένας βολικός τρόπος για να τα διαμορφώσετε είναι να εγκαταστήσετε αρκετή ποσότητα του λειτουργικού συστήματος για να επιτύχετε αυτό που απαιτείται. Η ερώτηση “τι απαιτείται” απαντάται εξετάζοντας πώς θα χρησιμοποιήσετε το περιβάλλον chroot σας.

Μερικές κοινές χρήσεις είναι:

Ανάπτυξη Λογισμικού και Επαλήθευση Προϊόντος. Οι προγραμματιστές γράφουν λογισμικό και η ομάδα επαλήθευσης προϊόντος (PV) το δοκιμάζει. Μερικές φορές εντοπίζονται προβλήματα από το PV που δεν μπορούν να αναπαραχθούν στον υπολογιστή του προγραμματιστή. Ο προγραμματιστής έχει όλα τα είδη εργαλείων και βιβλιοθηκών εγκατεστημένα στον υπολογιστή ανάπτυξης που ο μέσος χρήστης —και το PV— δεν θα έχει. Συχνά, νέο λογισμικό που λειτουργεί για τον προγραμματιστή αλλά όχι για άλλους αποδεικνύεται ότι χρησιμοποιεί έναν πόρο στον υπολογιστή του προγραμματιστή που δεν έχει συμπεριληφθεί στη δοκιμαστική έκδοση του λογισμικού. Το chroot επιτρέπει στους προγραμματιστές να έχουν ένα απλό περιβάλλον αιχμαλωσίας βανίλιας στον υπολογιστή τους στο οποίο μπορούν να βουτήξουν το λογισμικό πριν το δώσουν στο PV. Το αιχμάλωτο περιβάλλον μπορεί να διαμορφωθεί με τις ελάχιστες εξαρτήσεις που απαιτεί το λογισμικό.

  Πώς να συμπιέσετε αρχεία PNG στο Linux

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

Εκτέλεση καταργημένου λογισμικού. Μερικές φορές πρέπει απλώς να έχετε μια παλιά έκδοση κάτι που τρέχει. Εάν το παλιό λογισμικό έχει απαιτήσεις που θα συγκρούονταν ή θα ήταν ασύμβατες με την έκδοση του Linux, μπορείτε να κάνετε chroot ένα περιβάλλον για το προβληματικό λογισμικό.

Ανάκτηση και αναβαθμίσεις συστήματος αρχείων: Εάν μια εγκατάσταση Linux δεν λειτουργεί, μπορείτε να χρησιμοποιήσετε το chroot για να προσαρτήσετε το κατεστραμμένο σύστημα αρχείων σε ένα σημείο προσάρτησης σε ένα Live CD. Αυτό σας επιτρέπει να εργαστείτε στο κατεστραμμένο σύστημα και να προσπαθήσετε να το διορθώσετε σαν να ήταν κανονικά τοποθετημένο στο root /. Αυτό σημαίνει ότι οι αναμενόμενες διαδρομές αρχείων εντός του κατεστραμμένου συστήματος θα αναφέρονται σωστά από τον ριζικό κατάλογο και όχι από το σημείο προσάρτησης του Live CD. Μια παρόμοια τεχνική χρησιμοποιήθηκε στο άρθρο που περιγράφει τον τρόπο μετεγκατάστασης του συστήματος αρχείων Linux από το ext2 ή το ext3 στο ext4.

Εφαρμογές Ringfencing. Η εκτέλεση ενός διακομιστή FTP ή άλλης συσκευής συνδεδεμένης στο Διαδίκτυο μέσα σε περιβάλλον chroot περιορίζει τη ζημιά που μπορεί να προκαλέσει ένας εξωτερικός εισβολέας. Αυτό μπορεί να είναι ένα πολύτιμο βήμα για την ενίσχυση της ασφάλειας του συστήματός σας.

Δημιουργία Περιβάλλοντος chroot

Χρειαζόμαστε έναν κατάλογο για να λειτουργεί ως ο ριζικός κατάλογος του περιβάλλοντος chroot. Για να έχουμε έναν συνοπτικό τρόπο αναφοράς σε αυτόν τον κατάλογο, θα δημιουργήσουμε μια μεταβλητή και θα αποθηκεύσουμε το όνομα του καταλόγου σε αυτήν. Εδώ ρυθμίζουμε μια μεταβλητή για την αποθήκευση μιας διαδρομής στον κατάλογο “testroot”. Δεν έχει σημασία αν αυτός ο κατάλογος δεν υπάρχει ακόμα, θα τον δημιουργήσουμε σύντομα. Εάν ο κατάλογος υπάρχει, θα πρέπει να είναι κενός.

chr=/home/dave/testroot

Εάν ο κατάλογος δεν υπάρχει, πρέπει να τον δημιουργήσουμε. Μπορούμε να το κάνουμε αυτό με αυτήν την εντολή. Η επιλογή -p (γονείς) διασφαλίζει ότι τυχόν γονικοί κατάλογοι που λείπουν δημιουργούνται ταυτόχρονα:

mkdir -p $chr

Πρέπει να δημιουργήσουμε καταλόγους για να κρατήσουμε τα τμήματα του λειτουργικού συστήματος που θα απαιτήσει το περιβάλλον chroot μας. Θα δημιουργήσουμε ένα μινιμαλιστικό περιβάλλον Linux που χρησιμοποιεί το Bash ως διαδραστικό κέλυφος. Θα συμπεριλάβουμε επίσης τις εντολές touch, rm και ls. Αυτό θα μας επιτρέψει να χρησιμοποιήσουμε όλες τις ενσωματωμένες εντολές του Bash και τα αγγίγματα, rm και ls. Θα μπορούμε να δημιουργήσουμε, να καταγράψουμε και να αφαιρέσουμε αρχεία και να χρησιμοποιήσουμε το Bash. Και — σε αυτό το απλό παράδειγμα — αυτό είναι όλο.

  Πώς να ενημερώσετε το υποσύστημα των Windows για Linux στα Windows 10

Καταχωρίστε τους καταλόγους που πρέπει να δημιουργήσετε στο {} επέκταση του νάρθηκα.

mkdir -p $chr/{bin,lib,lib64}

Τώρα θα αλλάξουμε τον κατάλογο στον νέο μας ριζικό κατάλογο.

cd $chr

Ας αντιγράψουμε τα δυαδικά αρχεία που χρειαζόμαστε στο μινιμαλιστικό μας περιβάλλον Linux από τον κανονικό σας κατάλογο “/bin” στον κατάλογό μας “/bin” chroot. Η επιλογή -v (verbose) κάνει το cp να μας λέει τι κάνει καθώς εκτελεί κάθε ενέργεια αντιγραφής.

cp -v /bin/{bash,touch,ls,rm} $chr

Τα αρχεία αντιγράφονται για εμάς:

Αυτά τα δυαδικά αρχεία θα έχουν εξαρτήσεις. Πρέπει να ανακαλύψουμε τι είναι και να αντιγράψουμε αυτά τα αρχεία και στο περιβάλλον μας, διαφορετικά τα bash, touch, rm και ls δεν θα μπορούν να λειτουργήσουν. Πρέπει να το κάνουμε αυτό με τη σειρά μας για κάθε μία από τις εντολές που επιλέξαμε. Θα κάνουμε πρώτα το Bash. Η εντολή ldd θα απαριθμήστε τις εξαρτήσεις για εμάς.

ldd /bin/bash

Οι εξαρτήσεις προσδιορίζονται και παρατίθενται στο παράθυρο τερματικού:

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

Ευτυχώς, μπορούμε να το ημι-αυτοματοποιήσουμε. Θα απαριθμήσουμε ξανά τις εξαρτήσεις και αυτή τη φορά θα σχηματίσουμε μια λίστα. Στη συνέχεια, θα κάνουμε κύκλο στη λίστα αντιγράφοντας τα αρχεία.

Εδώ χρησιμοποιούμε το ldd για να απαριθμήσουμε τις εξαρτήσεις και να τροφοδοτήσουμε τα αποτελέσματα μέσω ενός σωλήνα στο egrep. Η χρήση του egrep είναι η ίδια με τη χρήση του grep με την επιλογή -E (εκτεταμένες κανονικές εκφράσεις). Η επιλογή -o (μόνο αντιστοίχιση) περιορίζει την έξοδο στα αντίστοιχα μέρη των γραμμών. Αναζητούμε αρχεία βιβλιοθήκης που ταιριάζουν και τελειώνουν σε έναν αριθμό [0-9].

list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"

Μπορούμε να ελέγξουμε τα περιεχόμενα της λίστας χρησιμοποιώντας το echo:

echo $list

Τώρα που έχουμε τη λίστα, μπορούμε να την προχωρήσουμε με τον ακόλουθο βρόχο, αντιγράφοντας τα αρχεία ένα κάθε φορά. Χρησιμοποιούμε τη μεταβλητή i για να προχωρήσουμε στη λίστα. Για κάθε μέλος της λίστας, αντιγράφουμε το αρχείο στον ριζικό μας κατάλογο chroot που είναι η τιμή που διατηρείται στο $chr.

Η επιλογή -v (verbose) αναγκάζει το cp να ανακοινώνει κάθε αντίγραφο καθώς το εκτελεί. Η επιλογή –parents διασφαλίζει ότι τυχόν γονικοί κατάλογοι που λείπουν δημιουργούνται στο περιβάλλον chroot.

for i in $list; do cp -v --parents "$i" "${chr}"; done

για το i στη λίστα $;  κάντε cp -v --parents

Και αυτό είναι το αποτέλεσμα:

  Πώς να ενεργοποιήσετε την υποστήριξη Nvidia Optimus σε Linux

Θα χρησιμοποιήσουμε αυτήν την τεχνική για να καταγράψουμε τις εξαρτήσεις καθεμιάς από τις άλλες εντολές. Και θα χρησιμοποιήσουμε την τεχνική βρόχου για να εκτελέσουμε την πραγματική αντιγραφή. Τα καλά νέα είναι ότι χρειάζεται μόνο να κάνουμε μια μικρή τροποποίηση στην εντολή που συγκεντρώνει τις εξαρτήσεις.

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

Εδώ έχουμε χρησιμοποιήσει το πλήκτρο επάνω βέλους για να βρούμε την εντολή και την έχουμε επεξεργαστεί για να πούμε touch αντί για bash.

list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"

Μπορούμε τώρα να επαναλάβουμε την ίδια ακριβώς εντολή βρόχου όπως πριν:

for i in $list; do cp -v --parents "$i" "${chr}"; done

για το i στη λίστα $;  κάντε cp -v --parents

Και τα αρχεία μας αντιγράφονται για εμάς:

Μπορούμε τώρα να επεξεργαστούμε τη γραμμή εντολών της λίστας για το ls:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Και πάλι, θα χρησιμοποιήσουμε την ίδια εντολή βρόχου. Δεν με νοιάζει ποια αρχεία υπάρχουν στη λίστα. Λειτουργεί τυφλά μέσω της λίστας αντιγράφοντας τα αρχεία για εμάς.

for i in $list; do cp -v --parents "$i" "${chr}"; done

για το i στη λίστα $;  κάντε cp -v --parents

Και οι εξαρτήσεις για το ls αντιγράφονται για εμάς:

Επεξεργαζόμαστε τη γραμμή εντολών της λίστας για τελευταία φορά, κάνοντάς την να λειτουργεί για rm:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Χρησιμοποιούμε την εντολή αντιγραφής βρόχου για τελευταία φορά:

for i in $list; do cp -v --parents "$i" "${chr}"; done

Οι τελευταίες από τις εξαρτήσεις μας αντιγράφονται στο περιβάλλον μας chroot. Είμαστε επιτέλους έτοιμοι να χρησιμοποιήσουμε την εντολή chroot. Αυτή η εντολή ορίζει τη ρίζα του περιβάλλοντος chroot και καθορίζει ποια εφαρμογή θα εκτελείται ως κέλυφος.

sudo chroot $chr /bin/bash

Το chroot περιβάλλον μας είναι πλέον ενεργό. Η προτροπή παραθύρου τερματικού έχει αλλάξει και το διαδραστικό κέλυφος είναι ο χειρισμός του κελύφους bash στο περιβάλλον μας.

Μπορούμε να δοκιμάσουμε τις εντολές που έχουμε φέρει στο περιβάλλον.

ls
ls /home/dave/Documents

Η εντολή ls λειτουργεί όπως θα περιμέναμε όταν τη χρησιμοποιούμε στο περιβάλλον. Όταν προσπαθούμε να αποκτήσουμε πρόσβαση σε έναν κατάλογο εκτός του περιβάλλοντος, η εντολή αποτυγχάνει.

Μπορούμε να χρησιμοποιήσουμε το touch για να δημιουργήσουμε ένα αρχείο, το ls για να το παραθέσουμε και το rm για να το αφαιρέσουμε.

touch sample_file.txt
ls
rm sample_file.txt
ls

Φυσικά, μπορούμε να χρησιμοποιήσουμε και τις ενσωματωμένες εντολές που παρέχει το κέλυφος του Bash. Εάν πληκτρολογήσετε βοήθεια στη γραμμή εντολών, το Bash θα σας τις παραθέσει.

help

Χρησιμοποιήστε την έξοδο για έξοδο από το περιβάλλον chroot:

exit

Εάν θέλετε να καταργήσετε το περιβάλλον chroot, μπορείτε απλά να το διαγράψετε:

rm -r testroot/

Αυτό θα διαγράψει αναδρομικά τα αρχεία και τους καταλόγους στο περιβάλλον chroot.

Αυτοματοποίηση για ευκολία

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