= Εργασία Εξαμήνου
:toc: right
:toc-title: Πίνακας περιεχομένων
:toclevels: 4
:sectnums:
:icons: font
:tabs: +

== Αρχιτεκτονική swarm

image:images/swarmarchitecture.png[] +
Υπάρχει αστερίσκος στο δεύτερο αριθμό της IP του docker network, διότι καθόλη την διάρκεια της άσκησης χρειάστηκε η ξαναδημιουργία σμήνους. Οπότε ο αστερίσκος μπορεί να αντικατασταθεί με 19 ή 29 καθόλη την διάρκεια της άσκησης.

== Δημιουργία του swarm
----
../install/usr/share/swarmlab.io/sec/swarmlab-sec create
----
image:images/swarmCreation.png[] +
Δημιουργία 5 cluster 
----
../install/usr/share/swarmlab.io/sec/swarmlab-sec up size=5 
----
Σύνδεση ως master +
----
../install/usr/share/swarmlab.io/sec/swarmlab-sec login
----
image:images/connectionToMaster.png[] +
Εύρεση του δικτύου του swarm +
----
ifconfig
----
image:images/findSwarmNetworkIP.png[] +
Άρα το δίκτυο μας είναι το 172.19.0.* +
Εύρεση των IP των worker +
----
nmap -sP 172.19.0.*
----
image:images/findIPOfWorkers.png[] +
άρα έχουμε τις εξής IP:
|===
|master|172.19.0.2
|worker_1|172.19.0.3
|worker_2|172.19.0.4
|worker_3|172.19.0.5
|worker_4|172.19.0.6
|===
Σύνδεση στον worker_1 +
----
../install/usr/share/swarmlab.io/sec/swarmlab-sec login
ssh docker@172.19.0.3
bash
----
image:images/connectionToWorker1.png[] +

== DOS Attack και iptable rules
Εγκατάσταση του hping3 στον worker_1
----
sudo apt update
sudo apt install hping3
----
Σύνδεση ως worker_2 +
----
../install/usr/share/swarmlab.io/sec/swarmlab-sec login
ssh docker@172.19.0.4
bash
----
image:images/connectionToWorker2.png[] +
Εμφάνιση πακέτων του worker_1 που παραλαμβάνονται από τον worker_2 +
----
sudo tcpdump src 172.19.0.3
----
image:images/awaitingPacketsFromWorker2.png[] +
Ο worker_1 κάνει DOS attack στον worker_2 +
----
sudo hping3 172.19.0.4
----
image:images/succesfulDOSAttack.png[] +
Εμφανίζονται στον worker_2 τα πακέτα από το DOS attack +
image:images/displayOfAttackPackets.png[] +
Δημιουργία κανόνα στον worker_2 για να αγνοεί πακέτα του worker_1 και ξαναεμφάνιση των πακέτων που θα προέλθουν από τον worker_1 +
----
sudo iptables -I INPUT -s 172.19.0.3 -j DROP
sudo tcpdump srd 172.19.0.3
----
image:images/ruleCreationAndDisplayOfAttackPackets.png[] +
Ο worker_1 ξανακάνει DOS attack στον worker_2 +
----
sudo hping3 172.19.0.4
----
image:images/unsuccesfulDOSAttack.png[] +
Παρατηρούμε 100% packet loss, άρα το DOS attack απέτυχε +
Εμφάνιση του ποσού των πακέτων που έγιναν DROP από τον κανόνα που θέσαμε +
----
sudo iptables -nvL
----
image:images/displayOfAmountOfAttackPacketsDroped.png[] +
19 πακέτα έγιναν DROP

== Brute Force Attack, Fail2Ban, Passwordless(withKey) ssh connection
Συνδεόμαστε στον worker_1 και εγκαθιστούμε το patator +
----
sudo apt install patator
----
Δημιουργούμε το αρχείο passwords.txt +
----
vi passwords.txt
----
|===
|dfsgds +
fgd +
fg +
df +
gd +
fg +
dfg +
dfgdfg +
df +
gd +
fg +
df +
g +
asdfgfd +
gs +
dfg +
sg +
sd +
gsdfdasf +
a +
docker +
14114144 +
|===
Ο worker_1 κάνει brute force attack στον worker_1
----
patator ssh_login host=172.29.0.4 user=docker password=FILE0 0=passwords.txt -x ignore:mesg='Authentication failed.'
----
image:images/succesfulBruteForceAttack.png[] +
Κατάφερε να βρει τον κωδικό του worker_2(172.29.0.4)
Εγκαθιστούμε στον worker_2 το fail2ban
----
sudo apt install fail2ban
----
Αντιγράφουμε τα περιεχόμενα του jail.conf στο jail.local +
----
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
----
image:images/creationOfJailLocal.png[] +
Βάζουμε τις παρακάτω γραμμές μέσα στο jail.local αντικαθιστώντας τα παλιά περιεχόμενα του [sshd]
|===
|[ssh] +
enabled  = true +
filter = sshd +
logpath = /var/log/auth.log +
maxretry = 5 +
backend = %(sshd_backend)s +

[sshd] +
enabled = true +
filter= sshd +
logpath = /var/log/auth.log +
maxretry=5 +
backend = %(sshd_backend)s
|===
Εγκαθιστούμε το rsyslog
----
sudo apt-get -y install rsyslog
----
Τρέχουμε το rsyslogd για να εμφανιστεί το auth.log στο οποίο θα αναγράφεται οι απόπειρες σύνδεσης στον worker_2
----
rsyslogd
----
Στη συνέχεια δοκιμάζουμε πάλι το brute force attack και παίρνουμε το παρακάτω αποτέλεσμα
----
patator ssh_login host=172.29.0.4 user=docker password=FILE0 0=passwords.txt
----
image:images/unsuccesfulBruteForceAttack.png[] +
Παρατηρούμε ότι όταν έφτασε στην δοκιμή docker έβγαλε error Connection refused, το οποίο σημαίνει ότι το fail2ban έκανε ban τον worker_1 επιτυχώς. +
Στη συνέχεια, μπορούμε να δούμε και τον κανόνα που πρόσθεσε το fail2ban στα iptables +
----
sudo iptables -L
----
image:images/ruleCreatedByFail2Ban.png[] +
Στην συνέχεια διαγράψαμε την δουλειά του fail2ban για να προχωρήσουμε στο επόμενο βήμα.
----
sudo fail2ban-client unban --all
sudo iptables -F
sudo fail2ban-client stop
----
Ανοίγουμε το sshd_config και αλλάζουμε τις εξής γραμμές αφαιρώντας και την δίεση +
====
LogLevel VERBOSE +
PermitRootLogin prohibit-password +
PasswordAutherntication no
====
Επανεκκίνηση του ssh
----
sudo service restart
----
Προσπαθούμε να συνδεθούμε στον worker_2 με τον worker_1. +
image:images/unsuccesfulSSHDueToNoPasswordRule.png[] +
Ξανά σχολιάζουμε την γραμμή PasswordAuthentication no για να μπορέσουμε να στείλουμε το κλειδί που θα φτιάξει ο worker_1 στον worker_2.
Επανεκκίνηση του ssh
----
sudo service ssh restart
----
Δημιουργούμε το κλειδί με passphrase 12345 +
----
ssh-keygen
----
image:images/keyCreation.png[] +
Το στέλνουμε στον worker_2
----
ssh-copy-id -i ~/.ssh/id_rsa.pub docker@172.29.0.4
----
image:images/sendKeyToWorker2.png[] +
Ξανά βγάζουμε από σχόλιο την γραμμή  PasswordAuthentication no +
Επανεκκίνηση του ssh
----
sudo service ssh restart
----
Σύνδεση του worker_1 με τον worker_2 με το passphrase 12345 +
image:images/connectionWithKey.png[] +

== Local και Remote SSH Forwarding
Εγκαθιστούμε τον apache στο μηχάνημα μας
----
sudo apt install apache2
----
Τρέχουμε τον server
----
apacherctl start
----
Αλλάζουμε το περιεχόμενο που θα έχει το site, αλλάζοντας το περιεχόμενο του αρχείου /var/www/html/index.html σε Hello World +
Εγκαθιστούμε το openssh-server για να μπορεί να συνδεθεί ο worker στο μηχάνημα μας
----
sudo apt install openssh-server
----
Βρίσκουμε την IP του μηχανήματος μας
----
ifconfig
----
image:images/myIP.png[] +
Στη συνέχεια κάνουμε local ssh forwarding από το worker_1 στο μηχάνημα μας +
----
ssh -nNT -L 8000:localhost:80 geo@192.168.80.128
----
image:images/localPortForwarding.png[] +
Στη συνέχεια ανοίγουμε άλλο ένα terminal για τον worker_1 και βλέπουμε το αποτέλεσμα. +
----
curl localhost:8000
----
image:images/accessToWebServer.png[] +
Αφού κλείσουμε το local ssh forwarding ανοίγουμε remote ssh forwarding από το μηχάνημα μας στον worker_1 +
----
ssh -nNT -R 8000:localhost:80 docker@172.29.0.4
----
image:images/remotePortForwarding.png[] +
Βλέπουμε ότι από τον worker_1 μπορούμε να δούμε τον server του μηχανήματος μας
----
curl localhost:8000
----
image:images/accessToWebServer.png[] +

== VPN
Δημιουργούμε το παρακάτω αρχείο στο μηχάνημα μας
~/Downloads/swarmlab-sec-master/swarmlab-sec/vpn/create-vpn.sh +
|===
|#!/bin/bash +
IP=127.0.0.1                                            # Server +
P=1194                                                  # Server Port +
OVPN_SERVER='10.80.0.0/16'                              # VPN Network +

