217 lines
21 KiB
TeX
217 lines
21 KiB
TeX
\chapter{Εισαγωγή} \label{introduction}
|
||
|
||
Παραδοσιακά, όταν ήθελε κάποιος χρήστης/εταιρεία να παράσχει μια υπηρεσία, στο
|
||
ευρύ κοινό θα έπρεπε να διαθέσει ένα ````Χ'''' κεφάλαιο για την αγορά
|
||
εξοπλισμού. Σε περίπτωση που η υπηρεσία αυτή ετύγχανε ευρείας αποδοχής
|
||
καθίστατο επιτακτική η ανάγκη της επέκτασης του υφιστάμενου εξοπλισμού αλλά και
|
||
η μεταφορά όλων των υπαρχόντων πόρων λογισμικού (βάσεις δεδομένων
|
||
(\textlatin{Databases}), λογισμικό της υπηρεσίας, αρχείων ρυθμίσεων, κ.λπ.) σε
|
||
αυτό. Η παραπάνω διαδικασία απαιτούσε επιπλέον κεφάλαιο και αρκετές εργατοώρες
|
||
προκειμένου να γίνει πράξη. Στις αρχές του 2000 ο τρόπος διεξαγωγής της
|
||
παραπάνω διαδικασίας άλλαξε ριζικά όταν η \textlatin{Amazon} για πρώτη φορά
|
||
προσέφερε την υπηρεσία \textlatin{AWS}. Έπειτα, πολλές εταιρίες όπως η
|
||
\textlatin{Google}, \textlatin{IBM} και \textlatin{Mirosoft} άρχισαν να
|
||
προσφέρουν και αυτές υπηρεσίες τύπου \textlatin{IaaS}.
|
||
|
||
\section{\textlatin{Cloud Computing}} \label{cloudComputing}
|
||
|
||
Ο όρος \textlatin{Cloud Computing} δεν είναι καινούριος. Ήρθε στο προσκήνιο
|
||
χάρη στην \textlatin{Amazon} όταν κοντά στο 2000 δημιούργησε τη θυγατρική της,
|
||
\textlatin{AWS} ψάχνοντας τρόπους να κλιμακώσει τις υπηρεσίες που προσέφερε
|
||
στον τομέα του \textlatin{e-commerce}. Από τότε πολλές εταιρίες όπως αυτές που
|
||
προαναφέρθηκαν στο κεφάλαιο [\ref{introduction}] αλλά και άλλες όπως
|
||
\textlatin{Linode}, \textlatin{Vultr} και \textlatin{Digital Ocean}, προσφέρουν
|
||
\textlatin{Cloud Computing} ως την κύρια υπηρεσία τους δίνοντας τη δυνατότητα
|
||
διάθεσης υπολογιστικών πόρων στους χρήστες με τη μορφή ενοικίασης ιδεατών
|
||
μηχανών. Ο έλεγχος τους γίνεται μέσω ενός \textlatin{API} με το οποίο
|
||
επικοινωνεί κανείς είτε μέσω γραφικού περιβάλλοντος από την ιστοσελίδα τους
|
||
είτε μέσω της γραμμής εντολών.
|
||
|
||
\section{\textlatin{Security of Cloud Computing}} \label{cloudComputingSecurity}
|
||
|
||
Όταν επιλέξει κανείς να δημιουργήσει ιδεατές μηχανές μέσω μιας από τις διάφορες
|
||
πλατφόρμες που το υποστηρίζουν, πολλές φορές για τη διευκόλυνση του χρήστη η
|
||
διαδικασία γίνεται μέσω γραφικού περιβάλλοντος της μορφής \textlatin{Point and
|
||
Click}. Τις περισσότερες φορές διατίθενται διάφορες διανομές \textlatin{Linux}
|
||
οι οποίες έχουν εγκατεστημένα και ρυθμισμένα εκ των προτέρων διάφορα λογισμικά
|
||
όπως \textlatin{MySQL} για διαχείριση βάσης δεδομένων και \textlatin{Nginx} για
|
||
διακομιστή ιστού. Αυτό καθιστά πολύ πιο εύκολη τη διαδικασία στον χρήστη μιας
|
||
και δε χρειάζεται να διαθέσει τον χρόνο εγκατάστασης και ρύθμισης τους αλλά
|
||
εισάγει ένα αναγκαίο μοντέλο εμπιστοσύνης ανάμεσα σε αυτόν και όποιον έκανε τις
|
||
ρυθμίσεις. Όπως αναφέρεται στο \textlatin{\citealt{balduzzi2012security}} και
|
||
θα το δούμε και παρακάτω πολλές φορές αυτή η διαδικασία δε γίνεται σωστά και
|
||
αφήνουν τον τελικό χρήστη και μερικές φορές ακόμα και τον πάροχο νέφους
|
||
ευάλωτους σε ρίσκα ασφαλείας όπως μη εγκεκριμένη πρόσβαση, μόλυνση με κακόβουλο
|
||
λογισμικό και υποκλοπές ευαίσθητων προσωπικών δεδομένων.
|
||
|
||
\section{\textlatin{Docker}} \label{docker}
|
||
|
||
\subsection{Ο ρόλος του \textlatin{Docker}} \label{dockerRole}
|
||
|
||
Το \textlatin{Docker} είναι μια μηχανή δοχείων που επιτρέπει τον διαχωρισμό
|
||
ανάμεσα στον πηγαίο κώδικα, τις βιβλιοθήκες και εξαρτήσεις ενός λογισμικού από
|
||
το κύριο σύστημα. Πρόκειται για μια πλατφόρμα που διαθέτει μηχανισμούς για
|
||
συναρμολόγηση, θέση σε λειτουργία, εκτέλεση, ενημέρωση και διαχείριση των
|
||
προγραμμάτων σε μορφή δοχείων.
|
||
|
||
Πολλά λειτουργικά συστήματα αλλά και αυτά που κάνουν χρήση του πυρήνα
|
||
\textlatin{Linux} διαθέτουν μηχανισμούς απομόνωσης διεργασιών και δυνατότητες
|
||
εικονικοποίησης όπως είναι τα \textlatin{control groups} για την ενάθεση πόρων
|
||
μεταξύ διεργασιών και \textlatin{namespaces} για τον περιορισμό πρόσβασης ή
|
||
ορατότητας αυτών σε σχέση με άλλες διεργασίες ή περιοχές του συστήματος
|
||
δημιουργώντας έτσι δοχεία.
|
||
|
||
\pagebreak
|
||
|
||
\subsection{Πως προέκυψε} \label{dockerOrigins}
|
||
|
||
Λόγω δυσκολίας αυτοματοποίησης της διαχείρισης των δοχείων αυτών δημιουργήθηκε
|
||
το \textlatin{Docker} τη χρονολογία 2013 απλοποιώντας κατά πολύ την ανάπτυξη
|
||
και παράδοση κατανεμημένων εφαρμογών. Οι λειτουργίες που προσφέρει, το
|
||
καθιστούν την καταλληλότερη επιλογή για επιχειρήσεις που λειτουργούν με ένα
|
||
υβριδικό μοντέλο νέφους και εγκαταστάσεων ή αποκλειστικά στο \textlatin{Cloud}.
|
||
Το βασικότερο από τα πλεονεκτήματα του σε σχέση με παραδοσιακές εικονικές
|
||
μηχανές είναι το γεγονός ότι όλα τα δοχεία μοιράζονται τον ίδιο πυρήνα και
|
||
επομένως δε χρειάζεται να απονεμηθούν πόροι για εικονικοποίηση ολόκληρου του
|
||
λειτουργικού συστήματος. Επιπλέον, τα δοχεία μπορούν να εκτελεστούν σε κάθε
|
||
περιβάλλον που έχει εγκατεστημένο το \textlatin{Docker} και πολύ ταχύτερα από
|
||
μια εικονική μηχανή κάνοντας τα ιδανικά για \textlatin{CI/CD} αλλά και
|
||
πρακτικές \textlatin{Agile} ή \textlatin{DevOps}. Τέλος, λόγω των δυνατοτήτων
|
||
του προσφέρει μεγαλύτερη αποδοτικότητα πόρων αφού μπορεί κανείς να εκτελέσει
|
||
πολύ περισσότερα αντίγραφα ενός προγράμματος σε σχέση με τον αριθμό που θα
|
||
μπορούσε με χρήση ιδεατών μηχανών, κάτι που μειώνει ιδιαίτερα το κόστος
|
||
λειτουργίας.
|
||
|
||
\section{\textlatin{Why Docker}} \label{whyDocker}
|
||
|
||
Η δημοτικότητα του έχει συνταυτίσει τους όρους \textlatin{Docker} και
|
||
\textlatin{Container}. Παρόλα αυτά ιστορικά, οι πρώτες τεχνολογίες περί δοχείων
|
||
υπήρχαν πολύ πριν βγει στην αγορά. Συγκεκριμένα το 2008 εφαρμόστηκε στον πυρήνα
|
||
του \textlatin{Linux} το \textlatin{LXC} που επέτρεπε πλήρη εικονικοποίηση ενός
|
||
στιγμιότυπου \textlatin{Linux}, ενώ η εντολή \textlatin{chroot} που προϋπήρχε
|
||
από το 1979 στην έβδομη έκδοση του \textlatin{Unix} έδινε τη δυνατότητα
|
||
δημιουργίας και φιλοξενίας ενός ξεχωριστού εικονικού αντιγράφου του συστήματος
|
||
λογισμικού.
|
||
|
||
\section{\textlatin{Advantages Over LXC and other older technologies}} \label{advantagesOverLXC}
|
||
|
||
Ενώ χρησιμοποιούνται ακόμα και στις μέρες μας, δεν προσφέρουν την ίδια
|
||
διαφάνεια χρήσης αφού πολλές φορές αναφέρονται σε ρυθμίσεις συγκεκριμένες για
|
||
την εκάστοτε συσκευή. Το \textlatin{Docker} ωστόσο, δίνει τη δυνατότητα
|
||
κατασκευής μιας εφαρμογής που θα συνεχίσει να τρέχει ακόμα και αν κομμάτια της
|
||
χρειάζονται επισκευή αφού πολλές διεργασίες συνδυάζονται σε ένα δοχείο.
|
||
Διευκολύνει την κατασκευή δοχείων βάζοντας κριτήρια όπως τον κώδικα της
|
||
εφαρμογής και κάθε ένα μπορεί να χρησιμοποιηθεί ως πρότυπο για τη δημιουργία
|
||
καινούριου. Το πιο σημαντικό από όλα όμως είναι το γεγονός πως εξαιτίας της
|
||
δημοτικότητας του, ο καθένας έχει πρόσβαση σε χιλιάδες δοχεία που ανέβασε
|
||
κάποιος άλλος.
|
||
|
||
\section{\textlatin{Docker In Cloud Computing}} \label{dockerInCloudComputing}
|
||
|
||
Λόγω της αρχιτεκτονικής του είναι πολύ σύνηθες η θέση σε λειτουργία, εφαρμογών
|
||
μέσω \textlatin{Docker} επειδή απομονώνει τις αναγκαίες βιβλιοθήκες και
|
||
εξαρτήσεις τους από το υπόλοιπο σύστημα και επιτρέπει την αποδοτικότερη
|
||
διαχείριση τους μέσω ειδικών εντολών. Τα προβλήματα που μπορεί να προέκυπταν σε
|
||
ένα περιβάλλον νέφους όπως μη συμβατές εκδόσεις προγραμμάτων και δυσκολία
|
||
διαχείρισης τους τα λύνει δημιουργώντας έναν συστημικό τρόπο διανομής και
|
||
ελέγχου εφαρμογών. Καθιστά επίσης και πολύ εύκολη τη μεταφορά τους σε
|
||
οποιοδήποτε μηχάνημα.
|
||
|
||
\section{\textlatin{Docker Security}} \label{dockerSecurity}
|
||
|
||
Μία από τις πιο σημαντικές προκλήσεις κατά την εκτέλεση υπηρεσιών σε δημόσια
|
||
εικονικά περιβάλλοντα είναι η διατήρηση και επίτευξη της ασφάλειας. Παραδοσιακά
|
||
κατά την επιλογή χρήσης τεχνολογιών εικονικοποίησης ανάμεσα στις επιλογές
|
||
\textlatin{hypervisor-based} και \textlatin{container-based} είθισται να είναι
|
||
προτιμότερη η δεύτερη. Μια λογική απόφαση εάν αναλογιστεί κανείς τα
|
||
πλεονεκτήματα που προσφέρει στην απόδοση και την αποδοτική αλλά και εύκολη
|
||
διαχείριση των υπηρεσιών όταν διατίθενται σε μορφή δοχείων. Παρ' όλα αυτά, για
|
||
τον ίδιο λόγο που την καθιστά καταλληλότερη είναι και λιγότερο ασφαλής. Η
|
||
στρώση απομόνωσης ανάμεσα στα προγράμματα και το μηχάνημα στο οποίο εκτελούνται
|
||
αποτελεί ένα παραπάνω εμπόδιο που θα πρέπει να ξεπεράσει ένας επιτιθέμενος για
|
||
να προκαλέσει ζημιές στο σύστημα, αφού θα πρέπει πρώτα να περάσει από τον
|
||
εικονικό πυρήνα και μετά από τον \textlatin{hypervisor} έναντι στην
|
||
αρχιτεκτονική δοχείων όπου υπάρχει άμεση επικοινωνία με τον πυρήνα του
|
||
συστήματος.
|
||
|
||
\pagebreak
|
||
|
||
\subsection{\textlatin{Docker Security Advantages}} \label{dockerSecurityAdvatnages}
|
||
|
||
Με τη χρήση της αρχιτεκτονικής δοχείων και ειδικότερα του \textlatin{Docker},
|
||
έρχονται αρκετά εγγενή οφέλη ασφαλείας \cite{dockerInherentSecurity}. Ένα
|
||
βασικό όφελος αποτελεί η διαφάνεια. Λόγω της φύσης τους, τα δοχεία επιτρέπουν
|
||
την ακριβή κατανόηση του κώδικα που εκτελείται μέσα σε αυτά σε αντίθεση με μια
|
||
εικονική μηχανή. Επιπρόσθετα, κατά την εμφάνιση προβλημάτων σε μία υπηρεσία με
|
||
αρχιτεκτονική \textlatin{microservices} που κάνει χρήση δοχείων, είναι διακριτή
|
||
η διευκόλυνση στον εντοπισμό της πηγής τους. Ένα εξίσου σημαντικό όφελος
|
||
αποτελεί η μικρότερη επιφάνεια επίθεσης. Σε ένα παραδοσιακό περιβάλλον
|
||
εκτέλεσης όπου γίνεται χρήση εικονικών διακομιστών, πρέπει να προστατευτούν τα
|
||
μηχανήματα, ο διακομιστής και η υπηρεσία η ίδια, ενώ σε περιβάλλον δοχείων τα
|
||
μέρη που χρήζουν προστασίας είναι ο διακομιστής, η υπηρεσία και η μηχανή
|
||
δοχείων η οποία ασφαλίζεται ευκολότερα από μια εικονική μηχανή. Τέλος, δύο
|
||
ακόμα υψίστης σημασίας πλεονεκτήματα είναι η ευκολία εφαρμογής ενημερώσεων
|
||
ασφαλείας και η σταθερότητα του περιβάλλοντος. Η ενημέρωση ενός δοχείου είναι
|
||
μια διαδικασία δύο μόνο εντολών ενώ η ευχέρεια της άγνοιας των μεταβλητών
|
||
κομματιών του κάθε δοχείου καθιστά δυνατή την ασφάλιση της υπηρεσίας με τις
|
||
συγκεκριμένες εξαρτήσεις που χρειάζεται ανεξαρτήτως των εκδόσεων που μπορεί να
|
||
βρίσκονται ήδη στο σύστημα.
|
||
|
||
\subsection{\textlatin{Docker Security Disadvantages}} \label{dockerSecurityDisadvantages}
|
||
|
||
Παρ'' όλα τα πλεονεκτήματα του όπως η δυνατότητα απαλλαγής από εξαρτήσεις του
|
||
εκάστοτε συστήματος και η ευελιξία διαχείρισης των δοχείων του, υπόκειται σε
|
||
αρκετές ατασθαλίες. Οι πιο αξιοσημείωτες αυτών είναι η ανάγκη του να τρέχει υπό
|
||
την κυριότητα του \textlatin{root} και η αρχικά ελαστικότερη απ'' ό,τι
|
||
χρειάζεται απομόνωση του από τον πυρήνα του συστήματος. Με τα παραπάνω
|
||
δεδομένα, μετά από μία επιτυχημένη επίθεση τύπου \textlatin{Container Escape},
|
||
ο επιτιθέμενος έχει δικαιώματα \textlatin{root} και το σύστημα βρίσκεται υπό το
|
||
έλεος του.
|
||
|
||
\subsection{\textlatin{Overcoming Docker's security disadvantages}} \label{overcomingDockerDisadvantages}
|
||
|
||
Οι πιο συνήθεις τρόποι αντιμετώπισης της ανεπαρκούς προκαθορισμένης ασφάλειας
|
||
του \textlatin{Docker} είναι η ρύθμιση καλύτερων \textlatin{Apparmor} προφίλ ή
|
||
κανόνων \textlatin{SELinux} προκειμένου να απομονωθεί καλύτερα από το κύριο
|
||
σύστημα. Στην πραγματικότητα, αυτές οι πρακτικές λαμβάνουν υπόψιν τους κυρίως
|
||
τα δοχεία και όχι τη μηχανή δοχείων καθ'' αυτού. Γι'' αυτό τον λόγο πολλές
|
||
φορές πρέπει να ακολουθούνται και καλύτερες πρακτικές κατά τη λειτουργία του
|
||
όπως η αποφυγή χρήσης του διαχειριστικού λογαριασμού όσον αφορά τα δοχεία και η
|
||
αποφυγή λήψης δοχείων από μη έμπιστες πηγές.
|
||
|
||
\pagebreak
|
||
|
||
Με τη χρήση του εργαλείου \textlatin{SecDep} που θα περιγράψουμε παρακάτω
|
||
[\ref{installationANDShowcase}], θα επιτευχθεί η ασφάλιση του
|
||
\textlatin{Docker} και του συστήματος με αυτοματοποιημένο τρόπο ακολουθώντας
|
||
ορθές πρακτικές, χρησιμοποιώντας ένα ασφαλέστερο από το αρχικό
|
||
\textlatin{Container Runtime} και εκτελώντας το \textlatin{Docker} εξολοκλήρου
|
||
χωρίς την ανάγκη του \textlatin{root}. Η απεξάρτηση από τον διαχειριστικό
|
||
λογαριασμό επιτυγχάνεται χάρη στη δουλειά του \textlatin{Akihiro Suda} πάνω στο
|
||
\textlatin{rootlesskit} \cite{AkihiroSuda} επιτρέποντας έτσι έναν πλαστό
|
||
διαχειριστικό λογαριασμό προκειμένου να μπορέσει η μηχανή δοχείων να εκτελεστεί
|
||
υπό την κυριότητα οποιουδήποτε χρήστη του συστήματος. Επιπροσθέτως, η
|
||
αντικατάσταση του αρχικού \textlatin{Container Runtime} με το αντίστοιχο του
|
||
\textlatin{gVisor} \cite{gVisor}, εισάγει ένα πιο συμπαγές τοίχος προστασίας
|
||
απέναντι σε συνηθισμένες επιθέσεις κατά των δοχείων καθιστώντας το σύστημα μας
|
||
πιο ασφαλές συγκριτικά με τις αρχικές ρυθμίσεις.
|
||
|
||
\section{Δομή Εργασίας} \label{structure}
|
||
|
||
Συνεχίζοντας παρακάτω, η δομή που θα συναντήσει ο αναγνώστης είναι η εξής. Στο
|
||
κεφάλαιο [\ref{background}] θα μελετήσουμε τον όρο \textlatin{cloud computing},
|
||
θα αναλύσουμε τις διάφορες τεχνολογίες εικονικοποίησης και θα εμβαθύνουμε στην
|
||
τεχνολογία των δοχείων και συγκεκριμένα στην ασφάλεια του \textlatin{Docker}.
|
||
Στο επόμενο κεφάλαιο [\ref{relevantWork}], θα δούμε εργασίες σχετικές με την
|
||
παρούσα και θα πραγματοποιηθεί ανάλυση και σύγκριση αυτών. Αμέσως μετά, στο
|
||
[\ref{projectDevelopment}], αναφερόμαστε στον σχεδιασμό του εργαλείου μιλώντας
|
||
για τις απαιτήσεις, τα συστατικά του μέρη και πως αυτά συνεργάζονται μεταξύ
|
||
τους. Προχωρώντας στο [\ref{installationANDShowcase}], θα αναφερθούμε στις
|
||
οδηγίες εγκατάστασης και λειτουργίας του εργαλείου με βάση στοχευμένα σενάρια
|
||
χρήσης. Έπειτα, στο [\ref{experimentationANDresults}] βλέπουμε την
|
||
αποδοτικότητα του μετά από αρκετές χρήσεις και μετρήσεις που έγιναν προκειμένου
|
||
να αποτιμηθεί ορθότερα η εξασφάλιση των στόχων του. Τέλος, στο
|
||
[\ref{conclusions}], γίνεται αναφορά σημείων που θα μπορούσαν να επωφεληθούν με
|
||
βελτιώσεις προκειμένου να μπορέσει το εργαλείο αυτό να πάρει μια θέση στην
|
||
αγορά.
|