0.Make sure you did finish all the tasks of the previous weeks.
We expect here all personal domains are configured, VM is referable by its FDQN internally and externally from UT network (172.17.0.0/16 and 193.40.154.0/23) as well as from client machines ( over VPN ).
- Check that VPN is active in your personal machine
- From your personal machine command line
ping <vm_name>.estandping student-test.estshould give positive response.- If it does not work remember that you need to edit you personal machine's DNS server info in order to access our custom/fake domain addresses.
PS! Before you continue lab instructors highly recommend to read a very good manual about how e-mail works and how to set it up, from Christoph Haas https://workaround.org/ispmail/stretch page.
1.Setting up personal mail server
Now our fake DNS domain est is ready and populated with individual sub-domains inside, VMs are reachable by FDQN. Moreover each student has full control of his own domain, which means we can add as many names as we wish into our domain. Ideally each service has conventional names, like www for web, mail for smtp or ftp for FTP server. As we start here with e-mail service, let's add the mail host name as well as Mail Exchanger pointer to our DNS configuration.
Understanding MX Records
DNS type MX (Mail eXchange) records are used to specify the mail server(s) responsible for accepting e-mail messages on behalf of an entire domain. If there is no MX record for the domain, type A record will be queried for instead. If there is no A record either, it is not possible to send e-mails to the domain. Our goal is to set up the MX records so that the e-mails for the <vm_name>.est domain will be directed to mail.<vm_name>.est, which in turn points to our IP. So you will need to create a new type A record, too. If AAAA IPv6 records are present the postfix will use them by default, since we have no IPv6 setup we will not use AAAA records.
Here are some extra materials for type MX records. The minimum you will need to know is: what are the priority values of MX records and how to set them in the zone file.
Edit the Zone <vm_name>.est in bind9 configuration:
- Add a type
Arecord formail.<vm_name>.estwith your VM's external IP as a value. - In the same Zone file, add an
MXrecord pointing to the hostnamemail.<vm_name>.est. Set the priority value to 10.- Think about the order, how the records should be organized in the Zone files ?
- MX first then A record or vice-versa? Is there a difference?
- Think about the order, how the records should be organized in the Zone files ?
- Save the zone file
- Should we change the serial before closing ?
- Test the Zone syntax
- Remember
named-checkzonecommand
- Remember
- If everything is OK, restart the
bind9service
To test, query for the A and MX records you have just created (use either VM itself or the client machine):
dig @193.40.154.X mail.<vm_name>.estdig @193.40.154.X <vm_name>.est MX
The query should give the answer like (works only if you have set your DNS servers to be the Lab's ones):
teacher@teacher:~$ dig student-test.est -t MX ; <<>> DiG 9.10.3-P4-Debian <<>> -t mx student-test.est ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45912 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;student-test.est. IN MX ;; ANSWER SECTION: student-test.est. 900 IN MX 10 mail.student-test.est. ;; AUTHORITY SECTION: student-test.est. 900 IN NS ns1.student-test.est. ;; ADDITIONAL SECTION: mail.student-test.est. 900 IN A 193.40.155.0 ns1.student-test.est. 900 IN A 193.40.155.0 ;; Query time: 1 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Mar 24 20:55:38 UTC 2019 ;; MSG SIZE rcvd: 116
Setting up NTP
Before you start, check current clock and timezone info,
$ date$ timedatectl
update the apt-get (re-synchronize the package index files from their sources):
# apt update- It is a good practice to do it each time you intend to install something with
aptorapt-get, because this makes sure you're installing the latest versions.
- It is a good practice to do it each time you intend to install something with
Before we setup the SMTP service let's make sure our VM's time is in sync with the world time. As the mail delivery system stamps each mail with sent-out date and delivery-date it is very important that all servers have the timezone specified and the clock kept in sync. The Network Time Protocol (NTP) is used for that purpose, the details you may read here.
In Debian the NTP is handled by the package called ntp , so let's install it.
Use package manager and install ntp package
Understanding ntp client configuration
By default the ntp package comes with the list of predefined servers to sync against the following serves (according to /etc/ntp.conf :
... pool 0.debian.pool.ntp.org iburst pool 1.debian.pool.ntp.org iburst pool 2.debian.pool.ntp.org iburst pool 3.debian.pool.ntp.org iburst ...
Let's make sure our VMs do also rely on university's NTP server:
ntp.ut.ee
Edit the /etc/ntp.conf :
- Add the
ntp.ut.eeinto list of the NTP servers - Save the file
- Restart the
ntpservice - Check if that fixed time using
datecommand. Probably the clock is not right, as VM's created in the ETAIS cloud come with a UTC timezone by default. Let's fix the timezone mismatch next.- use
timedatectl list-timezonesto identifyTallinntimezone option - set with
timedatectlcommand and correctset-timezoneparameter timezone toEurope/Tallinn
- use
Check if the time is sync using date command:
$ timedatectl$ date
Prepare for VM for mail service related packages
For the mail delivery services will want the hostname -f to
return the FQDN of the VM. One option is to keep the line in /etc/hosts file:
193.40.154.X <vm_name>.est <vm_name>
... we did this in the beginning.
Now we have our DNS fully functional and therefore there is no point of keeping these line in /etc/hosts as the local DNS should resolve it anyway.
Moreover there is more intelligent way to keep the FQDN information. If you specify the FQDN into /etc/hostname explicitly - the OS will be always provisioned with its FQDN irregardless of the entries in /etc/hosts and the Zone records in DNS configuration.
Make sure your VM knows its FQDN
$ hostname -f
should return your ''<vm_name>.est'
If it does not:
- Fix the
/etc/hostnamecorrespondingly - Update the
/etc/hostscorrespondingly - Restart the machine
Generating TLS/SSL Certificates
In this lab you will need programs that are not installed by default. Start by installing Postfix, Dovecot, SpamAssassin and Alpine packages. As we mentioned during the first lab session there are other package management tools. apt can be very handy when you know exact package names and don't expect any complicated troubles with dependencies.
Install packages: Postfix, Dovecot and SpamAssassin with apt:
# apt install postfix dovecot-imapd spamassassin alpine procmail
It will offer you to install given packages and all their dependencies. Postfix will also require to remove exim since there cannot be two mail systems.
After packages are installed, you would be asked to specify some configuration parameters:
- Postfix
- Choose Internet Site
- For System mail name: <vm_name>.est
We will use SMTP and IMAP based mechanisms to exchange messages and to access mailboxes. In "plain" versions, these mechanisms send user names and passwords in clear text across the Internet. In order to protect sensitive data, we will enable support TLS (Transport Layer Security), which will encrypt the traffic. The "plain" versions will still be used by default, so we need to enable TLS on the client-side, too. The predecessor for TLS was called SSL (Secure Sockets Layer).
First we will need a TLS certificate that will be used to identify our servers and start the encrypted connection. Certificate file contains a public key and the corresponding private key is stored in separate file. Our certificates will be self-signed, meaning that there will be no Certification Authority to prove our identity. Some client software will warn about this. (We will fix this later in Apace lab.)
We will use the same (identical) certificate for both SMTP (Postfix) and IMAP (Dovecot) server. It simplifies configuration and authentication slightly in the beginning. In Debian system there is a recommended location for all the certificates and the private keys:
Certificate files are stored under the:
- /etc/ssl/certs
- The files under this directory are having read permissions for all, therefore setting the ownership is not important (public certificates must be public to everyone).
- Check permission with
ls -la /etc/ssl/certscommand.
The private key files are stored under the:
- /etc/ssl/private
- The files under this directory
MUST HAVEzero permissions for public, and only user and group can read. Additionally the group ownership is assigned to group ssl-cert. - Check permission with
ls -la /etc/ssl/privatecommand.
- The files under this directory
Generate a new certificate for your mail server:
# openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem -keyout /etc/ssl/private/dovecot.key- Use these values to answer the questions (if not listed here, use the default value):
- Country Name=EE
- State or Province Name=Tartumaa
- Locality Name=Tartu
- Organization Name=SA lab
- Organizational Unit Name=Mail Server
- Common Name=
mail.<vm_name>.est - Do not set email.
- Use the same certificate as created in previous step for postfix
- In order to do that,
copykey/cert pair files you generated for dovecot to the corresponding (/etc/ssl/private,/etc/ssl/certs) directories with namepostfix.pemandpostfix.key.cp /etc/ssl/certs/dovecot.pem /etc/ssl/certs/postfix.pemcp /etc/ssl/private/dovecot.key /etc/ssl/private/postfix.key
- The above steps are needed because dovecot and postfix rely on specific key/pem filenames although in this case we are using same certs and keys.
- In order to do that,
- Be sure all 4 previously created certificate files have right permissions! (You should be able to figure it out yourself)
The OpenSSL commands you may use to check the private keys and certificates:
# openssl rsa -in <private key> -text -noout# openssl x509 -in <certificate> -text -noout
Additionally you may check if the certificate corresponds to private key, by checking if the modulus component matches:
# openssl x509 -noout -modulus -in <certificate> | openssl md5# openssl rsa -noout -modulus -in <private key> | openssl md5
Those commands should show the same value.
Setting Up SMTP Service Using the Postfix Software
First you need to install the required software
Postfix is an SMTP server (Mail Transfer Agent) that is relatively easy to configure. However, you must still read and understand the "Postfix Configuration- Basics" document before you proceed.
The locations of the Postfix configuration and log file:
- Configuration file:
/etc/postfix/main.cf - Log file for e-mail related log messages:
/var/log/mail.log - also, keep on monitoring the
/var/log/messageslog file
In postfix the $mydomain parameter specifies the parent domain of $myhostname. By default, it is derived from $myhostname by stripping off the first part (unless the result would be a top-level domain).
Modify the Postfix configuration file so that it meets the following criteria (most of the variables already exist, modify them instead of adding new lines):
myhostnameparameter should be set tomail.<vm_name>.estmydomainparameter should not be specified and it will be derived frommyhostname
- The domain name for the outbound mail is
<vm_name>.esta.k.a$mydomainmyoriginparameter should set to$mydomain
- Server listens on all the interfaces (
inet_interfaces=all) - Server should handle mail for following addresses:
<vm_name>.est, mail.<vm_name>.est, localhost.<vm_name>.est, localhost- Better use variables like
$mydomain, localhost.$mydomain ($paramName means that we take content of paramName defined in the current conf file; in postfix configuration file order is not important)
- Better use variables like
- Trusted networks style (
mynetworks_style) is "host"- Remove (add comment character in front of line)
relayhostandmynetworksparameters and addmynetworks_styleparameter. - Set
mynetworks_style = hostand that forces Postfix to "trust" only the networks the VM is directly attached to.
- Remove (add comment character in front of line)
- The TLS configuration parameters are set up in the following way (these you should replace/add if missing):
smtpd_tls_security_level = maysmtpd_tls_cert_file=/etc/ssl/certs/postfix.pemsmtpd_tls_key_file=/etc/ssl/private/postfix.keysmtpd_tls_loglevel = 1smtp_tls_loglevel = 1
- The Internet protocols Postfix will attempt to use when making or accepting connections.
inet_protocols = ipv4
- In Debian file
/etc/mailnamemight be used to determine your hostname so also change it tomail.<vm_name>.est
Canonical sender aliases
By default the the postfix will supplement FDQN of the machine it is running in From/To: field's host part. For example if user teacher is sending out and receiving mail from host05.teacher.est machine - the From: will look like:
- teacher@host05.teacher.est
The canonical email addresses however should contain only the domain information after the @ sign. Therefore we have to force the postfix to remove the undesired host information from the From field when sending out. This is done using canonical sender alias maps (or canonical table). According the documentation, the canonical map should contain the rewrite rules, as follows:
<original> <alias>
Here original is the original is the <real user>@<sender host> and the alias is what should be shown instead in the from field. For example if we would need to hide the real user teacher behind the alias SA.Teacher when sending out, the canonical map should contain following:
teacher@host05.teacher.est SA.Teacher@teacher.est
The postfix would rewrite the From field correspondingly for each mail that is sent out by teacher user.
In our setup we first of all will focus on rewriting the host part of the email addresses specified in From field. And the user names we take later (will hide the using both virtual and local aliases). In case only the host part needs to be replaced the canonical file will look like:
@host05.teacher.est @teacher.est
And with this setup any user sending an email from host host05.teacher.est will have his From field rewritten with @teacher.est (leaving his user name untouched).
In /etc/postfix directory:
- Create the empty file called canonical
- Edit the canonical file:
- Add configuration telling postfix to rewrite the From field as follows:
mail.<vm_name>.est-><vm_name>.est- If you have specified <vm_name>.<vm_name>.est in DNS:
<vm_name>.<vm_name>.est-><vm_name>.est
- Only the host part of the e-mail address has to be rewritten, the user part we currently leave as it is
- Add configuration telling postfix to rewrite the From field as follows:
- Save the
canonicalfile: - Compile the
canonicalfile into binary hash table:# postmap /etc/postfix/canonical
- Check if the
canonical.dbfile was properly created during the compilation process- canonical.db will be stored besides the textual canonical file
Now add the configuration to postfix telling to use canonical map
Edit the main configuration file of the postfix
- Add the following line:
canonical_maps = hash:/etc/postfix/canonical
If everything is Ok, you can start up the Postfix server. If you did not specify allow-all when creating the VM, SMTP port will need to be opened from the firewall, too.
- Check the
postfixservicesystemctl status postfix.service- Start if not running (restart if running),
- Set
postfixservice to start automatically at system start-up if not set yetsystemctl is-enabled postfix.servicesystemctl enable postfix.service- You can also use legacy update-rc.d command (i.e.
update-rc.d postfix enable) .
- You can also use legacy update-rc.d command (i.e.
- If you did not specify allow-all when creating the VM:
- Add the firewall rules to accept packets on ports
tcp/25. Don't forget to save the rules! - Create a new
Security groupinETAIScalledSMTPfortcp port 25and add it to you Virtual machine
- Add the firewall rules to accept packets on ports
Mail server can now be tested by sending mails from/to the different user accounts on your machine.
- You can add new user account using following command:
# adduser newUserName
- Create a new user with login
mailuser- Set a password that is secure and that you can remember.
- Change your user to mail testing user (
sudo su - mailuser). - Run
alpinemail client. Send an email to your main user account.- Make sure the main user account has run alpine before sending email. Otherwise the emails will not go to the proper folder, and will be not visible from the Message Index screen.
- Furthermore, do not use
rootas your receiving user. Due to the underlying email service in postfix running as the usernobody, email sent torootwill actually be sent to the usernobody. Once you set up an alias for the root user the emails will be forwarded correctly.
- Return to your previous session (and if not there) log in as user and check your
mailbox. - If sending e-mails between the local users works, try to exchange e-mails with other lab systems (ask for their e-mail addresses).
- To pass the Lab7: Test if mailuser has sent email to nagios@scoring.est Nagios check, send an email from
mailuser@<vm_name>.esttonagios@scoring.est.- If the email From: header matches format of mailuser@<vm_name>.est, the check will pass.
- If you have sent an email, and this does not turn green soon, then check your postfix logs to find possible issues. (/var/log/mail.log)
Mail Aliases
Mail aliases are used to forward all e-mails sent to some address to some other address. Using aliases, you can also create an e-mail address that is not in strict connection with any of the system's user accounts. Aliases are configured in the /etc/aliases file. You can read more about aliases and its file format with command $ man aliases .
- You should already have an alias for
postmaster->root. Change it topostmaster->mailuser- Create a (local) alias
root->mailuser(as a result of this alias, e-mails sent toroot@<vm_name>.estmust be forwarded tomailuser's mailbox) - You can also create an alias for non-existent users. To test it create a (local) alias
aliastest->scoring(as a result of this alias, e-mails sent toaliastest@<vm_name>.estmust be forwarded toscoring's mailbox)
- Create a (local) alias
- Re-generate alias database with command
# newaliases - Reload postfix configuration with command
# postfix reload
If you might have noticed alpine can autocomplete e-mail addresses so you could just write username and it will automatically add your hostname to complete the address. The problem here is that you don't want to send out e-mails with your hostname in the header (i.e X-Original-To: aliastest@host06.teacher.est).In each users' home folder there is alpine configuration file (i.e /home/<user>/.pinerc ), but editing it will make changes only to particular user alpine environment. Therefore we must create centralized an alpine configuration file and modify it to achieve our goal.
- Create alpine configuration file
# alpine -conf > /etc/pine.conf- make sure its readable to everyone but writable only to
root
- make sure its readable to everyone but writable only to
- set parameter
user-domainto to equal your<vm_name>.est(i.e. student-test.est) so alpine will automatically add <vm_name>.est instead of hostname.<vm_name>.est to e-mail header.
Now you can test the alias by sending some e-mails:
- Send an e-mail to
root@<vm_name>.est, and check if this mail ends up inmailuser's mailbox. - Send e-mail to
aliastestfrom useruser(but write only "aliastest" intoTo :line and then hit <DOWN> arrow key.- Aliastest e-mail should end up in
scoringuserINBOX)
- Aliastest e-mail should end up in
- You can send e-mail also from command line
# echo -e "Subject: Command line email-01 \n\nHello! \nThis is a e-mail sent with sendmail command from command line\nby $USER" from $HOSTNAME | /usr/sbin/sendmail aliastest- You can also read e-mails without
alpineprogram from command line# cat /var/mail/scoring - Try reading other user e-mail without
rootpermission. Did it work? Why? Should it?
General check of the Postfix configuration
The following commands are useful to review the active configuration. Here active configuration means - the configuration from main.cf loaded once service is restarted.
The postconf command is used to print the active configuration variables loaded.
If we refer to manual man postconf we may discover couple of useful features:
- You may notice that till now we ask you to read
manpages or manual, but if you tryman postconfyou get an errorman: command not found... - so lets install
manwithapt install man - try now
man postconf
- You may notice that till now we ask you to read
-nswitch: Prints only the configuration alternated by user (omits default values)-dswitch: Prints only the default configuration not alternated by user (good to check what was the initial value of the variable)
IMAP Service Using Dovecot Software
We did use a "local mailbox" model for testing the e-mail service, but nowadays most of the e-mail reading is done over the network protocols such as IMAP and POP3. Actually, web-based solutions are the most popular by far, but these also usually use IMAP behind the scenes.
We will now set up an easy-to-configure IMAP server called Dovecot (the package should be installed already).
Again, you should read and understand the configuration part of the Dovecot manual.
Dovecot Wiki. Main configuration file for Dovecot is /etc/dovecot/dovecot.conf and because of the modular design each module has separate configuration file under /etc/dovecot/conf.d directory.
Details about Dovecot configuration files:
Dovecot Wiki
Configuring dovecot logging module
Configure the Dovecot IMAP server's logging module:
- Edit
/etc/dovecot/conf.d/10-logging.conffile:- Set
log_pathto /var/log/dovecot/dovecot.log - Set
mail_debugto yes
- Set
- Save file
- In
/var/logdirectory- Create
dovecotdirectory - Set ownership and permissions correctly (you should be able to figure them out on your own)
- hint: which user is running the dovecot process ?
- As a reminder
ps -aux | grep dovecot
- Create
- Restart the
dovecotservice
Make sure dovecot writes its logs into /var/log/dovecot/dovecot.log file
Configuring dovecot ssl module
Make Dovecot use the certificate we have created for our server (this will automatically allow TLS):
- Edit
/etc/dovecot/conf.d/10-ssl.conffile:- Set
sslvariable toyes: - Set
ssl_certandssl_keyas follows:ssl_cert = </etc/ssl/certs/dovecot.pemssl_key = </etc/ssl/private/dovecot.key
- Set
- Save the file
Configuring dovecot authentication module
The simplest authentication mechanism is PLAIN. The client simply sends the password unencrypted to Dovecot. All clients support the PLAIN mechanism, but obviously there's the problem that anyone listening on the network can steal the password. For that reason (and some others) other mechanisms were implemented.
Today however many people use SSL/TLS, and there's no problem with sending unencrypted password inside SSL secured connections. So if you're using SSL, you probably don't need to bother worrying about anything else than the PLAIN mechanism.
Another plaintext mechanism is LOGIN. It's typically used only by SMTP servers to let Outlook clients perform SMTP authentication. Note that LOGIN mechanism is not the same as IMAP's LOGIN command. The LOGIN command is internally handled using PLAIN mechanism.
Allow dovecot to use PLAIN and LOGIN authentication methods:
- Edit
/etc/dovecot/conf.d/10-auth.conffile:- Set
auth_mechanismsvariable to allow plain and login
- Set
- Take a look at the other variables, make sure authentication
plainis only enable over secured connection (TLS/SSL). (PS! You have to find correct parameter name yourself. HINT: nano -> CTRL + w -> type: plain -> ENTER -> CTRL + w -> ENTER -> till you find right parameter.) - Save the file
Configuring dovecot mail module
Setup the dovecot mail directory (~/mail) and mailbox (/var/mail).
- Edit
/etc/dovecot/conf.d/10-mail.conffile:- Set
mail_locationvariable tombox:~/mail:INBOX=/var/mail/%u
- Set
- Check default mail folder permissions
ls -ld /var/mail - It means only the
rootand themailgroup has write permission to the directory. You'll need to give Dovecot's mail processes ability to belong to thismail groupby- Setting
mail_privileged_groupvariable tomail
- Setting
- Save the file
- Restart the
dovecotservice,- Check the logs, make sure the
dovecotis running
- Check the logs, make sure the
- Set
dovecotto autostart usingsystemctlorupdate-rc.dcommand
General check of the Dovecot configuration
Similar to postconf there is a doveconf command for checking Dovecot configuration. The manual man doveconf suggest that most of the switches are similar to the ones of the postconf command (-n, -d, -P).
Firewall Configuration
If everything was set up properly the dovecot service should now listen for 2 port in TCP stack. What are these ports ?
- Check the default ports used by
dovecotwhen serving IMAP/IMAPS:- Take look into file
10-master.confin the/etc/dovecot/conf.d/configuration directory - Find the imap-login service block - the default ports should be stated there in commented blocks
tcp/143 (imap plain or with TLS)andtcp/993 (imaps - imap over explicit SSL/TLS pipe).
- Take look into file
- Use
netstatcommand with proper options (TCP, numeric, listening, program name) to discover if these ports are in use.
If you know the answer, declare the ports in firewall configuration:
- Add the firewall rules to accept the packets on ports used by dovecot (TCP ports: 25, 143, 993)
- Don't forget to save the rules!
- Create a new
Security Groupwith nameIMAPSand add ports143and993to it.- Dont forget to add it to Virtual Machine!
Thunderbird configuration
In order to verify Dovecot functionality we can use popular e-mail client called Thunderbird https://www.mozilla.org/en-US/thunderbird/.
- In Linux hosts you can just install the corresponding package using package manager
- In your own/personal machine download and install Thunderbird
- Verify that you can access
<vm_name>.esti.e.ping mail.student-test.estfrom own machine.- If not try:
ping 193.40.155.0andping 193.40.154.247if not YOUR VPN is misconfigurednslookup mail.student-test.estandnslookup mail.<vm_name>.estif WRONG ANSWER but ping is OK your host machine networking is messed up -> try:ipconfig /flushdnsor setting inc:/Windows/System32/drivers/etc/hostsfile mappings of IP addresses to host names manually. Restart might also help :)!
- If not try:
- Add a new e-mail address:
Thunderbird -> ALT key -> Tools -> Account settings -> Add mail account -> email addressusername@<vm_name>.esti.e.mailuser@scoring.est@@ -> add Name and NO password -> verify settings (Thunderbird should automatically find configuration) -> Accept self-certificate - Now when you open the inbox, insert the password you created the mailuser with.
- If you have either forgotten your password or need to set it you can user
sudo passwd <username> - Check if you can see e-mail in your INBOX
- Try to send e-mails to other users in your domain
SMTP Authentication
You may have noticed while configuring the Thunderbird client, that the SMTP client was configured automatically along with IMAP client. The mail sending (submission) from Thunderbird is still partial as the SMTP is not authenticated by default as opposed to IMAP. The disadvantage of the unauthenticated SMTP is that it only allows the SMTP client to submit mails to the same domain the SMTP server is serving for. The cross-domain submission will be however impossible.
You may test it as follows:
Using the Thunderbird application on client machine:
- Compose the message to some user inside your domain
- Send the message
Example in teacher.est domain:
- teacher and teacher2 accounts were in use
- email sent from teacher2@teacher.est to teacher@teacher.est The message header was as follows:
... From: teacher2@teacher.est To: teacher@teacher.est Subject: Test SMTP ...
Now destination user should have received the email (you may check it using the alpine command of the destination user, or alternatively you may setup another IMAP/SMTP client in Thunderbird.
Now if you try to address mail to the destination in different domain, the SMTP server will respond with a message:


Let's fix the error by adding the authentication to SMTP, like we did with the IMAP:
- enabling STARTTLS and explicit TLS
- enabling PLAIN authentication only over encrypted channel
The differences are however in authentication backend:
- Dovecot relies by default on system
PAMwhen authenticating clients, therefore all the user accounts in the host do have IMAP accounts automatically.- The other authentication back-ends possible for Dovecot are: Database, LDAP, Plain password file, etc.
- Postfix suggests using
SASLprotocol for authentication and the systemPAMdoesn't suggest any SASL implementation to use by default (should be configured separately by installing and configuring Cyrus SASL for example).- Alternatively a SASL implementation of the Dovecot may be used (in this case we do not have to install any additional software)
- In this case however the SASL needs to be enabled in the Dovecot
The SMTP authentication chain looks like:
- SMTP client -> SMTP server (postfix) -> Dovecot SASL -> System PAM
Let's start step by step enabling these features:
Configure Dovecot enabling SASL protocol
In /etc/dovecot/conf.d directory:
- Edit
10-master.conffile:- Find the smtp-auth block:
# Postfix smtp-auth
#unix_listener /var/spool/postfix/private/auth {
# mode = 0666
#}
- Enable the block (uncomment)
- Add the following variables
userandgroupwith the valuepostfixassigned to both of them.
- Add the following variables
- Enable the block (uncomment)
- Save the file
- Restart the
dovecotservice
Configure Postfix to use Dovecot's SASL back-end
In /etc/postfix directory:
- Edit the
main.cffile- Add the following lines:
smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes
Configure Postfix to enable submission port (587) for MUAs
SMTP communication between mail servers uses port 25. Mail clients on the other hand, often submit the outgoing emails to a mail server on port 587. Despite being deprecated, mail providers sometimes still permit the use of historic nonstandard port 465 for this purpose (i.e University of Tartu).
First let's enable the submission port with SASL authentication over STARTTLS. We also allow some certain limitations on email submission:
- Disable anonymous submission
noanonymous - Restrict SMTP clients: only allow SASL authenticated
- Restrict Relaying: only allow SASL authenticated
- Restrict Originators: From may only contain the "domain" of the SMTP server
- SMTP client cannot put random values into From field
In /etc/postfix directory:
- Edit the
master.cffile:- Find the submission port declaration:
#submission inet n - - - - smtpd # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING
(It is disabled by default)
- Enable the submission block (uncomment the header line)
- In the options list (lines starting with
-o) in the submission block make sure the following options are enabled:- -o syslog_name=postfix/submission
- -o smtpd_tls_security_level=encrypt
- -o smtpd_sasl_auth_enable=yes
- -o smtpd_sasl_path=private/auth
- -o smtpd_sasl_security_options=noanonymous
- -o smtpd_client_restrictions=permit_sasl_authenticated,reject
- -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
- -o milter_macro_daemon_name=ORIGINATING
- In the options list (lines starting with
(In case some of the options are missing, you should add them)
Now let's also enable secure submission over explicit TLS (SMTPS). We will use the same limitation policies as in submission block
In /etc/postfix directory:
- Edit the
master.cffile:- Find the smtps port declaration:
#smtps inet n - - - - smtpd # -o syslog_name=postfix/smtps # -o smtpd_tls_wrappermode=yes # -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING
(It is disabled by default)
- Enable the submission block (uncomment the header line)
- In the options list (lines starting with
-o) in the submission block make sure the following options are enabled:- -o syslog_name=postfix/smtps
- -o smtpd_tls_wrappermode=yes
- SMTPS connection runs in TLS pipe (see previous options) so we do not have to enroll any in-line TLS encryption, therefore we omit the tls_security_level option:
- The rest of the options you may configure as in the submission block
- -o smtpd_sasl_auth_enable=yes
- -o smtpd_sasl_path=private/auth
- -o smtpd_sasl_security_options=noanonymous
- -o smtpd_client_restrictions=permit_sasl_authenticated,reject
- -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
- -o milter_macro_daemon_name=ORIGINATING
- In the options list (lines starting with
- Save the file
- Restart the
postfixservice
Enable the submission port in firewall
Do not forget to enable the submission port on firewall (tcp/587) on firewall and in ETAIS
Testing
How to test: In Thunderbird compose an email to the domain other then yours:
- you may use:
nagios@scoring.est
- SMTP should ask for user name and password (may be stored in Thunderbird already)
- There should be no more error messages like Relay Access Denied and you should get an positive auto-reply from teacher@teacher.est addresses.
Spam Filtering with SpamAssassin and Procmail
Apache SpamAssassin is one of the best open source spam filters. It uses a robust scoring framework and plug-ins to integrate a wide range of advanced heuristic and statistical analysis tests on email headers and body text including text analysis, Bayesian filtering, DNS blocklists, and collaborative filtering databases. We will use SpamAssassin spamd/spamc model through procmail software. spamd is a SpamAssassin service that calculates "spam scores" for the messages. spamc is a client for the spamd. procmail is a rule-based mail processing tool. We will use procmail to do the real filtering based on the spam scores set by SpamAssassin.
You can read more about how to set up SpamAssassin in Debian here https://wiki.debian.org/DebianSpamAssassin .
- As a mail test user (
mailuser), create a.procmailrcfile (in the home directory), read the SpamAssassin/procmail tutorial on what rules to add to this file. Alternatively you can just take the content of the exampleprocmailrcfile and copy its content to mailuser's home folder into file.procmailrc. The example configuration you may find in: /usr/share/doc/spamassassin/examples/procmailrc.example
After you copied the content, edit the file:
- in the first rule, replace
|spamassassinwith|spamc - as the spam folders, use:
mail/almost-certainly-spaminstead ofalmost-certainly-spammail/probably-spaminstead ofprobably-spam
- in the first rule, replace
- Enable and start the "
spamassassin" service (restart if running). Be surespamassassinwill be started at system start-up. - Make sure the
procmailpackage is installed:apt-get install procmail
- Verify the
procmailas the default mail delivery routine inpostfix:- In directory
/etc/postfixedit themain.cffile (postfix main configuration file):- verify that the following line exists:
mailbox_command = procmail -a "$EXTENSION"
- verify that the following line exists:
- Save the file
- In directory
- Restart both
postfixandspamassassinservices
Test the spam filter by sending some e-mails:
- Send e-mails to user for which you have just created the
.procmailrcconfiguration file - Look at the e-mail headers, SpamAssassin should add some extra headers with spam score (
# cat /var/mail/mailuser) - Read
/usr/share/doc/spamc/sample-spam.txton how to create a spam test message. Send such message tomailuser- Check
/var/log/mail.info(should be smth like this "spamd: identified spam (999.4/5.0) for mailuser") - If everything is correct, you'll see your spam message in:
$ cat mail/almost-certainly-spam
inmailuserhome directory.
- Check
Sometimes you need to modify SpamAssassin and its rules to customize its action. You can read more aboud how scores are calculated from here. https://www.clickz.com/understand-spamassassin-for-better-delivery-rates/69157/ Following example has been taken from http://www.informit.com/articles/article.aspx?p=375704&seqNum=6 with modifications but it has some more explanation of how it works.
- Take a look at files and rules in
/usr/share/spamassassin/folder- Good file to start with is
/usr/share/spamassassin/50_scores.cf
- Good file to start with is
- Modify
/etc/spamassassin/local.cffile and make SpamAssassin more strict by modifyingrequired_scoreparameter to value4 - Also uncomment line
rewrite_header Subject *****SPAM***** - At the end of file
/etc/spamassassin/local.cfadd custom SpamAssassin rule by adding following lines.
body MY_SPAMASSASSIN_RULE /this is a test text for custom spamassassin rule/is describe MY_SPAMASSASSIN_RULE Test of my spamassassin rule score MY_SPAMASSASSIN_RULE 10
- Reload
postfixandspamassassinservices# service postfix reload# service spamassassin reload
- Send e-mail to
mailuserwith a text "this is a test text for custom spamassassin rule" as e-mail content, you can add more text before and/or after it. - Check its spam score and that it ended in spam folder.
Add auto-reply for scoring account
If everything worked till now lets make it easy for our automated scoring scripts to white-box test your e-mail server functionality.
- Enable
spamassassinfor userscoringwith default rules and custom rule you created in previous task. - Modify file with name
.procmailrcin scoring home folder.- add following lines at the end of it and change
teacher@teacher.este-mail toscoring@<yourdomain>.est
- add following lines at the end of it and change
LOGFILE=/home/scoring/procmailrc.log VERBOSE=on #Autoreply for every incoming mail :0 c * !^FROM_DAEMON * !^X-Loop: teacher@teacher.est | (formail -rk -A "Precedence: junk" -A "X-Loop: teacher@teacher.est" ; echo "E-mail received at : " `date`) | /usr/sbin/sendmail -t -oi -oe
- Save the file
- Ask a fellow student to send test e-mail to
scoring@<yourdomain>.est- Check that it will get correct auto-response from your mail server
- Ask a fellow student to send test e-mail to
scoring@<yourdomain>.estwith a text "this is a test text for custom SpamAssassin rule" as e-mail content- This e-mail should get
NOautomatic response as you dont want to respond to spam messages.
- This e-mail should get