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

See artikkel selgitab, kuidas seadistada kaasaegne postiserver.
Postfix + Dovecot. SPF + DKIM + rDNS. IPv6-ga.
TSL-krüpteerimisega. Toetab mitmeid domeene — koos tõelise SSL-sertifikaadiga.
Sisaldab rämpsposti kaitset ja kõrget rämpsposti reitingut teiste postiserverite seas.
Toetab mitut füüsilist liidest.
OpenVPN, millele pääseb juurde läbi IPv4, ja mis võimaldab IPv6.

Kui te ei soovi neid tehnoloogiaid õppida, aga soovite sellist serverit seadistada — siis on see artikkel teie jaoks.

Artiklis puuduvad katsed selgitada iga detaili. Selgitused on keskendunud sellele, mis on konfigureeritud ebatavaliselt või on tarbija seisukohalt oluline.

Motivatsioon postiserveri seadistamiseks — minu pikaajaline unistus. Võib-olla kõlab see rumalalt, aga IMO on see palju parem, kui unistada oma lemmikmarka uuest autost.

IPv6 seadistamise motivatsioon — kaks. IT-spetsialist peab pidevalt õppima uusi tehnoloogiaid, et ellu jääda. Soovin anda oma tillukese panuse tsensuuri vastu võitlemisse.

OpenVPN seadistamise motivatsioon — ainult selleks, et IPv6 töötaks kohalikus masinas.
Mitme füüsilise liidese seadistamise motivatsioon — mul on serveris üks 'aeglane, kuid piiramatu' ja teine 'kiire, kuid tasuline'.

Bind'i seadistamise motivatsioon — minu teenusepakkuja pakub ebastabiilset DNS-serverit ning Google'ilgi juhtub aeg-ajalt tõrkeid. Soovin stabiilset DNS-serverit isiklikuks kasutamiseks.

Artikli kirjutamise motivatsioon — mustand valmis 10 kuud tagasi ja olen seda juba kaks korda vaadanud. Kui isegi autor vajab seda regulaarselt, siis on tõenäosus, et teisedki vajavad seda, suur.

Ühtset lahendust meiliserveri jaoks ei eksisteeri. Kuid püüan kirjutada 'tehke nii ja kui kõik töötab nagu peab, visake üleliigne ära'.

Server on Colocation teenusepakkuja tech.ru juures. On võimalik võrrelda OVH, Hetzner ja AWS-ga. Selle ülesande lahendamiseks on koostöö tech.ru-ga tunduvalt tõhusam.

Serveris on paigaldatud Debian 9.

Serveris on 2 liidest `eno1` ja `eno2`. Esimene on piiramatu, teine kiire vastavalt.

On olemas 3 staatilist IP-aadressi, XX.XX.XX.X0, XX.XX.XX.X1 ja XX.XX.XX.X2 liidesele `eno1` ning XX.XX.XX.X5 liidesele `eno2`.

On olemas XXXX:XXXX:XXXX:XXXX::/64 IPv6 aadresside vahe, mis on määratud liidesele `eno1` ja sellest XXXX:XXXX:XXXX:XXXX:1:2::/96 minu taotlusel määratud `eno2`-le.

On olemas 3 domeeni `domain1.com`, `domain2.com`, `domain3.com`. Domeenidel `domain1.com` ja `domain3.com` on SSL-sertifikaadid.

On olemas Google'i konto, millele soovitakse seadistada meiliaadress `vasya.pupkin@domain1.com` (kirjade vastuvõtt ja saatmine otse Gmaili liidesest).
Peab olema meiliaadress `support@domain2.com`, mille koopiaid soovin näha oma Gmailis. Ja harva võimalus midagi saata `support@domain2.com` nimel veebiliidese kaudu.

Peab olema meiliaadress `ivanov@domain3.com`, mida kasutab Ivanov oma iPhone'ist.

Saadetavad kirjad peavad vastama kõikidele kaasaegsetele rämpsposti vastastele nõudmistele.
Peab olema kõrgeim krüpteerimise tase, mis on ette nähtud avalikes võrkudes.
Peab olema toetatud IPv6 kirjade saatmiseks ja vastuvõtmiseks.
Peab olema SpamAssassin, mis kunagi ei eemalda kirju, vaid teeb kas tagasiside või jätab need vahele või saadab need IMAP kausta «Rämps».
SpamAssassini automaatõppe peab olema seadistatud: kui liigutan posti «Rämps» kausta — see õpib seda; kui liigutan posti «Rämps» kaustast välja — see õpib seda. SpamAssassini õppe tulemused peaksid mõjutama kirjade sisenemist «Rämps» kausta.
Php skriptid peavad oskama saata postitusi mis tahes domeeni nimel sellel serveril.
Peab olema openvpn teenus, võimalusega kasutada IPv6 klientidel, kellel pole IPv6.