#vpn_data=/var/lib/swarmlab/openvpn/openvpn-services/   # Dir to save data ** this must exist ** +
vpn_data=$PWD/openvpn-services/ +
if [ ! -d $vpn_data ]; then +
 mkdir -p $vpn_data +
fi +

NAME=swarmlab-vpn-services                              # name of docker service +
DOCKERnetwork=swarmlab-vpn-services-network             # docker network +
docker=registry.vlabs.uniwa.gr:5080/myownvpn            # docker image +

docker stop  $NAME                                            #stop container +
sleep 1 +
docker container rm  $NAME                              #rm container +

# rm config files +
rm -f $vpn_data/openvpn.conf.\*.bak +
rm -f $vpn_data/openvpn.conf +
rm -f $vpn_data/ovpn_env.sh.*.bak +
rm -f $vpn_data/ovpn_env.sh +

# create network +
sleep 1 +
docker network create --attachable=true --driver=bridge --subnet=172.50.0.0/16 --gateway=172.50.0.1 $DOCKERnetwork +

#run container        see ovpn_genconfig +
docker run --net=none -it -v $vpn_data:/etc/openvpn  -p 1194:1194 --rm $docker ovpn_genconfig  -u udp://$IP:1194 \
-N -d -c -p "route 172.50.20.0 255.255.255.0" -e "topology subnet" -s $OVPN_SERVER   +

# create pki          see ovpn_initpki +
docker run --net=none -v $vpn_data:/etc/openvpn  --rm -it $docker ovpn_initpki     +

#                     see ovpn_copy_server_files +
#docker run --net=none -v $vpn_data:/etc/openvpn  --rm $docker ovpn_copy_server_files +

#create vpn           see --cap-add=NET_ADMIN +
sleep 1 +
docker run --detach --name $NAME -v $vpn_data:/etc/openvpn --net=$DOCKERnetwork --ip=172.50.0.2 -p $P:1194/udp --cap-add=NET_ADMIN $docker   +

sudo sysctl -w net.ipv4.ip_forward=1 +

#show created +
docker ps +
|===
Βάζουμε δικαιώματα εκτέλεσης
----
chmod 700 create-vpn.sh
----
Εκτελούμε το script  create-vpn.sh
----
./create-vpn.sh
----
Μας ζητάει pass phrase και του δίνουμε το 54321 +
Δημιουργούμε το παρακάτω αρχείο στο μηχάνημα μας +
~/Downloads/swarmlab-sec-master/swarmlab-sec/vpn/create-user.sh +
|===
|USERNAME=test1 +
vpn_data=$PWD/openvpn-services/
docker=registry.vlabs.uniwa.gr:5080/myownvpn +

docker run -v $vpn_data:/etc/openvpn --rm -it $docker easyrsa build-client-full $USERNAME nopass +
docker run -v $vpn_data:/etc/openvpn --log-driver=none --rm $docker ovpn_getclient $USERNAME  > $USERNAME.vpn +
|===
Βάζουμε δικαιώματα εκτέλεσης
----
chmod 700 create-user.sh
----
Εκτελούμε το script  create-vpn.sh
----
./create-user.sh
----
Μας ζητάει pass phrase και του δίνουμε το 54321 +
Αντικαθιστούμε τις παρακάτω γραμμές στο test1.vpn
|===
|Γραμμές προς αντικατάσταση|Νέες γραμμές
|client +
nobind +
dev tun +
remote-cert-tls server +

remote 127.0.0.1 1194 udp 
|client +
nobind +
dev tun +
comp-lzo +
resolv-retry infinite +
keepalive 15 60 +

remote-cert-tls server +
remote 192.168.80.128 1194 udp +
float +
|===
Αντιγράφουμε το test1.ovpn στον φάκελο project που έχει access το swarm
----
cp test1.ovpn ../myproject/project/test1.vpn
----
Εγκαθιστούμε στον worker_1 το openvpn
----
sudo apt update
sudo apt install openvpn
----
Σύνδεση του worker_1 στο vpn +
----
sudo openvpn --config /project/test1.vpn
----
image:images/connectionToVPN.png[] +
Πήραμε την IP 10.80.0.2 +
----
ifconfig
----
image:images/workerVPNIP.png[] +
Αλλάζουμε την πρώτη γραμμή του create-user.sh έτσι ώστε να δημιουργήσει ένα ακόμη αρχείο +
|===
|USERNAME=test2
|===
Και κάνουμε την παραπάνω διαδικασία για το master και το test2.vpn
Μετά κάνουμε ping μεταξύ τους και βλέπουμε αντίδραση +
----
sudo tcpdump -i tun0
----
image:images/pingBetweenMasterWorkerThroughtVPN.png[] +