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::/80Nendes 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 eno1tSelle 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 eno1tSelle 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.X0Selle 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.X2See 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::1Siin 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 $IFACESee 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::/80Mä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 restartFaili „/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 = 1Need on minu serveri „sysctl“ seadistused. Tähistan olulise.
net.ipv4.ip_forward = 1Ilma selleta OpenVPN ei tööta kuidagi.
net.ipv6.ip_nonlocal_bind = 1Igaü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 = 1Ilma 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 -pTäpsemat teavet «table» reeglite kohta:
============= 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 DROPSee 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.keyValmistame 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-CBCValmistame 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}.ovpnLoo esimene OpenVPN klient:
cd ~/openvpn-ca
source vars
./build-key client-name
cd ~/client-configs
./make_config.sh client-nameFail «~/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-CBCSee on vajalik, et määrata iga kliendi jaoks staatiline aadress (mitte kohustuslik, kuid mina kasutan):
# Client config dir
client-config-dir /etc/openvpn/ccdKõ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 eno1Fail «/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 eno1Mõlemad skriptid kasutavad faili «/etc/openvpn/variables»:
# Subnet
prefix=XXXX:XXXX:XXXX:XXXX:2:
# netmask
prefixlen=112Miks 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-CBCSee on maitse küsimus — valisin sellise krüptimise meetodi.
============= Postfix =============
Peamiste pakettide installimine:
apt-get install postfixInstallimisel 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.pcreRäägime selle konfi üksikasjadest.
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.keyHabr-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:1See 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 = ipv4Võ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 = yesNüü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 = 3600Seadistamine, 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.sockSeadistamine, 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.pcreSee 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-spfLülitame sisse SPF kontrolli.
apt-get install postfix-policyd-spf-pythonPaigaldame ü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-domain1Ja 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 .
.
============= Dovecot =============
apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispamMySQL seadistamine, installime paketid ise.
Fail «/etc/dovecot/conf.d/10-auth.conf»
disable_plaintext_auth = yes
auth_mechanisms = plain loginAinult krüpteeritud vormis autoriseerimine.
Fail «/etc/dovecot/conf.d/10-mail.conf»
mail_location = maildir:/var/mail/vhosts/%d/%nSiin 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 spamcPaigaldame paketid.
adduser spamd --disabled-loginLisame kasutaja, kelle nimel tegutseda.
systemctl enable spamassassin.serviceLülitame spamassassini teenuse automaatlaadimise sisse.
Fail «/etc/default/spamassassin»:
CRON=1Lü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 passwordTuleb 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.
.
.
.
.
============= 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:
- Kohustuslik tõeline DKIM allkiri, kohustuslik SPF, kohustuslik rDNS.
- Masinõppe mudel antispämmi teemal + andmebaas, mis asub kliendi poolel.
- 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
