ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ
Αρχική εγκατάσταση
Ρύθμιση τείχους προστασίας
OpenSMTPd
Διαμόρφωση ανεπιθύμητων μηνυμάτων
Περιστεριώνα
συμπέρασμα
Η λειτουργία του δικού σας διακομιστή email μπορεί να είναι αρκετά ικανοποιητική. Είστε υπεύθυνοι για τα δεδομένα σας. Σας επιτρέπει επίσης μεγαλύτερη ευελιξία με τις επιλογές παράδοσης. Ωστόσο, υπάρχουν μερικές προκλήσεις. Διατρέχετε τον κίνδυνο να ανοίξετε τον διακομιστή σας σε ευπάθειες, καθώς και να κάνετε τον διακομιστή σας έναν πιθανό αναμεταδότη για χρήση από τους spammers.
Με αυτό το πρόβλημα, ας προχωρήσουμε στη λειτουργία του δικού μας διακομιστή αλληλογραφίας.
ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ
Υπάρχουν τρία απαραίτητα κομμάτια λογισμικού για εγκατάσταση που δεν περιλαμβάνονται στο βασικό σύστημα του FreeBSD:
- OpenSMTPd
- Περιστεριώνα
- ανεπιθύμητη αλληλογραφία
Το OpenSMTPd είναι ένας πράκτορας μεταφοράς αλληλογραφίας (MTA) και ένας παράγοντας παράδοσης αλληλογραφίας (MDA). Αυτό σημαίνει ότι μπορεί να επικοινωνεί με άλλους διακομιστές αλληλογραφίας μέσω του SMTP
πρωτοκόλλου και επίσης χειρίζεται την παράδοση αλληλογραφίας στα γραμματοκιβώτια των μεμονωμένων χρηστών. Θα ρυθμίσουμε το OpenSMTPd έτσι ώστε να μπορεί να επικοινωνεί με εξωτερικούς διακομιστές (φιλτραρισμένους μέσω spamd) και να παραδίδει αλληλογραφία σε τοπικούς χρήστες, καθώς και να παραδίδει τοπική αλληλογραφία από χρήστη σε χρήστη.
Το Dovecot είναι ένα MDA που διαβάζει τοπικά γραμματοκιβώτια και τα εξυπηρετεί μέσω IMAP ή POP3 στους χρήστες. Θα χρησιμοποιήσει τα γραμματοκιβώτια των τοπικών χρηστών για την εξυπηρέτηση αυτού του περιεχομένου.
Το Spamd είναι μια υπηρεσία φιλτραρίσματος αλληλογραφίας. Μπορούμε να προωθήσουμε την αλληλογραφία μέσω ανεπιθύμητων μηνυμάτων και θα φιλτράρει την αλληλογραφία με βάση μια ποικιλία μαύρων λιστών, λευκών λιστών και γκρι λίστας.
Η γενική ιδέα για αυτόν τον διακομιστή αλληλογραφίας απαιτεί μερικές διαφορετικές διαδρομές:
Outside world -> Firewall -> spamd -> OpenSMTPD -> User mail boxes
Outside world -> Firewall (spamd-whitelist) -> OpenSMTPD -> User mailboxes
Outside world -> Firewall (IMAP/POP3) -> Dovecot
Outside world -> Firewall (SMTPD submission)
Για αυτό το σεμινάριο, θα χρησιμοποιήσουμε την έκδοση FreeBSD του PF του OpenBSD για το τείχος προστασίας μας. Μπορείτε επίσης να χρησιμοποιήσετε το ipfw
, όπου η διαμόρφωση είναι πολύ παρόμοια.
Σημείωση: Το Vultr, από προεπιλογή, μπλοκάρει τη θύρα 25, η οποία χρησιμοποιείται από διακομιστές SMTP παντού. Εάν θέλετε να εκτελέσετε έναν πλήρως λειτουργικό διακομιστή email, θα πρέπει να ανοίξετε αυτήν τη θύρα.
Αρχική εγκατάσταση
Αρχικά, πρέπει να εγκαταστήσουμε τα απαιτούμενα προγράμματα.
Υποθέτοντας ότι τρέχετε ως χρήστης με ρυθμισμένη πρόσβαση sudo, μπορούμε να εκτελέσουμε τις ακόλουθες εντολές. Θα διαφέρουν ανάλογα με το αν χρησιμοποιείτε θύρες ή πακέτα.
Πακέτα (προτείνεται)
Εάν δεν χρειάζεστε συγκεκριμένη λειτουργικότητα ενσωματωμένη σε αυτά τα βοηθητικά προγράμματα, συνιστάται η εγκατάσταση μέσω πακέτων. Είναι ευκολότερο, απαιτεί λιγότερο χρόνο και πόρους διακομιστή και παρέχει μια διαισθητική, φιλική προς το χρήστη διεπαφή.
sudo pkg install opensmtpd dovecot spamd
Οι ακόλουθες make
εντολές θα σας δώσουν πολλές επιλογές μεταγλώττισης, οι προεπιλογές θα λειτουργήσουν καλά. Μην τα αλλάζετε αν δεν γνωρίζετε ακριβώς τι κάνετε.
sudo portsnap fetch update # or run portsnap fetch extract if using ports for the first time
cd /usr/ports/mail/opensmtpd
make install # Installs openSMTPd
make clean
cd /usr/ports/mail/dovecot
make install # Installs dovecot
make clean
cd /usr/ports/mail/spamd
make install # Installs spamd
make clean
Θα χρειαστεί να προσθέσουμε τις ακόλουθες γραμμές στο /etc/rc.conf
:
pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
obspamd_enable="YES"
obspamd_flags="-v"
obspamlogd_enable="YES"
dovecot_enable="YES"
Ρύθμιση τείχους προστασίας
Για να διαμορφώσουμε το PF, μπορούμε να δημιουργήσουμε /usr/local/etc/pf.conf
:
## Set public interface ##
ext_if="vtnet0"
## set and drop IP ranges on the public interface ##
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
0.0.0.0/8, 240.0.0.0/4 }"
table <spamd> persist
table <spamd-white> persist
# Whitelisted webmail services
table <webmail> persist file "/usr/local/etc/pf.webmail.ip.conf"
## Skip loop back interface - Skip all PF processing on interface ##
set skip on lo
## Sets the interface for which PF should gather statistics such as bytes in/out and packets passed/blocked ##
set loginterface $ext_if
# Deal with attacks based on incorrect handling of packet fragments
scrub in all
# Pass spamd whitelist
pass quick log on $ext_if inet proto tcp from <spamd-white> to $ext_if port smtp \
-> 127.0.0.1 port 25
# Pass webmail servers
rdr pass quick log on $ext_if inet proto tcp from <gmail> to $ext_if port smtp \
-> 127.0.0.1 port 25
# pass submission messages.
pass quick log on $ext_if inet proto tcp from any to $ext_if port submission modulate state
# Pass unknown mail to spamd
rdr pass log on $ext_if inet proto tcp from {!<spamd-white> <spamd>} to $ext_if port smtp \
-> 127.0.0.1 port 8025
## Blocking spoofed packets
antispoof quick for $ext_if
## Set default policy ##
block return in log all
block out all
# Drop all Non-Routable Addresses
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians
pass in inet proto tcp to $ext_if port ssh
# Allow Ping-Pong stuff. Be a good sysadmin
pass inet proto icmp icmp-type echoreq
# Open up imap/pop3 support
pass quick on $ext_if proto tcp from any to any port {imap, imaps, pop3, pop3s} modulate state
# Allow outgoing traffic
pass out on $ext_if proto tcp from any to any modulate state
pass out on $ext_if proto udp from any to any keep state
Αυτή είναι μια λειτουργική διαμόρφωση PF. Είναι σχετικά απλό, αλλά υπάρχουν και μερικές ιδιορρυθμίες που πρέπει να εξηγηθούν επίσης.
Αρχικά, ορίζουμε τη $ext_if
μεταβλητή μας vtnet0
για τη χρήση της συσκευής μας αργότερα. Ορίζουμε επίσης μη έγκυρες διευθύνσεις IP που πρέπει να απορριφθούν στην εξωτερική διεπαφή.
Ορίζουμε επίσης δύο πίνακες spamd
και spamd-white
- αυτοί οι δύο πίνακες δημιουργούνται από το spamd στην προεπιλεγμένη διαμόρφωση του. Επίσης, ορίζουμε έναν πίνακα με το όνομα webmail
που θα χρησιμοποιήσουμε για να επιτρέψουμε σε ορισμένους μεγάλους παρόχους webmail να περάσουν.
Για να προβάλετε έναν πίνακα, μπορείτε να χρησιμοποιήσετε την εντολή pfctl -t tablename -T show
για να παραθέσετε τα στοιχεία σε έναν πίνακα.
Θέτουμε μερικούς κανόνες PF: παράβλεψη επεξεργασίας στην τοπική διεπαφή, ενεργοποίηση στατιστικών στοιχείων στην εξωτερική διεπαφή και καθαρισμός εισερχόμενων πακέτων.
Ακολουθεί ένα από τα πιο σημαντικά μέρη, όπου διαχειριζόμαστε την αποστολή της επισκεψιμότητάς μας μέσω του spamd ή του OpenSMTPd.
Ο πρώτος είναι ένας κανόνας ανακατεύθυνσης (σημειώστε τη σύνταξη εδώ, το FreeBSD 11 χρησιμοποιεί την παλαιότερη σύνταξη PF (πριν από το OpenBSD 4.6), επομένως η σύνταξη μπορεί να φαίνεται περίεργη. Εάν λάβουμε οτιδήποτε στο smtp από έναν κεντρικό υπολογιστή που αναφέρεται στον spamd
πίνακα ή δεν αναφέρεται στο στον spamd-white
πίνακα, ανακατευθύνουμε τη σύνδεση στον δαίμονα ανεπιθύμητης αλληλογραφίας, ο οποίος ασχολείται με αυτές τις συνδέσεις. Οι επόμενοι τρεις κανόνες είναι κανόνες διέλευσης, έτσι ώστε να μπορούμε να λαμβάνουμε μηνύματα αλληλογραφίας. Περνάμε μηνύματα από τις IP που αναφέρονται στο spamd-white
και τους webmail
πίνακες κατευθείαν στο OpenSMTPd Επίσης, δεχόμαστε μηνύματα στη θύρα υποβολής ( 587
).
Στη συνέχεια, υπάρχουν μερικοί κανόνες καθαριότητας για να ορίσουμε την προεπιλεγμένη πολιτική μας και να αποδεχόμαστε μηνύματα SSH και ICMP.
Στη συνέχεια περνάμε το IMAP και το POP3 στην εξωτερική μας διεπαφή για να έχουμε πρόσβαση στο Dovecot.
Τέλος, επιτρέπουμε όλη την εξερχόμενη κίνηση. Εάν θέλετε να προσθέσετε επιπλέον ασφάλεια, θα μπορούσατε να περιορίσετε τις θύρες που περνάτε, αλλά για έναν διακομιστή μιας χρήσης δεν είναι πρόβλημα να περάσουν τα πάντα.
Έναρξη PF:
sudo service pf start
Τώρα που έχουμε τη ρύθμιση του τείχους προστασίας, μπορούμε να προχωρήσουμε στη διαμόρφωση του διακομιστή αλληλογραφίας μας.
OpenSMTPd
Το OpenSMTPd έχει μια πολύ απλή και ευανάγνωστη σύνταξη διαμόρφωσης. Μια ολόκληρη διαμόρφωση εργασίας μπορεί να χωρέσει σε 14 γραμμές, όπως μπορείτε να δείτε παρακάτω:
#This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.
ext_if=vtnet0
# If you edit the file, you have to run "smtpctl update table aliases"
table aliases file:/etc/mail/aliases
table domains file:/etc/mail/domains
# Keys
pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"
# If you want to listen on multiple subdomains (e.g. mail.davidlenfesty) you have to add more lines
# of keys, and more lines of listeners
# Listen for local SMTP connections
listen on localhost hostname mail.example.com
# listen for filtered spamd connections
listen on lo0 port 10026
# Listen for submissions
listen on $ext_if port 587 tls-require auth pki mail.example.com tag SUBMITTED
# Accept mail from external sources.
accept from any for domain <domains> alias <aliases> deliver to maildir "~/mail"
accept for local alias <aliases> deliver to maildir "~/mail"
accept from local for any relay tls
accept tagged SUBMITTED for any relay tls
Αρχικά, ορίζουμε ξανά την εξωτερική μας διεπαφή, καθώς και μερικούς πίνακες, ψευδώνυμα και τομείς. Στη συνέχεια, προχωράμε στο κλειδί SSL και στο πιστοποιητικό για τυχόν τομείς στους οποίους θέλουμε να χειριστούμε την αλληλογραφία.
In the next section, we define the interfaces and ports we want to listen on. Firstly, we listen on localhost for our mail.example.com
domain, for any local connections. Then we listen for our spamd-filtered messages and submitted messages on the external interface. Lastly, we listen for submissions, these happen on port 587
and we are requiring them to authenticate, for security reasons.
Lastly are our accept
settings. We accept any message for any of our domains defined in our domains
table for aliases in our aliases
table, to deliver to their home directory in the maildir
format. Then we accept all local connections for local mailboxes and relay out our messages, so we can send email. Lastly, we accept our submitted messages to relay. If we didn't require authentication for our submissions port, this would be a big security hazard. This would let anyone use our server as a spam relay.
Aliases
FreeBSD ships with a default alias file /etc/mail/aliases
in the following format:
vuser1: user1
vuser2: user1
vuser3: user1
vuser4: user2
This defines the different mail boxes, and where we want to forward messages sent to these defined mailboxes. We can either define our users as local system users or external mailboxes to forward to. The default FreeBSD file is quite descriptive so you can refer to that for reference.
Domains
FreeBSD does not supply a default domains file, but this is incredibly simple:
# Domains
example.com
mail.example.com
smtp.example.com
This is just a plain text file with each domain you want to listen to on a new line. You can make a comment using the #
symbol. This file exists simply so that you can use fewer lines of configuration.
SSL Certificates
There are two ways to be able to secure your communications with your mail server, self-signed and signed certificates. It is certainly possible to self-sign your certificates, however services like Let's Encrypt provide free and incredibly easy to use signing.
First we have to install the certbot program.
sudo pkg install py-certbot
Alternatively, it can be installed with ports:
cd /usr/ports/security/py-certbot
make install
make clean
Then, to get your certificate, you need to make sure you have opened up port 80
on your external interface. Add the following lines somewhere in your filtering rules in /usr/local/etc/pf.conf
:
pass quick on $ext_if from any to any port http
Then run pfctl -f /usr/local/etc/pf.conf
to reload the ruleset.
Then you can run the command for any domains you want to get a certificate for:
certbot certonly --standalone -d mail.example.com
It is recommended to set up a crontab entry to run certbot renew
once every 6 months to ensure your certificates don't expire.
Then for every relevant domain, you can modify the lines to point to the correct key file:
pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"
Edit the securities:
sudo chmod 700 /usr/local/etc/letsencrypt/archive/mail.example.com/*
Note: You will have to do this for each original keyfile or else OpenSMTPd won't open them.
Now we can start the service:
sudo service smtpd start
Configuring spamd
Here we are using OpenBSD's spamd daemon to reduce the amount of spam we get from the internet. Essentially, this filters out messages from IPs that are known as bad from various spam sources, as well as (by default) "greylisting" incoming connections. Spamd also tries to waste spammer's timme by "stuttering" blacklisted and greylisted connections, which means it spreads out it's response over several seconds which forces the client to stay open for longer than usual.
Η εγγραφή μιας σύνδεσης σε γκρίζο πραγματοποιείται όταν συνδέεται οποιαδήποτε νέα διεύθυνση IP που δεν βρίσκεται σε καμία μαύρη ή λευκή λίστα. Μόλις συνδεθεί η νέα διεύθυνση, το spamd ρίχνει το μήνυμα με ένα αβλαβές μήνυμα σφάλματος και, στη συνέχεια, το προσθέτει σε μια προσωρινή λίστα. Επειδή οι αποστολείς ανεπιθύμητης αλληλογραφίας πληρώνονται για τα μηνύματα που παραδίδονται, δεν θα προσπαθήσουν ξανά για ένα σφάλμα, ενώ μια νόμιμη υπηρεσία θα προσπαθήσει ξανά σχετικά σύντομα.
Θα πρέπει να εκτελέσετε τα εξής για να προσαρτήσετε fdescfs
:
mount -t fdescfs null /dev/fd
Τότε θα πρέπει να προσθέσετε αυτή τη γραμμή στο /etc/fstab
:
fdescfs /dev/fd fdescfs rw 0 0
Το προεπιλεγμένο αρχείο ρυθμίσεων (που βρίσκεται στο /usr/local/etc/spamd/spamd.conf.sample
) θα λειτουργήσει καλά. Μπορείτε να το επεξεργαστείτε για να προσθέσετε νέες πηγές ή να αλλάξετε τις πηγές που χρησιμοποιείτε:
sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf
Μπορούμε να ξεκινήσουμε την υπηρεσία με τα εξής:
sudo service obspamd start
Σε αυτό το σημείο έχει ρυθμιστεί το spamd.
Ενεργοποίηση Υπηρεσιών Webmail
Ένα πρόβλημα με την προσέγγιση της γκρίζας λίστας είναι ότι οι μεγάλες υπηρεσίες αλληλογραφίας συχνά στέλνουν αλληλογραφία μέσω ενός από τα πολλά διαφορετικά καρούλια και δεν είστε σίγουροι ότι θα στέλνετε το μήνυμα από τον ίδιο διακομιστή κάθε φορά. Μια λύση σε αυτό είναι η επιτρεπόμενη λίστα των περιοχών IP που χρησιμοποιούνται από διάφορες υπηρεσίες webmail. Αυτός είναι ο λόγος για τον οποίο χρησιμοποιείται ο πίνακας αλληλογραφίας web στη διαμόρφωση PF. Αυτή η στρατηγική μπορεί να αποτύχει εάν συμπεριλάβετε μια διεύθυνση IP που χρησιμοποιεί ένας αποστολέας ανεπιθύμητης αλληλογραφίας, αλλά εφόσον είστε προσεκτικοί με το εύρος που βάζετε στον πίνακα, θα είστε εντάξει.
Για να προσθέσετε μια περιοχή email στον πίνακα webmail, μπορείτε να εκτελέσετε την ακόλουθη εντολή:
pfctl -t webmail -T add 192.0.2.0/24
Περιστεριώνα
Εάν θέλετε οι χρήστες να έχουν πρόσβαση στην αλληλογραφία τους χωρίς να συνδεθούν μέσω SSH, θα χρειαστείτε ένα MDA που να υποστηρίζει IMAP ή/και POP3. Ένα πολύ δημοφιλές πρόγραμμα είναι το Dovecot, με αρκετά απλή διαμόρφωση και ισχυρά χαρακτηριστικά.
Μπορούμε να αντιγράψουμε την προεπιλεγμένη διαμόρφωση:
cd /usr/local/etc/dovecot
cp -R example-config/* ./
Η διαμόρφωση αποτελείται από αρκετά διαφορετικά αρχεία. Για να δείτε τις διαφορές μεταξύ της διαμόρφωσής σας και των προεπιλογών του Dovecot, εκτελέστε την παρακάτω εντολή:
sudo doveconf -n
Το παρακάτω είναι μια απλή, λειτουργική διαμόρφωση:
# 2.3.2.1 (0719df592): /usr/local/etc/dovecot/dovecot.conf
# OS: FreeBSD 11.2-RELEASE amd64
# Hostname: mail.example.com
hostname = mail.example.com
mail_location = maildir:~/mail
namespace inbox {
inbox = yes
location =
mailbox Archive {
auto = create
special_use = \Archive
}
mailbox Archives {
auto = create
special_use = \Archive
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = create
autoexpunge = 60 days
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox "Sent Mail" {
auto = no
special_use = \Sent
}
mailbox "Sent Messages" {
auto = no
special_use = \Sent
}
mailbox Spam {
auto = no
special_use = \Junk
}
mailbox Trash {
auto = no
autoexpunge = 90 days
special_use = \Trash
}
prefix =
separator = /
}
passdb {
args = imap
driver = pam
}
ssl = required
ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_dh = </usr/local/etc/dovecot/dh.pem
ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem
userdb {
driver = passwd
}
Τα περισσότερα αρχεία ρυθμίσεων θα είναι μέσα conf.d
Τα σημαντικά είναι 10-auth.conf
, 10-mail.conf
, και 10-ssl.conf
.
Μπορείτε να διαμορφώσετε τα διάφορα γραμματοκιβώτια που χρησιμοποιείτε στο 15-mailboxes.conf
. Αυτό που βλέπετε παραπάνω είναι μια καλή διαμόρφωση για πολλά συστήματα, αλλά τα χιλιόμετρα σας μπορεί να διαφέρουν. Συνιστάται να παίζετε με αυτό με όσους περισσότερους διαφορετικούς πελάτες μπορείτε.
Αυθεντικοποίηση
Οι περισσότερες προεπιλεγμένες ρυθμίσεις θα είναι σωστές. Εάν θέλετε να χρησιμοποιήσετε τους χρήστες του συστήματος για έλεγχο ταυτότητας, θα πρέπει να επεξεργαστείτε το 10-auth.conf
.
Καταργήστε το σχόλιο της ακόλουθης γραμμής:
!include auth-system.conf.ext
Κρυπτογράφηση
Πρέπει να δημιουργήσουμε παραμέτρους Diffie-Hellman:
sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem
Σημείωση: Θα χρειαστεί πολύς χρόνος για να εκτελεστεί. Πολύ περισσότερο από όσο θα περίμενες.
Μπορούμε τώρα να ξεκινήσουμε το Dovecot:
sudo service dovecot start
συμπέρασμα
Σε αυτό το σημείο, έχουμε έναν λειτουργικό, ασφαλή και σχετικά χωρίς spam διακομιστή αλληλογραφίας.
Ορισμένα ακόμη πράγματα που πρέπει να εξετάσετε από εδώ είναι η χρήση του SpamAssassin για να απαλλαγείτε ευρετικά από τα ανεπιθύμητα, καθώς και η εύρεση περισσότερων μαύρων λιστών ανεπιθύμητης αλληλογραφίας που δημοσιεύονται από πηγές που εμπιστεύεστε.