\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} ωστόσο, δίνει την δυνατότητα κατασκευής μιας εφαρμογής που θα συνεχίσει να τρέχει ακόμα και αν κομμάτια της χρειάζονται επισκευή αφού πολλές διεργασίες συνδυάζονται σε ένα δοχείο. Διευκολύνει την κατασκευή δοχείων βάζοντας κριτήρια όπως τον κώδικα της εφαρμογής και κάθε ένα μπορεί να χρησιμοποιηθεί ως πρότυπο για την δημιουργία καινούριου. Το πιο σημαντικό από όλα όμως είναι το γεγονός πως εξαιτίας της δημοτικότητας του, ο καθένας έχει πρόσβαση σε χιλιάδες δοχεία που ανέβασε κάποιος άλλος.

\pagebreak

\section{\textlatin{Docker In Cloud Computing}} \label{dockerInCloudComputing}

Λόγω της αρχιτεκτονικής του είναι πολύ σύνηθες η θέση σε λειτουργία, εφαρμογών μέσω \textlatin{Docker} επειδή απομονώνει τις αναγκαίες βιβλιοθήκες και εξαρτήσεις τους από το υπόλοιπο σύστημα και επιτρέπει την αποδοτικότερη διαχείριση τους μέσω ειδικών εντολών. Τα προβλήματα που μπορεί να προέκυπταν σε ένα περιβάλλον νέφους όπως μη συμβατές εκδόσεις προγραμμάτων και δυσκολία διαχείρισης τους τα λύνει δημιουργώντας έναν συστημικό τρόπο διανομής και ελέγχου εφαρμογών. Καθιστά επίσης και πολύ εύκολη την μεταφορά τους σε οποιοδήποτε μηχάνημα.

\section{\textlatin{Docker Security}} \label{dockerSecurity}

Μία από τις πιο σημαντικές προκλήσεις κατά την εκτέλεση υπηρεσιών σε δημόσια εικονικά περιβάλλοντα είναι η διατήρηση και επίτευξη της ασφάλειας. Παραδοσιακά κατά την επιλογή χρήσης τεχνολογιών εικονοποίησης ανάμεσα στις επιλογές \textlatin{hypervisor-based} και \textlatin{container-based} είθισται να είναι προτιμότερη η δεύτερη. Μια λογική απόφαση εάν αναλογιστεί κανείς τα πλεονεκτήματα που προσφέρει στην απόδοση και την αποδοτική αλλά και εύκολη διαχείριση των υπηρεσιών όταν διατίθενται σε μορφή δοχείων. Παρ' όλα αυτά, για τον ίδιο λόγο που την καθιστά καταλληλότερη είναι και λιγότερο ασφαλής. Η στρώση απομόνωσης ανάμεσα στα προγράμματα και το μηχάνημα στο οποίο εκτελούνται αποτελεί ένα παραπάνω εμπόδιο που θα πρέπει να ξεπεράσει ένας επιτιθέμενος για να προκαλέσει ζημιές στο σύστημα, αφού θα πρέπει πρώτα να περάσει από τον εικονικό πυρήνα και μετά από τον \textlatin{hypervisor} έναντι στην αρχιτεκτονική δοχείων όπου υπάρχει άμεση επικοινωνία με τον πυρήνα του συστήματος. 

\section{\textlatin{Disadvantages of Docker}} \label{dockerDisadvantages}

Παρ' όλα τα πλεονεκτήματα του όπως η δυνατότητα απαλλαγής από εξαρτήσεις του εκάστοτε συστήματος και η ευελιξία διαχείρισης των δοχείων του, υπόκειται σε αρκετές ατασθαλίες. Οι πιο αξιοσημείωτες αυτών είναι η ανάγκη του να τρέχει υπό την κυριότητα του \textlatin{root} και η αρχικά ελαστικότερη απ' ό,τι χρειάζεται απομόνωση του από τον πυρήνα του συστήματος. 

\pagebreak

\subsection{\textlatin{Overcoming Docker's security disadvantages}} \label{overcomingDockerDisadvantages}

Οι πιο συνήθεις τρόποι αντιμετώπισης της ανεπαρκούς προκαθορισμένης ασφάλειας του \textlatin{Docker} είναι η ρύθμιση καλύτερων \textlatin{Apparmor} προφίλ ή κανόνων \textlatin{SELinux} προκειμένου να απομονωθεί καλύτερα από το κύριο σύστημα. Στην πραγματικότητα, αυτές οι πρακτικές λαμβάνουν υπόψιν τους κυρίως τα δοχεία και όχι την μηχανή δοχείων κάθε αυτού. Γι 'αυτό τον λόγο πολλές φορές πρέπει να ακολουθούνται και καλύτερες πρακτικές κατά την λειτουργία του όπως η αποφυγή χρήσης του διαχειριστικού λογαριασμού όσον αφορά τα δοχεία και η αποφυγή λήψης δοχείων από μη έμπιστες πηγές. 