Esmalt tuleb seadistada liidesed ja marsruutmise, sealhulgas IPv6.
Seejärel tuleb seadistada OpenVPN, mis ühendub IPv4 kaudu ja annab kliendile staatilise, reaalse IPv6 aadressi. Selle kliendi juures on juurdepääs kõikidele serveri IPv6 teenustele ja kõigile IPv6 ressurssidele internetis.
Seejärel tuleb seadistada Postfix e-kirjade saatmiseks + SPF + DKIM + rDNS ja kõik muud sarnased pisiasjad.
Seejärel tuleb seadistada Dovecot ja seadistada Multidomain.
Seejärel tuleb seadistada SpamAssassin ja seadistada õpe.
Lõpetuseks installida Bind.

============= Multi-interfaces =============

Liideste seadistamiseks tuleb kirjutada selline rida «/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

Nendes seadetes saab kasutada igasuguste serverite puhul tech.ru (väikse kokkuleppega toega) ja need hakkavad kohe korralikult toimima.

Kui sul on kogemusi sarnaste seadete tegemisel Hetzneris või OVH-is — seal on see teistsugune. Raskem.

eno1 on võrkaardi #1 nimi (aeglane, kuid piiramata).
eno2 on võrkaardi #2 nimi (kiire, kuid maksustatud).
tun0 on OpenVPN-i virtuaalse võrkaardi nimi.
XX.XX.XX.X0 — IPv4 #1 eno1-l.
XX.XX.XX.X1 — IPv4 #2 eno1-l.
XX.XX.XX.X2 — IPv4 #3 eno1-l.
XX.XX.XX.X5 — IPv4 #1 eno2-l.
XX.XX.XX.1 — IPv4 värav.
XXXX:XXXX:XXXX:XXXX::/64 — IPv6 kogu serveri jaoks.
XXXX:XXXX:XXXX:XXXX:1:2::/96 — IPv6 eno2 jaoks, kõik muu siseneb eno1 kaudu.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 värav (tuleb märkida, et siin saab/peab olema teisiti. Tuleb näidata IPv6 lülitust).
dns-nameservers — määratud 127.0.0.1 (sellepärast, et bind on kohapeal installitud) ja 213.248.1.6 (see on tech.ru-st).

"table eno1t" ja "table eno2t" — nende route-rule'i mõte on see, et läbi eno1 sisenenud liiklus läheks läbi selle, ning läbi eno2 sisenenud liiklus läheks läbi selle. Samuti läheks serveri algatusel olevad ühendused läbi eno1.

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

Selle käsuga määrame, et kõik arusaamatud andmed, mis kuuluvad alla mis tahes reegli, millel on märgitud „table eno1t“ -> suunatakse liidesele eno1.

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

Selle käsuga määrame, et kõik serveripoolne liiklus suunatakse liidesele eno1.

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

Selle käsuga määrame liikluse märgistamise reeglid.

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

See plokk määrab teise IPv4 liidesele eno1.

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

Selle käsuga määrame OpenVPN klientide marsruudi kohalike IPv4 aadresside juurde, välja arvatud XX.XX.XX.X0.
Miks on see käsk piisav kõigi IPv4 jaoks — ma ei saa siiani aru.

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

Siin määrame aadressi liidesele. Server kasutab seda kui 'väljuvat' aadressi. Seda enam muul viisil ei kasutata.

Miks on „:1:1::“ nii keeruline? Et OpenVPN töötaks õigesti ja ainult selleks. Räägime sellest hiljem rohkem.

Teema gateway — see töötab ja ongi kõik. Kuid õigesti öeldes tuleks siia näidata IPv6 lüliti, millele server on ühendatud.

Kuid kuidagi ei tööta IPv6, kui ma seda teen. Tõenäoliselt on see mingid tech.ru veidrad asjad.

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

See on IPv6 aadressi lisamine liidesesse. Kui on vaja sada aadressi — siis tähendab sada rida selles failis.

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

Märgistasin kõikide liideste aadressid ja alamvõrgud, et oleks selge.
eno1 — peab olema kindlasti «/64» — sest see on kogu meie aadresside grup.
tun0 — alamvõrk peab olema kindlasti suurem kui eno1. Vastasel juhul ei saa seadistada IPv6 gateway'd OpenVPN klientidele.
eno2 — alamvõrk peab olema kindlasti suurem kui tun0. Vastasel juhul ei saa OpenVPN kliendid pääseda kohalikele IPv6 aadressidele.
Selguse huvides valisin alamvõrgu sammu 16, kuid soovi korral võib isegi «1» sammu teha.
Seega 64+16 = 80, ja 80+16 = 96.

