**ΕΡΓΑΣΤΗΡΙΟ ΜΑΘΗΜΑΤΟΣ «ΑΣΦΑΛΕΙΑ ΔΙΚΤΥΩΝ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ» ΑΣΚΗΣΗ 2020-2021**
**Swarmlab**** Project**
Αθηνά Κουτσοπούλου
ΑΜ 71347126
**Γενικά**
**Τί είναι το** **docker**** ;**
Το DOCKER είναι μια πλατφόρμα ανοιχτού κώδικα _\_(open source)\__ και λειτουργεί σαν εικονική μηχανή. Το λογισμικό αυτό επιτρέπει σε ανεξάρτητες εφαρμογές να χρησιμοποιούν τον ίδιο πυρήνα Linux. Με αυτόν τον τρόπο αποφεύγεται η επιπλέον χρήση υπολογιστικών πόρων που θα απαιτούσε μια εικονική μηχανή.
**Το** **Project**
Το project είναι βασίζεται στο [swarmlab](http://docs.swarmlab.io/SwarmLab-HowTos/labs/sec/sec.adoc.html) το οποίο λειτουργεί με το [docker](http://docs.swarmlab.io/SwarmLab-HowTos/labs/Howtos/docker/install.adoc.html). Πρώτα πρέπει να γίνει εγκατάσταση του [docker](http://docs.swarmlab.io/SwarmLab-HowTos/labs/Howtos/docker/install.adoc.html) και να γίνει clone το [swarmlab project](http://docs.swarmlab.io/SwarmLab-HowTos/labs/sec/sec.adoc.html) από το [https://git.swarmlab.io:3000/swarmlab/swarmlab-sec](https://git.swarmlab.io:3000/swarmlab/swarmlab-sec). Με αυτό έχουμε στην διάθεσή μας ένα μεταβλητού μεγέθους σμήνος (swarm) το οποίο μπορούμε να χρησιμοποιήσουμε για να προσομοιώσουμε κάποια περιστατικά. Συγκεκριμένα , στο project αυτό προσομοιώνονται κάποιες επιθέσεις (Ddos, SSH Brute Force), τα αντίστοιχα αντίμετρα τους και κάποιες υπηρεσίες (Ssh Forwarding και VPN).
Για να "ξεκινήσει" οποιαδήποτε από τις παραπάνω προσομοιώσεις πρέπει να δημιουργηθεί το σμήνος (εντολή create), έπειτα να ορίσουμε το μέγεθος του και να το "σηκωσουμε" (πχ. up size=5) και στην συνέχεια να συνδεθούμε (login) στον κύριο κόμβο (master) του σμήνους απ' όπου μπορούμε να έχουμε πρόσβαση και στα υπόλοιπα μέλη του σμήνους (workers).
Ο κατάλογος του project είναι ο **swarmlab-sec/** (δημιουργείται μετά το cloning του project), δημιουργούμε μέσα εκεί ένα δικό μας φάκελο - συγκεκριμένα εδώ **LabProject** - από τον οποίο θα κάνουμε create, up size=? και login στο σμήνος.
Άρα για να ξεκινήσει οποιαδήποτε προσομοίωση πρέπει να γίνουν τα 3 παρακάτω βήματα μέσα στον κατάλογο **swarmlab-sec/LabProject**.
Στη συνέχεια, γίνεται reset του configuration του iptables ώστε να δούμε ξεκάθαρα το αποτέλεσμα της επίθεσης που δέχεται ο worker.
- **sudo iptables -F**
Κάνουμε monitor τις απαντήσεις που στέλνονται από τον worker1 στον master (Icmp replies) για 2 δευτερόλεπτα. Κάνουμε monitor στις απαντήσεις και όχι στα εισερχόμενα ICMP πακέτα διότι ανάμεσα στον worker και στον master παρεμβάλλεται το firewall. Έτσι παρατηρώντας τις απαντήσεις που είναι ισάριθμες των εισερχόμενων πακέτων, έχουμε ξεκάθαρη εικόνα του πλήθους των πακέτων καθώς το firewall βρίσκεται τοπολογικά μετά τον worker και άρα δεν εμπλέκεται στο monitoring των απαντήσεων.
Τέλος, κάνουμε monitor τις απαντήσεις που στέλνονται από τον worker1 στον master (Icmp replies) για 5 δευτερόλεπτα και η διαφορά στο πλήθος που θα παρατηρηθεί είναι εμφανώς μεγάλη.
Παρατηρούμε ότι oworker λαμβάνει πάρα πολλά πακέτα ενώ μετά τους κανόνες iptables και tcpdump τα πακέτα περιορίζονται σε 5.
**2. Υλοποίηση συστήματος για την προσομοίωση "SSH Brute Force Attacks" (THC Hydra)**
**Στον** **Master****:**
Αφού κάνουμε login ο master θα κάνει SSHBruteForce επίθεση στον worker 1(αρχείο 2master.sh). Για την επίθεση το εργαλείο που χρησιμοποιείται είναι το hydra. Το hydra είναι ένα εργαλείο στο οποίο αφιερώνοντας κάποια threads (υπολογιστικούς πόρους -εδώ αφιερώνουμε 4 threads-) μπορεί να δοκιμάσει να αποκτήσει πρόσβαση σε κάποια υπηρεσία (συγκεκριμένα εδώ ssh) χρησιμοποιώντας credentials τα οποία είτε δίνονται manually είτε ως λεξικό. Συγκεκριμένα εδώ δίνουμε το σωστό username manually και τον σωστό κωδικό μέσα από ένα λεξικό που τον περιέχει.
Αφού γίνει εγκατάσταση του εργαλείου στον master :
Είναι σημαντικό η παραπάνω επίθεση να τρέξει ξανά μετά την εφαρμογή των αντιμέτρων ώστε να φανεί ότι απέτυχε.
**Στον** **Worker****:**
Εδώ ο worker εφαρμόζει αντίμετρα στην SSH Brute Force επίθεση που δέχεται από τον master μέσω του εργαλείου fail2ban(αρχείο 2worker.sh). Το fail2ban είναι ένα εργαλείο το οποίο κάνοντας monitor log files κάποιων υπηρεσιών εφαρμόζει τα αντίμετρα που επιλέγουμε αν ισχύει κάποια συνθήκη. Εδώ επειδή η εικόνα που χρησιμοποιούν τα docker nodes είναι η alpine από την οποία λείπουν βασικές λειτουργίες ενός λειτουργικού συστήματος πρέπει να εγκατασταθεί και η υπηρεσία που δημιουργεί τα log files συστήματος (rsyslog).
Αφού γίνει εγκατάσταση του εργαλείου και του rsyslog στον worker :
- **sudo apt update**
- **sudo apt upgrade -y**
- **sudo apt-get install fail2ban -y**
- **sudo apt install rsyslog -y**
Το εργοστασιακό configuration file του fail2ban είναι το jail.conf αλλά για λόγους ασφαλείας αυτό πρέπει να μείνει άθικτο. Το fail2ban "διαβάζει" τις ρυθμίσεις του από το jail.local αρχείο το οποίο κάνουμε copy από το εργοστασιακό
Εδώ κάνουμε copy ένα προετοιμασμένο αρχείο στο αρχείο ρυθμίσεων του fail2ban ώστε να κάνει monitor την υπηρεσία ssh και να κάνει τις απαραίτητες ενέργειες σε μία επίθεση brute force. Αναλυτικά ορίσαμε το **bantime=1m** (γραμμή 63) δηλαδή η IP του χρήστη που θα κάνει brute force να αποκλείεται για ένα λεπτό από την στιγμή της τελευταίας επίθεσης. Επίσης στις γραμμές 238 έως 249 βρίσκεται όλο το configuration που ορίσαμε για την υπηρεσία ssh.
- **sudo cp "/project/ssh brute force attack/fail2bansshconf" /etc/fail2ban/jail.loca** \*\* l\*\*
Εδώ κάνουμε copy ένα προετοιμασμένο αρχείο στο αρχείο ρυθμίσεων του ssh ούτως ώστε να κρατάει η υπηρεσία ssh log files στο σύστημα ( **SyslogFacility AUTH, LogLevel INFO** γραμμές 26-27) .
- **sudo cp "/project/ssh brute force attack/sshdconf" /etc/ssh/sshd\_config**
Στην συνέχεια κάνουμε restart τα παραπάνω services ώστε να ισχύσουν οι νέες ρυθμίσεις .
- **sudo service ssh restart**
- **sudo service rsyslog restart**
- **sudo service fail2ban restart**
Με την παρακάτω εντολή έχουμε μία εικόνα ως προς το τι απέτρεψε το εργαλείο fail2ban στην υπηρεσία ssh.
- **sudo fail2ban-client status sshd**
Τροποποίηση του ssh-server έτσι ώστε να επιτρέπει μόνο συνδέσεις μέσω key
**masterkeyenable.sh**
Εδώ ο master κάνει τις απαραίτητες ενέργειες ώστε να μπορεί να συνδέεται στον worker χωρίς την απαίτηση κωδικού αλλά χρησιμοποιώντας κλειδιά.
Αφού γίνει αναγνώριση της IP του worker από τον master
Ο master παράγει ένα ζεύγος κλειδιών (δημόσιο, ιδιωτικό) για να χρησιμοποιηθούν στην σύνδεση με τον worker
- **ssh-keygen -t rsa**
Εγκαθίσταται ένα [κλειδί SSH](https://www.ssh.com/ssh/key/) στον SSH server (worker1) ως εξουσιοδοτημένο κλειδί. Σκοπός του είναι να παρέχει πρόσβαση χωρίς να απαιτείται κωδικός πρόσβασης για κάθε σύνδεση.
- **ssh-copy-id docker@$worker1IP**
Εδώ παίρνουμε ένα bash στον worker1 και κάνουμε copy ένα προετοιμασμένο αρχείο στο configuration ssh file του worker1 ώστε να επιτρέπει συνδέσεις με κλειδιά (γραμμή 56 **PasswordAuthentication no,** γραμμή 61 **ChallengeResponseAuthentication no** , γραμμή 84 **UsePAM yes** ).
Στην συνέχεια κάνουμε restart το ssh service ώστε να ισχύσουν οι ρυθμίσεις και πλέον μπορούμε να κάνουμε συνδέσεις ssh από τον master στον worker χωρίς κωδικό.
- **sudo service ssh restart**
**3. Δημιουργία Local/Remote SSH Forwarding για την παροχή υπηρεσιών στο σμήνος.**
**Στον** **Worker****:**
**3worker.sh**
Ο worker εγκαθιστά έναν apache server σαν μια υπηρεσία αναφοράς για να δειχθεί το ssh forwarding. Επίσης εγκαθίσταται το lynx που είναι ένας web browser για τερματικά.
- **sudo apt update**
- **sudo apt upgrade -y**
- **sudo apt-get install apache2 -y**
- **sudo apt-get install lynx -y**
- **sudo service apache2 start**
**Στον** **Master****:**
**3masterLocal.sh**
Εδώ ο master κάνει local ssh forwarding μία υπηρεσίας που "τρέχει" στον worker στην πόρτα 80 στην δική του πόρτα 5000.
Αφού εγκατασταθεί το lynx και γίνει γνωστή στον master η IP του worker
Δημιουργείται μια ssh σύνδεση μέσω της οποίας γίνεται forward η υπηρεσία του worker στην πόρτα 80 στον master στην πόρτα 5000.
- **ssh docker@$worker1IP -L 5000:$worker1IP:80**
Αν σε ένα καινούριο τερματικό συνδεθούμε εκ νέου στον master node και τρέξουμε την εντολή **lynx localhost:5000** παρατηρούμε ότι η default σελίδα του apache server που τρέχει στον worker1 είναι διαθέσιμη στον master στην πόρτα 5000.
**Στον** **Worker****:**
**3workerRemote.sh**
Εδώ ο worker κάνει remote ssh forwarding μία υπηρεσίας που "τρέχει" στην πόρτα 80 στην πόρτα 5002 του master node.
Αφού εγκατασταθεί το lynx και γίνει γνωστή στον worker η IP του master
Δημιουργείται μια ssh σύνδεση μέσω της οποίας γίνεται forward η υπηρεσία του worker στην πόρτα 80 στον master στην πόρτα 5002.
- **ssh -R 5002:localhost:80 docker@$masterIP**
Αν σε ένα καινούριο τερματικό συνδεθούμε εκ νέου στον master node και τρέξουμε την εντολή **lynx localhost:5002** παρατηρούμε ότι h default σελίδα του apache server που τρέχει στον worker1 είναι διαθέσιμη στον master στην πόρτα 5002.
**4. Δημιουργήστε VPN για την παροχή υπηρεσιών στο σμήνος**