Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-interfaces + SpamAssassin-learn + Bind

Tento článok sa zaoberá tým, ako nastaviť moderný poštový server.
Postfix + Dovecot. SPF + DKIM + rDNS. S IPv6.
So šifrovaním TSL. S podporou viacerých domén — časť s pravým SSL certifikátom.
S antispamovou ochranou a vysokým antispamovým hodnotením u iných poštových serverov.
S podporou viacerých fyzických rozhraní.
S OpenVPN, ktorého pripojenie prebieha cez IPv4 a ktoré zabezpečuje IPv6.

Ak sa nechcete učiť všetky tieto technológie, ale chcete nastaviť taký server — potom je tento článok pre vás.

V článku chýbajú pokusy vysvetliť každý detail. Vysvetlenia sú poskytované len tam, kde je niečo nastavené neštandardne alebo je to dôležité z pohľadu užívateľa.

Motivácia nastaviť poštový server — moja dlhoročná túžba. Možno to znie hlúpo, ale podľa môjho názoru je to oveľa lepšie, ako snívať o novom aute mojej obľúbenej značky.

Motivácia nastaviť IPv6 — je dvojaká. IT špecialista sa musí neustále učiť nové technológie, aby prežil. Chcem prispieť svojím skromným spôsobom k boju proti cenzúre.

Motivácia nastavenia OpenVPN — len na to, aby IPv6 fungovalo na lokálnom počítači.
Motivácia nastavenia viacerých fyzických rozhraní — na mojom serveri mám jedno rozhranie „pomalé, ale bezlimitné“ a druhé „rýchle, ale s tarifom“.

Motivácia nastaviť Bind — môj poskytovateľ ponúka nestabilný DNS server a Google tiež občas spôsobuje poruchy. Chcem stabilný DNS server na osobné použitie.

Motivácia napísať článok — návrh bol napísaný pred 10 mesiacmi a už dva razy som sa na neho pozrel. Ak ho autor potrebuje pravidelne, je veľká pravdepodobnosť, že to potrebujú aj iní.

Neexistuje univerzálne riešenie pre poštový server. Ale pokúsim sa napísať niečo ako „urobte to takto a potom, keď všetko bude fungovať ako má — zbavte sa zbytočného“.

Mám server Colocation od spoločnosti tech.ru. Je možnosť porovnať s OVH, Hetzner, AWS. Pre riešenie tejto úlohy bude oveľa efektívnejšie spolupracovať práve s tech.ru.

Na serveri je nainštalovaný Debian 9.

Na serveri sú 2 rozhrania `eno1` a `eno2`. Prvé je bezlimitné, a druhé rýchle podľa toho.

Mám 3 statické IP adresy, XX.XX.XX.X0, XX.XX.XX.X1 a XX.XX.XX.X2 na rozhraní `eno1` a XX.XX.XX.X5 na rozhraní `eno2`.

Mám XXXX:XXXX:XXXX:XXXX::/64 IPv6 adresový blok, ktorý je priradený k rozhraniu `eno1` a z neho XXXX:XXXX:XXXX:XXXX:1:2::/96 na moju žiadosť priradili k `eno2`.

Sú 3 domény `domain1.com`, `domain2.com`, `domain3.com`. Pre `domain1.com` a `domain3.com` je k dispozícii SSL certifikát.

Existuje účet Google, na ktorý chcem priradiť e-mailovú schránku `vasya.pupkin@domain1.com` (prijímanie a odosielanie e-mailov priamo z rozhrania Gmail).
Musí byť e-mailová adresa `support@domain2.com`, z ktorej chcem mať kópiu e-mailov v Gmaili. A občas mať možnosť poslať niečo v mene `support@domain2.com` cez webové rozhranie.

Musí existovať e-mailová adresa `ivanov@domain3.com`, ktorú bude používať Ivanov zo svojho iPhone.

Odosielané e-maily musia spĺňať všetky moderné požiadavky na antispam.
Musí byť zabezpečená najvyššia úroveň šifrovania na verejných sieťach.
Podpora IPv6 musí byť k dispozícii na odosielanie aj prijímanie e-mailov.
Musí byť nainštalovaný SpamAssassin, ktorý nikdy neodstráni e-maily. Bude buď vracať, alebo presúvať, alebo posielať do IMAP zložky „Spam“.
Musí byť nastavené automatické učenie SpamAssassin: ak presuniem e-mail do zložky „Spam“ — poučí sa o tom; ak presuniem e-mail zo zložky „Spam“ — poučí sa o tom. Výsledky učenia SpamAssassin — musia ovplyvniť umiestnenie e-mailu v zložke „Spam“.
PHP skripty musia vedieť odosielať e-maily v mene akejkoľvek domény na tomto serveri.
Musí byť služba openvpn, s možnosťou používať IPv6 na klientovi, ktorý nemá IPv6.

Najprv je potrebné nastaviť rozhrania a smerovanie, vrátane IPv6.
Potom bude potrebné nastaviť OpenVPN, ktorý sa bude pripájať cez IPv4 a poskytne klientovi statickú skutočnú IPv6 adresu. Tento klient bude mať prístup ku všetkým IPv6 službám na serveri a prístup k akýmkoľvek IPv6 zdrojom na internete.
Potom bude potrebné nastaviť Postfix na odosielanie e-mailov + SPF + DKIM + rDNS a ďalšie podobnosti.
Potom bude potrebné nastaviť Dovecot a nastaviť viacdoménovú podporu.
Potom bude potrebné nastaviť SpamAssassin a nastaviť učenie.
Na záver nainštalovať Bind.

============= Viacrozhrania =============