Veelgi suurema selguse huvides:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY — need on aadressid, mis peaksid olema määratud konkreetsetele saitidele või teenustele liideses eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY — need aadressid, mis peavad olema määratud konkreetsete veebilehtede või teenuste jaoks liidese eno2 peal.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY — need aadressid peavad olema määratud OpenVPN-ile või neid kasutatakse OpenVPN teeninduslike aadressidena.

Võrgu seadistamiseks peab olema võimalik serverit taaskäivitada.
IPv4 muudatused võetakse kasutusele käivitamisel (kindlasti tuleb see ekraanile ümber mähkida — vastasel juhul katkestab see lihtsalt võrgu serveris):

/etc/init.d/networking restart

Faili „/etc/iproute2/rt_tables“ tuleb lisada lõppu:

100 eno1t
101 eno2t

Ilma selleta ei saa kasutada kohandatud tabeleid failis „/etc/network/interfaces“.
Numbrid peavad olema unikaalsed ja alla 65535.

IPv6 muudatused on hõlpsasti muudetavad ilma taaskäivitamiseta, kuid selleks tuleb vähemalt kolme käsku õppida:

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

Seadistus „/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

Need on minu serveri „sysctl“ seadistused. Tähistan olulise.

net.ipv4.ip_forward = 1

Ilma selleta OpenVPN ei tööta kuidagi.

net.ipv6.ip_nonlocal_bind = 1

Igaüks, kes proovib siduda IPv6 (näiteks nginx) kohe pärast liidese käivitamist — saab vea, et selline aadress ei ole saadaval.

Selle olukorra vältimiseks tehaksegi selline seadistus.

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

Ilma nende seadistusteta OpenVPNi IPv6 liiklus klientidelt ei jõua maailma.

Teised seadistused kas ei seondu asjaoluga või ma ei mäleta, miks nad on.
Aga igaks juhuks jätan «nagu on».

Selle faili muudatuste käivitamiseks ilma serveri taaskäivitamiseta pead käitama käsku:

sysctl -p

Täpsemat teavet «table» reeglite kohta: habr.com/post/108690

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

OpenVPN IPv4 ei tööta ilma iptables'ita.

Minu iptables on VPN jaoks sellised:

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 — see on minu kohaliku masina staatiline IPv4 aadress.
10.8.0.0/24 — OpenVPNi IPv4 võrk. OpenVPNi klientide IPv4 aadressid.
Reeglite järjestus on oluline.

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

See piirang on, et ainult mina oma staatilise IP-ga saaksin OpenVPNi kasutada.

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

Для пробрасывания IPv4 пакетов между клиентами OpenVPN и интернетом — нужно прописать одну из этих команд.

Для разных случаев один из вариантов не подходит.
Для моего случая подходят обе команды.
Почитав документацию я выбрал первый вариант, потому что он кушает меньше CPU.

Чтобы все настройки iptables подхватывались после reboot — надо сохранить их куда-то.

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

Такие имена выбраны не случайно. Их использует пакет «iptables-persistent».

apt-get install iptables-persistent

Установка основного пакета OpenVPN:

apt-get install openvpn easy-rsa

Настроим шаблон для сертификатов (подставить свои значения):

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

Отредактируем настройки шаблона сертификатов:

mcedit vars

...
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
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"
...

Создаём серверный сертификат:

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

Valmistame võimaluse luua lõplikud «client-name.opvn» failid:

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

Valmistame skripti, mis ühendab kõik failid ühte opvn faili.

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

Loo esimene OpenVPN klient:

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

Fail «~/client-configs/files/client-name.ovpn» saadetakse kliendi seadmesse.

iOS klientide jaoks on vaja teha nipp:
Tähe «tls-auth» sisu peab olema ilma kommentaarideta.
Samuti tuleb panna «key-direction 1» kohe enne tähte «tls-auth».

Seame üles OpenVPN serveri konfiguratsiooni:

cd ~/openvpn-ca/keys
cp ca.crt ca.key server.crt server.key ta.key /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

See on vajalik, et määrata iga kliendi jaoks staatiline aadress (mitte kohustuslik, kuid mina kasutan):

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

Kõige keerukam ja oluline detail.

