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

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

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

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

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

\clearpage

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

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

\clearpage

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

\clearpage

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

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

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

\begin{itemize}

    \item \textbf{Το εργαλείο πρέπει να υποστηρίζει την χρήση των 3 μεγαλύτερων
        ονομάτων στον κλάδο της νεφο-υπολογιστικής}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

\end{itemize}

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

\begin{itemize}

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

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

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

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

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

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

    \item \textbf{Το δεύτερο εκτελέσιμο αρχείο του εργαλείου πρέπει να
        δημιουργεί στην εικονική μηχανή δύο επιπλέον εκτελέσιμα αρχεία για
        περιοδική ενημέρωση των πακέτων και κλείσιμο αχρησιμοποίητων θυρών}

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

\end{itemize}

\clearpage

\begin{landscape}
\thispagestyle{empty}

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

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

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = 0.9\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.0\textwidth]{Figures/Diagrams/secdep-flowchart-diagram.png}
        \captionof{figure}{Διάγραμμα ροής}
        \label{fig:flowchartDiagram}
    \end{figure}
\vspace*{-30pt}
\end{center}

\end{landscape}

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

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

\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}

\clearpage

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

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

\begin{center}
    \begin{figure}[!ht]
        \centering
        \includegraphics[width = .9\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 = .9\textwidth]{Figures/doxygen/secdepVariables.png}
        \captionof{figure}{Μεταβλητές του secdep.py}
        \label{fig:secdepVariables}
    \end{figure}
\vspace*{-30pt}
\end{center}

\clearpage

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

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

\begin{itemize}

    \item \textbf{create\_node}:

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

        \begin{itemize}

            \item \textbf{provider}
            \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}