Na nastavenie rozhraní je potrebné zapísať toto do „/etc/network/interfaces“.

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eno1
iface eno1 inet static
        address XX.XX.XX.X0/24
        gateway XX.XX.XX.1
        dns-nameservers 127.0.0.1 213.248.1.6
        post-up ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t
        post-up ip route add default via XX.XX.XX.1 table eno1t
        post-up ip rule add table eno1t from XX.XX.XX.X0
        post-up ip rule add table eno1t to XX.XX.XX.X0

auto eno1:1
iface eno1:1 inet static
address XX.XX.XX.X1
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X1
        post-up ip rule add table eno1t to XX.XX.XX.X1
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE

# The secondary network interface
allow-hotplug eno2
iface eno2 inet static
        address XX.XX.XX.X5
        netmask 255.255.255.0
        post-up   ip route add XX.XX.XX.0/24 dev eno2 src XX.XX.XX.X5 table eno2t
        post-up   ip route add default via XX.XX.XX.1 table eno2t
        post-up   ip rule add table eno2t from XX.XX.XX.X5
        post-up   ip rule add table eno2t to XX.XX.XX.X5
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t

iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE

# OpenVPN network
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Tieto nastavenia môžu byť aplikované na akomkoľvek serveri v tech.ru (s malou dohodou s podporou) a hneď to bude fungovať ako treba.

Ak máte skúsenosti s nastavením podobných vecí pre Hetzner, OVH — tam je to iné. Zložitejšie.

eno1 je názov sieťovej karty #1 (pomalá, ale neobmedzená).
eno2 je názov sieťovej karty #2 (rýchla, ale s tarifou).
tun0 — je názov virtuálnej sieťovej karty od OpenVPN.
XX.XX.XX.X0 — IPv4 #1 na eno1.
XX.XX.XX.X1 — IPv4 #2 na eno1.
XX.XX.XX.X2 — IPv4 #3 na eno1.
XX.XX.XX.X5 — IPv4 #1 na eno2.
XX.XX.XX.1 — IPv4 gateway.
XXXX:XXXX:XXXX:XXXX::/64 — IPv6 pre celý server.
XXXX:XXXX:XXXX:XXXX:1:2::/96 — IPv6 pre eno2, všetko ostatné prichádza do eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 gateway (je potrebné poznamenať, že tu by sa malo/alebo je potrebné urobiť inak. Uviesť IPv6 switcha).
dns-nameservers — sú uvedené 127.0.0.1 (pretože je nainštalovaný bind lokálne) a 213.248.1.6 (toto je od tech.ru).

„table eno1t“ a „table eno2t“ — význam týchto route-rule je v tom, aby traffic, ktorý vstúpil cez eno1, išiel cez neho, a traffic, ktorý vstúpil cez eno2, išiel cez neho. Rovnako ako spojenia iniciované serverom by mali odchádzať cez eno1.

ip route add default via XX.XX.XX.1 table eno1t

Týmto príkazom určujeme, že akýkoľvek neznámy traffic, ktorý spadá pod akékoľvek pravidlo, ktoré je označené ako „table eno1t“, by mal byť poslaný na rozhranie eno1.

ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t

Týmto príkazom určujeme, že akýkoľvek traffic iniciovaný serverom by mal byť poslaný na rozhranie eno1.

ip rule add table eno1t from XX.XX.XX.X0
ip rule add table eno1t to XX.XX.XX.X0

Týmto príkazom určujeme samotné pravidlá označovania trafficu.

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

Tento block určuje druhý IPv4 pre rozhranie eno1.

ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

Týmto príkazom určujeme route pre klientov OpenVPN do lokálnych IPv4 okrem XX.XX.XX.X0.
Prečo je tento príkaz dostatočný pre všetky IPv4 — stále nechápem.

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1

Týmto nastavujeme adresu pre samo rozhranie. Server ho bude používať ako „odchádzajúcu“ adresu. Inak sa nebude používať.

Prečo je uvedené „:1:1::“ tak zložito? Aby OpenVPN fungovalo správne a iba pre to. O tom podrobnejšie neskôr.

Čo sa týka gateway — tak funguje a je to v poriadku. Ale správne by sem mal byť uvedený IPv6 switch, na ktorý je server pripojený.

Prečo však IPv6 prestáva fungovať, ak to robím takto? Pravdepodobne sú to zvláštnosti tech.ru.

ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE

Toto je pridanie IPv6 adresy k rozhraniu. Ak potrebujete sto adries — znamená to sto riadkov v tomto súbore.

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
...
iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
...
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Označil som adresy a podsiete všetkých rozhraní, aby to bolo prehľadné.
eno1 — musí byť povinne «/64» — pretože to je celý náš pool adries.
tun0 — podsieť musí byť povinne väčšia ako eno1. Inak nebude možné nastaviť IPv6 gateway pre klientov OpenVPN.
eno2 — podsieť musí byť povinne väčšia ako tun0. Inak sa klienti OpenVPN nedostanú na miestne IPv6 adresy.
Pre prehľadnosť som zvolil krok podsiete 16, ale pri želaní je možné zvoliť aj krok «1».
Čo sa týka súvislosti, 64+16 = 80 a 80+16 = 96.

Pre ešte väčšiu prehľadnosť:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY — to sú adresy, ktoré by mali byť priradené konkrétnym stránkam alebo službám na rozhraní eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY — to sú adresy, ktoré by mali byť priradené konkrétnym stránkam alebo službám na rozhraní eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY — to sú adresy, ktoré by mali byť priradené klientom OpenVPN alebo používané ako pracovné adresy OpenVPN.

Pre nastavenie siete — musí byť možnosť reštartovať server.
Zmeny IPv4 sa aplikujú pri vykonaní (povinne zabaľte do screen — inak táto príkaz iba spadne sieť na serveri):

/etc/init.d/networking restart