Kahjuks OpenVPN ei oska veel automaatselt konfigureerida IPv6 gateway'd klientide jaoks.
Peab selle iga kliendi jaoks "käe kaudu" edasi laadima.

# 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"

Fail «/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

Fail «/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

Mõlemad skriptid kasutavad faili «/etc/openvpn/variables»:

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

Miks see niimoodi kirjas on — raske meenutada.

Praegu tundub imelik, et netmask = 112 (siin peaks olema 96).
Ja prefix on kummaline, ei vasta võrgule tun0.
Aga noh, jätan «nagu on».

cipher DES-EDE3-CBC

See on maitse küsimus — valisin sellise krüptimise meetodi.

Üksikasjalikumalt OpenVPN IPv4 seadistamisest.

Üksikasjalikumalt OpenVPN IPv6 seadistamisest.

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

Peamiste pakettide installimine:

apt-get install postfix

Installimisel valida «internet-site».

Minu «/etc/postfix/main.cf» näeb välja selline:

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

# .domain'i lisamine on MUA ülesanne.
append_dot_mydomain = ei

readme_directory = ei

# Vaata http://www.postfix.org/COMPATIBILITY_README.html — vaikimisi 2 uutel installatsioonidel.
compatibility_level = 2

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

smtp_tls_security_level = võib olla
smtp_tls_ciphers = export
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_loglevel = 1

smtpd_relay_restrictions = luba_mynetworks luba_sasl_authenticated edasilükkamine_unauth_sihtkoht
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 = kõik
inet_protocols = ipv4

internal_mail_filter_classes = bounce

# Salvestustüüp
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 seaded
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = jah
smtpd_recipient_restrictions =
        luba_sasl_authenticated,
        luba_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 =
        luba_mynetworks,
        luba_sasl_authenticated,
        reject_non_fqdn_helo_hostname,
        luba

# SPF
policyd-spf_time_limit = 3600

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

# IP-aadress per domeen
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Räägime selle konfi üksikasjadest.

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

Habr-i kogukonna arvamus on, et see plokk sisaldab `valeinformatsiooni ja valeväiteid`.Alles kaheksa aastat pärast oma karjääri algust sain ma aru, kuidas SSL töötab.

Seetõttu julgen ma kirjeldada, kuidas SSL-i kasutada (ilma küsimustele „Kuidas see töötab?” ja „Miks see töötab?” vastamata).

Kaasaegse krüptimise alus on kahe võtme koodi loomine (kaks väga pikka sümbolite jada).

Üks „võti” on privaatne, teine „avalik”. Privaatset võtit hoia kindlasti salajas. Avalikku võtme jagame kõigile soovijatele.

Avaliku võtmega saab tekstijada krüptida nii, et seda saab dekrüpteerida ainult privaatse võtme omanik.
Noh, see on kogu tehnoloogia alus.

Samm nr 1 — https saidid.
Veebibrauser, kui ta ühendub saidiga, saab veebiserverilt teada, et sait on https ja seetõttu küsib ta avalikku võtit.
Veebiserver edastab avaliku võtme. Brauser, kasutades avalikku võtme, krüptib http-päringu ja saadab selle.
HTTP-päringut saab lugeda ainult see, kellel on erasümbol, st ainult server, millele päring tehakse.
HTTP-päring sisaldab vähemalt URI-d. Seega, kui riigis üritatakse ligipääsu piirata mitte kogu saidile, vaid konkreetsele lehele — siis on see HTTPS-saitide puhul võimatu.

Samm №2 — krüpteeritud vastus.
Veebiserver annab vastuse, mille saavad teel kergesti lugeda.
Lahendus on äärmiselt lihtne — brauser genereerib endas kohalikult analoogse paarikese erasümbolist ja avalikust võtmes igale HTTPS-saidile.
Koos saidi avaliku võtme päringuga saadetakse tema kohalik avalik võti.
Veebiserver mäletab seda ja HTTP-vastust edastades krüpteerib selle konkreetse kliendi avaliku võtmega.
Nüüd saab HTTP-vastust dekrüpteerida ainult brauseri kliendi erasümbooli omanik (st klient ise).

Samm №3 — kaitstud ühenduse loomine avalikul kanalil.
Näites №2 on haavatavus — pole midagi, mis takistaks headel kavatsustel HTTP-päringu pealtkuulamist ja avaliku võtme teabe muutmist.
Seega saab vahendaja suurepäraselt näha kogu saadetud ja saadud sõnumite sisu, kuni sidekanal vahetub.
Sellega toimetulek on äärmiselt lihtne — piisab, kui saata brauseri avalik võti sõnumina, mis on krüpteeritud veebiserveri avaliku võtmega.
Veebiserver saadab siis esmalt vastuse, mis ütleb: "sinu avalik võti on selline" ja krüpteerib selle sõnumi sama avaliku võtme abil.
Brauser vaatab vastust — kui saabub sõnum "sinu avalik võti on selline" — siis on see 100% garantii, et see sidekanal on turvaline.
Kui turvaline see on?
Sellise turvalise sidekanali loomine toimub speediga ping*2. Näiteks 20 ms.
Kurjategijal peab olema kas eelnevalt ühe osapoole privaatvõti või ta peab suutma privaatvõtme mõne millisekundi jooksul leida.
Ühe kaasaegse privaatvõtme purustamine võtaks superarvutis kümneid aastaid.

Samm №4 — avalik andmebaas avalike võtmete jaoks.
On selge, et kogu selle loo käigus on võimalus kurjategijale, kes asub sidekanali vahel kliendi ja serveri vahel.
Kliendil on võimalus esindada serverit ja serveril esindada klienti. Samuti on võimalik emuleerida paari võtmeid mõlemas suunas.
Siis näeb ründaja kogu liiklust ja tal on võimalus seda 'muuta'.
Näiteks muuta aadressi, kuhu raha saata, või kopeerida parool online-pangast või blokeerida 'ebasobiv' sisu.
Selliste ründajate vastu mõeldi välja avalik ANDMEBAAS, kus on iga https saidi jaoks avalikud võtmed.
Iga brauser 'teab' umbes 200 sellise ANDMEBAASI olemasolust. See on iga brauserisse eelnevalt seadistatud.
See 'teadmise' tase on kinnitatud iga sertifikaadi avaliku võtmega. See tähendab, et ühenduse kuvamine iga konkreetse sertifitseerimiskeskusega ei ole võimalik.

Nüüd on lihtne arusaam SSL-i kasutamisest https-i jaoks.
Kui mõistetakse, siis saab selgeks, kuidas eriteenistused võivad selles struktuuris midagi häkkida. Kuid see nõuab neilt tohutult pingutust.
Organisatsioonidele, sealhulgas NSA-le või CIA-le, on olemasoleva taseme kaitse läbimurre praktiliselt võimatu, isegi VIP-iden.

Lisaks mainin ssh-ühendusi. Seal ei ole avalikke võtmeid, kuidas siis olla. Küsimus lahendatakse kahel viisil.
SSH-parooli variant:
Esimese ühenduse korral peab ssh-kliendi teadma, et meil on uus avalik võti ssh-serverilt.
Ja edasiste ühenduste puhul, kui ilmneb hoiatus 'uus avalik võti ssh-serverilt' — tähendab see, et keegi üritab teid nuhkida.
Või esimesel ühendusel võidi teid nuhkida ja nüüd suhtlete serveriga ilma vahendajateta.
Jõhkralt seda, et nuhkimise fakt paljastub kiiresti ja lihtsalt — seda rünnakut kasutatakse ainult erijuhtudel konkreetse kliendi suhtes.

SSH-võti variant:
Võtame mälupulga, salvestame sinna privaatvõtme ssh-serverile (selle jaoks on terminid ja palju olulisi nüanse, kuid ma kirjutan hariduse tutvustamiseks, mitte kasutusjuhendi jaoks).
Avalik võti jääb masinale, kus on ssh-kliendi ning seda hoitakse samuti saladuses.
Viime mälupulga serverisse, sisestame, kopeerime privaatvõtme, seejärel põletame mälupulga ja hajutame tuha tuule kätte (või vähemalt vormindame selle nullidega).
Nii see läheb – pärast sellist operatsiooni on sellise ssh ühenduse häkkimine võimatu. Muidugi, kümne aasta pärast võib superarvutis liiklust vaadata – aga see on eraldi lugu.

Palun vabandust offtopiku pärast.

Nii et nüüd, kui teooria on teada. Räägin ssl sertifikaadi loomise protsessist.

Kasutades "openssl genrsa", loome privaatvõtme ja "ettevalmistused" avaliku võtme jaoks.
"ettevalmistusi" saadame kolmandale osapoolele, kellele maksame umbes 9 dollarit kõige lihtsamate sertifikaatide eest.

Paari tunni pärast saame sealtpoolt ettevõttelt meie "avaliku" võtme ja veel hulga teisi avalikke võtmeid.

Miks maksta kolmandale osapoolele minu avaliku võtme vormistamise eest – see on eraldi küsimus, seda ei aruta.

