= Εργασία Εξαμήνου
Ασφάλεια Δικτύων Επικοινωνιών Καραμιχάλης Κωνσταντίνος , Κυριακάκος Παναγιώτης
:toc: right
:toc-title: Πίνακας περιεχομένων
:toclevels: 4
:sectnums:
:icons: font
:tabs:


{empty} +
[WARNING]
====

Προσοχή !!! Πριν την συνέχιση της ανάγνωσης πρέπει να εκτελέσετε τις παρακάτω εντολές για την διατήρηση της ψυχικής ηρεμίας : +
[.text-center]
*sudo apt-get remove vim* +
*sudo apt-get purge vim* +
*sudo apt-get install nano* +
{empty} +
[small]*_"I've been using VIM for about 2 years now mostly because i dont know how to exit it..."_*

====

toc::[]
== Docker
=== Τι είναι το Docker

    To Docker είναι μια πλατφόρμα λογισμικού ανοιχτού κώδικα που υλοποιεί Virtualization σε επίπεδο Λειτουργικού Συστήματος.
Ουσιαστικά το Docker προσφέρει δυνατότητες ανάπτυξης εφαρμογών στα Containers του. Το Docker χρησιμοποιεί τεχνολογιές του πυρήνα του Linux όπως τα cgroups (ομάδες λογαριασμών που ελέγχεται το ποσοστό χρήσης του υλικού του υπολογιστή μας), namespaces (το namespaces δημιουργεί ανεξάρτητα πακέτων πόρων και διεργασιών) έτσι ώστε τα ανεξάρτητα software containers που δημιουργεί να εκτελούνται στο ίδιο λειτουργικό σύστημα. Έτσι αποφεύγεται η χρήση επιπλέον υπολογιστικών πόρων που θα απαιτούσε μια εικονική μηχανή (virtual machine).

=== Δημιουργία εικονικών δικτύων στο Docker
====
Για την δημιουργία δικτύων προς χρήση μέσα στα containers του Docker εκτελούμε σε ένα τερματικό την πακάτω εντολή :
{empty} +
{empty} +
docker network create --driver=bridge --subnet=*_subnet_IP/Preffix_* *_Network_Name_*
====
=== Δημιουργία δικτύων στους containers
====
Στην συνέχεια με την παρακάτω εντολή καθορίζουμε σε ποια δίκτυα θα συνδεθούν τα container που θέλουμε:
{empty} +
{empty} +
docker network connect *_Network_Name_*  *_Container_Name_*
====
==== Σύνδεση με το Internet
====
Για την σύνδεση κάποιου container με το internet θα πρέπει να ρύθμίσουμε ως Gateway τον Host υπολογιστή μας
{empty} +
{empty} +
ip route add default via *_Host_Network_IP_* dev *_interface_*
====
==== Επικοινωνία Δικτύων A-> B και B->A
CAUTION: Για την επικοινωνία των δικτύων θα χρειαστεί να ρυθμίσουμε το Shorewall
====
Με την βοήθεια του προγράμματος *nano και όχι VIM* ανοίγουμε το αρχείο: +
[.text-center]
*/etc/shorewall/zones* +

Στην συνέχεια συμπληρώνουμε στα κατάλληλα πεδία τις απαραίτητες ρυθμίσεις όπως: +
//#ZONE{nbsp}{nbsp}{nbsp}{nbsp}TYPE{nbsp}{nbsp}{nbsp}{nbsp}OPTIONS{nbsp}{nbsp}{nbsp}{nbsp}IN_OPTIONS{nbsp}{nbsp}{nbsp}{nbsp} OUT_OPTIONS +
Στο πεδίο ZONE θα είναι η ονομασία του δικτύου που θέλουμε να ελεγξουμε. +
Στο πεδίο TYPE Καθορίζουμε τον τύπου της ζώνης. +
*# ZONE{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}TYPE{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}OPTIONS{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}IN_OPTIONS{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}OUT_OPTIONS* +
{nbsp}{nbsp}{nbsp}{nbsp} fw {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}firewall +
{nbsp}{nbsp}{nbsp}{nbsp} net {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}ipv4 +
{nbsp}{nbsp}{nbsp}{nbsp} loc{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}ipv4 +
{nbsp}{nbsp}{nbsp} dmz {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}ipv4 +
====
NOTE: Επειδή το shorewall ταιριάζει τις διευθύνσεις απο τα πακέτα με την σειρά που είναι δηλωμένα στο αρχείο σε περίπτωση που έχουμε εμφωλευμένες ζώνες καλό θα ήταν να εξασφαλίσουμε ότι η κύρια ζώνη είναι μετα απο τις υποζώνες !
{empty} +
{empty} +