Do súboru «/etc/iproute2/rt_tables» pridajte na koniec:

100 eno1t
101 eno2t

Bez toho nie je možné použiť vlastné tabuľky v súbore «/etc/network/interfaces».
Čísla musia byť jedinečné a menej ako 65535.

Zmeny IPv6 sa ľahko menia bez reštartovania, ale na to treba zvládnuť aspoň tri príkazy:

ip -6 addr ...
ip -6 route ...
ip -6 neigh ...

Nastavenie «/etc/sysctl.conf»

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward = 1

# Do not accept ICMP redirects (prevent MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0

# For receiving ARP replies
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.arp_filter = 0

# For sending ARP
net.ipv4.conf.all.arp_announce = 0
net.ipv4.conf.default.arp_announce = 0

# Enable IPv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

# IPv6 configuration
net.ipv6.conf.all.autoconf = 1
net.ipv6.conf.all.accept_ra = 0

# For OpenVPN
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

# For nginx on boot
net.ipv6.ip_nonlocal_bind = 1

To sú nastavenia «sysctl» mojho servera. Zdôrazním to dôležité.

net.ipv4.ip_forward = 1

Bez toho OpenVPN nebude fungovať žiadnym spôsobom.

net.ipv6.ip_nonlocal_bind = 1

Každý, kto sa pokúsi vykonať bind IPv6 (napríklad nginx) okamžite po tom, ako sa rozhranie pripojí — dostane chybu. Že taká adresa nie je dostupná.

Aby sa predišlo takej situácii, vykonáva sa takáto konfigurácia.

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

Bez týchto nastavení IPv6 traffic od klienta OpenVPN nevychádza do sveta.

Iné nastavenia sa buď netýkajú problému, alebo si nepamätám, na čo slúžia.
Ale na každú prípadnosť ich nechávam «ako sú».

Aby sa zmeny tohto súboru aktivovali bez reštartovania servera — treba vykonať príkaz:

sysctl -p

Podrobnejšie o pravidlách «tables»: habr.com/post/108690

============= OpenVPN =============

OpenVPN IPv4 nefunguje bez iptables.

Moje iptables sú takéto pre VPN:

iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
##iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROP

YY.YY.YY.YY — to moja statická IPv4 adresa lokalného zariadenia.
10.8.0.0/24 — IPv4 sieť openvpn. IPv4 adresy pre klientov openvpn.
Poradie pravidiel je dôležité.

iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
...
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROP

Toto obmedzenie zabezpečuje, že len ja môžem s mojím statickým IP využívať OpenVPN.

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
  -- alebo --
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE

Na preposielanie IPv4 paketov medzi klientmi OpenVPN a internetom — je potrebné zadať jeden z týchto príkazov.

Pre rôzne prípady sa jedna z možností nehodí.
Pre môj prípad sú obe príkazy vhodné.
Po prečítaní dokumentácie som si vybral prvú možnosť, pretože zaberá menej CPU.

Aby sa všetky nastavenia iptables použili po reštartovaní — je potrebné ich niekam uložiť.

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Tieto názvy neboli vybrané náhodne. Používa ich balík „iptables-persistent“.

apt-get install iptables-persistent

Inštalácia základného balíka OpenVPN:

apt-get install openvpn easy-rsa

Nastavíme šablónu pre certifikáty (dosadíme svoje hodnoty):

make-cadir ~/openvpn-ca
cd ~/openvpn-ca
ln -s openssl-1.0.0.cnf openssl.cnf

Upravenie nastavení šablóny certifikátov:

mcedit vars

...
# Toto sú predvolené hodnoty pre polia
# ktoré budú umiestnené v certifikáte.
# Nenechávajte žiadne z týchto polí prázdne.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Krasnodar"
export KEY_CITY="Dinskaya"
export KEY_ORG="Own"
export KEY_EMAIL="admin@domain1.com"
export KEY_OU="VPN"

# X509 Subject Field
export KEY_NAME="server"
...

Vytvárame serverový certifikát:

cd ~/openvpn-ca
source vars
./clean-all
./build-ca
./build-key-server server
./build-dh
openvpn --genkey --secret keys/ta.key

Pripravíme možnosť vytvárať konečné súbory „client-name.opvn“:

mkdir -p ~/client-configs/files
chmod 700 ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
mcedit ~/client-configs/base.conf

# Client mode
client

# Interface tunnel type
dev tun

# TCP protocol
proto tcp-client

# Address/Port of VPN server
remote XX.XX.XX.X0 1194

# Don't bind to local port/address
nobind

# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun

# Remote peer must have a signed certificate
remote-cert-tls server
ns-cert-type server

# Enable compression
comp-lzo

# Custom
ns-cert-type server
tls-auth ta.key 1
cipher DES-EDE3-CBC

Pripravíme skript, ktorý spojí všetky súbory do jedného opvn súboru.

mcedit ~/client-configs/make_config.sh
chmod 700 ~/client-configs/make_config.sh

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} 
    <(echo -e '<ca>') 
    ${KEY_DIR}/ca.crt 
    <(echo -e '</ca>n<cert>') 
    ${KEY_DIR}/${1}.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/${1}.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/${1}.ovpn

Vytvárame prvého klienta OpenVPN:

cd ~/openvpn-ca
source vars
./build-key client-name
cd ~/client-configs
./make_config.sh client-name

Súbor „~/client-configs/files/client-name.ovpn“ posielame na zariadenie klientovi.

Pre klientov iOS bude potrebné urobiť trik:
Obsah tagu „tls-auth“ by mal byť bez komentárov.
A tiež dať „key-direction 1“ priamo pred tag „tls-auth“.

Nastavíme konfiguráciu servera OpenVPN:

cd ~/openvpn-ca/keys
cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf
mcedit /etc/openvpn/server.conf

# Listen port
port 1194

# Protocol
proto tcp-server

# IP tunnel
dev tun0
tun-ipv6
push tun-ipv6

# Master certificate
ca ca.crt

# Server certificate
cert server.crt

# Server private key
key server.key

# Diffie-Hellman parameters
dh dh2048.pem

# Allow clients to communicate with each other
client-to-client

# Client config dir
client-config-dir /etc/openvpn/ccd

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

# Server mode and client subnets
server 10.8.0.0 255.255.255.0
server-ipv6 XXXX:XXXX:XXXX:XXXX:1:3::/80
topology subnet

# IPv6 routes
push "route-ipv6 XXXX:XXXX:XXXX:XXXX::/64"
push "route-ipv6 2000::/3"

# DNS (for Windows)
# These are OpenDNS
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

# Configure all clients to redirect their default network gateway through the VPN
push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway ipv6" #For iOS

# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun

# Ping every 10s. Timeout of 120s.
keepalive 10 120

# Enable compression
comp-lzo

# User and group
user vpn
group vpn

# Log a short status
status openvpn-status.log

# Logging verbosity
##verb 4

# Custom config
tls-auth ta.key 0
cipher DES-EDE3-CBC

To je potrebné na to, aby sa každému klientovi pridelila statická adresa (nie je to povinné, ale ja to používam):

# Client config dir
client-config-dir /etc/openvpn/ccd

Najzložitejšia a kľúčová časť.

Bohužiaľ, OpenVPN ešte nevie automaticky nastaviť IPv6 gateway pre klientov.
Musí sa to „ručne“ prerozdeľovať pre každého klienta.

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

Súbor „/etc/openvpn/server-clientconnect.sh“:

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
        echo $ipv6
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eno1

Súbor „/etc/openvpn/server-clientdisconnect.sh“:

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Delete proxy rule
/sbin/ip -6 neigh del proxy $ipv6 dev eno1

Oba skripty používajú súbor „/etc/openvpn/variables“:

# Subnet
prefix=XXXX:XXXX:XXXX:XXXX:2:
# netmask
prefixlen=112

Neviem si spomenúť, prečo to tu tak napísané.

Teraz to vyzerá zvláštne netmask = 112 (tu by mal byť 96).
A prefix je zvláštny, nezodpovedá sieti tun0.
Ale dobre, nechám to „ako je“.

cipher DES-EDE3-CBC

To je na chuť — vybral som si taký spôsob šifrovania pripojenia.

Podrobnejšie o nastavení OpenVPN IPv4.

Podrobnejšie o nastavení OpenVPN IPv6.

============= Postfix =============

Inštalácia hlavného balíka:

apt-get install postfix

Pri inštalácii vyberte „internet-site“.

Môj „/etc/postfix/main.cf“ vyzerá takto:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# pridanie .domény je úlohou MUA.
append_dot_mydomain = no

readme_directory = no

# Pozrite http://www.postfix.org/COMPATIBILITY_README.html -- predvolene je 2 na
# čerstvých inštaláciách.
compatibility_level = 2

# TLS parametre
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

smtp_tls_security_level = may
smtp_tls_ciphers = export
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_loglevel = 1

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = domain1.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = domain1.com
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

internal_mail_filter_classes = bounce

# Typ ukladania
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

# SMTP-Auth nastavenia
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        #reject_invalid_hostname,
        #reject_unknown_recipient_domain,
        reject_unauth_destination,
        reject_rbl_client sbl.spamhaus.org,
        check_policy_service unix:private/policyd-spf

smtpd_helo_restrictions =
        #reject_invalid_helo_hostname,
        #reject_non_fqdn_helo_hostname,
        reject_unknown_helo_hostname

smtpd_client_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_helo_hostname,
        permit

# SPF
policyd-spf_time_limit = 3600

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

# IP adresa podľa domény
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Pozrime sa na detaily tejto konfigurácie.

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key

Podľa názoru hubárov tento blok obsahuje `dezinformácie a nesprávne tézy`.Až po 8 rokoch po začiatku mojej kariéry som začal chápať, ako SSL funguje.

Preto si dovolím popísať, ako používať SSL (bez odpovedania na otázky "Ako to funguje?" a "Prečo to funguje?").

Základom moderného šifrovania je vytvorenie páru kľúčov (dve veľmi dlhé reťazce znakov).

Jeden "kľúč" je súkromný, druhý kľúč je "verejný". Súkromný kľúč uchovávame veľmi starostlivo v tajnosti. Verejný kľúč rozdávame všetkým, ktorí majú záujem.

Pomocou verejného kľúča môžeme zašifrovať reťazec textu tak, že dešifrovať ho môže iba majiteľ súkromného kľúča.
A to sú všetky základy tejto technológie.

Krok č. 1 — https stránky.
Pri prístupe k stránke sa prehliadač dozvie od webového servera, že stránka je https, a preto požaduje verejný kľúč.
Webový server poskytuje verejný kľúč. Prehliadač pomocou verejného kľúča šifruje http-request a posiela ho.
Obsah http-request môže prečítať len ten, kto má súkromný kľúč, teda len server, ku ktorému je adresa smerovaná.
Http-request obsahuje minimálne URI. Preto ak sa v krajine snažia obmedziť prístup nie k celej stránke, ale k určitej stránke – pre https stránky to nie je možné.

Krok č. 2 – zašifrovaná odpoveď.
Webový server poskytuje odpoveď, ktorú si môžu ľahko prečítať počas prenosu.
Riešenie je veľmi jednoduché – prehliadač si lokálne vytvorí takú istú dvojicu súkromný-verejný kľúč pre každú https stránku.
A spolu so žiadosťou o verejný kľúč stránky posiela svoj lokálny verejný kľúč.
Webový server si ho zapamätá a pri posielaní http-response šifruje s týmto verejným kľúčom konkrétneho klienta.
Teraz http-response môže dešifrovať iba držiteľ súkromného kľúča prehliadača klienta (teda sám klient).

Krok č. 3 – nastavenie zabezpečeného spojenia cez verejný kanál.
V príklade č. 2 existuje zraniteľnosť – nič nebráni zlomyseľným osobám zachytiť http-request a upraviť informácie o verejnom kľúči.
Takže prostredník bude perfektne vidieť všetok obsah zasielaných a prijímaných správ, kým sa nezmení komunikačný kanál.
Bojovať proti tomuto je veľmi jednoduché – stačí poslať verejný kľúč prehliadača ako správu zašifrovanú verejným kľúčom webového servera.
Webový server potom najprv posiela odpoveď typu „tvoj verejný kľúč je takýto“ a šifruje túto správu týmto istým verejným kľúčom.
Prehliadač sa pozrie na odpoveď – ak prišla správa „tvoj verejný kľúč je takýto“ – je to 100% záruka, že tento komunikačný kanál je bezpečný.
Ako bezpečný je?
Samotné vytvorenie takého bezpečného komunikačného kanála prebieha rýchlosťou ping*2. Napríklad 20 ms.
Zlomyseľník musí buď vopred mať súkromný kľúč jednej zo strán. Alebo získať súkromný kľúč za pár milisekúnd.
Prelomenie jedného moderného súkromného kľúča bude trvať desaťročia na superpočítači.

Krok č. 4 – verejná databáza verejných kľúčov.
Je zrejmé, že v celej tejto histórii existuje možnosť pre zlomyseľníka, ktorý sedí na komunikačnom kanáli medzi klientom a serverom.
Možnosť, aby sa klient predstavil ako server a server ako klient. A simulovať pár kľúčov v oboch smeroch.
Vtedy útočník uvidí celý prenos a bude mať možnosť "upraviť" prenos.
Napríklad zmeniť adresu, kam posielať peniaze, skopírovať heslo z online banky alebo zablokovať "nežiaduci" obsah.
Na boj s takými útočníkmi bola vymyslená verejná databáza s verejnými kľúčmi pre každú https stránku.
Každý prehliadač "vie" o existencii približne 200 takých databáz. To je prednastavené v každom prehliadači.
"Poznanie" je potvrdené verejným kľúčom od každého certifikátu. To znamená, že spojenie s každým konkrétnym certifikačným centrom je nemožné sfalšovať.

Teraz existuje jednoduché pochopenie, ako používať SSL pre https.
Ak sa trochu zamyslíte, pochopíte, ako môžu tajné služby niečo prelomiť v tejto konštrukcii. Ale to im bude stáť obrovské úsilie.
Pre organizácie menej než NSA alebo CIA je prakticky nemožné prelomiť existujúcu úroveň ochrany, dokonca ani pre VIP.

Ešte dodám o ssh spojeniach. Tam nie sú žiadne verejné kľúče, ako to teda riešiť. Otázka sa rieši dvoma spôsobmi.
Variant ssh-pomocou hesla:
Pri prvom pripojení by mal ssh klient upozorniť, že tu máme nový verejný kľúč od ssh servera.
A pri ďalších pripojeniach, ak sa objaví upozornenie "nový verejný kľúč od ssh servera" — to bude znamenať, že vás sa snažia odpočúvať.
Alebo pri prvom pripojení vás odpočúvali a teraz komunikujete so serverom bez sprostredkovateľov.
Práve preto, že fakt odpočúvania sa ľahko, rýchlo a bez námahy odhalí — touto útokvou metódou sa používajú len vo výnimočných prípadoch pre konkrétneho klienta.

Variant ssh-pomocou kľúča:
Zoberieme USB kľúč, nahráme naň súkromný kľúč pre ssh server (pre toto existujú terémy a množstvo podstatných nuáns, ale píšem len pre vzdelávanie, nie návod na použitie).
Verejný kľúč zostáva na stroji, kde bude ssh klient, a tiež ho uchovávame v tajnosti.
Prineste USB kľúč k serveru, vložte ho, skopírujte súkromný kľúč, a USB kľúč spáľte a rozptýlite poprašok po vetre (alebo aspoň naformátujte s vyplnením nulami).
A je to — po takovej operácii bude nemožné hacknúť také ssh pripojenie. Samozrejme, za 10 rokov na superpočítači bude možné pozrieť si prenosy — ale to je iný príbeh.

Ospravedlňujem sa za offtopic.

Takže, teraz keď je známa teória. Povediem o procese vytvorenia ssl certifikátu.

Pomocou "openssl genrsa" vytvárame súkromný kľúč a "prípravky" pre verejný kľúč.
"prípravky" posielame tretej strane, ktorej platíme asi 9 $ za najjednoduchší certifikát.

O niekoľko hodín dostaneme od tejto tretej strany náš "verejný" kľúč a ešte súbor niekoľkých verejných kľúčov.

Prečo platiť tretej strane za vybavenie môjho verejného kľúča — to je úplne iná otázka, zde sa ňou nezaoberáme.

Teraz je jasné, v čom je zmysel nápisu:

smtpd_tls_key_file=\/etc\/ssl\/domain1.com.2018.key

V priečinku "\/etc\/ssl" sú uložené všetky súbory pre ssl otázky.
domain1.com — názov domény.
2018 — rok vytvorenia kľúčov.
"key" — označenie, že súbor je súkromný kľúč.

A význam tohto súboru:

smtpd_tls_cert_file=\/etc\/ssl\/domain1.com.2018.chained.crt
domain1.com — názov domény.
2018 — rok vytvorenia kľúčov.
chained — označenie, že tu je reťazec verejných kľúčov (prvý — náš verejný a ostatné — čo prišlo od spoločnosti, ktorá vybavila verejný kľúč).
crt — označenie, že tu je hotový certifikát (verejný kľúč s technickými vysvetleniami).

smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

Toto nastavenie sa v tomto prípade nepoužíva, ale je uvedené pre príklad.

Pretože chyba v tomto parametri povedie k odoslaniu spamu z vášho servera (bez vašej vôle).

Potom dokazujte všetkým, že za to nemôžete.

recipient_delimiter = +

Možno mnohí nevedia, tak tu je to štandardný symbol pre škálovanie passem a to podporuje väčšina moderných poštových serverov.

Napríklad, ak máte poštovú schránku "username@gmail.com", skúste poslať na "username+spam@gmail.com" — pozrite sa, čo z toho vyjde.

inet_protocols = ipv4

Toto by mohlo zmiasť.

Ale nie je to len tak. Každá nová doména — predvolene len IPv4, potom zapínam IPv6 pre každú zvlášť.

virtual_transport = lmtp:unix:private\/dovecot-lmtp
virtual_mailbox_domains = mysql:\/etc\/postfix\/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:\/etc\/postfix\/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:\/etc\/postfix\/mysql-virtual-alias-maps.cf

Tu nastavujeme, že všetka prichádzajúca pošta ide do dovecot.
A pravidlá pre domény, schránky, aliasy — pozrieme sa v DB.

/etc/postfix/mysql-virtual-mailbox-domains.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

/etc/postfix/mysql-virtual-mailbox-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

/etc/postfix/mysql-virtual-alias-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

Teraz postfix vie, že prijímať poštu na ďalšie odosielanie je možné len po overení s dovecot.

Naozaj mi nie je jasné, prečo to tu duplicovať. Už sme predsa uviedli v "virtual_transport" všetko potrebné.

Ale postfix je veľmi starý systém — asi sú to núdzové riešenia z dávnych čias.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

To sa nastavuje pre každý poštový server osobitne.

Mám k dispozícii 3 poštové servery a tieto nastavenia sú veľmi rôzne kvôli rôznym požiadavkám na použitie.

Nastavovať treba opatrne — inak vám môže prísť spam alebo ešte horšie — spam môže od vás odchádzať.

# SPF
policyd-spf_time_limit = 3600

Nastavenie pre nejaký plugin spojený s overovaním SPF prichádzajúcich e-mailov.

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

Nastavenie, že všetky odchádzajúce e-maily by sme mali vybaviť podpisom DKIM.

# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

To je kľúčový detail v smerovaní e-mailov pri odosielaní správ z php skriptov.

Súbor "/etc/postfix/sdd_transport.pcre":

/^www-domain1@domain1.com$/ domain1:
/^www-domain2@domain1.com$/ domain2:
/^www-domain3@domain1.com$/ domain3:
/@domain1.com$/             domain1:
/@domain2.com$/             domain2:
/@domain3.com$/             domain3:

Vľavo — regulárne výrazy. Vpravo — značka, ktorou je mail označený.
Postfix podľa značky zoberie do úvahy ešte niekoľko riadkov konfigurácie pre konkrétny e-mail.

Ako presne bude postfix rekonfigurovaný pre konkrétny e-mail — bude uvedené v "master.cf".

Riadky 4, 5, 6 — sú hlavné. Od akého domény posielame e-mail — takú značku a dávame.
Ale nie vždy v php skriptoch je uvedené pole "from" v starom kóde. Vtedy na pomoc prichádza meno používateľa.

Článok je aj tak rozsiahly — nechcel by som sa odpútať od nastavenia nginx+fpm.

Stručne — pre každú stránku nastavujeme svojho linux-user vlastníka. A samozrejme svoj fpm-pool.

Fpm-pool používa akúkoľvek verziu php (to je skvelé, keď na jednom serveri bez problémov pre susedné stránky môžeme používať rôzne verzie php a dokonca aj rôzny php.ini).

Takže konkrétny linux-user "www-domain2" má stránku domain2.com. Na tejto stránke je kód na odosielanie e-mailov bez uvedenia poľa from.

Takže aj v takom prípade budú správy odchádzať správne a nikdy sa nedostanú do spamu.

Môj "/etc/postfix/master.cf" vyzerá takto:

...
smtp inet n - y - - smtpd
-o content_filter=spamassassin
...
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
...
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spf

spamassassin unix - n n - - pipe
user=spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}
...
domain1 unix - - n - - smtp
-o smtp_bind_address=XX.XX.XX.X1
-o smtp_helo_name=domain1.com
-o inet_protocols=all
-o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
-o syslog_name=postfix-domain1

domain2 unix - - n - - smtp
-o smtp_bind_address=XX.XX.XX.X5
-o smtp_helo_name=domain2.com
-o inet_protocols=all
-o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:2:1:1
-o syslog_name=postfix-domain2

domain3 unix - - n - - smtp
-o smtp_bind_address=XX.XX.XX.X2
-o smtp_helo_name=domain3
-o inet_protocols=all
-o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:5:1
-o syslog_name=postfix-domain3

Súbor nie je úplný — už aj tak je veľmi veľký.
Označil som iba to, čo bolo zmenené.

smtp      inet  n       -       y       -       -       smtpd
-o content_filter=spamassassin
...
spamassassin unix - n n - - pipe
user=spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}

Toto sú nastavenia súvisiace so spamassassinom, o ňom neskôr.

submission inet n       -       y       -       -       smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

Umožňujeme pripojenie k poštovému serveru cez port 587.
Na to je nutné sa autentifikovať.

policyd-spf  unix  -       n       n       -       0       spawn
user=policyd-spf argv=/usr/bin/policyd-spf

Aktivujeme kontrolu SPF.

apt-get install postfix-policyd-spf-python

Nainštalujeme balík pre vyššie SPF kontroly.

domain1  unix -       -       n       -       -       smtp
-o smtp_bind_address=XX.XX.XX.X1
-o smtp_helo_name=domain1.com
-o inet_protocols=all
-o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
-o syslog_name=postfix-domain1

A toto je najzaujímavejšie. Toto je možnosť posielať e-maily pre konkrétnu doménu z konkrétnej IPv4/IPv6 adresy.

Robí sa to kvôli rDNS. rDNS — to je získanie nejakej reťazca podľa IP adresy.
A pre poštu sa táto možnosť používa na potvrdenie toho, že helo naozaj zodpovedá rDNS adresy, z ktorej sa odoslal e-mail.

Ak helo nezodpovedá doméne pošty, v mene ktorej bol e-mail odoslaný, získava sa počet spamových bodov.

Helo nezodpovedá rDNS — dostáva sa veľa spamových bodov.
Podľa toho musí mať každá doména svoju vlastnú IP adresu.
Pre OVH — v konzole existuje možnosť uviesť rDNS.
Pre tech.ru — otázka sa rieši cez support.
Pre AWS — otázka sa rieši cez support.
„inet_protocols“ a „smtp_bind_address6“ — toto je zapnutie podpory IPv6.
Aj pre IPv6 je potrebné nastaviť rDNS.
„syslog_name“ — to je pre lepšiu čitateľnosť logov.

Nakupovanie certifikátov odporúčam tu.

Nastavenie prepojenia postfix+dovecot tu.

Nastavenie SPF.

============= Dovecot =============

apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispam

Nastavenie mysql, inštalujeme si balíčky sami.

Súbor „/etc/dovecot/conf.d/10-auth.conf“

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autentifikácia len v šifrovanej forme.

Súbor „/etc/dovecot/conf.d/10-mail.conf“

mail_location = maildir:/var/mail/vhosts/%d/%n

Tu uvedieme miesto ukladania e-mailov.

Chcem, aby sa ukladali do súborov a boli usporiadané podľa domén.

Súbor „/etc/dovecot/conf.d/10-master.conf“

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 995
    ssl = yes
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
service imap {
}
service pop3 {
}
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  user = dovecot
}
service auth-worker {
  user = vmail
}
service dict {
  unix_listener dict {
  }
}

Toto je hlavný konfiguračný súbor dovecot.
Tu vypíname nezašifrované pripojenia.
A zapíname zašifrované pripojenia.

Súbor „/etc/dovecot/conf.d/10-ssl.conf“

ssl = required
ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt
ssl_key = </etc/nginx/ssl/domain1.com.2018.key
local XX.XX.XX.X5 {
  ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt
  ssl_key =  </etc/nginx/ssl/domain2.com.2018.key
}

Nastavujeme ssl. Uvádzame, že ssl je povinné.
A samotný certifikát. A dôležitý detail — direktíva „local“. Určuje, pri pripojení na aký lokálny IPv4 — aký ssl certifikát použiť.

Mimochodom, IPv6 tu nie je nastavené, túto chybu opravím neskôr.
XX.XX.XX.X5 (domain2) — certifikát nie je. Pre pripojenie klientov je potrebné uvádzať domain1.com.
XX.XX.XX.X2 (domain3) — certifikát je, pre pripojenie klientov je možné uvádzať domain1.com alebo domain3.com.

Súbor „/etc/dovecot/conf.d/15-lda.conf“

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Toto bude neskôr potrebné pre spamassassin.

Súbor „/etc/dovecot/conf.d/20-imap.conf“

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Toto je antispam plugin. Je potrebný pre školenie spamassassin pri presúvaní do/z priečinka „Spam“.

Súbor „/etc/dovecot/conf.d/20-pop3.conf“

protocol pop3 {
}

Proste taký súbor existuje.

Súbor „/etc/dovecot/conf.d/20-lmtp.conf“

protokol lmtp {
  mail_plugins = $mail_plugins sieve
  postmaster_address = admin@domain1.com
}

Nastavenie lmtp.

Súbor „/etc/dovecot/conf.d/90-antispam.conf“

plugin {
  antispam_backend = pipe
  antispam_trash = Trash;trash
  antispam_spam = Junk;Spam;SPAM
  antispam_pipe_program_spam_arg = --spam
  antispam_pipe_program_notspam_arg = --ham
  antispam_pipe_program = /usr/bin/sa-learn
  antispam_pipe_program_args = --username=%Lu
}

Nastavenia učenia spamassassin pri premiestňovaní do/z priečinka „Spam“.

Súbor „/etc/dovecot/conf.d/90-sieve.conf“

plugin {
  sieve = ~/ .dovecot.sieve
  sieve_dir = ~/sieve
  sieve_after = /var/lib/dovecot/sieve/default.sieve
}

Súbor, v ktorom je uvedené, čo robiť s prichádzajúcimi e-mailami.

Súbor „/var/lib/dovecot/sieve/default.sieve“

require ["fileinto", "mailbox"];

if header :contains "X-Spam-Flag" "YES" {
        fileinto :create "Spam";
}

Je potrebné skompilovať súbor: „sievec default.sieve“.

Súbor „/etc/dovecot/conf.d/auth-sql.conf.ext“

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Uvedenie sql súborov na autorizáciu.
A samotný súbor — ako spôsob autorizácie.

Súbor „/etc/dovecot/dovecot-sql.conf.ext“

driver = mysql
connect = host=127.0.0.1 dbname=servermail user=usermail password=password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Toto zodpovedá podobným nastaveniam pre postfix.

Súbor „/etc/dovecot/dovecot.conf“

protocols = imap lmtp pop3
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf

Hlavný konfiguračný súbor.
Dôležité je, že tu uvádzame/pridávame protokoly.

============= SpamAssassin =============

apt-get install spamassassin spamc

Nainštalujeme balíky.

adduser spamd --disabled-login

Pridáme používateľa, pod ktorým.

systemctl enable spamassassin.service

Zapneme automatické spúšťanie služby spamassassin pri štarte.

Súbor „/etc/default/spamassassin“:

CRON=1

Zapne automatické aktualizovanie pravidiel „podľa predvoleného nastavenia“.

Súbor „/etc/spamassassin/local.cf“:

report_safe 0

use_bayes          1
bayes_auto_learn   1
bayes_auto_expire  1
bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
bayes_sql_dsn      DBI:mysql:sa:localhost:3306
bayes_sql_username sa
bayes_sql_password password

Je potrebné vytvoriť v mysql databázu „sa“ s používateľom „sa“ a heslom „password“ (nahradiť niečím primeraným).

report_safe — to znamená, že namiesto e-mailu bude zaslaná správa o e-maili-spame.
use_bayes — to sú nastavenia strojového učenia spamassassin.

Ostatné nastavenia spamassassin boli uplatnené skôr podľa článku.

Celkové nastavenie „spamassassin“.
O premiestnení nových spamových e-mailov do IMAP priečinka „Spam“.
O jednoduchom prepojení Dovecot + SpamAssassin.
Odporúčam prečítať si teóriu učenia spamassassin pri premiestňovaní e-mailov v imap priečinkoch (a neodporúčam na použitie).

============= Oslovenie komunity =============

Ešte by som rád predložil myšlienku komunite o tom, ako zvýšiť úroveň ochrany prenášaných e-mailov. Keďže som sa do tejto témy ponoril hlboko.

Aby používateľ mohol na svojom zariadení (Outlook, Thunderbird, prehliadač, …) vytvoriť pár kľúčov. Verejný a súkromný. Verejný — poslať do DNS. Súkromný — uchovávať na zariadení. Poštové servery by mali vedieť použiť verejný kľúč na odoslanie konkrétnemu adresátovi.

A na ochranu pred spamom pri takýchto e-mailoch (áno, poštový server nemôže skontrolovať obsah) — je potrebné zaviesť 3 pravidlá:

  1. Povinný autentický podpis DKIM, povinný SPF, povinný rDNS.
  2. Neurónová sieť zameraná na výučbu proti spamu + databáza k nej na strane klienta.
  3. Algoritmus šifrovania by mal byť také, že odosielajúca strana musí na šifrovanie využiť 100-krát viac výkonu CPU ako prijímajúca strana.

Okrem verejných e-mailov — vyvinúť štandard pre ponuku e-mailu "začať chránenú komunikáciu". Jeden z používateľov (poštová schránka) posiela druhému poštovému účtu e-mail s prílohou. V e-maile je textová ponuka na začatie chráneného komunikačného kanála a verejný kľúč vlastníka poštového účtu (pričom súkromný kľúč je na strane klienta).

Môžete dokonca vytvoriť pár kľúčov špeciálne pre každú komunikáciu. Prijímajúci používateľ môže prijať túto ponuku a poslať svoj verejný kľúč (taktiež vytvorený špeciálne pre túto komunikáciu). Následne prvý používateľ posiela služobný kontrolný e-mail (šifrovaný verejným kľúčom druhého používateľa) — po jeho prijatí môže druhý používateľ považovať vytvorený komunikačný kanál za spoľahlivý. Potom druhý používateľ posiela kontrolný e-mail — a tak prvý používateľ môže považovať vytvorený kanál za chránený.

V boji proti zachyteniu kľúčov na ceste — je potrebné v protokole predpokladať možnosť prenosu aspoň jedného verejného kľúča pomocou USB kľúča.

A najdôležitejšie — aby to všetko fungovalo (otázka "kto za to zaplatí?"):
Zadajte e-mailové certifikáty s cenou od 10 $ za 3 roky. Ktoré umožnia odosielateľovi uviesť do DNS, že „moje verejné kľúče sú tam“. A umožnia začať zabezpečené pripojenie. Pri tom – prijímať také pripojenia zdarma.
gmail konečne monetizuje svojich používateľov. Za 10 $ na 3 roky – právo vytvárať zabezpečené kanály korešpondencie.

============= Záver =============

Na testovanie celej článku som plánoval prenajať si dedikovaný server na mesiac a kúpiť doménu s SSL certifikátom.

Ale životné okolnosti spôsobili, že táto otázka sa natiahla na 2 mesiace.
A keď sa znova objavil voľný čas – rozhodol som sa publikovať článok tak, ako je, a neriskovať tým, že publikácia sa natiahne ešte na rok.

Ak bude dostatok otázok typu „toto nie je dostatočne podrobne popísané“ – pravdepodobne nájdem sily prevziať dedikovaný server s novou doménou a novým SSL certifikátom a podrobnejšie opísať a hlavne – odhaliť všetky nezohľadnené dôležité detaily.

Rovnako by som rád dostal spätnú väzbu na tému myšlienky o e-mailových certifikátoch. Ak sa myšlienka zapáči – pokúsim sa nájsť sily napísať návrh na RFC.

Pri kopírovaní veľkých častí článku – uvádzajte odkaz na tento článok.
Pri preklade do akéhokoľvek iného jazyka – uvádzajte odkaz na tento článok.
Do angličtiny sa pokúsim preložiť sám a nechám krížové odkazy.


Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster