Se instaleaza pachetele “dnsutils” si “telnet”
apt-get install dnsutils telnet -y
Se verifica daca portul 25 este deblocat:
dig mx +short yahoo.com |awk -F ' ' '{print $2}'
mta6.am0.yahoodns.net.
mta5.am0.yahoodns.net.
mta7.am0.yahoodns.net.
telnet mta6.am0.yahoodns.net 25
Trying 98.138.112.34…
Connected to mta6.am0.yahoodns.net.
Escape character is ‘^]’.
220 mta1278.mail.ne1.yahoo.com ESMTP ready
Daca output-ul este “Conection timed out” atunci portul este blocat
Se concateneaza certificatele digitale:
cat domeniu.com.crt intermediate.crt > domeniu.com.chain.crt
Se instaleaza Dovecot si Postfix
apt-get install dovecot-imapd dovecot-lmtpd apt-get install postfix postgrey postfix-policyd-spf-python
Se elimina pachetul Exim instalat odata cu sistemul de operare:
apt-get purge exim4 exim4-*
Postfix asculta porturile SMTP(25) si Submission(587) iar Dovecot asculta portul IMAP(993).
Configurari initiale
POSTFIX
Pentru configurarea porturilor se editeaza master.cf
nano /etc/postfix/master.cf
Se activeaza serviciul Submission eliminand comentariul (#) de la linia 17
……
smtp inet n – – – – smtpd
#smtp inet n – – – 1 postscreen
……
submission inet n – – – – smtpd
# -o syslog_name=postfix/submission
……
Serviciul SMTP este activat implicit.
Se editeaza fisierul de configurare main.cf:
nano /etc/postfix/main.cf
Se specifica certificatele de siguranta
Se inlocuieste smtpd_use_tls = yes cu smtpd_tls_security_level = may
Se introduce smtp_tls_security_level = may
smtpd_tls_cert_file=/var/SSL/marinelvis.biz.chain.crt
smtpd_tls_key_file=/var/SSL/marinelvis.biz.key
smtpd_tls_security_level = may
smtp_tls_security_level = may
DOVECOT
Se creeaza un singur fisier de configurare dovecot.conf:
doveconf -n > /etc/dovecot/dovecot.conf.new mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig mv /etc/dovecot/dovecot.conf.new /etc/dovecot/dovecot.conf nano /etc/dovecot/dovecot.conf
Linia ssl = no se sterge si se inlocuieste cu urmatorul bloc:
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
}
}
ssl = required
ssl_ca = </etc/ssl/certs/ca-certificates.crt
ssl_cert = /var/SSL/domeniu.com.chain.crt
ssl_key = </var/SSL/domeniu.com.key
Se elimina monitorizarea de catre systemd a portului IMAP(143) pentru a preveni aparitia de erori:
cp /lib/systemd/system/dovecot.socket /etc/systemd/system/ systemctl reenable dovecot.socket sed -i '/:143$/s/^/#/' /etc/systemd/system/dovecot.socket
PROBA
Pe serverul unde se instaleaza:
systemctl restart postfix systemctl restart dovecot netstat -lnpt
In output trebuie sa fie listate porturile 25, 587 si 993 in coloana „Local Address”
Se verifica daca sunt semnalate erori in log-uri:
less | /var/log/mail.log less | /var/log/syslog
Din calculatorul local:
openssl s_client -starttls smtp -crlf -connect domeniu.com:587 openssl s_client -connect domeniu.com:993
In ambele cazuri antepenultimul rand din output trebuie sa fie:
……
Verify return code: 0 (ok)
……
Se revine la root cu Ctrl + c
Autentificare si mailbox-uri
POSTFIX
nano /etc/postfix/main.cf
Se modifica modul de autentificare in Dovecot.
Se introduce urmatorul bloc:
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
# The path is relative to $queue_directory:
# postconf |grep queue_directory
# queue_directory = /var/spool/postfix
smtpd_sasl_path = private/auth
# Do not accept SASL authentication over unencrypted connections
smtpd_tls_auth_only = yes
DOVECOT
nano /etc/dovecot/dovecot.conf
Se introduce urmatorul bloc:
# Allows plaintext authentication only when SSL/TLS is used first.
# http://wiki2.dovecot.org/Authentication
auth_mechanisms = plain login
disable_plaintext_auth = yes
service auth-worker {
# Forbid to access /etc/shadow
user = $default_internal_user
}
service auth {
# IMPORTANT: Match the path to smtpd_sasl_path of Postfix
unix_listener /var/spool/postfix/private/auth {
group = postfix
user = postfix
mode = 0666
}
}
Se inlocuiesc mail_location, passdb si userdb:
mail_location = maildir:/var/vmail/%d/%n
passdb {
driver = passwd-file
# The entire email address will be used as the username for email client.
# Don’t bother about the scheme here, will be overwritten by a strong scheme from file.
# (http://wiki2.dovecot.org/AuthDatabase/PasswdFile)
args = scheme=CRYPT username_format=%u /etc/dovecot/users
}
userdb {
# For static type, LDA verify the user’s existence by lookup passdb
# ( http://wiki2.dovecot.org/UserDatabase/Static )
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
Toate directoarele speciale ale casutei postale vor fi create automat de Dovecot pentru fiecare cont in parte. Trebuie specificat formatul casutei postale in mail_location si un utilizator de sistem care sa execute operatiile corespunzatoare in mailbox-uri
Se creeaza utilizatorul de sistem vmail:
adduser --system --home /var/vmail --uid 550 --group --disabled-login vmail
A fost creat folderul /var/vmail detinut de utilizatorul de sistem vmail.
Se creaza primul cont de e-mail si se introduce parola utilizand algoritmul de criptare SHA512 dupa urmatorul model:
doveadm pw -s SHA512-CRYPT
Exemplu de rezultat:
{SHA512-CRYPT}$6$jBJaXdjpgiAZVRUh$ysJbSwCDAZvxrJNUHr8urqKWOUmyQ7mNxl7ptWDf7htMB9s9lZZuNYTXuDPST2W226nOQG5IrHHmo0PCnhF/d0
Se creeaza un fisier nou in /etc/dovecot si se introduce parola criptata:
nano /etc/dovecot/users
dupa modelul:
user@domeniu.com:{SHA512-CRYPT}$6$jBJaXdjpgiAZVRUh$ysJbSwCDAZvxrJNUHr8urqKWOUmyQ7mNxl7ptWDf7htMB9s9lZZuNYTXuDPST2W226nOQG5IrHHmo0PCnhF/d0
Se schimba propietarul si permisiunile:
chmod 640 /etc/dovecot/users chown root:dovecot /etc/dovecot/users
Dovecot nu depinde de domenii, deci pot fi folosite mai multe sau nici un domeniu. Utilizatorii pot fi administrați utilizand acest fisier.
PROBA
Din calculatorul local:
openssl s_client -connect domeniu.com:993
Se realizeaza conexiunea la serverul de mail:
……
* OK
……
In terminal se scriu comenzile pentru conectarea la contul de utilizator creat anterior:
a login user@domeniu.com parola
a OK [……] Logged in
Pentru iesire si revenire la cursorul de root:
b logout
Se poate reveni la root si cu Ctrl + c
LMTP (Local Mail Transfer Protocol)
POSTFIX
nano /etc/postfix/main.cf
Se introduce linia mydomain = domeniu.com inainte de $myhostname. Se schimba variabilele urmatoare:
mydomain = domeniu.com
myhostname = $mydomain
myorigin = $mydomain
mydestination = localhost
Valorile variabilelor $mydomain si $myhostname trebuie sa fie aceleasi din certificatele SSL.
Modul de utilizare al variabilelor:
$myhostname: numele transmis prin comenzile SMTP HELO sau EHLO si banerul de intampinare SMTP.
$myorigin, $mydestination: In /etc/postfix/virtual_aliases mai jos.
$myorigin, $virtual_mailbox_domains, $virtual_alias_maps: reject_unauth_destination
Se introduc urmatoarele linii:
# Handing off local delivery to Dovecot’s LMTP
# http://wiki2.dovecot.org/HowTo/PostfixDovecotLMTP
#
# The path relative to $queue_directory, that is:
# /var/spool/postfix/private/dovecot-lmtp
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Check domains only, query users and aliases in Dovecot
#
# IMPORTANT: Don’t overlap with $mydestination
#virtual_mailbox_domains = example1.com, example2.com
virtual_mailbox_domains = $mydomain
#virtual_alias_domains = $virtual_alias_maps
virtual_alias_maps = hash:/etc/postfix/virtual_aliases
Alias-uri
Se creeaza fisierul virtual_aliases
nano /etc/postfix/virtual_aliases
si se introduc urmatoarele linii:
# The input(left column) without domain, will match user@$myorigin
# and user@$mydestination (e.g. root@example.com, root@localhost)
#
# The result(right column) without domain, Postfix will append
# $myorigin as $append_at_myorigin=yes
# So the user user@domeniu.com must exists in /etc/dovecot/users
# See: The section TABLE FORMAT in manual virtual(5)
postmaster root
webmaster root
abuse root
# Person who should get root’s mail
root user
info@domeniu.com user
# A catch-all address is at the risk of spam
#@domeniu.com user
Apoi se creeaza baza de date alocata alias-urilor:
postmap /etc/postfix/virtual_aliases postfix reload
DOVECOT
nano /etc/dovecot/dovecot.conf
Se introduce urmatorul bloc:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0666
user = postfix
group = postfix
}
}
Calea absoluta catre dovecot-lmtp trebuie sa fie aceeasi ca valoarea variabilei $virtual_transport in Postfix.
PROBA
Pe serverul unde se instaleaza:
systemctl restart postfix systemctl restart dovecot
Se verifica daca s-a creat fisierul „dovecot-lmtp”
ls -l /var/spool/postfix/private/dovecot-lmtp
Se trimite un e-mail. Datorita alias-urilor create anterior contul user@domeniu.com va primi un mesaj in directorul new:
sendmail -bv webmaster
sudo ls -l /var/vmail/domeniu.com/user/new
Inregistrarile DNS
Hostname -> A -> IPv4
domeniu.com -> MX -> mail.domeniu.com
domeniu.com -> TXT -> v=spf1 a mx ip4:IPv4 ip6:IPv6 –all
Pentru ca serverul de mail este acelasi cu serverul domeniului domeniu.com = mail.domeniu.com
Raspunsul inregistrarii MX trebuie sa fie aceeasi cu variabila $myhostname din /etc/postfix/main.cf
domeniu.com -> A -> 5.189.138.195 (IP-ul domeniului)
domeniu.com -> MX -> domeniu.com
domeniu.com -> TXT -> v=spf1 a mx ip4:5.189.138.195 ip6:2a02:c207:2013:6973:0000:0000:0000:0001 -all
Pentru reverseDNS se introduce IP-ul inversat in inregistrarea PTR:
195.138.189.5.in-addr.arpa
PROBA
Se testeaza cu comanda dig:
dig +short mx domeniu.com |awk '{print $2}'
Output-ul trebuie sa fie numele domeniului unde a fost directionata inregistrarea MX
domeniu.com
dig +short a domeniu.com
Output-ul trebuie sa fie IP-ul mailserver-ului
5.189.138.195
dig +short -x 5.189.138.195
Output-ul trebuie sa fie numele domeniului
domeniu.com
Mail User Agent
Date de configurare pentru clientii de mail (Microsoft Outlook, Thunderbird, etc.):
IMAP
Server Name: domeniu.com
Port: 993
Connection security: SSL/TLS
Authentication method: Normal password
User Name: user@ domeniu.com
SMTP
Server Name: domeniu.com
Port: 587
Connection security: STARTTLS
Authentication method: Normal password
User Name: user@ domeniu.com
Antispam
POSTFIX
nano /etc/postfix/main.cf
Se sterge linia cu variabila smtpd_relay_restrictions. In locul ei se introduce blocul urmator:
# Restrictions in order: client, helo, sender, relay/recipient
smtpd_client_restrictions = permit_mynetworks,
reject_unauth_pipelining,
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
smtpd_sender_restrictions = permit_mynetworks,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
check_sender_access hash:/etc/postfix/sender_access,
# Reject destination we’re not responsible for, limit abuse or
# prevent postfix become an open relay. (version >= 2.10 required)
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated,
reject_unauth_destination,
smtpd_recipient_restrictions =
# General rules
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
# Our users
permit_mynetworks,
permit_sasl_authenticated,
# Spam filters
reject_rbl_client zen.spamhaus.org,
reject_rbl_client dnsbl.sorbs.net,
reject_rhsbl_reverse_client dbl.spamhaus.org,
reject_rhsbl_helo dbl.spamhaus.org,
reject_rhsbl_sender dbl.spamhaus.org,
# This should be next-to-last
check_policy_service unix:private/postgrey,
permit
Regula reject_unauth_destination impiedica mailserver-ul sa devina open relay.
POSTGREY
Se modifica optiunile Postgrey:
nano /etc/default/postgrey
POSTGREY_OPTS=”–unix=/var/spool/postfix/private/postgrey –delay=66″
Restart Postgrey:
systemctl restart postgrey
BLACKLIST OF SENDER
Unii spam-eri pot trece de filtrele impuse de Postfix. In acest caz se foloseste Blacklist.
nano /etc/postfix/sender_access
Calea /etc/postfix/sender_access trebuie sa fie aceeasi ca setarea variabilei check_sender_access din main.cf:
Se creeaza baza de date sender_access.db:
postmap hash:sender_access
Apoi se introduc manual domeniile spam-erilor in baza de date:
Exemplu:
cd /etc/postfix/ echo spam@yandex.ru REJECT >> sender_access echo ya.ru REJECT >> sender_access postmap hash:sender_access
FAIL2BAN
Se instaleaza fail2ban:
apt-get install fail2ban -y
Se face o copie locala a fisierului de configurare si se editeaza:
cd /etc/fail2ban/filter.d/ cp postfix.conf postfix.local nano postfix.local
Se adauga linia:
^%(__prefix_line)slost connection after (?:AUTH|UNKNOWN) from \S+\[<HOST>\]$
la failregex, care ar trebui sa arate asa:
failregex = ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 554 5\.7\.1 .*$
^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 450 4\.7\.1 : Helo command rejected: Host not found; from=<> to=<> proto=ESMTP helo= *$
^%(__prefix_line)sNOQUEUE: reject: VRFY from \S+\[<HOST>\]: 550 5\.1\.1 .*$
^%(__prefix_line)simproper command pipelining after \S+ from [^[]*\[<HOST>\]:?$
^%(__prefix_line)slost connection after (?:AUTH|UNKNOWN) from \S+\[<HOST>\]$
Se editeaza jail.local:
nano /etc/fail2ban/jail.local
Se activeaza Postfix:
[postfix]
Enabled = true
Se reporneste Fail2ban
fail2ban-client reload postfixfail2ban-client status
SPF
nano /etc/postfix/main.cf
Inainte de linia check_policy_service unix:private/postgrey se intorduce linia aferenta SPF:
……
check_policy_service unix:private/policyd-spf,
check_policy_service unix:private/postgrey,
permit
Linia check_policy_service trebuie introdusa dupa reject_unauth_destination pentru a evita ca mailserver-ul sa devina open relay.
La sfarsitul fisierului main.cf se introduce linia:
policy-spf_time_limit = 3600s
Se editeaza fisierul master.cf si se introduc cele 2 linii la sfarsitul fisierului:
nano /etc/postfix/master.cf
policyd-spf unix – n n – 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spf
Se reporneste Postfix:
systemctl restart postfix
DKIM (DomainKeys Identified Mail)
DKIM implica configurarea pachetului OpenDKIM, conectarea lui cu Postfix si alocarea inregistrarilor DNS specifice.
Se instaleaza OpenDKIM:
apt-get install opendkim opendkim-tools -y
Fisierul de configurare /etc/opendkim.conf trebuie sa arate astfel:
nano /etc/opendkim.conf
# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.
# Log to syslog
Syslog yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask 002
# OpenDKIM user
# Remember to add user postfix to group opendkim
UserID opendkim
# Map domains in From addresses to keys used to sign messages
KeyTable /etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
# Hosts to ignore when verifying signatures
ExternalIgnoreList /etc/opendkim/trusted.hosts
InternalHosts /etc/opendkim/trusted.hosts
# Commonly-used options; the commented-out versions show the defaults.
Canonicalization relaxed/simple
Mode sv
SubDomains no
#ADSPAction continue
AutoRestart yes
AutoRestartRate 10/1M
Background yes
DNSTimeout 5
SignatureAlgorithm rsa-sha256
# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer
# and the verifier. From is oversigned by default in the Debian package
# because it is often the identity key used by reputation systems and thus
# somewhat security sensitive.
OversignHeaders From
Se aloca permisiunile fisierului:
chmod u=rw,go=r /etc/opendkim.conf
Se creeaza folderele pentru datele OpenDKIM, se desemneaza user-ul opendkim ca propietar al folderelor si se configureaza permisiunile fisierelor:
mkdir /etc/opendkim mkdir /etc/opendkim/keys chown -R opendkim:opendkim /etc/opendkim chmod go-rw /etc/opendkim/keys
Se creeaza tabelul de semnaturi /etc/opendkim/signing.table in care se introduce cate o linie pentru fiecare domeniu care are alocat un server de mail dupa modelul de mai jos:
nano /etc/opendkim/signing.table
*@domeniu.com domeniu
Se creeaza tabelul cheilor private /etc/opendkim/key.table cu cate o linie pentru fiecare domeniu inscris in signing.table dupa modelul de mai jos:
nano /etc/opendkim/key.table
domeniu.com domeniu.com:YYYYMM:/etc/opendkim/keys/domeniu.private
Primul camp conecteaza tabelul de semnaturi cu tabelul cheilor private.
Al doilea camp e impartit in 3 sectiuni separate de „:”
prima sectiune e numele de domeniu pentru care este alocata cheia.
a doua sectiune este selectorul (YYYYMM) folosit cand este cautata cheia inscrisa in inregistrarile DNS
a treia sectiune desemneaza fisierul care contine cheia de criptare alocata domeniului.
Fluxul pentru cautarea DKIM incepe cu adresa expeditorului. Tabelul de semnaturi este scanat pana la o intrare al carei model (primul element) se potriveste cu adresa. Apoi, valoarea celui de-al doilea element este utilizata pentru a localiza intrarea in tabelul cheilor a carei informatie cheie va fi utilizata. Pentru mesajele primite, domeniul si selectorul sunt apoi folosite pentru a gasi înregistrarea TXT a cheii publice in DNS si cheia publica este utilizată pentru a valida semnatura. Pentru e-mailul de iesire, cheia privata este citită din fisierul numit s utilizata pentru a genera semnatura pe mesaj.
Se creeaza fisierul /etc/opendkim/trusted.hosts cu urmatorul continut:
nano /etc/opendkim/trusted.hosts
127.0.0.1
::1
localhost
mail.domeniu.com
domeniu.com
Se aloca permisiunile si propietarul fisierelor:
chown -R opendkim:opendkim /etc/opendkim chmod -R go-rwx /etc/opendkim/keys
Se genereaza cheile de criptare:
opendkim-genkey -b 2048 -h rsa-sha256 -r -s 201710 -d domeniu.com -v
Se genereaza doua fisiere: YYYYMM.private care contine cheia de criptare si YYYYMM.txt care contine inregistrareaTXT pentru setarile DNS. Se redenumesc fisierele ca sa se potriveasca cu a treia sectiune a celui de-al doilea camp din key.table:
mv 201710.private domeniu.private
mv 201710.txt domeniu.txt
Se configureaza permisiunile si propietarul folderului /etc/opendkim:
chown -R opendkim:opendkim /etc/opendkim
chmod -R go-rw /etc/opendkim/keys
Se reporneste OpenDKIM:
systemctl restart opendkim
Daca sunt semnalate erori
systemctl status -l opendkim
DKIM foloseste inregistrarile TXT ca sa pastreze informatiile despre semnatura fiecarui domeniu.
Continutul fisierului /etc/opendkim/keys/domeniu.txt arata asa:
YYYYMM._domainkey IN TXT ( “**v=DKIM1; h=rsa-sha256; k=rsa; s=email; “ “p=MIIBIjANBgkqX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHiABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/+PdtqIwXR” “ZksfuXh7m30kuyavp3UasoMgMjO+YjG8JsdcwIDAQAB**” ) ; —– DKIM key YYYYMM for domeniu.com
Valoarea dintre paranteze se copie intr-un fisier-text separat fara ghilimele si spatii goale. De asemenea se inlocuieste h=rsa-sha256 cu h=sha256:
v=DKIM1; h=sha256; k=rsa; s=email;
p= MIIBIjANBgkqX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHiABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/+PdtqIwXR ZksfuXh7m30kuyavp3UasoMgMjO+YjG8JsdcwIDAQAB
Continutul de mai sus se introduce intr-o intr-o inregistrare TXT in managerul DNS
PROBA
Pentru verificare se foloseste comanda opendkim-testkey:
opendkim-testkey -d domeniu.com -s YYYYMM
Daca nu exista output atunci totul este configurat corect. Daca apar erori, pentru mai multe informatii se adauga optiunea –vvv la sfarsitul comenzii. Output-ul trebuie sa fie „key OK”. Va aparea si mesajul “key not secure” care va fi corectat prin configurarile urmatoare.
mkdir /var/spool/postfix/opendkim chown opendkim:postfix /var/spool/postfix/opendkim
Se configureaza socket-ul pentru Postfix in fisierul de configurare implicit al OpenDKIM:
nano /etc/default/opendkim
# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=””
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
SOCKET=”local:/var/spool/postfix/opendkim/opendkim.sock”
#SOCKET=”inet:54321″ # listen on all interfaces on port 54321
#SOCKET=”inet:12345@localhost” # listen on loopback on port 12345
#SOCKET=”inet:12345@192.0.2.1″ # listen on 192.0.2.1 on port 12345
Calea catre socket este diferita de cea implicita pentru ca, incepand cu Debian 8 procesele Postfix ruleaza in chroot jail si nu pot accesa locatia implicita
Se editeaza /etc/postfix/main.cf si se completeaza cu blocul urmator dupa smtpd_recipient_restrictions:
nano /etc/postfix/main.cf
# Milter configuration
# OpenDKIM
milter_default_action = accept
# Postfix ≥ 2.6 milter_protocol = 6, Postfix ≤ 2.5 milter_protocol = 2
milter_protocol = 6
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = local:/opendkim/opendkim.sock
Se repornesc OpenDKIM si Postfix
systemctl restart opendkim systemctl restart postfix
PROBA
Se trimite un e-mail de test la check-auth@verifier.port25.com folosind un client de e-mail