====
Στην συνέχεία με την χρήση του προγράμματος *nano* ανοίγουμε το αρχέιο: +

[.text-center]
*/etc/shorewall/policy* 

Στα πεδία του αρχείου γραφουμε τις πολιτικές που θέλουμε να εφαρμόσουμε στα πακέτα που καταφθάνουν στην διεπαφή. Στο πεδίο SOURCE την πηγή, στο πεδίο DEST τον προορισμό και εάν ταιριάξει με κάποιο πακέτο τότε εφαρμόζεται η πολιτή που έχουμε καθορίσει στο πεδίο POLICY 

Οι πολιτικές που μπορούν να εφαρμοστούν είναι: +
*ACCEPT*  Με το Accept δέχεται τα πακέτα. +
*DROP*  Με το Drop απορρίπτει τα πακέτα (χωρίς ενημέρωση του αποστολέα). +
*REJECT*  Με το Reject απορρίπτει τα πακέτα (και στέλνει ενημέρωση στον αποστολέα). +

*#{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}SOURCE{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}DEST{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}POLICY{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}LOGLEVEL{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}LIMIT* +
{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} loc {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} net {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} ACCEPT +
{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} net {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} all {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} DROP {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} info +
{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} all {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} all {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} REJECT {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} info +

====
{empty} +
====
Εν συνεχεία κάνοντας πάλι χρήση του προγράμματος *nano* ανοίγουμε το αρχείο : +
[.text-center]
*_/etc/shorewall/rules_* +

Στο πεδίο ACTION γράφουμε την επιτρεπόμενη ενέργεια για τα δίκτυα που αντιστοιχίζονται με κάποια απο τις εγγραφές. +
Στο πεδίο Source γράφουμε το δίκτυο της πηγής μας. +
Στο πεδίο Dest γράφουμε τοδίκτυο προορισμού. +
Στο πεδίο PROTO γράφουμε το είδος του πρωτοκόλλου που θα χρησιμοποιήσουμε. +
Στο πεδίο DEST_PORT την θύρα προορισμού. +
Στο πεδίο SOURCE_PORT την θύρα της πηγής. +

NOTE: Τα ονόματα των πεδίων δεν είναι αναγκάιο ούτε να υπάρχουν ούτε να έχουν αυτήν την ονομασία !! +

*# ACTION*{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} *SOURCE* {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} *DEST* {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} *PROTO* {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} *DEST_PORT* {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} *SOURCE_PORT* +
{nbsp}{nbsp}{nbsp} ACCEPT {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} FW{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}net{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}udp{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}53 + 
{nbsp}{nbsp}{nbsp} ACCEPT {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} net{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}FW{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}udp{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}53 +
{nbsp}{nbsp}{nbsp} ACCEPT {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} FW{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}net{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}tcp{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}80 +
{nbsp}{nbsp}{nbsp} ACCEPT {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} net{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}FW{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}tcp{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}80 +
====
{empty} +
====
Τέλος _(λογικά θα το έχεις καταλάβει μέχρι τώρα)_ κάνοντας χρήση του προγράμματος *nano* ανοίγουμε το αρχείο : +
[.text-center]
*_/etc/shorewall/interfaces_* +

Στο πεδίο ZONE γράφουμε την ονομασία της ζώνης που καθορίσαμε στο αρχείο ZONES +
Στο πεδίο ΙΝΤ γράφουμε την διεπαφή που θέλουμε να αντιστοιχίσουμε με την εκάστοτε ζώνη. +
Στο πεδίο BROADCAST εάν βάλουμε την επιλογή detect τότε το shorewall θα ψάξει μόνο του να βρει την broacast διευθυνση του δικτύου. +
Στο πεδίο OPTIONS μορούμε να βάλουμε διάφορες επιλογές για την διεπαφή της εγγραφής.

NOTE: Τα ονόματα των πεδίων δεν είναι αναγκάιο ούτε να υπάρχουν ούτε να έχουν αυτήν την ονομασία !! +

*# ZONE{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}INT{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}BROADCAST{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}OPTIONS{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}* +
{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} net{sp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}eth0{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} +
{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} loc {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}eth0{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}detect +
{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} dmz {nbsp}{nbsp}{nbsp}{nbsp}{nbsp} eth0{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} +
====
{empty} +
{empty} +

== SSH
=== Τι είναι το SSH.

    To SSH (Secure Shell) παρέχει στους χρήστες ένα ασφαλές, κρυπτογραφημένο μηχανισμό για σύνδεση , εκτέλεση εντολών και μεταφορά αρχείων.
