Βήμα 1. Διαμόρφωση IPFW
Βήμα 2. Εγκαταστήστε και διαμορφώστε το SSHGuard
Βήμα 3. Δημιουργήστε ένα σενάριο κανόνων
Βήμα 4. Εκκίνηση και δοκιμή
Βήμα 5. Παραμείνετε σε εγρήγορση...
Οι διακομιστές VPS στοχοποιούνται συχνά από εισβολείς. Ένας κοινός τύπος επίθεσης εμφανίζεται στα αρχεία καταγραφής του συστήματος καθώς εκατοντάδες μη εξουσιοδοτημένες προσπάθειες σύνδεσης ssh. Η εγκατάσταση ενός τείχους προστασίας είναι πολύ χρήσιμη, αλλά από μόνη της μπορεί να μην ελέγχει επαρκώς τις αποτρεπτικές προσπάθειες εισβολής.
Αυτό το σεμινάριο δείχνει πώς να δημιουργήσετε ένα βελτιωμένο φράγμα εισβολής για το FreeBSD χρησιμοποιώντας δύο προγράμματα, το ipfw
τείχος προστασίας και το sshguard
. Το SSHGuard είναι ένα μικρό πρόσθετο πρόγραμμα που παρακολουθεί τα αρχεία καταγραφής του συστήματος για "καταχρηστικές" καταχωρήσεις. Όταν οι παραβάτες επιχειρούν να αποκτήσουν πρόσβαση, sshguard
δίνει εντολή ipfw
να αποκλειστεί η κυκλοφορία που προέρχεται από τη διεύθυνση IP του παραβάτη. Στη συνέχεια, ο δράστης αποκλείεται ουσιαστικά.
Μόλις γίνει κατανοητό πώς λειτουργούν αυτά τα προγράμματα, η διαχείριση της προστασίας διακομιστή είναι αρκετά απλή. Αν και αυτός ο οδηγός επικεντρώνεται στη διαμόρφωση του FreeBSD, τμήματα του ισχύουν για άλλα λειτουργικά συστήματα και λογισμικό τείχους προστασίας.
Βήμα 1. Διαμόρφωση IPFW
Το FreeBSD παρέχει 3 τείχη προστασίας στον προεπιλεγμένο ( GENERIC
) πυρήνα του, ipfw
, pf
, και ipfilter
. Κάθε ένα έχει πλεονεκτήματα και θαυμαστές, αλλά ipfw
είναι το εγγενές λογισμικό τείχους προστασίας του FBSD και είναι αρκετά απλό στη χρήση για τους σκοπούς μας. Αξίζει να σημειωθεί ότι ipfw
κάνει πολλά πράγματα όπως δείχνει η σελίδα man του, ωστόσο δυνατότητες όπως NAT, διαμόρφωση κυκλοφορίας κ.λπ., δεν χρειάζονται για την τυπική κατάσταση VPS. Ευτυχώς, τα βασικά χαρακτηριστικά του τείχους προστασίας ανταποκρίνονται εύκολα στις απαιτήσεις μας.
Για να ξεκινήσετε το τείχος προστασίας κατά την εκκίνηση, προσθέστε τα ακόλουθα στο /etc/rc.conf
:
firewall_enable="YES"
firewall_script="/usr/local/etc/IPFW.rules"
firewall_logging="YES"
Η service
εντολή είναι διαθέσιμη για μη αυτόματη εκκίνηση/διακοπή του τείχους προστασίας:
[user@vultr ~]$ sudo service ipfw start
Φυσικά, ipfw
δεν θα κάνει τίποτα μέχρι να προσθέσει κανόνες, συχνά από ένα αρχείο, σε αυτό το παράδειγμα που βρίσκεται στο /usr/local/etc/IPFW.rules
. Το αρχείο κανόνων θα μπορούσε στην πραγματικότητα να βρίσκεται οπουδήποτε ή να έχει οποιοδήποτε όνομα, αρκεί να ταιριάζει με την παράμετρο "firewall_script". Το αρχείο κανόνων περιγράφεται αναλυτικά παρακάτω.
sshguard
διατίθεται σε διάφορες γεύσεις για χρήση με διαφορετικά τείχη προστασίας. Χρησιμοποιήστε το pkg
βοηθητικό πρόγραμμα για ανάκτηση και εγκατάσταση sshguard-ipfw
:
[user@vultr ~]$ sudo pkg install sshguard-ipfw
Στις περισσότερες περιπτώσεις αυτό είναι το μόνο που χρειάζεται να κάνει κανείς. Η κατάλληλη μεταβλητή εισάγεται αυτόματα /etc/rc.conf
για εκκίνηση κατά την εκκίνηση:
sshguard_enable="YES"
Οι προεπιλογές συνήθως λειτουργούν καλά. Εάν απαιτούνται διαφορετικές τιμές, η sshguard
σελίδα man παρέχει λεπτομερείς πληροφορίες σχετικά με τις παραμέτρους:
# sshguard--program defaults, so don't need to be in rc.conf unless assigning different value
# sshguard_pidfile="/var/run/sshguard.pid"
# sshguard_watch_logs="/var/log/auth.log:/var/log/mail"
# sshguard_blacklist="40:/var/db/sshguard/blacklist.db"
# sshguard_safety_thresh="40"
# sshguard_pardon_min_interval="420"
# sshguard_prescribe_interval="1200"
Μπορείτε να ξεκινήσετε sshguard
με τη συνήθη service
επίκληση:
[user@vultr ~]$ sudo service sshguard start
Βήμα 3. Δημιουργήστε ένα σενάριο κανόνων
Το πιο δύσκολο μέρος είναι η δημιουργία του συνόλου κανόνων του τείχους προστασίας. ipfw
μπορεί να κάνει χρήση του παρεχόμενου /etc/rc.firewall
σεναρίου, αλλά πρέπει να τροποποιηθεί για να φιλοξενήσει το SSHGuard, καθώς και διαφορετικά λειτουργικά σενάρια. Ορισμένες ιστοσελίδες και το Εγχειρίδιο FreeBSD έχουν χρήσιμες πληροφορίες σχετικά με αυτό. Ωστόσο, η σύνταξη ενός αρχείου κανόνων δεν είναι τόσο δύσκολη, επιπλέον, ένα προσαρμοσμένο σύνολο κανόνων μπορεί να είναι ευκολότερο να κατανοηθεί και να αλλάξει όταν είναι απαραίτητο.
Ένα σημαντικό χαρακτηριστικό των ipfw
κανόνων είναι ότι ο πρώτος αγώνας κερδίζει, πράγμα που σημαίνει ότι η σειρά κανόνων είναι σημαντική. Στο ipfw
, κάθε κανόνας είναι μια εντολή και το αρχείο κανόνων είναι ένα εκτελέσιμο σενάριο φλοιού. Αυτό επιτρέπει την αλλαγή του συνόλου κανόνων αλλάζοντας κανόνες και στη συνέχεια εκτελώντας το αρχείο κανόνων ως το σενάριο φλοιού που είναι:
[user@vultr /usr/local/etc]$ sudo ./IPFW.rules
Γενικά, ένα αρχείο κανόνων θα ορίσει μια μεταβλητή για την ipfw
εντολή, στη συνέχεια θα διαγράψει τους τρέχοντες κανόνες, θα εκδώσει γενικούς κανόνες και στη συνέχεια θα προχωρήσει στον καθορισμό κανόνων "out" και στη συνέχεια στους κανόνες "in". Η σελίδα του εγχειριδίου ipfw και άλλοι πόροι περιέχουν πληθώρα πληροφοριών σχετικά με τη δομή κανόνων και τις επιλογές που είναι το λιγότερο πολλές.
Δεδομένου ότι η έκδοση sshguard του FreeBSD έχει ενημερωθεί στην έκδοση 1.6.2, η μέθοδος εισαγωγής κανόνων αποκλεισμού για παραβάτες έχει αλλάξει. Τώρα οι διευθύνσεις των παραβατών διατηρούνται σε έναν πίνακα ipfw (πίνακας 22 για να είμαστε συγκεκριμένοι), αντί να εισάγονται στους κανόνες πάνω από 55000 όπως πριν.
Ευτυχώς, είναι πολύ απλό να ρυθμίσετε το αρχείο κανόνων για να χρησιμοποιήσετε τον πίνακα. Είναι απλώς θέμα να τοποθετήσετε τον κανόνα του πίνακα στη σωστή θέση και να φροντίσετε να χρησιμοποιείτε τη σωστή σύνταξη κατά τη σύνταξη του κανόνα.
Όταν sshguard
βρίσκει έναν παραβάτη, βάζει τη διεύθυνση του παραβάτη στη μαύρη λίστα του και εισάγει επίσης τη διεύθυνση στον ipfw
πίνακα, ώστε να "ενεργοποιήσει" την άρνηση πρόσβασης. Αυτός ο κανόνας θα επιτύχει αυτούς τους σκοπούς:
01000 deny ip from table\(22\) to any
Είναι ακόμα απαραίτητο να τεθούν κανόνες που να επιτρέπουν τις εισερχόμενες υπηρεσίες άνω του 01000 σε αυτήν την περίπτωση. Για παράδειγμα, ας υποθέσουμε ότι η διεύθυνση 10.20.30.40
είναι παραβάτης στον πίνακα 22 και έχουμε αυτόν τον κανόνα ipfw:
56420 allow tcp from any to me dst-port 22 in via $vif
Δεδομένου ότι ipfw
συναντά τον κανόνα 01000 πριν από τον κανόνα 56420 , 10.20.30.40
είναι αποκλεισμένος . Δεν θα φανεί ποτέ από τον κανόνα "επιτρέπω 22 in". Εάν ο κανόνας αποδοχής είχε έναν "κανονικό" αριθμό όπως 00420 , η κακή κίνηση θα επιτρεπόταν και δεν θα αποκλειστεί ποτέ (επειδή το 00420 είναι μικρότερο από το 01000 και οι "πρώτες νίκες αγώνα").
Ένα ωραίο χαρακτηριστικό της ενημερωμένης έκδοσης είναι ότι τώρα όταν ξεκινά το sshguard, όλες οι διευθύνσεις στη μαύρη λίστα προστίθενται στον πίνακα και είναι διαθέσιμες για τον αποκλεισμό των εισερχόμενων παραβατών χωρίς καθυστέρηση. Η μαύρη λίστα είναι αθροιστική και διατηρείται μεταξύ των περιόδων σύνδεσης.
Σε αυτό το σημείο είναι πιθανώς λογικό να εμφανιστεί ένα πλήρες ipfw
σύνολο κανόνων τροποποιημένο για sshguard
. Τα σχόλια θα πρέπει να διευκολύνουν την τήρηση της λογικής του κανόνα:
#!/bin/sh
# ipfw config/rules
# from FBSD Handbook, rc.firewall, et. al.
# Flush all rules before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add "
vif="vtnet0"
# allow all for localhost
$cmd 00010 allow ip from any to any via lo0
# checks stateful rules. If marked as "keep-state" the packet has
# already passed through filters and is "OK" without futher
# rule matching
$cmd 00101 check-state
# allow DNS out
$cmd 00110 allow tcp from me to any dst-port 53 out via $vif setup keep-state
$cmd 00111 allow udp from me to any dst-port 53 out via $vif keep-state
# allow dhclient connection out (port numbers are important)
$cmd 00120 allow udp from me 68 to any dst-port 67 out via $vif keep-state
# allow HTTP HTTPS replies
$cmd 00200 allow tcp from any to any dst-port 80 out via $vif setup keep-state
$cmd 00220 allow tcp from any to any dst-port 443 out via $vif setup keep-state
# allow outbound mail
$cmd 00230 allow tcp from any to any dst-port 25 out via $vif setup keep-state
$cmd 00231 allow tcp from any to any dst-port 465 out via $vif setup keep-state
$cmd 00232 allow tcp from any to any dst-port 587 out via $vif setup keep-state
# allow icmp re: ping, et. al.
# comment this out to disable ping, et.al.
$cmd 00250 allow icmp from any to any out via $vif keep-state
# alllow timeserver out
$cmd 00260 allow tcp from any to any dst-port 37 out via $vif setup keep-state
# allow ntp out
$cmd 00270 allow udp from any to any dst-port 123 out via $vif keep-state
# allow outbound SSH traffic
$cmd 00280 allow tcp from any to any dst-port 22 out via $vif setup keep-state
# otherwise deny outbound packets
# outbound catchall.
$cmd 00299 deny log ip from any to any out via $vif
# inbound rules
# deny inbound traffic to restricted addresses
$cmd 00300 deny ip from 192.168.0.0/16 to any in via $vif
$cmd 00301 deny ip from 172.16.0.0/12 to any in via $vif
$cmd 00302 deny ip from 10.0.0.0/8 to any in via $vif
$cmd 00303 deny ip from 127.0.0.0/8 to any in via $vif
$cmd 00304 deny ip from 0.0.0.0/8 to any in via $vif
$cmd 00305 deny ip from 169.254.0.0/16 to any in via $vif
$cmd 00306 deny ip from 192.0.2.0/24 to any in via $vif
$cmd 00307 deny ip from 204.152.64.0/23 to any in via $vif
$cmd 00308 deny ip from 224.0.0.0/3 to any in via $vif
# deny inbound packets on these ports
# auth 113, netbios (services) 137/138/139, hosts-nameserver 81
$cmd 00315 deny tcp from any to any dst-port 113 in via $vif
$cmd 00320 deny tcp from any to any dst-port 137 in via $vif
$cmd 00321 deny tcp from any to any dst-port 138 in via $vif
$cmd 00322 deny tcp from any to any dst-port 139 in via $vif
$cmd 00323 deny tcp from any to any dst-port 81 in via $vif
# deny partial packets
$cmd 00330 deny ip from any to any frag in via $vif
$cmd 00332 deny tcp from any to any established in via $vif
# allowing icmp re: ping, etc.
$cmd 00310 allow icmp from any to any in via $vif
# allowing inbound mail, dhcp, http, https
$cmd 00350 allow udp from any 53 to me in via $vif
$cmd 00360 allow tcp from any 53 to me in via $vif
$cmd 00370 allow udp from any 67 to me dst-port 68 in via $vif keep-state
$cmd 00400 allow tcp from any to me dst-port 80 in via $vif setup limit src-addr 2
$cmd 00410 allow tcp from any to me dst-port 443 in via $vif setup limit src-addr 2
# SSHguard puts offender addresses in table 22. Set up the table rule
# Please note the '\(22\)' syntax, necessary since it's run as shell command
$cmd 01000 deny ip from table\(22\) to any
# allow inbound ssh, mail. PROTECTED SERVICES: numbered ABOVE sshguard blacklist range
$cmd 56420 allow tcp from any to me dst-port 22 in via $vif setup limit src-addr 2
$cmd 56530 allow tcp from any to any dst-port 25 in via $vif setup keep-state
$cmd 56531 allow tcp from any to any dst-port 465 in via $vif setup keep-state
$cmd 56532 allow tcp from any to any dst-port 587 in via $vif setup keep-state
# deny everything else, and log it
# inbound catchall
$cmd 56599 deny log ip from any to any in via $vif
# ipfw built-in default, don't uncomment
# $cmd 65535 deny ip from any to any
Βήμα 4. Εκκίνηση και δοκιμή
Οι ανάγκες του συστήματος ποικίλλουν και διαφορετικές επιλογές θυρών για αποκλεισμό ή κατάργηση αποκλεισμού αντικατοπτρίζονται στο σύνολο κανόνων. Μόλις ολοκληρωθεί το σύνολο κανόνων, αποθηκεύστε το αρχείο στο /usr/local/etc/IPFW.rules
και ξεκινήστε τις υπηρεσίες FBSD:
# service ipfw start
# service sshguard start
Το επαυξημένο τείχος προστασίας θα πρέπει τώρα να εκτελείται! Έλεγχος sshguard
:
[user@vultr ~]$ sudo pgrep -lfa ssh
Εάν sshguard
εκτελείται, εμφανίζονται το pid και η πλήρης γραμμή εντολών:
720 /usr/local/sbin/sshguard -b 40:/var/db/sshguard/blacklist.db -l /var/log/auth.log -l /var/log/maillog -a 40 -p 420 -s 1200 -w /usr/local/etc/sshguard.whitelist -i /var/run/sshguard.pid
Αυτό δείχνει το σύνολο κανόνων του τείχους προστασίας με στατιστικά και την τελευταία φορά που ένα πακέτο ταιριάζει με τον κανόνα:
[user@vultr ~]$ sudo ipfw -cat list
Μετά από ώρες ή ημέρες, οι διευθύνσεις των παραβατών προστίθενται στη μαύρη λίστα καθώς και στον πίνακα 22. Για να δείτε όλες τις διευθύνσεις στον πίνακα, χρησιμοποιήστε αυτήν την εντολή:
ipfw table 22 list
Το αποτέλεσμα εκτυπώνεται ως εξής:
10.10.10.118/32 0
10.10.10.72/32 0
...
Όπως περιγράφεται παραπάνω, οι συνδέσεις από αυτές τις διευθύνσεις δεν επιτρέπονται. Φυσικά, κατά την πρώτη εκτέλεση sshguard
δεν θα υπάρχουν διευθύνσεις στη λίστα, αλλά με την πάροδο του χρόνου μπορεί να είναι αρκετά μεγάλη. Μια επιλογή είναι η δημιουργία χωριστών κανόνων αποκλεισμού για διευθύνσεις με πολλές καταχωρήσεις στον πίνακα και στη συνέχεια η διαγραφή τους από τη μαύρη λίστα.
Βήμα 5. Παραμείνετε σε εγρήγορση...
Είναι καλή ιδέα να ελέγχετε περιστασιακά τα αρχεία καταγραφής για να βεβαιωθείτε ότι ελέγχονται οι εισβολές. Γενικά, /var/log/auth.log
και /var/log/security
είναι ενημερωτικά. Μπορεί να γίνουν εμφανή κενά ή σφάλματα στην κάλυψη των υπηρεσιών δικτύου. Η τροποποίηση του συνόλου κανόνων του τείχους προστασίας όπως απαιτείται είναι ένα κανονικό μέρος της διαχείρισης διακομιστή.
Σε προηγούμενες εκδόσεις sshguard, όταν το /var/db/sshguard/blacklist.db
αρχείο είχε μεγαλώσει, θα μπορούσε να αποτρέψει την sshguard
εκκίνηση κατά την εκκίνηση του συστήματος. Αφαίρεση ή μετονομασία του αρχείου μαύρης λίστας που επιτρέπεται sshguard
να ξεκινήσει. Αυτό το ζήτημα φαίνεται να επιδιορθώνεται στην πιο πρόσφατη έκδοση sshguard, επομένως αυτή η λύση μάλλον δεν είναι πλέον απαραίτητη.
Βεβαιωθείτε ότι έχετε προσθέσει στη λίστα επιτρεπόμενων τη διεύθυνση IP από την οποία είστε συνδεδεμένοι στην περίοδο λειτουργίας SSH. Εάν κλειδωθείτε κατά λάθος, μπορείτε πάντα να συνδεθείτε στην κονσόλα noVNC στη διεύθυνση https://my.vultr.com και να προσθέσετε στη λίστα επιτρεπόμενων την IP σας.
Συνοψίζοντας, η χρήση του συνδυασμού ipfw
και sshguard
βοηθά να διατηρήσετε το σύστημα FreeBSD σας ασφαλές και να κάνει τη δουλειά του. Η ελαχιστοποίηση της παρεμβατικής δραστηριότητας δικτύου έχει ένα πρόσθετο πλεονέκτημα: ο λιγότερος "θόρυβος" διευκολύνει την παρακολούθηση και τον συντονισμό της λειτουργίας του συστήματος, συμβάλλοντας σε έναν ασφαλέστερο διακομιστή που λειτουργεί καλύτερα.
Η αποτελεσματική προστασία ενός συστήματος/διακομιστή FreeBSD δεν είναι ιδιαίτερα περίπλοκη. Ενώ απαιτείται μέτρια προσπάθεια για να τεθεί σε λειτουργία και να λειτουργήσει, αποδίδει σε σημαντικά μεγαλύτερη ασφάλεια VPS και έργου.