Κεφάλαιο 6 · 6.3
Docker και firewall: ασφαλής δημοσίευση θυρών
Αυτή είναι η παγίδα στην οποία πέφτουν οι περισσότεροι. Μια θύρα που δημοσιεύετε στο Docker με ports: είναι προσβάσιμη από το internet, ακόμη κι αν το ufw την έχει κλείσει. Το Docker ορίζει τους δικούς του κανόνες firewall και αυτοί έχουν προτεραιότητα έναντι των κανόνων του ufw.
Ένα παράδειγμα του τι πηγαίνει στραβά
services:
db:
image: mariadb:11
ports:
- "3306:3306"
Το firewall σας λέει ότι μόνο οι θύρες 22, 80 και 443 είναι ανοιχτές. Παρ' όλα αυτά, η βάση δεδομένων σας είναι πλέον προσβάσιμη από όλο τον κόσμο στη θύρα 3306.
Τρεις κανόνες για να παραμείνει ασφαλές
- Δημοσιεύετε μόνο ό,τι πρέπει να είναι προσβάσιμο από έξω. Σε αυτόν τον οδηγό αυτό είναι μόνο το Caddy, στις θύρες 80 και 443. Οι εφαρμογές επικοινωνούν με το Caddy μέσω του εσωτερικού δικτύου του compose. Αυτές δεν χρειάζονται
ports:. - Πρέπει μια θύρα να είναι προσβάσιμη μόνο από τον ίδιο τον server; Προσθέστε μπροστά
127.0.0.1:. Τότε έχει πρόσβαση μόνο ο ίδιος ο server ή εσείς μέσω ενός SSH tunnel (δείτε Ένα αρχείο ρυθμίσεων SSH: σύνδεση με ένα σύντομο όνομα). - Μια βάση δεδομένων δεν παίρνει ποτέ
ports:. Η εφαρμογή τη βρίσκει με το όνομα της υπηρεσίας, όπωςdb.
ports:
- "127.0.0.1:3001:3001"
Έλεγχος από έξω
Δείτε στον server ποιες θύρες είναι ανοιχτές για όλους:
anna@web1:~$ sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 0.0.0.0:443 0.0.0.0:* users:(("docker-proxy",...))
LISTEN 0 4096 127.0.0.1:3001 0.0.0.0:* users:(("docker-proxy",...))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",...))
Ό,τι εμφανίζεται με 0.0.0.0 ή [::] είναι προσβάσιμο από έξω. Ό,τι εμφανίζεται με 127.0.0.1 είναι προσβάσιμο μόνο από μέσα. Αν θέλετε να το δείτε από έξω, χρησιμοποιήστε από τον δικό σας υπολογιστή έναν σαρωτή θυρών όπως το nmap στη δική σας διεύθυνση IP.
Προσοχή: Μη συνδέετε το /var/run/docker.sock σε ένα container, εκτός αν γνωρίζετε ακριβώς γιατί. Όποιος αποκτήσει τον έλεγχο αυτού του container, αποκτά έτσι ολόκληρο τον server σας.