Το SSH χρησιμοποιεί συνήθως την θύρα 22 για την σύνδεση ανάμεσα στον υπολογιστή σας και έναν άλλο υπολογιστή ή συσκευή στο Internet ή στο τοπικό σας δίκτυο.
Ένα κλασσικό παράδειγμα χρήσης του είναι διαχειριστές μίας εταιρείας να συνδέονται εξ'αποστάσεως για τον ελέγχου για τη διαχείριση των υπολογιστών των επιχειρήσεων τους.

=== Δημιουργια SSH Tunneling
====
Για την επίλυση του ερωτήματος θα πρέπει να γίνουν δύο συραγγώσεις δεσμέυοντας τις ζητούμες θύρες για κάθε μία απο αυτές . +
Η πρώτη σύράγγωση θα είναι μεταξύ του υπολογιστή μας προς ένα conτainer (master) . +
Στην συνέχεια πρέπει να δημιουργηθεί μία δευτερη συράγγωση απο το container (master) προς ένα άλλο container του σμήνους, στο οποίο θα πρέπει να βρίσκεται ο HTTP server (apache2).
[.text-center]
ssh -t -L 9000:localhost:8080 *_user@IP_Address_* ssh -L 8080:localhost:80 *_user@IP_address_* +

IMPORTANT: Για τις ports του παραδέιγματος το λειτουργικό σύστημα δεν μας άφησε να τις δεσμέυσουμε, στην πράξη χρησιμοποιήσαμε ports μη δεσμευμένες απο το σύστημα, εκτός της 80 !!!
====

image::ssh_edited.png[]

{empty} +
{empty} +

== Virtual Private Network (VPN)
=== Τι είναι το VPN

    To VPN είναι ένα εικονικό δίκτυο το οποιο προσφέρει ιδιωτική επικοινωνία πάνω σε ένα δημόσιο δίκτυο π.χ διαδίκτυο. Το VPN παρέχει δυνατότητες κρυπτογράφησης της επικοινωνίας και την χρήση διαπιστευτηρίων για την κάθε σύνδεση. Θα μπορούσαμε να πούμε οτι το VPN είναι μία ποιο οικονομική εναλλακτικη των μισθωμένων γραμμών .

=== Δημιουργια VPN server, χρήστη και σύνδεση του στον server

==== Network Create
====
docker network create --attachable=true --driver=bridge --subnet=*_subnet_IP/Preffix_* --gateway=*_Gateway_IP_* *_Network_Name_*
====
==== Container Configuration
====

NOTE: Δημιουργούμε έναν φάκελο η χρησιμοποιούμε έναν ήδη υπάρχουν στον οποίο θα αποθηκευτούν οι ρυθμίσεις του VPN server για να γίνει η αντιγραφή τους στον container που θα τον εγκαταστήσουμε. +
Για το παράδειγμά μας θα υποθέσουμε οτι ο φάκελος αυτός είναι: +
[.text-center]
*_/home/username/vpn_data_*

{empty} +
docker run --net=none -it -v */home/username/vpn_data*:/etc/openvpn  --rm registry.vlabs.uniwa.gr:5080/myownvpn ovpn_genconfig  -u udp://*Host_IP_Address:Port* -N -d -c -p "route *_container Network_Address Subnet_Mask_*" -e "topology subnet" -s 10.65.0.0/16 (οι διευθύνσεις που θα εκχωρηθούν στους χρήστες που σύνδεόνται στον VPN Server).
====
==== Key Creation
====
Με την παρακάτω εντολή δημιουργούμε το Private Key του VPN server μας: +

docker run --net=none -v *_/home/username/vpn_data_*:/etc/openvpn  --rm -it registry.vlabs.uniwa.gr:5080/myownvpn ovpn_initpki
====
==== Create VPN
====
docker run --detach --name *_VPN_Server_NAME_* -v *_/home/username/vpn_data_*:/etc/openvpn --net=*_Docker_network_name_* --ip=*_VPN_Server_container_IP_* {nbsp}-p 1112:1194/udp --cap-add=NET_ADMIN registry.vlabs.uniwa.gr:5080/myownvpn

====
==== User Creation
====
Με την παρακάτω εντολή δημιουργούμε έναν χρήστη με το όνομα της επιλογής μας χωρίς κωδικό πρόσβασης:

docker run -v *_/home/username/vpn_data_*:/etc/openvpn --rm -it registry.vlabs.uniwa.gr:5080/myownvpn  easyrsa build-client-full *_VPN_username_* nopass
====

{empty} +
{empty} +
{empty} +

[.text-center]

[big]*Any Question's ???*

{empty} +
{empty} +

[.text-center]
image::questions.jpg[187,225]