Nüüd on selge, mis on selle kirjutise mõte:

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

Katalooge "/etc/ssl" on kogutud kõik ssl-iga seotud failid.
domain1.com – domeeninimi.
2018 – võtmete loomise aasta.
"key" – tähistus, et fail on privaatvõti.

Ja selle faili mõte:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com – domeeninimi.
2018 – võtmete loomise aasta.
chained — tähis, et siin on avalike võtmete ahel (esimene — meie avalik ja ülejäänud — need, mis tulid ettevõttelt, kes vormistas avaliku võtme).
crt — tähis, et siin on valmis sertifikaat (avalik võti koos tehniliste selgitustega).

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

See seade ei ole antud juhul kasutusel, kuid on kirjutatud näitena.

Sest vea esinemine selles parameetris toob kaasa teie serveri saatmise spämmivisi, ilma et te ise sooviksite.

Siis tõestage kõigile, et te ei ole süüdi.

recipient_delimiter = +

Võib-olla paljud ei tea, et see on standardne sümbol e-kirjade järjestamiseks ja seda toetavad enamik kaasaegseid meiliserversid.

Näiteks kui teil on meilikoht «username@gmail.com», proovige saata «username+spam@gmail.com» — vaadake, mis juhtub.

inet_protocols = ipv4

Võib-olla see tekitab segadust.

Aga see ei ole lihtsalt niisama. Iga uus domeen — vaikimisi ainult IPv4, hiljem lülitan IPv6 sisse igaühe jaoks eraldi.

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

Siin määrame, et kogu sissetulev postkiri läheb dovecot'i.
Domaani, postkastide, alias'e reeglid vaata andmebaasis.

/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

Nüüd teab postfix, et postkiri edastamiseks saab vastu võtta ainult siis, kui on autoriseeritud dovecot'i kaudu.

Ma tõesti ei saa aru, miks seda siin duplitseerida. Oleme ju juba 'virtual_transport' sees kõik vajalikud määranud.

Aga postfix on väga vana süsteem - ilmselt on need järelevalved vanade aegade jaoks.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Iga postiserveri seadistamine on eriline.

Minu käsutuses on kolme postiserverit ja need seaded erinevad suuresti, kuna kasutusnõuded on erinevad.

Seadistamine tuleb teha ettevaatlikult - vastasel juhul voolab teie poole rämpspost või veel hullemini - voolab rämpspost teie poolt.

# SPF
policyd-spf_time_limit = 3600

Seadistamine, mis on seotud saabuvate kirjade SPF kontrollimise plugina.

# 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

Seadistamine, et kõik välja minevad kirjad peavad olema DKIM allkirjastatud.

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

See on oluline komponent meilide marsruutimisel, kui neid saadetakse PHP skriptidest.

Fail „/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:

Vasakul — regulaaravaldised. Paremal — silt, millega kiri märgistatakse.
Postfix arvestab sildiga — see võtab arvesse veel mitmeid konfigureerimisjooni konkreetse kirja jaoks.

Kuidas täpselt postfixi konkreetse kirja jaoks ümber konfigureeritakse — see on märgitud failis „master.cf“.

Read 4, 5, 6 — need on peamised. Selle domeeni nimel, millelt me kirja saadame — selline silt me paneme.
Kuid mitte alati PHP skriptides vanades koodides on välja „from“ määratud. Sel juhul tuleb appi kasutajanimi.

Artikkel on juba ulatuslik — ei tahaks, et rõhk läheks nginx+fpm seadistamisele.

Lühidalt öeldes — määrame igale saidile oma linux-kasutaja omaniku. Ja vastavalt sellele oma fpm-pooli.

Fpm-pool kasutab ükskõik millist PHP versiooni (see on suurepärane, kui ühel serveril saab probleemideta kasutada erinevaid PHP versioone ja isegi erinevat php.ini-d).

Nii et konkreetsel linux-kasutajal „www-domain2“ on veebisait domain2.com. Sellel saidil on kood, mis saadab kirju ilma „from“ välja määramata.

Isegi sellisel juhul saadetakse kirjad korrektselt ja need ei satu kunagi spämi.

Minu „/etc/postfix/master.cf“ näeb välja selline:

...
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

Fail ei ole täielik — see on juba väga suur.
Tõin välja ainult muudetud osad.

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}

Need on spamassassiniga seotud seaded, millest räägin hiljem.

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

Me lubame liituda meiliserveriga porti 587 kaudu.
Selleks tuleb kindlasti autentida.

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

Lülitame sisse SPF kontrolli.

apt-get install postfix-policyd-spf-python

