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

Tento článek je o tom, jak nastavit moderní poštovní server.
Postfix + holubník. SPF + DKIM + rDNS. S IPv6.
S TSL šifrováním. S podporou více domén – část se skutečným SSL certifikátem.
S antispamovou ochranou a vysokým antispamovým hodnocením z jiných poštovních serverů.
Podporuje více fyzických rozhraní.
S OpenVPN, ke kterému je připojení přes IPv4 a které poskytuje IPv6.

Pokud se nechcete učit všechny tyto technologie, ale chcete si takový server nastavit, pak je tento článek určen právě vám.

Článek se nesnaží vysvětlit každý detail. Vysvětlení jde k tomu, co není nakonfigurováno jako standardní nebo co je důležité z pohledu spotřebitele.

Motivace k založení poštovního serveru byl mým dlouhodobým snem. Může to znít hloupě, ale IMHO je to mnohem lepší než snít o novém autě své oblíbené značky.

Pro nastavení IPv6 existují dvě motivace. IT specialista se musí neustále učit novým technologiím, aby přežil. Rád bych svým skromným příspěvkem přispěl k boji proti cenzuře.

Motivací pro nastavení OpenVPN je pouze zprovoznění IPv6 na místním počítači.
Motivací pro nastavení několika fyzických rozhraní je, že na svém serveru mám jedno rozhraní „pomalé, ale neomezené“ a druhé „rychlé, ale s tarifem“.

Motivací pro nastavení nastavení Bind je to, že můj ISP poskytuje nestabilní DNS server a google také někdy selže. Chci stabilní DNS server pro osobní použití.

Motivace k napsání článku – koncept jsem napsal před 10 měsíci a už jsem se na něj dvakrát podíval. I když to autor potřebuje pravidelně, je velká pravděpodobnost, že to budou potřebovat i ostatní.

Univerzální řešení pro poštovní server neexistuje. Ale pokusím se napsat něco jako "udělejte toto a pak, až bude vše fungovat, jak má, vyhoďte věci navíc."

Společnost tech.ru má kolokační server. Je možné srovnávat s OVH, Hetzner, AWS. K vyřešení tohoto problému bude spolupráce s tech.ru mnohem efektivnější.

Na serveru je nainstalován Debian 9.

Server má 2 rozhraní `eno1` a `eno2`. První je neomezená a druhá je rychlá, resp.

Existují 3 statické IP adresy, XX.XX.XX.X0 a XX.XX.XX.X1 a XX.XX.XX.X2 na rozhraní „eno1“ a XX.XX.XX.X5 na rozhraní „eno2“ .

K dispozici XXXX:XXXX:XXXX:XXXX::/64 fond IPv6 adres, které jsou přiřazeny k rozhraní `eno1` az něj XXXX:XXXX:XXXX:XXXX:1:2::/96 byl na můj požadavek přiřazen `eno2`.

Existují 3 domény `domain1.com`, `domain2.com`, `domain3.com`. Existuje certifikát SSL pro `domain1.com` a `domain3.com`.

Mám účet Google, se kterým bych chtěl propojit svou poštovní schránku[chráněno e-mailem]` (přijímání pošty a odesílání pošty přímo z rozhraní gmailu).
Musí tam být poštovní schránka[chráněno e-mailem]`, kopii e-mailu, ze kterého chci vidět ve svém gmailu. A je vzácné, že můžete něco poslat jménem `[chráněno e-mailem]` přes webové rozhraní.

