\chapter{Ανάπτυξη Συστήματος} \label{projectDevelopment}

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

\section{Μοντέλο ανάπτυξης}

Για την ανάπτυξη του SecDep, ακολουθήθηκε το μοντέλο καταρράκτη. Στο μοντέλο
αυτό, κάθε στάδιο της δραστηριότητας ανάπτυξης εκτελείται σειριακά. Δηλαδή, για
την μετάβαση σε κάθε επόμενο στάδιο, απαιτείται η επιτυχής ολοκλήρωση του
προηγούμενου. Έτσι και εδώ, ξεκινάμε με την ανάλυση απαιτήσεων, έπειτα
προχωράμε στη σχεδίαση του συστήματος και τέλος φτάνουμε στην υλοποίησή του. Η
επίδειξη της τελικής μορφής του εργαλείου καλύπτεται στο Κεφάλαιο
\ref{installationANDShowcase}, ενώ η αποτίμηση των αποτελεσμάτων εκτέλεσής του,
στο Κεφάλαιο \ref{experimentationANDresults}.

\section{Απαιτήσεις από το εργαλείο} \label{toolRequirements}

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

\subsection{Λειτουργικές απαιτήσεις}

\begin{itemize}

    \item Το εργαλείο πρέπει για κάθε πάροχο να υποστηρίζει την λειτουργία
        εμφάνισης λίστας των διαθέσιμων μεγεθών εικονικής μηχανής

    \item Το εργαλείο πρέπει για κάθε πάροχο να υποστηρίζει την λειτουργία
        εμφάνισης λίστας των διαθέσιμων τοποθεσιών

    \item Το εργαλείο πρέπει για κάθε πάροχο να υποστηρίζει την λειτουργία
        εμφάνισης λίστας των διαθέσιμων διανομών

    \item Το εργαλείο πρέπει για κάθε εντολή που επιδέχεται παραμέτρους, να
        ρωτάει τον χρήστη για κάθε παράμετρο που δεν δόθηκε

    \item Το εργαλείο πρέπει να ελέγχει την εγκυρότητα κάθε παραμέτρου που
        δίνεται από τον χρήστη

    \item Το εργαλείο πρέπει να υποστηρίζει την λειτουργία δημιουργίας
        εικονικής μηχανής

    \item Το εργαλείο πρέπει να υποστηρίζει την λειτουργία παύσης εικονικής
        μηχανής

    \item Το εργαλείο πρέπει να υποστηρίζει την λειτουργία εκκίνησης εικονικής
        μηχανής

    \item Το εργαλείο πρέπει να υποστηρίζει την λειτουργία επανεκκίνησης
        εικονικής μηχανής

    \item Το εργαλείο πρέπει να υποστηρίζει την λειτουργία διαγραφής εικονικής
        μηχανής

    \item Το εργαλείο πρέπει να υποστηρίζει την σύνδεση με SSH ακόμα και χωρίς
        να διαθέτει ο χρήστης πελάτη SSH

    \item Το εργαλείο πρέπει να υποστηρίζει την λειτουργία εμφάνισης όλων των
        εικονικών μηχανών που διαχειρίζεται

    \item Το εργαλείο πρέπει να εμφανίζει μηνύματα λάθους σε περίπτωση που κάτι
        πάει στραβά κατά την εκτέλεση

    \item Το εργαλείο πρέπει να υποστηρίζει την διαδραστική διαμόρφωση του
        αρχείου ρυθμίσεών του

    \item Το εργαλείο πρέπει να υποστηρίζει την εκτέλεση εξωτερικού εκτελέσιμου
        αρχείου στις εικονικές μηχανές με σκοπό την σκλήρυνσή τους

    \item Το εργαλείο πρέπει να εγκαθιστά και να σκληραίνει και το Docker πέρα
        από το λειτουργικό σύστημα

    \item Το εργαλείο θα ενημερώνει περιοδικά τα πακέτα της εικονικής μηχανής
        και θα κλείνει αχρησιμοποίητες θύρες

    \item Το εργαλείο πρέπει να υποστηρίζει την εγκατάσταση δοχείων στις
        εικονικές μηχανές που δημιουργεί, κατά την διάρκεια της σκλήρυνσής
        τους, μέσω ενός αρχείου docker-compose.yml που θα βρίσκεται στον ίδιο
        φάκελο με το εκτελέσιμο αρχείο του

    \item Το εργαλείο πρέπει να μπορεί να εγκαθιστά δοχεία στις εικονικές
        μηχανές, κατά την διάρκεια σκλήρυνσής τους, μέσω παραμέτρων που έχει
        εισάγει ο χρήστης

    \item Το εργαλείο πρέπει να διαθέτει λειτουργία εμφάνισης όλων των
        διαθέσιμων εντολών του

    \item Το εργαλείο πρέπει να διαθέτει λειτουργία εμφάνισης συμπλήρωσης
        εντολών και για τα 3 πιο δημοφιλή κελύφη εντολών (Bash, Zsh, tcsh)

    \item Το εργαλείο πρέπει να διαθέτει λειτουργία εμφάνισης της έκδοσής του

    \item Το εργαλείο πρέπει να διαθέτει παράμετρο για την προσπέραση
        (bypassing) του βήματος επιβεβαίωσης κατά την δημιουργία εικονικών
        μηχανών

    \item Το εργαλείο πρέπει να διαθέτει μηχανισμό συγκεκριμενοποίησης περιοχής
        για τον πάροχο AWS

    \item Το εργαλείο πρέπει να διαθέτει μηχανισμό επιλογής θύρας για την
        λειτουργία σύνδεσης μέσω SSH

    \item Το εργαλείο πρέπει να υποστηρίζει την αρχικοποίηση μονάχα ενός
        παρόχου δίχως την συμπλήρωση κενών πεδίων για τους υπόλοιπους από τον
        χρήστη

\end{itemize}

\subsection{Μη λειτουργικές απαιτήσεις}

\begin{itemize}

    \item Το εργαλείο πρέπει να υποστηρίζει την χρήση των 3 μεγαλύτερων
        ονομάτων στον κλάδο της νεφο-υπολογιστικής (Amazon, Google, Microsoft)

    \item Το εργαλείο πρέπει να υποστηρίζει την χρήση των 6 δημοφιλέστερων
        διανομών για περιβάλλον διακομιστή (Debian, Ubuntu, Red Hat Enterprise
        Linux, Fedora, CentOS, openSUSE Leap)

    \item Το εργαλείο πρέπει να λειτουργεί μέσω της γραμμής εντολών ώστε να
        μπορεί να αυτοματοποιηθεί περαιτέρω η εκτέλεση των εντολών του

    \item Το εργαλείο πρέπει να είναι εύκολο στην χρήση για έναν χρήστη που
        έχει χρησιμοποιήσει προγράμματα γραμμής εντολών στο παρελθόν

    \item Το εργαλείο θα πρέπει να είναι αξιόπιστο, δηλαδή κάθε εκτέλεση να
        επιφέρει τα αναμενόμενα αποτελέσματα

    \item Το εργαλείο πρέπει να δημιουργεί ξεχωριστό αρχείο για τις ρυθμίσεις
        του στον ίδιο φάκελο που βρίσκεται και το εκτελέσιμο αρχείο του

    \item Το εργαλείο πρέπει να κρατάει αρχείο των διευθύνσεων IP των εικονικών
        μηχανών που δημιουργεί ώστε να μπορούν να διαμορφωθούν περαιτέρω εάν ο
        χρήστης επιθυμεί να χρησιμοποιήσει άλλα προγράμματα, όπως το Ansible

    \item Το εργαλείο πρέπει να διαθέτει ένα μοτίβο εντολών που να μπορεί ο
        χρήστης να καταλαβαίνει και να διαμορφώνει ανάλογα με τις ανάγκες του

    \item Το εργαλείο πρέπει να δημιουργεί κλειδιά SSH σε περίπτωση που δεν
        υπάρχουν, στον ίδιο φάκελο με το εκτελέσιμο αρχείο του

    \item Το εργαλείο θα πρέπει να εγκαθιστά τις υπηρεσίες watchtower και
        portainer \footfullcite{portainer} για την περαιτέρω σκλήρυνση του
        Docker και την διευκόλυνση του χρήστη κατά την εγκατάσταση δοχείων
        αντίστοιχα

\end{itemize}

\clearpage

\begin{landscape}
\thispagestyle{empty}

\section{Διαγραμματική Μοντελοποίηση} \label{designModels}

Οι παραπάνω απαιτήσεις και ο τρόπος λειτουργίας του εργαλείου, μεταφράζονται
καλύτερα στον χρήστη μέσω ενός σχεδιαγράμματος περίπτωσης χρήσης. Το Σχήμα
\ref{fig:useCaseDiagram} δημιουργήθηκε με την βοήθεια του εργαλείου
\textquote{yuml} \footfullcite{yuml}. Επιπλέον, με το εργαλείο
\textquote{mermaid} \footfullcite{mermaid}, δημιουργήθηκε ένα διάγραμμα ροής
(flowchart) για το SecDep που απεικονίζεται στο Σχήμα
\ref{fig:flowchartDiagram}. Το διάγραμμα ροής αυτό, απεικονίζει την ροή των
εντολών που μπορεί να επιλεγούν από τον χρήστη κατά την εκτέλεση του
προγράμματος.

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = .8\textwidth]{Figures/Diagrams/secdep-use-case-diagram.jpg}
        \captionof{figure}{Διάγραμμα περιπτώσεων χρήσης}
        \label{fig:useCaseDiagram}
    \end{figure}
\vspace*{-30pt}
\end{center}

\end{landscape}

\clearpage

\begin{landscape}
\thispagestyle{empty}

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = 1.4\textwidth]{Figures/Diagrams/flowchart/1secdep-flowchart-diagram.png}
        \captionof{figure}{Διάγραμμα ροής - Γενικό}
        \label{fig:flowchartDiagram}
    \end{figure}
\vspace*{-30pt}
\end{center}

\end{landscape}

\begin{landscape}
\thispagestyle{empty}

\noindent Λόγω της πολυπλοκότητας του Σχήματος \ref{fig:flowchartDiagram}, αυτό
διασπάστηκε σε 6 ξεχωριστά διαγράμματα ροής, για τις εξής λειτουργίες του
SecDep:

\begin{itemize}

    \item Εκτέλεση απλών μεθόδων

        \begin{center}
            \begin{figure}[!ht]
                \centering
                \includegraphics[width = 1.3\textwidth]{Figures/Diagrams/flowchart/2secdep-flowchart-diagramSimpleFunctions.png}
                \captionof{figure}{Διάγραμμα ροής - Απλές λειτουργίες}
                \label{fig:flowchartDiagram1}
            \end{figure}
        \vspace*{-30pt}
        \end{center}

\end{itemize}
\end{landscape}

\clearpage

\begin{itemize}

    \item Απόκτηση λίστας εικονικών μηχανών

        \begin{center}
            \begin{figure}[!ht]
                \centering
                \includegraphics[width = .5\textwidth]{Figures/Diagrams/flowchart/3secdep-flowchart-ListVMs.png}
                \captionof{figure}{Διάγραμμα ροής - Λίστα εικονικών μηχανών}
                \label{fig:flowchartDiagram2}
            \end{figure}
        \vspace*{-30pt}
        \end{center}

\end{itemize}

\clearpage

\begin{itemize}

    \item Εκτέλεση ενέργειας σε εικονική μηχανή

        \begin{center}
            \begin{figure}[!ht]
                \centering
                \includegraphics[width = .55\textwidth]{Figures/Diagrams/flowchart/4secdep-flowchart-ActionOnVM.png}
                \captionof{figure}{Διάγραμμα ροής - Ενέργεια σε εικονική μηχανή}
                \label{fig:flowchartDiagram3}
            \end{figure}
        \vspace*{-30pt}
        \end{center}

\end{itemize}

\clearpage

\begin{itemize}

    \item Σύνδεση SSH σε εικονική μηχανή

        \begin{center}
            \begin{figure}[!ht]
                \centering
                \includegraphics[width = .6\textwidth]{Figures/Diagrams/flowchart/5secdep-flowchart-SSHToVM.png}
                \captionof{figure}{Διάγραμμα ροής - Σύνδεση SSH σε εικονική μηχανή}
                \label{fig:flowchartDiagram4}
            \end{figure}
        \vspace*{-30pt}
        \end{center}

\end{itemize}

\clearpage

\begin{itemize}

    \item Απόκτηση πληροφοριών πόρων παρόχου

        \begin{center}
            \begin{figure}[!ht]
                \centering
                \includegraphics[width = .35\textwidth]{Figures/Diagrams/flowchart/6secdep-flowchart-ResourceInfo.png}
                \captionof{figure}{Διάγραμμα ροής - Απόκτηση πληροφοριών πόρων παρόχου}
                \label{fig:flowchartDiagram5}
            \end{figure}
        \vspace*{-30pt}
        \end{center}

\end{itemize}

\clearpage

\begin{landscape}
\thispagestyle{empty}
\begin{itemize}

    \item Δημιουργία εικονικής μηχανής

        \begin{center}
            \begin{figure}[!ht]
                \centering
                \includegraphics[width = .7\textwidth]{Figures/Diagrams/flowchart/7secdep-flowchart-CreateVM.png}
                \captionof{figure}{Διάγραμμα ροής - Δημιουργία εικονικής μηχανής}
                \label{fig:flowchartDiagram6}
            \end{figure}
        \vspace*{-30pt}
        \end{center}

\end{itemize}
\end{landscape}
\clearpage

Ουσιαστικά, κατά την πραγματική χρήση του SecDep υπάρχουν πάντοτε δύο οντότητες
που αλληλεπιδρούν μεταξύ τους. Ο χρήστης και ο πάροχος νέφους. Ο χρήστης μπορεί
να ζητήσει πληροφορίες για διαθέσιμους πόρους, όπως οι εικονικές του μηχανές, ή
τα συστατικά που έχει στην διάθεσή του για την δημιουργία τους, όπως οι
διανομές, τα μεγέθη και οι τοποθεσίες τους. Αυτή η αλληλεπίδραση μεταξύ του
χρήστη και του παρόχου νέφους, απεικονίζεται καλύτερα στο Σχήμα
\ref{fig:sequenceDiagram}, το οποίο δημιουργήθηκε με το εργαλείο
\textquote{mermaid}. Πρόκειται για ένα διάγραμμα ακολουθίας (sequence diagram),
στο οποίο απεικονίζεται η αλληλεπίδραση του χρήστη με τον πάροχο νέφους μέσω
του SecDep, κατά την δημιουργία μιας εικονικής μηχανής.

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = \textwidth]{Figures/Diagrams/secdep-sequence-diagram.png}
        \captionof{figure}{Διάγραμμα ακολουθίας για την δημιουργία εικονικής μηχανής}
        \label{fig:sequenceDiagram}
    \end{figure}
\vspace*{-30pt}
\end{center}

\section{Αποφάσεις που πάρθηκαν κατά την ανάπτυξη} \label{developmentDecisions}

Κατά την ανάπτυξη του συστήματος, προκειμένου να επιτευχθούν οι στόχοι που
θέσαμε στην Ενότητα \ref{overcomingDockerDisadvantages} και συγκεκριμένα για
την επικοινωνία και διασύνδεση με διάφορους παρόχους νέφους, επιλέχθηκε να
γίνει χρήση της βιβλιοθήκης libcloud \footfullcite{libcloud}. Μια από τις δύο
επιλογές βιβλιοθηκών της Apache \footfullcite{apache} για την επικοινωνία με
παρόχους νέφους στα πλαίσια της υλοποίησης multi-cloud εφαρμογών, πλατφορμών
και εργαλείων. Συγκριτικά με την βιβλιοθήκη jclouds \footfullcite{jclouds}, η
οποία σχεδιάστηκε για την γλώσσα Java \footfullcite{java}, η libcloud είναι πιο
απλή στην χρήση, αφού είναι σχεδιασμένη για την γλώσσα Python
\footfullcite{python}. Επιπροσθέτως, η libcloud είναι πιο διαδεδομένη, ενώ η
γλώσσα python αποτελεί μια πιο ευέλικτη επιλογή για τις ανάγκες της ανάπτυξης
του εργαλείου μας. Αυτό συμβαίνει διότι σε σχέση με την Java, η python είναι
απλούστερη στην σύνταξή της, προ εγκατεστημένη σε πολλά λειτουργικά συστήματα
και διαθέτει πολλές επιβοηθητικές βιβλιοθήκες, επίσημες ή από τρίτους, οι
οποίες δύναται να εμπλουτίσουν τα προγράμματα σε python, με παραπάνω
λειτουργίες.

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

Παρ' όλη την προσπάθεια που καταβλήθηκε από την libcloud όμως, για την
ενοποίηση αυτή, οι διαφορές στους τρόπους λειτουργίας του κάθε παρόχου αρχίζουν
να εμφανίζονται σύντομα κατά την ανάπτυξη. Για το εργαλείο SecDep που προτείνει
η παρούσα διπλωματική εργασία, χρειάζεται να γίνει χρήση των λειτουργιών
\textquote{Compute} της βιβλιοθήκης libcloud. Στην αρχική σελίδα της
βιβλιοθήκης, αναφέρεται υποστήριξη για πάνω από 50 παρόχους. Κατά την σελίδα
τεκμηρίωσης \cite{libcloudProviders} για τις λειτουργίες \textquote{Compute},
αναφέρονται 48 πάροχοι σε έναν πίνακα, ο οποίος αναγράφει την υποστήριξη ή
απουσία αυτής, για διάφορες λειτουργίες/μεθόδους (διαχείρισης) εικονικών
μηχανών. Στις λειτουργίες αυτές περιλαμβάνονται η δημιουργία εικονικών μηχανών,
η εκκίνηση, η παύση, η διαγραφή τους και εν γένει όσες λειτουργίες είναι
απαραίτητες για την ολοκληρωμένη λειτουργία του προτεινόμενού μας εργαλείου.
Από αυτούς τους 48 παρόχους, οι 25 υποστηρίζουν και τις 9 λειτουργίες
διαχείρισης. Ωστόσο, από αυτούς τους 25 έπρεπε να αφαιρεθούν οι 20 για λόγους,
όπως η μη ύπαρξη τεκμηρίωσης χρήσης από την libcloud, η μη συνέχιση της
λειτουργίας τους, η έλλειψη πληροφοριών τιμής ή δοκιμαστικής περιόδου για τις
υπηρεσίες τους και η αδυναμία δημιουργίας λογαριασμού στην επίσημη σελίδα τους.
Επομένως, υπάρχουν εν τέλει 5 πάροχοι νέφους που δύναται να χρησιμοποιηθούν,
υποστηρίζοντας όλες τις πιθανές λειτουργίες διαχείρισης εικονικών μηχανών.
Τέλος, από αυτούς τους 5, επιλέχθηκαν για επίσημη υποστήριξη από το εργαλείο
που προτείνεται στην παρούσα διπλωματική εργασία, τα τρία μεγαλύτερα ονόματα
του χώρου, οι Amazon, Google και Microsoft. Οι άλλοι δύο είτε δεν παρείχαν
δοκιμαστική περίοδο των υπηρεσιών τους, είτε δεν υπήρχε εμπιστοσύνη ως προς την
ποιότητα των υπηρεσιών αυτών.

Παρακάτω θα διαπιστώσουμε πως ακόμα και με την χρήση της βιβλιοθήκης libcloud
και την επίσημη υποστήριξη όλων των λειτουργιών για κάθε πάροχο, υπήρχε η
ανάγκη χρήσης της επίσημης βιβλιοθήκης της Azure (Microsoft Azure SDK) για την
δημιουργία Resource Group \footfullcite{azure-mgmt-resource} και Virtual
Network \footfullcite{azure-mgmt-network} διότι αυτές οι λειτουργίες δεν
υποστηρίζονται μέσω της libcloud. Επιπροσθέτως, δίχως την υποστήριξη των
λειτουργιών αυτών, ο χρήστης θα ήταν υποχρεωμένος να δημιουργεί αυτούς τους
πόρους χειροκίνητα ή να είναι περιορισμένος μονάχα σε μια γεωγραφική τοποθεσία.
Οι δύο τελευταίες επιλογές πάνε ενάντια σε έναν από τους βασικότερους στόχους
του εργαλείου. Την ομοιόμορφη λειτουργία για κάθε πάροχο νέφους που
υποστηρίζεται.

Πέρα από την απόφαση για την χρήση της libcloud και την γλώσσα προγραμματισμού
Python, πάρθηκε επίσης η απόφαση για την υποστήριξη των 6 δημοφιλέστερων
επιλογών για λειτουργικά συστήματα Linux σε περιβάλλοντα διακομιστών. Οι
διανομές αυτές υποστηρίζονται και για τους 3 παρόχους νέφους και κάθε μια από
αυτές περιλαμβάνει διαφορετικές εκδόσεις της κάθε διανομής. Αυτές είναι οι εξής
για κάθε πάροχο:

\begin{savenotes}
\selectfont
\begin{table}[!ht]
\caption{Υποστηριζόμενες εκδόσεις διανομών για κάθε πάροχο}
\renewcommand{\arraystretch}{1.5}
\centering
\textgreek{\begin{tabular}{lc|c|c|c|}
\cline{3-5}
                                                                &                                                 & \multicolumn{3}{c|}{Πάροχοι} \\ \cline{3-5}
                                                                &                                                 & AWS                 & Azure                & GCE        \\ \hline
\multicolumn{1}{|c|}{\multirow{6}{*}{\rotatebox{90}{Διανομές}}} & Ubuntu \footfullcite{ubuntu}                    & 22.04, 22.10        & 22.04, 22.10         & Όλες       \\ \cline{2-5}
\multicolumn{1}{|c|}{}                                          & Debian \footfullcite{debian}                    & 10, 11              & 10, 11               & Όλες       \\ \cline{2-5}
\multicolumn{1}{|c|}{}                                          & CentOS \footfullcite{centos}                    & 7, 8, 9             & 8.4, 8.5             & Όλες       \\ \cline{2-5}
\multicolumn{1}{|c|}{}                                          & Fedora \footfullcite{fedora}                    & 37                  & 36, 37               & Όλες       \\ \cline{2-5}
\multicolumn{1}{|c|}{}                                          & Red Hat Enterprise Linux \footfullcite{redhat}  & 7.9, 8.6, 9         & 8.6, 9.1             & Όλες       \\ \cline{2-5}
\multicolumn{1}{|c|}{}                                          & openSUSE Leap \footfullcite{opensuse}           & 15.3, 15.4          & 15.3, 15.4           & Όλες       \\ \hline
\end{tabular}}
\label{table:supportedDistributions}
\renewcommand{\arraystretch}{1}
\end{table}
\end{savenotes}

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

\section{Αρχιτεκτονική Εργαλείου} \label{architecture}

Οι διαθέσιμες συναρτήσεις και μεταβλητές του secdep.py, απεικονίζονται στα
Σχήματα \ref{fig:secdepFunctions}, \ref{fig:secdepVariables1} και
\ref{fig:secdepVariables2} αντίστοιχα. Η δημιουργία τους πραγματοποιήθηκε με το
εργαλείο \textquote{doxygen} \footfullcite{doxygen}.

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = \textwidth]{Figures/doxygen/secdepFunctions.png}
        \captionof{figure}{Συναρτήσεις του secdep.py}
        \label{fig:secdepFunctions}
    \end{figure}
\vspace*{-30pt}
\end{center}

\begin{center}
    \begin{figure}[ht]
        \centering
        \includegraphics[width = \textwidth]{Figures/doxygen/secdepVariables1.png}
        \captionof{figure}{Μεταβλητές του secdep.py}
        \label{fig:secdepVariables1}
    \end{figure}
\vspace*{-30pt}
\end{center}

\begin{center}
    \begin{figure}[ht]
        \centering
        \includegraphics[width = \textwidth]{Figures/doxygen/secdepVariables2.png}
        \captionof{figure}{Μεταβλητές του secdep.py (συνέχεια)}
        \label{fig:secdepVariables2}
    \end{figure}
\vspace*{-30pt}
\end{center}

\clearpage

\noindent Προκειμένου να κατανοήσουμε καλύτερα πως αλληλεπιδρούν ορισμένες από
τις συναρτήσεις μεταξύ τους, δημιουργήθηκαν δύο διαγράμματα συστατικών
(component diagrams) για τις εξής λειτουργίες:

\begin{itemize}

    \item Απόκτηση λίστας εικονικών μηχανών συγκεκριμένης περιοχής του παρόχου νέφους Amazon (Σχήμα \ref{fig:secdepComponentDiagram1})
    \item Απόκτηση πληροφοριών ΑΜΙ (Amazon Machine Image) (Σχήμα \ref{fig:secdepComponentDiagram2})

\end{itemize}

\noindent Τα διαγράμματα αυτά δημιουργήθηκαν με την χρήση της βιβλιοθήκης
\textquote{pydoctrace} \footfullcite{pydoctrace} και του εργαλείου ανοιχτού
κώδικα \textquote{plantuml} \footfullcite{plantuml}. Με την εκτέλεση της
Εντολής \ref{lst:pydoctraceInstall}, εγκαθίσταται η βιβλιοθήκη στο σύστημα.
Μετά την περαίωσή της και την εγκατάσταση του πακέτου plantuml, προκειμένου να
αποκτήσουμε τα διαγράμματα συστατικών χρειάστηκε να πραγματοποιηθούν ορισμένες
προσθέσεις στον κώδικα του εργαλείου.

\begin{listing}[!ht]
\begin{bashcode}
pip install pydoctrace --break-system-packages
\end{bashcode}
\caption{Εγκατάσταση της βιβλιοθήκης pydoctrace}
\label{lst:pydoctraceInstall}
\vspace*{-10pt}
\end{listing}

\noindent Οι προσθέσεις αυτές αφορούν την προσθήκη των εξής γραμμών κώδικα του
secdep.py στο σημείο που ορίζονται οι βιβλιοθήκες:

\begin{listing}[!ht]
\begin{bashcode}
from pydoctrace.doctrace import trace_to_component_puml
from pydoctrace.callfilter.presets import (
    EXCLUDE_BUILTINS_PRESET,
    EXCLUDE_CALL_DEPTH_PRESET_FACTORY,
    EXCLUDE_DEPTH_BELOW_5_PRESET,
    EXCLUDE_STDLIB_PRESET,
    EXCLUDE_TESTS_PRESET,
    TRACE_ALL_PRESET,
)
\end{bashcode}
\vspace*{-10pt}
\end{listing}

\noindent Έπειτα, προσθέτουμε και τις παρακάτω γραμμές κώδικα, ακριβώς πριν την
δήλωση των συναρτήσεων που θέλουμε να καλέσουμε:

\clearpage

\begin{listing}[!ht]
\begin{bashcode}
ABOVE_1_PRESET = EXCLUDE_CALL_DEPTH_PRESET_FACTORY(1)
@trace_to_component_puml(filter_presets=[EXCLUDE_BUILTINS_PRESET, ABOVE_1_PRESET, EXCLUDE_DEPTH_BELOW_5_PRESET, EXCLUDE_STDLIB_PRESET, EXCLUDE_TESTS_PRESET, TRACE_ALL_PRESET])
\end{bashcode}
\vspace*{-10pt}
\end{listing}

\noindent Mε την εκτέλεση των Εντολών \ref{lst:getAwsImage} και
\ref{lst:listAllRegionalAwsNodes}, παράγονται δύο αρχεία με κατάληξη
\textquote{.puml}, τα οποία περιέχουν οδηγίες για την απεικόνιση των
διαγραμμάτων συστατικών στα Σχήματα \ref{fig:secdepComponentDiagram1} και
\ref{fig:secdepComponentDiagram2} αντίστοιχα.

\begin{listing}[!ht]
\begin{bashcode}
python3 secdep.py --provider aws --listimages --print
\end{bashcode}
\caption{Απόκτηση πληροφοριών ΑΜΙ (Amazon Machine Image)}
\label{lst:getAwsImage}
\vspace*{-10pt}
\end{listing}

\begin{listing}[!ht]
\begin{bashcode}
python3 secdep.py --provider aws --list --awsregion eu-north-1
\end{bashcode}
\caption{Απόκτηση λίστας εικονικών μηχανών συγκεκριμένης περιοχής του παρόχου νέφους Amazon}
\label{lst:listAllRegionalAwsNodes}
\vspace*{-10pt}
\end{listing}

\noindent Τέλος, η μετατροπή των αρχείων κειμένου σε σχήματα πραγματοποιείται
με την εκτέλεση της εντολής \ref{lst:plantumlCommand}.

\begin{listing}[!ht]
\begin{bashcode}
plantuml -progress -DPLANTUML_LIMIT_SIZE=8192 <όνομα αρχείου>.puml
\end{bashcode}
\caption{Μετατροπή αρχείων \textquote{.puml} σε αρχεία \textquote{.png} χρησιμοποιώντας το plantuml}
\label{lst:plantumlCommand}
\vspace*{-10pt}
\end{listing}

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = .9\textwidth]{Figures/Diagrams/component/GetAwsImage.png}
        \captionof{figure}{Διάγραμμα συστατικών για την Εντολή \ref{lst:getAwsImage}}
        \label{fig:secdepComponentDiagram1}
    \end{figure}
\vspace*{-30pt}
\end{center}

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = .9\textwidth]{Figures/Diagrams/component/ListAllRegionalAwsNodes.png}
        \captionof{figure}{Διάγραμμα συστατικών για την Εντολή \ref{lst:listAllRegionalAwsNodes}}
        \label{fig:secdepComponentDiagram2}
    \end{figure}
\vspace*{-30pt}
\end{center}

Τα παραπάνω διαγράμματα αποτελούν απλουστευμένες εκδοχές των πραγματικών. Αυτό
συμβαίνει, διότι έχουμε ρυθμίσει το pydoctrace να παραλείπει τις εμφανίσεις
ορισμένων εσωτερικών κλήσεων συναρτήσεων, καθώς και αυτών που βρίσκονται σε
επίπεδο callstack μεγαλύτερο από ένα. Στην αντίθετη περίπτωση, τα διαγράμματα
θα ήταν αρκετά δυσνόητα και δυσανάγνωστα.

Παρατηρώντας το Σχήμα \ref{fig:secdepComponentDiagram1}, αποκτάμε μεγαλύτερη
κατανόηση σχετικά με την εξάρτηση των συναρτήσεων μεταξύ τους. Προκειμένου να
φτάσουμε στην απόκτηση πληροφοριών για το AMI που θα διαλέξουμε, αρχικά πρέπει
να λάβουμε την λίστα των διαθέσιμων διανομών. Έπειτα, επιλέγουμε μια από αυτές
και αποκτάμε την λίστα των διαθέσιμων περιοχών της Amazon. Αυτό το βήμα είναι
απαραίτητο, διότι κάθε AMI έχει ξεχωριστό αναγνωριστικό ανά περιοχή. Αφότου
επιλέξουμε την περιοχή που επιθυμούμε, το εργαλείο επικοινωνεί με τον πάροχο
νέφους εκτελώντας την συνάρτηση απόκτησης της εικόνας και μας επιστρέφει τις
πληροφορίες της.

Στο Σχήμα \ref{fig:secdepComponentDiagram2}, βλέπουμε πως γίνεται κλήση της
συνάρτησης απόκτησης του οδηγού για την αυθεντικοποίηση με την Amazon και
έπειτα λαμβάνουμε την λίστα των εικονικών μηχανών για την περιοχή που ορίσαμε
κατά την σύνταξη της εντολής, από την αντίστοιχη συνάρτηση. Οι μέθοδοι start
και stop αφορούν την εκκίνηση και την παύση ενός μηχανισμού, ο οποίος έχει
προστεθεί στον τρόπο εμφάνισης των εντολών, ώστε να γνωρίζει ο χρήστης πως η
εκτέλεση του προγράμματος συνεχίζεται. Αυτό αποτελεί ένα χαρακτηριστικό που
αυξάνει την εμπειρία χρήσης, ιδίως για εντολές με μεγάλης διαρκείας εκτέλεση.

Το SecDep αποτελείται από δύο εκτελέσιμα αρχεία. Το πρώτο αρχείο, το
\textquote{secdep.py}, είναι το κύριο αρχείο του προγράμματος. Αυτό το αρχείο
είναι υπεύθυνο για την επικοινωνία με τους παρόχους νέφους και την διαχείριση
των εικονικών μηχανών. Το δεύτερο αρχείο, το \textquote{harden}, είναι υπεύθυνο
για την σκλήρυνση των εικονικών μηχανών και την εγκατάσταση/σκλήρυνση του
Docker. Το harden, εκτελείται μόνο στις εικονικές μηχανές κατά την δημιουργία
τους και μόνο εάν ο χρήστης το επιθυμεί.

Οι βασικότερες συναρτήσεις του secdep.py είναι οι εξής:

\begin{itemize}

    \item \textbf{create\_node}:

        Η συνάρτηση \textquote{create\_node}, είναι αυτή που δημιουργεί τις
        εικονικές μηχανές λαμβάνοντας ή ζητώντας από τον χρήστη τις κατάλληλες
        παραμέτρους. Οι βασικές παράμετροι που μπορεί να λάβει είναι:

        \begin{itemize}

            \item \textbf{provider}: Ο πάροχος νέφους στο νέφος του οποίου θα
                δημιουργηθεί η εικονική μηχανή (aws, gce, azure).

            \item \textbf{name}: Το όνομα της εικονικής μηχανής.

            \item \textbf{location}: Η περιοχή στην οποία θα δημιουργηθεί η
                εικονική μηχανή.

            \item \textbf{size}: Το μέγεθος της εικονικής μηχανής.

            \item \textbf{image}: Η εικόνα από την οποία θα δημιουργηθεί η
                εικονική μηχανή.

            \item \textbf{confirm}: Χρησιμοποιείται για επιβεβαίωση της
                δημιουργίας της εικονικής μηχανής χωρίς να χρειαστεί
                χειροκίνητη επιβεβαίωση από τον χρήστη.

            \item \textbf{deploy}: Για την εκτέλεση του harden (δηλ. την
                εφαρμογή της σκλήρυνσης).

        \end{itemize}

    \item \textbf{node\_action}:

        Η συνάρτηση \textquote{node\_action}, είναι αυτή που εκτελεί τις
        ενέργειες πάνω στις εικονικές μηχανές. Στις ενέργειες αυτές
        περιλαμβάνονται:

        \begin{itemize}

            \item \textbf{start} (εκκίνηση της εικονικής μηχανής)
            \item \textbf{stop} (παύση της εικονικής μηχανής)
            \item \textbf{reboot} (επανεκκίνηση της εικονικής μηχανής)
            \item \textbf{delete} (διαγραφή της εικονικής μηχανής)

        \end{itemize}

\clearpage

    \item \textbf{list\_all\_nodes}: Η συνάρτηση \textquote{list\_all\_nodes},
        είναι αυτή που εμφανίζει τις εικονικές μηχανές που διαχειρίζεται το
        SecDep. Χωρίς παραμέτρους θα εμφάνιζε όλες τις εικονικές μηχανές από
        όλους τους παρόχους. Επειδή, όμως, δεν είναι πάντοτε απαραίτητο να
        εμφανίζονται όλες οι εικονικές μηχανές, ο χρήστης μπορεί να δώσει τις
        παρακάτω παραμέτρους:

        \begin{itemize}

            \item \textbf{provider}

            \item \textbf{filterIn}: Χρησιμοποιείται για το φιλτράρισμα της
                λίστας κατά την χρήση της συνάρτησης \textquote{node\_action}.
                Με βάση την τιμή της ενέργειας που θέλει να πραγματοποιήσει ο
                χρήστης, δεν περιλαμβάνονται στην λίστα, οι εικονικές μηχανές
                για τις οποίες δεν είναι δυνατή η εκτέλεση της ενέργειας αυτής.

            \item \textbf{awsRegion}: Μόνο για τον πάροχο AWS. Χρησιμοποιείται
                για την επιλογή της περιοχής. Δίχως την παράμετρο αυτή, θα
                γινόταν έρευνα για εικονικές μηχανές σε όλες τις περιοχές. Κάτι
                που θα έκανε την εκτέλεση της εντολής πολύ αργή, ειδικά εάν ο
                χρήστης γνωρίζει πως χρησιμοποιεί μονάχα μια περιοχή.

        \end{itemize}

\end{itemize}

\noindent Το αρχείο harden, αποτελείται από πολλές συναρτήσεις, οι οποίες
εκτελούνται με την σειρά προκειμένου να ασφαλιστεί το σύστημα στο οποίο
εκτελείται. Οι πιο αξιοσημείωτες αυτών είναι:

\begin{itemize}

    \item \textbf{hardenSSH}:

        Η συνάρτηση υπεύθυνη για την σκλήρυνση του SSH.

    \item \textbf{dockerInit}:

        Η συνάρτηση υπεύθυνη για την εγκατάσταση/σκλήρυνση του Docker.

    \item \textbf{kernelSecurityModuleInit}:

        Η συνάρτηση υπεύθυνη για την εγκατάσταση/ρύθμιση του κατάλληλου για την
        διανομή (της εικονικής μηχανής) kernel security module.

    \item \textbf{configureFail2ban}:

        Αφότου έχει προηγηθεί η εγκατάσταση του κατάλληλου για την διανομή
        προγράμματος αναχώματος ασφαλείας, η συνάρτηση αυτή ρυθμίζει το
        fail2ban για την προστασία από επιθέσεις brute force.

\end{itemize}

\begin{landscape}
\thispagestyle{empty}

Mε το \textquote{code2flow} \footfullcite{code2flow} δημιουργήθηκε ένα
διάγραμμα που απεικονίζει τις κλήσεις συναρτήσεων που γίνονται κατά την
εκτέλεση του αρχείου secdep.py. Παράλληλα, το ίδιο αποτέλεσμα επιτεύχθηκε για
το αρχείο harden με την βοήθεια του \textquote{callGraph}
\footfullcite{callGraph}. Τα παραπάνω απεικονίζονται στα Σχήματα
\ref{fig:secdepFunctionCallDiagram} και \ref{fig:hardenFunctionCallDiagram}
αντίστοιχα.

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = 1.1\textwidth]{Figures/Diagrams/secdep-function-relationships.png}
        \captionof{figure}{Διάγραμμα κλήσεων συναρτήσεων του secdep.py}
        \label{fig:secdepFunctionCallDiagram}
    \end{figure}
\vspace*{-30pt}
\end{center}

\end{landscape}

\begin{landscape}
\thispagestyle{empty}

\vspace{30pt}

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = 1.1\textwidth]{Figures/Diagrams/harden-function-relationships.png}
        \captionof{figure}{Διάγραμμα κλήσεων συναρτήσεων του harden}
        \label{fig:hardenFunctionCallDiagram}
    \end{figure}
\vspace*{-30pt}
\end{center}

\end{landscape}

\noindent Επιπλέον, ένας χάρτης των σημαντικών εξαρτήσεων του secdep.py
δημιουργήθηκε με την βοήθεια του \textquote{pydeps} \footfullcite{pydeps}. Αυτό
έγινε με την εκτέλεση της παρακάτω εντολής:

\begin{listing}[!ht]
\begin{bashcode}
pydeps -T png --cluster --include-missing --max-bacon=1 --noshow --reverse --rankdir RL -o secdep-module-dependencies-organized.png secdep.py
\end{bashcode}
\caption{Εντολή δημιουργίας χάρτη εξαρτήσεων του secdep.py}
\label{lst:secdepModuleDependencies}
\vspace*{-10pt}
\end{listing}

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = .9\textwidth]{Figures/Diagrams/secdep-module-dependencies-organized.png}
        \captionof{figure}{Διάγραμμα σημαντικών εξαρτήσεων του secdep.py}
        \label{fig:secdepModules}
    \end{figure}
\vspace*{-30pt}
\end{center}

\noindent Οι παραπάνω βιβλιοθήκες, αποτελούν τους πυλώνες του SecDep. Κάθε μια
από αυτές, εξειδικεύεται σε διαφορετικούς τομείς και χρησιμοποιείται για την
κάλυψη διαφόρων λειτουργιών του SecDep. Με την σειρά που απεικονίζονται, έχουν
τις εξής αρμοδιότητες:

\begin{itemize}

    \item \textbf{azure}:

        Η βιβλιοθήκη της Azure, χρησιμοποιείται για την επικοινωνία και
        αυθεντικοποίηση με τον πάροχο νέφους Azure. Ο λόγος που χρειάζεται να
        χρησιμοποιηθεί συνδυαστικά με την libcloud, είναι για επιτύχουμε την
        ομοιόμορφη συμπεριφορά του εργαλείου κατά μήκος όλων των παρόχων που
        αυτό υποστηρίζει. Συγκεκριμένα, την χρειαζόμαστε για την επίτευξη των
        λειτουργιών δημιουργίας Resource Group και Virtual Network, καθώς αυτές
        λειτουργίες δεν υποστηρίζονται από την libcloud την παρούσα στιγμή.

\clearpage

    \item \textbf{dotenv}:

        Η βιβλιοθήκη dotenv \footfullcite{dotenv} χρησιμοποιείται για την
        ανάγνωση αρχείων \textquote{.env}. Το SecDep κάνει χρήση ενός αρχείου
        \textquote{.env}, στο οποίο δηλώνονται οι τιμές που χρειάζεται για την
        αυθεντικοποίηση με τους παρόχους νέφους.

    \item \textbf{libcloud}:

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

    \item \textbf{rich}:

        Η βιβλιοθήκη rich \footfullcite{rich} εμπλουτίζει την εμφάνιση του
        SecDep. Βοηθάει στην καλύτερη διαμόρφωση της εμφάνισης των
        αποτελεσμάτων των εντολών του, με σκοπό την θετική αύξηση της εμπειρίας
        χρήσης του εργαλείου.

    \item \textbf{shtab}:

        Η βιβλιοθήκη shtab \footfullcite{shtab} χρησιμοποιείται για παραγωγή
        συμπληρώσεων κελύφους. Αυτό αποτελεί βασικό χαρακτηριστικό για την
        ευχρηστία του εργαλείου, καθώς διευκολύνει τον χρήστη στην εύρεση των
        διαθέσιμων παραμέτρων και στην ταχύτερη σύνταξη εντολών.

    \item \textbf{paramiko}:

        Η βιβλιοθήκη paramiko \footfullcite{paramiko} αποτελεί εξάρτηση της
        libcloud για την επικοινωνία με τις εικονικές μηχανές, κάνοντας χρήση
        του πρωτοκόλλου SSH. Το SecDep, χρησιμοποιεί την βιβλιοθήκη αυτή για
        την διαδραστική σύνδεση σε εικονικές μηχανές μέσω SSH σε περίπτωση
        απουσίας πελάτη που να προσφέρει αυτή τη δυνατότητα. Επιπλέον,
        χρησιμοποιείται για την δημιουργία κλειδιών SSH.

\end{itemize}
