Ο βασικός κανόνας είναι ο εξής: Δεν hostaroume τιποτε απο το σπίτι, γιατι οταν ανοίξουμε port στο ρούτερ μας, αμέσως δίνουμε προσβαση σε κάποιον που θα μας στοχεύσει κακόβουλα.
Οπως και να γίνει όμως, βρισκόμαστε μερικές φορές στην δύσκολη κατάσταση του να πρέπει να hostaroume κάτι στο σπίτι μας, τόσο για να γλυτώσουμε έξοδα ενός ενοικιασμένου webserver ή για να κάνουμε δοκιμές. Σε αυτές τις περιπτώσεις η λύση είναι μία. Ανοίγουμε τις πόρτες, αλλα θεωρούμε πως ο εισβολέας είναι ήδη μέσα, και περιορίσουμε την πρόσβαση του , και την βλάβη που μπορεί να προκαλέσει.
Σημείωση: ο οδηγός προυποθέτει βασικές γνώσεις δικτύου/docker/linux. Δεν ειναι βήμα-βήμα οδηγός για πρωτάρηδες, αλλα πιο πολύ οδηγία για το πώς είναι σωστό και ασφαλές να στηθεί ενα τέτοιο environment
Πώς γίνεται αυτό; Μα με συνδιασμό 3 πραγμάτων. docker – reverse proxy – fail2ban.
Docker
Εδώ ξεκινάει η μαγία. το docker δημιουργεί containers που τρέχουν services σαν αυτά τα containers να ήταν το καθένα απο μόνο του ενας ξεχωριστός υπολογιστής. Ετσι ΠΧ αν σε 1 υπολογιστή εχουμε 2 docker containers, μπορούμε να εχουμε στο 1 τον webserver μας, στο 2ο την database μας. Αν κάποιος καταφέρνε να Hackarei τον webserver μας, δέν θα είχε απευθείας πρόσβαση και στην Database μας. Το docker engine μαζί με ολα τα καλούδια του μας επιτρέπει μεσω εικονικών switch να φτιάξουμε εικονικά δίκτυα και να εντάξουμε εκεί τις υπηρεσίες μας, για τις οποίες το οικιακό μας δίκτυο θα είναι αόρατο.
Reverse proxy
To reverse proxy θα μας βοηθήσει να μην εχουμε πολλες port ανοιχτές στο ιντερνετ. Οσο λιγότερες πορτες ασφαλώς καλύτερα. Το reverse proxy θα αναλάβει να τσιμπήσει ενα ονομα του domain που βλέπουμε το σπίτι μας, και να το “οδηγήσει” στην αντίστοιχη υπηρεσία και στο αντίστοιχο port του εκάστοτε εικονικού μηχανήματος του docker μας.
fail2ban
παρέα με τα IPTABLES μας , το failtoban Θα δουλεύει στα κρυφά απο πίσω, και θα προστατεύει τα docker μας απο DDOS και bruteforce.
“Ολα καλα τα λες, μήτσο, αλλα που εγκαθιστώ τι?”
Αυτό το παράδειγμα θα το φτιάξω ωστε να hostarei 2 services. Ενα wordpress site και μια database για αυτο (για να δείξω την λειτουργία του reverse proxy). Tο σύστημά μας στο τέλος θα περιγράφεται απο το παρακάτω διάγραμμα.
Αρχικά εγκαθιστούμε debian, τι άλλο. Έπειτα εχει σειρά το docker με το docker-compose, και το fail2ban. Αυτά και μόνο αυτά θα τρέχουν στο host συστημα μας.
(τα λίνκ στα ονόματα των προγραμμάτων παραπάνω, παραπέμπουν σε οφισιάλε οδηγούς εγκατάστασης.)
Δημιουργούμε ενα εικονικό bridge δικτυο στο οποίο θα τρέχουν τα εκτεθιμένα services μας.
docker network create --driver=bridge --subnet=192.168.100.0/16 nginx-bridge-lan
Φτιάχνουμε ενα φακελο για τα compose αρχεία μας και φτιαχνουμε ενα αρχείο για καθε docker Container που χρειαζόμαστε. Αυτα τα docker compose αρχεία ειναι “οδηγιες” για το τί ρυθμίσεις να εχει το εικονικό σύστημα που ζητάμε απο το docker να φτιάξει. Στις λεπτομέρειες που προσέχουμε είναι οι εξής:
- Τo network που συνδέουμε τα εικονικά μας συστήματα είναι το “nginx-bridge-lan” που φτιάξαμε παραπάνω.
- Το μόνο σύστημα που εχει ανοιχτές πόρτες στο host είναι το reverse-proxy και αυτές είναι οι 80 και οι 443. ανοίγουμε και την 81 για την πρώτη ρύθμιση, την οποια μετά μπορούμε να απενεργοποιήσουμε.
- τα containers δεν σώζουν δεδομένα απο την φύση τους. οπότε οτιδήποτε δεδομένα θέλουμε να διατηρήσουμε τους δηλώνουμε εικονικούς σκληρούς (που είναι φάκελοι στο host), καθώς και μεταβλητές που τις περνάμε σαν environment variables.
Τα compose αρχεία για το παραπάνω setup είναι τα εξής( τα αρχεία πρέπει να εχουν ονομα docker-compose.yml) :
για την mysql και το wordpress βάζω ενα κοινό αρχείο το docker θα δημιουργήσει μια κρυφή γέφυρα που θα ενώνει “δικτυακά” τα 2 αυτά συστήματα, και θα μπορούν να επικοινωνούν μεταξύ τους με hostname, και το wordpress θα παρει IP και στο δίκτυο που εχουμε τον reverse proxy παραπάνω. :
# Use root/example as user/password credentials
version: '3.1'
services:
nginx:
image: 'jc21/nginx-proxy-manager:latest'
container_name: njinx-proxy-manager
restart: unless-stopped
networks:
- nginx_bridge_lan
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- /media/nginxproxymanager/data:/data
- /media/nginxproxymanager/letsencrypt:/etc/letsencrypt
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
networks:
- nginx_bridge_lan
volumes:
- /media/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: PASSWORD_FOR_ROOT
MYSQL_DATABASE: database1
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_db_password
wordpress:
image: wordpress:latest
container_name: wordpress
hostname: wordpress
networks:
- nginx_bridge_lan
depends_on:
- db
restart: unless-stopped
volumes:
- /media/wordpress:/var/www/html
- /media/logs:/var/log/apache2
environment:
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: wp_db_password
WORDPRESS_DB_HOST: db:3306
networks:
nginx_bridge_lan:
external: true
Αυτό ήταν. αν τρέξουμε το παρακάτω,στο φάκελο του κάθενός απο τα αρχεία, θα κατέβουν όλα τα προαπαιτούμενα και τα συστήματα θα εγακτασταθούν και θα ρυθμιστούν αυτόματα.
docker-compose up
Ρυθμιση reverse-proxy (nginx-proxy-manager)
Μπαίνουμε στην ρύθμιση του reverse-proxy-manager απο την http://LAN_IP_TOU_HOST_MAS:81 και ρυθμίζουμε ενα host forward, το domain μας (πχ. dev.doomster.eu) να γίνεται forward στο hostname “wordpress”. πλέον και μόλις κάνουμε save, οταν πατάμε στο web dev.doomster.eu ο DNS θα στέλνει το request σπίτι μας, το reverse proxy θα παίρνει το request και θα το προωθεί στο docker container με hostname wordpress. μέσα απο την ίδια πλατφόρμα μπορούμε να εκδόσουμε απευθείας και πιστοποιητικά SSL για τα services μας και να τα κραταμε ενημερωμένα. Αντίστοιχα, μπορούμε να φτιάξουμε ενα δευτερο host για την database και το db.doomster.eu να δρομολογεί πακέτα στην θυρα 3306 του αντίστοιχου container με hostname db, ωστε να μπορούμε να συνδέσουμε και εξωτερικό db manager στην εγκατάσταση μας.
Πως θα δουλέψει το fail2ban εγκατεστημένο στο host να ελέγχει τα containers
Αφού εχουμε ρυθμίσει τα παραπάνω, ασφαλώς και κλειδώνουμε τελείως το IPTABLES αφήνωντας μόνο την 80 και την 443. Αλλα για να αποφύγουμε οποιαδήποτε bruteforce προσπάθεια στα services μας βάζουμε το fail2ban.Tο fail2ban είναι μια σειρά scripts που παρακολουθούν τα logs του συστήματος και ενεργοποιούνε κανόνες στο IPTABLES, κανωντας ban τις κακόβουλες IP για συγκεκριμένους χρόνους.
Δεν θα επεκταθώ στην εγκατάσταση και παραμετροποίηση του fail2ban αφού υπάρχουν άπειροι οδηγοί online που το κάνουν, και η παραμετροποίηση του γίνεται για τα εκάστωτε services που πρέπει να τρέξεις.
Αυτό που πρέπει να αλλάξουμε εμείς στην βασική εγκατάσταση/παραμετροποίηση του fail2ban για κάθε service με σκοπό να παίξει στην δική μας παραμετροποίηση είναι 2 πράγματα.
Α) που διαβάζει τα logs το fail2ban ωστε να κάνει το scouting του. στην συγκεκριμένη περίπτωση τα logs του apache του wordpress είναι mounted στο /media/logs .
Β) Το action πρέπει να γίνεται στο FORWARD Chain και οχι στο INPUT chain, αφού τα πακέτα είναι FORWARDING πακέτα στο εσωτερικό δίκτυο του docker.
Με αυτές τις 2 σημειώσεις, το google και λίγη υπομονή, θα μπορέσετε να κάνετε monitor με το fail2ban οποια services θέλετε.
Port forwards και συναφή
Ωρα να ανοίξουμε την πρόσβαση στο ίντερνετ. Μπαίνουμε στον DNS provider μας, και δηλώνουμε το domain που θελουμε να χρησιμοποιήσουμε (στο παραδειγμα development.doomster.eu) να κοιτάει την IP του σπιτιού μας. Μπαίνουμε στο router και προωθούμε την 80 και την 443 (για http και https αντίστοιχα) στις αντίστοιχες θύρες του docker server μας.
Οπως εγραψα και στην αρχή , αυτος είναι ενας συνοπτικός οδηγός, ενα guideline του πώς πρέπει να στηθεί ενα τέτοιο development environment για να ειναι υποτυποδώς ασφαλές. Σίγουρα παίρνει βελτιώσεις, αλλα απο μή στοχευμένες επιθέσεις θα είστε αρκετά ασφαλής για να τρέξετε το develompent environment σας. Βαλτε και ενα script στο host να κρατάει ημερήσια backups στα αρχεία των docker σας, με ιστορικό 5-6 ημερών και θα είστε σίγουροι πως και να είστε θύμα κάποιας επιτυχημένης επίθεσης, αυτή θα περιοριστεί μόνο στο virtual lan του docker και θα εχετε προηγούμενα backup σας αθικτα. με ενα rebuild τα docker files με αλλους κωδικούς μεσα σε 10 λεπτά επαναφέρετε το περιβάλλον σας σε λειτουργική κατάσταση.
Δημήτρης
Τανγκο αουτ .-