Musí tam být poštovní schránka[chráněno e-mailem]`, který Ivanov použije ze svého iPhonu.

Odeslané e-maily musí splňovat všechny moderní antispamové požadavky.
Ve veřejných sítích musí být zajištěna nejvyšší úroveň šifrování.
Měla by existovat podpora IPv6 pro odesílání i přijímání dopisů.
Měl by existovat SpamAssassin, který nikdy nebude mazat e-maily. A bude buď vrácen, nebo přeskočen nebo odeslán do složky IMAP „Spam“.
Automatické učení SpamAssassin musí být nakonfigurováno: když přesunu písmeno do složky Spam, naučí se z toho; když přesunu dopis ze složky Spam, naučí se z toho. Výsledky školení SpamAssassin by měly ovlivnit, zda dopis skončí ve složce Spam.
PHP skripty musí být schopny odesílat poštu jménem jakékoli domény na daném serveru.
Měla by existovat služba openvpn s možností používat IPv6 na klientovi, který IPv6 nemá.

Nejprve je potřeba nakonfigurovat rozhraní a směrování, včetně IPv6.
Poté budete muset nakonfigurovat OpenVPN, která se připojí přes IPv4 a poskytne klientovi staticko-reálnou IPv6 adresu. Tento klient bude mít přístup ke všem službám IPv6 na serveru a přístup ke všem zdrojům IPv6 na internetu.
Pak budete muset nastavit Postfix tak, aby posílal dopisy + SPF + DKIM + rDNS a další podobné drobnosti.
Poté budete muset nakonfigurovat Dovecot a nakonfigurovat Multidomain.
Poté budete muset nakonfigurovat SpamAssassin a nakonfigurovat školení.
Nakonec nainstalujte Bind.

============= Více rozhraní =============

Chcete-li nakonfigurovat rozhraní, musíte to napsat 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

Tato nastavení lze použít na libovolném serveru v tech.ru (s trochou koordinace s podporou) a okamžitě bude fungovat, jak má.

Pokud máte zkušenosti s nastavováním podobných věcí pro Hetzner, OVH, tam je to jiné. Obtížnější.

eno1 je název síťové karty #1 (pomalá, ale neomezená).
eno2 je název síťové karty #2 (rychlé, ale s tarifem).
tun0 je název virtuální síťové karty z 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 – brána IPv4.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 pro celý server.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 pro eno2, vše ostatní zvenčí jde do eno1.
XXXX:XXXX:XXXX:XXXX::1 — Brána IPv6 (je třeba poznamenat, že to lze/mělo by být provedeno jinak. Zadejte přepínač IPv6).
dns-nameservers - je uvedeno 127.0.0.1 (protože bind je nainstalován lokálně) a 213.248.1.6 (toto je z tech.ru).

„tabulka eno1t“ a „tabulka eno2t“ - význam těchto pravidel trasy je ten, že provoz vjíždějící přes eno1 -> by ji opustil a provoz vjíždějící přes eno2 -> by ji opustil. A také spojení iniciovaná serverem by procházela přes eno1.

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

Tímto příkazem určíme, že jakýkoli nesrozumitelný provoz, který spadá pod jakékoli pravidlo označené „tabulka eno1t“ -> bude odeslán do rozhraní eno1.

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

Tímto příkazem určíme, že veškerý provoz iniciovaný serverem by měl být směrován na rozhraní eno1.

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

Tímto příkazem nastavíme pravidla pro označování provozu.

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 blok specifikuje druhou IPv4 pro rozhraní eno1.

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

Tímto příkazem nastavíme cestu z klientů OpenVPN na lokální IPv4 kromě XX.XX.XX.X0.
Stále nechápu, proč tento příkaz stačí pro všechny IPv4.

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

Zde nastavujeme adresu pro samotné rozhraní. Server ji použije jako „odchozí“ adresu. Nebude znovu žádným způsobem použit.

Proč je ":1:1::" tak složité? Aby OpenVPN fungovalo správně a pouze pro toto. Více o tom později.

K tématu brány - tak to funguje a to je dobře. Ale správným způsobem je zde uvést IPv6 přepínače, ke kterému je server připojen.

Z nějakého důvodu však IPv6 přestane fungovat, pokud to udělám. Toto je pravděpodobně nějaký problém tech.ru.

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

Toto je přidání adresy IPv6 do rozhraní. Pokud potřebujete sto adres, znamená to sto řádků v tomto souboru.

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

Poznamenal jsem si adresy a podsítě všech rozhraní, aby to bylo jasné.
eno1 - musí být "/64“ – protože toto je celý náš fond adres.
tun0 - podsíť musí být větší než eno1. V opačném případě nebude možné nakonfigurovat bránu IPv6 pro klienty OpenVPN.
eno2 - podsíť musí být větší než tun0. V opačném případě nebudou mít klienti OpenVPN přístup k místním adresám IPv6.
Pro přehlednost jsem zvolil krok podsítě 16, ale pokud si přejete, můžete dokonce udělat krok „1“.
V souladu s tím 64+16 = 80 a 80+16 = 96.

Pro ještě větší přehlednost:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY jsou adresy, které by měly být přiřazeny konkrétním místům nebo službám na rozhraní eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY jsou adresy, které by měly být přiřazeny konkrétním místům nebo službám na rozhraní eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY jsou adresy, které by měly být přiřazeny klientům OpenVPN nebo použity jako adresy služby OpenVPN.

Pro konfiguraci sítě by mělo být možné restartovat server.
Změny IPv4 se zaznamenají při spuštění (nezapomeňte je zabalit do obrazovky - jinak tento příkaz jednoduše zhroutí síť na serveru):

/etc/init.d/networking restart

Přidejte na konec souboru „/etc/iproute2/rt_tables“:

100 eno1t
101 eno2t

Bez toho nemůžete používat vlastní tabulky v souboru „/etc/network/interfaces“.
Čísla musí být jedinečná a menší než 65535.

Změny protokolu IPv6 lze snadno změnit bez restartu, ale k tomu se musíte naučit alespoň tři příkazy:

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

Nastavení "/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

Toto jsou nastavení "sysctl" mého serveru. Dovolte mi upozornit na něco důležitého.

net.ipv4.ip_forward = 1

Bez toho nebude OpenVPN vůbec fungovat.

net.ipv6.ip_nonlocal_bind = 1

Každý, kdo se pokusí svázat IPv6 (například nginx) ihned po spuštění rozhraní, obdrží chybu. Že tato adresa není dostupná.

Aby se předešlo takové situaci, je provedeno takové nastavení.

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

Bez těchto nastavení IPv6 se provoz z klienta OpenVPN do světa nedostane.

Ostatní nastavení buď nejsou relevantní, nebo si nepamatuji, k čemu slouží.
Ale pro každý případ to nechám „tak jak je“.

Aby byly změny tohoto souboru načteny bez restartování serveru, musíte spustit příkaz:

sysctl -p

Další podrobnosti o pravidlech „tabulky“: habr.com/post/108690

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

OpenVPN IPv4 nefunguje bez iptables.

Moje iptables jsou pro VPN takto:

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 je moje statická adresa IPv4 místního počítače.
10.8.0.0/24 – síť IPv4 openvpn. IPv4 adresy pro klienty openvpn.
Důležitá je konzistence pravidel.

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 je omezení, takže OpenVPN mohu používat pouze já ze své statické IP.

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

Chcete-li předávat pakety IPv4 mezi klienty OpenVPN a Internetem, musíte zaregistrovat jeden z těchto příkazů.

Pro různé případy není jedna z možností vhodná.
Oba příkazy jsou pro můj případ vhodné.
Po přečtení dokumentace jsem zvolil první možnost, protože využívá méně CPU.

Aby byla všechna nastavení iptables po restartu vyzvednuta, musíte je někam uložit.

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

Taková jména nebyla vybrána náhodou. Používá je balíček "iptables-persistent".

apt-get install iptables-persistent

Instalace hlavního balíčku OpenVPN:

apt-get install openvpn easy-rsa

Pojďme nastavit šablonu pro certifikáty (nahraďte své hodnoty):

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

Upravme nastavení šablony certifikátu:

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="[email protected]"
export KEY_OU="VPN"

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

Vytvořte certifikát serveru:

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

Připravme možnost vytvořit finální soubory „jméno klienta.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

Připravme si skript, který sloučí všechny soubory do jednoho souboru opvn.

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}/.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/.ovpn

Vytvoření prvního klienta OpenVPN:

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

Do klientského zařízení je odeslán soubor „~/client-configs/files/client-name.ovpn“.

Pro iOS klienty budete muset udělat následující trik:
Obsah tagu „tls-auth“ musí být bez komentáře.
A také vložte „key-direction 1“ bezprostředně před značku „tls-auth“.

Pojďme nakonfigurovat konfiguraci serveru 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 potřeba k nastavení statické adresy pro každého klienta (není nutné, ale používám ji):

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

Nejtěžší a klíčový detail.

Bohužel OpenVPN zatím neví, jak samostatně nakonfigurovat IPv6 bránu pro klienty.
Musíte to „ručně“ přeposlat pro 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"

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

Soubor „/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í soubor „/etc/openvpn/variables“:

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

Je pro mě těžké si vzpomenout, proč je to takto napsáno.

Netmask = 112 vypadá divně (mělo by tam být 96).
A předpona je zvláštní, neodpovídá síti tun0.
Ale dobře, nechám to tak.

cipher DES-EDE3-CBC

To není pro každého – zvolil jsem tento způsob šifrování spojení.

Přečtěte si další informace o nastavení OpenVPN IPv4.

Přečtěte si další informace o nastavení OpenVPN IPv6.

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

Instalace hlavního balíčku:

apt-get install postfix

Při instalaci vyberte „internetové stránky“.

Můj "/etc/postfix/main.cf" vypadá takto:

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

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
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

# Storage type
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 settings
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 address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Podívejme se na podrobnosti této konfigurace.

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

Podle obyvatel Chabrovska tento blok obsahuje „dezinformace a nesprávné teze“.Teprve 8 let po začátku své kariéry jsem začal chápat, jak SSL funguje.

Dovolím si proto popsat, jak používat SSL (aniž bych odpovídal na otázky „Jak to funguje?“ a „Proč to funguje?“).

Základem moderního šifrování je vytvoření páru klíčů (dva velmi dlouhé řetězce znaků).

Jeden „klíč“ je soukromý, druhý klíč je „veřejný“. Soukromý klíč velmi pečlivě tajíme. Veřejný klíč distribuujeme všem.

Pomocí veřejného klíče můžete zašifrovat řetězec textu tak, aby jej mohl dešifrovat pouze vlastník soukromého klíče.
No, to je celý základ technologie.

Krok č. 1 – https stránky.
Při přístupu na web se prohlížeč z webového serveru dozví, že web je https, a proto požaduje veřejný klíč.
Webový server poskytne veřejný klíč. Prohlížeč používá veřejný klíč k zašifrování požadavku http a jeho odeslání.
Obsah http-požadavku může číst pouze ten, kdo má soukromý klíč, tedy pouze server, kterému je požadavek zasílán.
Http-request obsahuje alespoň URI. Pokud se tedy nějaká země snaží omezit přístup ne na celý web, ale na konkrétní stránku, pak to pro weby https nelze udělat.

Krok č. 2 – šifrovaná odpověď.
Webový server poskytuje odpověď, kterou lze snadno přečíst na cestách.
Řešení je extrémně jednoduché – prohlížeč lokálně generuje stejný pár soukromých a veřejných klíčů pro každý https web.
A spolu s požadavkem na veřejný klíč webu odešle jeho místní veřejný klíč.
Webový server si ji pamatuje a při odeslání http-odpovědi ji zašifruje veřejným klíčem konkrétního klienta.
Nyní může http-response dešifrovat pouze vlastník privátního klíče prohlížeče klienta (tedy samotný klient).

Krok č. 3 - navázání zabezpečeného spojení přes veřejný kanál.
V příkladu č. 2 je zranitelnost - nic nebrání příznivcům zachytit http-požadavek a upravit informace o veřejném klíči.
Zprostředkovatel tak jasně uvidí veškerý obsah odeslaných a přijatých zpráv, dokud se komunikační kanál nezmění.
Vypořádat se s tím je extrémně jednoduché – stačí poslat veřejný klíč prohlížeče jako zprávu zašifrovanou veřejným klíčem webového serveru.
Webový server poté nejprve odešle odpověď jako „váš veřejný klíč je takový“ a zašifruje tuto zprávu stejným veřejným klíčem.
Prohlížeč se podívá na odpověď - pokud obdrží zprávu „váš veřejný klíč je takový“ - pak je to 100% záruka, že je tento komunikační kanál bezpečný.
Jak je to bezpečné?
Samotné vytvoření takového zabezpečeného komunikačního kanálu probíhá rychlostí ping*2. Například 20 ms.
Útočník musí mít předem soukromý klíč jedné ze stran. Nebo najděte soukromý klíč během několika milisekund.
Hacknutí jednoho moderního soukromého klíče bude na superpočítači trvat desítky let.

Krok č. 4 – veřejná databáze veřejných klíčů.
Je zřejmé, že v celém tomto příběhu je příležitost pro útočníka sedět na komunikačním kanálu mezi klientem a serverem.
Klient se může vydávat za server a server se může vydávat za klienta. A emulujte dvojici kláves v obou směrech.
Poté útočník uvidí veškerý provoz a bude moci provoz „upravit“.
Například změňte adresu, kam se mají posílat peníze, zkopírujte heslo z online bankovnictví nebo zablokujte „nežádoucí“ obsah.
V boji proti takovým útočníkům přišli s veřejnou databází s veřejnými klíči pro každý web https.
Každý prohlížeč „ví“ o existenci asi 200 takových databází. Toto je předinstalované v každém prohlížeči.
„Znalosti“ jsou podloženy veřejným klíčem z každého certifikátu. To znamená, že spojení s každou konkrétní certifikační autoritou nelze zfalšovat.

Nyní je jednoduché pochopit, jak používat SSL pro https.
Pokud použijete mozek, bude jasné, jak mohou speciální služby něco v této struktuře nabourat. Bude je to ale stát monstrózní úsilí.
A organizace menší než NSA nebo CIA – je téměř nemožné hacknout stávající úroveň ochrany, a to i pro VIP.

Přidám také o připojeních ssh. Nejsou tam žádné veřejné klíče, tak co můžete dělat? Problém je vyřešen dvěma způsoby.
Možnost ssh-by-heslo:
Při prvním připojení by měl ssh klient upozornit, že máme nový veřejný klíč od ssh serveru.
A pokud se během dalších připojení objeví varování „nový veřejný klíč ze ssh serveru“, bude to znamenat, že se vás snaží odposlouchávat.
Nebo jste byli odposloucháváni při prvním připojení, ale nyní komunikujete se serverem bez prostředníků.
Ve skutečnosti, vzhledem k tomu, že skutečnost odposlechu je snadno, rychle a bez námahy odhalena, je tento útok používán pouze ve speciálních případech pro konkrétního klienta.

Možnost ssh-by-key:
Vezmeme flash disk, napíšeme na něj soukromý klíč pro ssh server (pro to existují podmínky a mnoho důležitých nuancí, ale píšu vzdělávací program, ne návod k použití).
Veřejný klíč ponecháme na stroji, kde bude ssh klient a také jej uchováváme v tajnosti.
Přivedeme flash disk na server, vložíme jej, zkopírujeme soukromý klíč, spálíme flash disk a rozprášíme popel do větru (nebo jej alespoň naformátujeme nulami).
To je vše - po takové operaci nebude možné hacknout takové připojení ssh. Samozřejmě, že za 10 let bude možné sledovat provoz na superpočítači – ale to je jiný příběh.

Omlouvám se za offtopic.

Takže teď, když je teorie známá. Řeknu vám o postupu vytváření certifikátu SSL.

Pomocí „openssl genrsa“ vytvoříme soukromý klíč a „prázdné místo“ pro veřejný klíč.
„Nevýrobky“ posíláme třetí straně, které zaplatíme přibližně 9 USD za nejjednodušší certifikát.

Po několika hodinách obdržíme náš „veřejný“ klíč a sadu několika veřejných klíčů od této společnosti třetí strany.

Proč by měla společnost třetí strany platit za registraci mého veřejného klíče, je samostatná otázka, kterou zde nebudeme zvažovat.

Nyní je jasné, jaký je význam nápisu:

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

Složka „/etc/ssl“ obsahuje všechny soubory pro problémy s ssl.
domain1.com — název domény.
Rok 2018 je rokem tvorby klíčů.
„klíč“ - označení, že soubor je soukromý klíč.

A význam tohoto souboru:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — název domény.
Rok 2018 je rokem tvorby klíčů.
řetězený - označení, že existuje řetězec veřejných klíčů (první je náš veřejný klíč a zbytek je to, co pochází od společnosti, která veřejný klíč vydala).
crt - označení, že existuje hotový certifikát (veřejný klíč s technickými vysvětlivkami).

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

Toto nastavení se v tomto případě nepoužívá, ale je napsáno jako příklad.

Protože chyba v tomto parametru povede k rozesílání spamu z vašeho serveru (bez vaší vůle).

Pak všem dokaž, že nejsi vinen.

recipient_delimiter = +

Mnoho lidí možná neví, ale toto je standardní znak pro hodnocení e-mailů a je podporován většinou moderních poštovních serverů.

Pokud máte například poštovní schránku "[chráněno e-mailem]"zkuste poslat na"[chráněno e-mailem]"- podívej, co z toho vyplývá.

inet_protocols = ipv4

To může být matoucí.

Ale není to jen tak. Každá nová doména je standardně pouze IPv4, pak zapínám IPv6 pro každou 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

Zde upřesňujeme, že veškerá příchozí pošta jde do dovecotu.
A pravidla pro doménu, schránku, alias - podívejte se do databáze.

/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

Postfix nyní ví, že pošta může být přijata k dalšímu odesílání pouze po autorizaci pomocí dovecotu.

Opravdu nechápu, proč se to tu duplikuje. Již jsme specifikovali vše, co je potřeba ve „virtual_transport“.

Ale systém postfixů je velmi starý - pravděpodobně je to návrat ze starých časů.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

To lze pro každý poštovní server nakonfigurovat odlišně.

Mám k dispozici 3 poštovní servery a tato nastavení se velmi liší kvůli různým požadavkům na použití.

Musíte to pečlivě nakonfigurovat - jinak se na vás bude hrnout spam, nebo ještě hůř - spam se bude hrnout z vás.

# SPF
policyd-spf_time_limit = 3600

Nastavení nějakého pluginu souvisejícího s kontrolou SPF příchozích dopisů.

# 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

Nastavení je, že u všech odchozích e-mailů musíme poskytnout podpis DKIM.

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

Toto je klíčový detail ve směrování dopisů při odesílání dopisů z PHP skriptů.

Soubor „/etc/postfix/sdd_transport.pcre“:

/^[email protected]$/ domain1:
/^[email protected]$/ domain2:
/^[email protected]$/ domain3:
/@domain1.com$/             domain1:
/@domain2.com$/             domain2:
/@domain3.com$/             domain3:

Vlevo jsou regulární výrazy. Na pravé straně je štítek, který označuje písmeno.
Postfix v souladu s popiskem - vezme v úvahu několik dalších konfiguračních řádků pro konkrétní písmeno.

Jak přesně bude postfix překonfigurován pro konkrétní písmeno, bude uvedeno v „master.cf“.

Řádky 4, 5, 6 jsou hlavní. Jménem které domény dopis zasíláme, uvedeme tento štítek.
Pole „od“ však není v PHP skriptech ve starém kódu vždy uvedeno. Pak přijde na záchranu uživatelské jméno.

Článek je již obsáhlý – nechtěl bych být rušen nastavením nginx+fpm.

Stručně řečeno, pro každý web nastavíme jeho vlastního vlastníka linuxového uživatele. A podle toho váš fond fpm.

Fpm-pool používá jakoukoli verzi php (je skvělé, když na stejném serveru můžete bez problémů používat různé verze php a dokonce i různé php.ini pro sousední stránky).

Takže konkrétní uživatel linuxu „www-domena2“ má webovou stránku domain2.com. Tato stránka obsahuje kód pro odesílání e-mailů bez uvedení pole od.

Takže i v tomto případě budou dopisy odeslány správně a nikdy neskončí ve spamu.

Můj "/etc/postfix/master.cf" vypadá 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

Soubor není poskytnut celý - je již velmi velký.
Pouze jsem zaznamenal, co se změnilo.

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 jsou nastavení související se spamassinem, o tom později.

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 vám připojit se k poštovnímu serveru přes port 587.
Chcete-li to provést, musíte se přihlásit.

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

Povolit kontrolu SPF.

apt-get install postfix-policyd-spf-python

Nainstalujme balíček pro kontroly SPF výše.

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 to je na tom to nejzajímavější. Jedná se o možnost odesílat dopisy pro konkrétní doménu z konkrétní adresy IPv4/IPv6.

To se děje kvůli rDNS. rDNS je proces přijímání řetězce podle IP adresy.
A u pošty se tato funkce používá k potvrzení, že helo přesně odpovídá rDNS adresy, ze které byl e-mail odeslán.

Pokud helo neodpovídá e-mailové doméně, jejímž jménem byl dopis odeslán, jsou přiděleny body za spam.

Helo neodpovídá rDNS - je uděleno mnoho bodů za spam.
V souladu s tím musí mít každá doména svou vlastní IP adresu.
Pro OVH - v konzoli je možné specifikovat rDNS.
Pro tech.ru - problém je vyřešen prostřednictvím podpory.
U AWS je problém vyřešen prostřednictvím podpory.
„inet_protocols“ a „smtp_bind_address6“ – povolujeme podporu IPv6.
Pro IPv6 je také potřeba zaregistrovat rDNS.
"syslog_name" - a to pro snadné čtení protokolů.

Kupte si certifikáty Doporučuji zde.

Nastavení odkazu postfix+dovecot zde.

Nastavení SPF.

============= Holubník =============

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

Nastavení mysql, instalace samotných balíčků.

Soubor "/etc/dovecot/conf.d/10-auth.conf"

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizace je pouze šifrovaná.

Soubor „/etc/dovecot/conf.d/10-mail.conf“

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

Zde uvádíme místo uložení dopisů.

Chci, aby byly uloženy v souborech a seskupeny podle domény.

Soubor "/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í soubor dovecot.
Zde zakážeme nezabezpečená připojení.
A povolit zabezpečená připojení.

Soubor "/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
}

Nastavení ssl. Označujeme, že je vyžadován ssl.
A certifikát samotný. A důležitým detailem je „místní“ směrnice. Označuje, který certifikát SSL použít při připojování ke kterému místnímu IPv4.

Mimochodem, IPv6 zde není nakonfigurováno, toto opomenutí opravím později.
XX.XX.XX.X5 (doména2) – žádný certifikát. Chcete-li připojit klienty, musíte zadat domain1.com.
XX.XX.XX.X2 (doména3) - existuje certifikát, pro připojení klientů můžete zadat doménu1.com nebo doménu3.com.

Soubor "/etc/dovecot/conf.d/15-lda.conf"

protocol lda {
  mail_plugins = $mail_plugins sieve
}

To bude pro spamassassina v budoucnu potřeba.

Soubor "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Toto je antispamový plugin. Potřebné pro trénování spamassina v době přenosu do/ze složky „Spam“.

Soubor "/etc/dovecot/conf.d/20-pop3.conf"

protocol pop3 {
}

Existuje právě takový soubor.

Soubor „/etc/dovecot/conf.d/20-lmtp.conf“

protocol lmtp {
  mail_plugins = $mail_plugins sieve
  postmaster_address = [email protected]
}

Nastavení lmtp.

Soubor "/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
}

Nastavení tréninku Spamassasin v době přenosu do/ze složky Spam.

Soubor "/etc/dovecot/conf.d/90-sieve.conf"

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

Soubor, který určuje, co se má dělat s příchozími dopisy.

Soubor "/var/lib/dovecot/sieve/default.sieve"

require ["fileinto", "mailbox"];

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

Musíte zkompilovat soubor: “sievec default.sieve”.

Soubor "/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
}

Určení souborů SQL pro autorizaci.
A jako způsob autorizace se používá samotný soubor.

Soubor "/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';

To odpovídá podobnému nastavení pro postfix.

Soubor "/etc/dovecot/dovecot.conf"

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

Hlavní konfigurační soubor.
Důležité je, že zde naznačíme - přidat protokoly.

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

apt-get install spamassassin spamc

Pojďme nainstalovat balíčky.

adduser spamd --disabled-login

Pojďme přidat uživatele, jehož jménem.

systemctl enable spamassassin.service

Povolujeme automatické načítání služby spamassassin při načítání.

Soubor "/etc/default/spamassassin":

CRON=1

Povolením automatické aktualizace pravidel „ve výchozím nastavení“.

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

Musíte vytvořit databázi „sa“ v mysql s uživatelem „sa“ s heslem „password“ (nahradit něčím adekvátním).

report_safe – toto odešle hlášení o spamu namísto dopisu.
use_bayes jsou nastavení strojového učení spamassassinů.

Zbývající nastavení spamassassina byla použita dříve v článku.

Obecné nastavení "spamassassin".
O přesouvání nových spamových e-mailů do složky IMAP „Spam“..
O jednoduché kombinaci Dovecot + SpamAssassin.
Doporučuji si přečíst teorii učení spamassina při přesouvání písmen ve složkách imap (a nedoporučuji ji používat).

============= Odvolání ke komunitě =============

Také bych rád vhodil do komunity nápad, jak zvýšit úroveň zabezpečení přeposílaných dopisů. Jelikož jsem tak hluboce ponořený do tématu pošty.

Aby si uživatel mohl na svém klientovi vytvořit dvojici klíčů (outlook, thunderbird, browser-plugin, ...). Veřejné i soukromé. Veřejné – odeslat na DNS. Soukromé - uložit na klienta. Poštovní servery by mohly použít veřejný klíč k odeslání konkrétnímu příjemci.

A k ochraně před spamem s takovými dopisy (ano, poštovní server nebude moci zobrazit obsah) - budete muset zavést 3 pravidla:

  1. Povinný skutečný podpis DKIM, povinný SPF, povinný rDNS.
  2. Neuronová síť na téma antispamové školení + k ní databáze na straně klienta.
  3. Šifrovací algoritmus musí být takový, že odesílající strana musí vynaložit 100krát více výkonu CPU na šifrování než přijímající strana.

Kromě veřejných dopisů vytvořte standardní návrhový dopis „pro zahájení bezpečné korespondence“. Jeden z uživatelů (schránka) odešle dopis s přílohou do jiné schránky. Dopis obsahuje textový návrh na spuštění zabezpečeného komunikačního kanálu pro korespondenci a veřejný klíč majitele schránky (se soukromým klíčem na straně klienta).

Můžete dokonce vytvořit několik klíčů speciálně pro každou korespondenci. Přijímající uživatel může tuto nabídku přijmout a odeslat svůj veřejný klíč (také vytvořený speciálně pro tuto korespondenci). Dále první uživatel odešle servisní kontrolní dopis (zašifrovaný veřejným klíčem druhého uživatele) - po jehož obdržení může druhý uživatel považovat vytvořený komunikační kanál za spolehlivý. Poté druhý uživatel odešle kontrolní dopis - a první uživatel může také považovat vytvořený kanál za bezpečný.

Aby bylo možné bojovat proti zachycování klíčů na cestách, musí protokol zajistit možnost přenosu alespoň jednoho veřejného klíče pomocí flash disku.

A nejdůležitější je, že to všechno funguje (otázka je „kdo to zaplatí?“):
Zadejte poštovní certifikáty začínající na 10 USD na 3 roky. Což umožní odesílateli uvést v DNS, že „mé veřejné klíče jsou támhle“. A dají vám příležitost zahájit zabezpečené připojení. Přijetí takových spojení je přitom bezplatné.
gmail konečně monetizuje své uživatele. Za 10 $ za 3 roky - právo vytvářet zabezpečené kanály pro korespondenci.

============= Závěr =============

Abych celý článek otestoval, chtěl jsem si na měsíc pronajmout dedikovaný server a koupit doménu s SSL certifikátem.

Ale životní okolnosti se vyvinuly, takže se tento problém táhl 2 měsíce.
A tak, když jsem měl opět volno, rozhodl jsem se článek publikovat tak, jak je, než riskovat, že se vydání protáhne o další rok.

Pokud je zde poměrně hodně otázek typu „ale toto není dostatečně podrobně popsáno“, pak bude pravděpodobně síla vzít dedikovaný server s novou doménou a novým SSL certifikátem a popsat jej ještě podrobněji a důležité je identifikovat všechny chybějící důležité detaily.

Také bych rád získal zpětnou vazbu ohledně nápadů ohledně poštovních certifikátů. Pokud se vám nápad líbí, pokusím se najít sílu napsat návrh pro rfc.

Při kopírování velkých částí článku uveďte odkaz na tento článek.
Při překladu do jiného jazyka uveďte odkaz na tento článek.
Pokusím se to sám přeložit do angličtiny a zanechat křížové odkazy.


Zdroj: www.habr.com

Přidat komentář