Paigaldame ülaltoodud SPF kontrollide paketi.

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

Ja see on kõige huvitavam. See võimalus saata kirju kindla domeeni ja konkreetse IPv4/IPv6 aadressiga.

Seda tehakse rDNS-i pärast. rDNS on stringi saamine IP-aadressi järgi.
Ja e-kirjade puhul kasutatakse seda võimalust, et kinnitada, et helo vastab tõepoolest selle aadressi rDNS-ile, kust e-kiri saadeti.

Kui helo ei vasta e-kirja saatja domeenile, siis kogutakse spämmi punkte.

Helo ei vasta rDNS-ile — kogutakse palju spämmi punkte.
Seega peab iga domeeni jaoks olema oma IP-aadress.
OVH jaoks on kontol võimalik määrata rDNS.
Tech.ru puhul lahendab küsimusi tugi.
AWS puhul lahendab küsimusi tugi.
«inet_protocols» ja «smtp_bind_address6» — aktiveerime IPv6 toe.
IPv6 puhul tuleb samuti määrata rDNS.
«syslog_name» — mugavuse huvides logide lugemiseks.

Osta sertifikaate soovitan siin.

Postfixi ja Dovecoti seadistamine siin.

Seadistamine SPF.

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

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

MySQL seadistamine, installime paketid ise.

Fail «/etc/dovecot/conf.d/10-auth.conf»

disable_plaintext_auth = yes
auth_mechanisms = plain login

Ainult krüpteeritud vormis autoriseerimine.

Fail «/etc/dovecot/conf.d/10-mail.conf»

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

Siin määrame kirjade hoidmise koha.

Soovin, et need salvestataks failidesse ja oleksid rühmitatud domeenide kaupa.

Fail «/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 {
  }
}

See on dovecot'i peamine konfiguratsioonifail.
Siin lülitame välja kaitsetud ühendused.
Ja aktiveerime kaitstud ühendused.

Fail «/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
}

Seadistame ssl-i. Määrame, et ssl on kohustuslik.
Ja sertifikaat ise. Oluline detail on direktiiv «local». See määrab, millist ssl-sertifikaati kasutada, kui ühenduse loomisel on tegu kohaliku IPv4-iga.

Muide, IPv6 pole siin korraldatud, parandan selle puuduse kunagi hiljem.
XX.XX.XX.X5 (domain2) — sertifika puudub. Klientide ühendamiseks tuleb märkida domain1.com.
XX.XX.XX.X2 (domain3) — sertifikaat on olemas, klientide ühendamiseks võib märkida domain1.com või domain3.com.

Fail «/etc/dovecot/conf.d/15-lda.conf»

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Seda on hiljem vajalik spamassassini jaoks.

Fail «/etc/dovecot/conf.d/20-imap.conf»

protocol imap {
  mail_plugins = $mail_plugins antispam
}

See on antispam plugin. Vajalik spamassassini õpetamiseks, kui liikuda kaustadesse «Spam».

Fail «/etc/dovecot/conf.d/20-pop3.conf»

protocol pop3 {
}

Lihtsalt selline fail on olemas.

Fail «/etc/dovecot/conf.d/20-lmtp.conf»

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

lmpt seadistus.

Fail «/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
}

spamassassini seadistused, kui liikuda kaustadesse «Spam».

Fail «/etc/dovecot/conf.d/90-sieve.conf»

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

Fail, mis määrab, mida teha saabuvate kirjadega.

Fail «/var/lib/dovecot/sieve/default.sieve»

require ["fileinto", "mailbox"];

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

Fail tuleb kompileerida: «sievec default.sieve».

Fail «/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
}

SQL-failide määramine autoriseerimiseks.
Ja fail ise — autoriseerimise viis.

Fail «/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';

See vastab Postfixi sarnastele seadistustele.

Fail «/etc/dovecot/dovecot.conf»

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

Põhikonfiguratsiooni fail.
Oluline on märkida, et siin määrame lisatud protokollid.

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

apt-get install spamassassin spamc

Paigaldame paketid.

adduser spamd --disabled-login

Lisame kasutaja, kelle nimel tegutseda.

systemctl enable spamassassin.service

Lülitame spamassassini teenuse automaatlaadimise sisse.

Fail «/etc/default/spamassassin»:

CRON=1

Lülitame vaikimisi sisse reeglite automaatse värskendamise.

Fail «/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

Tuleb luua MySQL andmebaas «sa» kasutajaga «sa» ja salajase sõnaga «password» (asu äkki midagi mõistlikumat).

report_safe — selle asemel, et e-kiri saadetaks, saadetakse spämmiaruande.
use_bayes — see on spamassassini masinõppe seadistus.

Ülejäänud spamassassini seadistused rakendati varem artiklis.

Üldine seadistus „spamassassin“.
Uute spämmi e-kirjade liigutamine IMAP kausta „Spam“.
Lihtne kombinatsioon Dovecot + SpamAssassin.
Soovitan lugeda spamassassini õpetusteooriat e-kirjade liikumise kohta imap kaustades (ja ei soovita rakendada)..

============= Kutsumine kogukonda =============

Tahaksin veel jagada ideed kogukonnale, kuidas suurendada edasi saadetud e-kirjade turvalisust. Kuna ma olen sel teemal sügavalt süvenenud.

Et kasutaja saaks enda kliendis (outlook, thunderbird, brauseri-plugins, ...) luua paar võtmet. Avalik ja privaatne. Avalik — saata DNS-i. Privaatne — hoida kliendil. Postiserverid oskaksid rakendada avalikku võtit, et saata konkreetsele aadressile.

Ja nende e-kirjade puhul spämmi kaitsmiseks (jah, postiserver ei saa sisu vaadata) — tuleb kehtestada kolm reeglit:

  1. Kohustuslik tõeline DKIM allkiri, kohustuslik SPF, kohustuslik rDNS.
  2. Masinõppe mudel antispämmi teemal + andmebaas, mis asub kliendi poolel.
  3. Krüpteerimisalgoritm peaks olema selline, et saatva poole CPU ressursid peavad olema 100 korda suuremad, kui vastuvõtva poole omad.

Lisaks avalikele kirjadele — töötada välja standardiseeritud ettepanekukiri "alustada kaitstud kirjavahetust". Üks kasutaja (meiliaadress) saadab teisele meiliaadressile kirja koos manusega. Kirjas on tekst ettepanekuga alustada kaitstud ühendust kirjavahetuseks ja saatja meiliaadressi avalik võti (samal ajal kui privaatvõti on kliendi poolel).

Isegi paar võtmeid saab iga vestluse jaoks eraldi luua. Vastuvõtja kasutaja võib selle pakkumise aktsepteerida ja saata oma avaliku võtme (mis ka on selle vestluse jaoks eraldi loodud). Siis saadab esimene kasutaja teenuslikku kontrollkirja (teise kasutaja avaliku võtmega krüpteeritud) — mille saadud korral võib teine kasutaja pidada loodud suhtlusteed usaldusväärseks. Edasi saadab teine kasutaja kontrollkirja — ja siis võib ka esimene kasutaja pidada loodud kanali kaitstuks.

Võtmete pealesaatmise pealtkatsumise vastu võitlemiseks peab protokollis olema ette nähtud vähemalt ühe avaliku võtme edastamise võimalus flash-diskiga.

Ja kõige tähtsam on, et kõik see toimiks (küsimus «kes selle eest maksab?»):
Sisse viia postiteenuse sertifikaadid, mille hind algab 10$ kolme aasta eest. Need võimaldavad saatjal dns-is märkida, et «mu avalikud võtmed on seal». Ja need annavad võimaluse alustada kaitstud ühendust. Samuti — selliste ühenduste vastuvõtt on tasuta.
gmail lõpuks monetiseerib oma kasutajaid. 10 $ kolme aasta eest — õigus luua kaitstud suhtluskanaale.

============= Kokkuvõte =============

Kogu artikli testimiseks plaanisin üürida dedikeeritud serveri kuuks ja osta domeen koos ssl-sertifikaadiga.

Kuid elutingimuste tõttu venis see küsimus kahe kuu võrra.
Ja kui mul taas vaba aega tekkis — otsustasin artikli sellisena avaldada, mitte riskida sellega, et avaldamine venib veel aastaks.

Kui tuleb piisavalt palju küsimusi nagu „aga siin ei ole piisavalt detailselt kirjeldatud“ — siis ehk leian jõu võtta dedikeeritud server uue domeeniga ja uue SSL-sertifikaadiga ning veelgi üksikasjalikumalt kirjeldada ja mis peamine — tuvastada kõik tähtsad üksikasjad.

Samuti sooviksin kuulda tagasisidet postikinnitussertifikaatide idee kohta. Kui idee meeldib — püüan leida jõu kirjutada mustand rfc jaoks.

Suuri artikli osi kopeerides — näita viidet sellele artiklile.
Iga teise keelde tõlkides — näita viidet sellele artiklile.
Inglise keeles püüan ise tõlkida ja jätan ristviidatud lingid.


Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster