Πως να hostαρετε με ασφάλεια ενα development environment απο το σπιτι.

Ο βασικός κανόνας είναι ο εξής: Δεν hostaroume τιποτε απο το σπίτι, γιατι οταν ανοίξουμε port στο ρούτερ μας, αμέσως δίνουμε προσβαση σε κάποιον που θα μας στοχεύσει κακόβουλα.

Οπως και να γίνει όμως, βρισκόμαστε μερικές φορές στην δύσκολη κατάσταση του να πρέπει να hostaroume κάτι στο σπίτι μας, τόσο για να γλυτώσουμε έξοδα ενός ενοικιασμένου webserver ή για να κάνουμε δοκιμές. Σε αυτές τις περιπτώσεις η λύση είναι μία. Ανοίγουμε τις πόρτες, αλλα θεωρούμε πως ο εισβολέας είναι ήδη μέσα, και περιορίσουμε την πρόσβαση του , και την βλάβη που μπορεί να προκαλέσει.

Σημείωση: ο οδηγός προυποθέτει βασικές γνώσεις δικτύου/docker/linux. Δεν ειναι βήμα-βήμα οδηγός για πρωτάρηδες, αλλα πιο πολύ οδηγία για το πώς είναι σωστό και ασφαλές να στηθεί ενα τέτοιο environment

Πώς γίνεται αυτό; Μα με συνδιασμό 3 πραγμάτων. docker reverse proxyfail2ban.

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 λεπτά επαναφέρετε το περιβάλλον σας σε λειτουργική κατάσταση.

Δημήτρης

Τανγκο αουτ .-

Σχολιαστε

Αφήστε μια απάντηση

Η ηλ. διεύθυνση σας δεν δημοσιεύεται.

Συντακτης
Dimitris Valilis
Ενθουσιώδης με την τεχνολογία, gamer και casual μπλόγκερ, απο μικρό παιδί προσπαθώ να ενημερώνομαι για νέες τεχνολογίες και να δοκιμάζω καινούρια πράγματα. Γράφω στο blog για να εκφράσω την άποψή μου, αλλα και για να σημειώσω πράγματα που μελλοντικά θα ψάχνω. Ενθουσιάζομαι με προγραμματιστικά και κατασκευαστικά projects και αφιερώνω τον ελεύθερο μου χρόνο στις 3D-Κατασκευές και τον σχεδιασμο/υλοποίηση και διαχείριση συστημάτων τεχνολογίας υπολογιστών.
Επικοινωνια

: Email
: Facebook
: Instagram

Created and maintained by doomster. All rights reserved.