Postfwd kasutamine operatsioonisüsteemiga Debian
Sissejuhatus
Tarkvara postfwd http://postfwd.org/ on Perl keeles programmeeritud SMTP tulemüür, mis on integreeritud Postfixiga policy protokolli abil; st postfwd on policy server. postfwd kasutusalaks on muu hulgas
- sissetulevatele kirjadele sageduspiirangu rakendamine (nt kirju ajaühikus per src ip address, per mail from address)
- src ip address, mail from ja rcpt to address alusel (ja nende kombinatsioonide alusel) kirjade sisenemise kontrollimine
- dns blocklistide ja whitlistide rakendamine
Tööpõhimõte
Postfwd töötab deemon protsessina ja teda juhib seadistusfail. Postfwd on integreeritud Postfixiga kasutades Postfix policy protokolli.
internet | __|__ | | tulemüür | | |_____| | | | ----|--------------|------|-----------|----- | | | __|__ __|__ __|__ | | | | | | | | | | | | |_____| |_____| |_____| frontend postfwd backend postimasin port 10045 postkastid
kus
- tulemüür - nö tavaline tulemüür (nö tcp/ip)
- frontend smtp server, mis sisenevate kirjade kontrollimisel muu hulgas kasutab postfwd abi põhimõtteliselt üle võrgu pöördudes postfwd teenuse poole
- postfwd server pakub postfwd teenust; tema poole pöördumisel kasutatakse nn Postfix policy protokolli, mille käigus edastatakse mitte kogu kiri, aga komplekt smtp päiseid
- backend serverisse jõuavad frontend smtp serveris kontrolli läbinud kirjad
Postfwd vastuseks on muu hulgas sellised variandid
- kirja võib vastu võtta (DUNNO)
- saatjale anda ajutine veateade (nt sageduspiirangu puhul)
- kirja vastuvõtmisest keeldumine (nt spam puhul)
- lisada kirjale smtp päis ja vastu võtta (nt PREPEND abil)
- tavaliselt töötab postwd teenus frontend smtp serveri protsessina
Tarkvara paigaldamine
Tarkvara paigaldamiseks sobib öelda
# apt-get install postfwd
Tulemusena tekib failisüsteemi
- /etc/default/postfwd - postfwd deemoni tööd üldiselt juhtiv seadistusfail (millisel pordi kuulab, kuidas logib jms)
- link /usr/sbin/postfwd -> /etc/alternatives/postfwd -> /usr/sbin/postfwd2
- kasutaja:grupp postfw:postfw
Postfwd deemoni seadistamine
Postfwd käivitamist juhib seadistusfail /etc/default/postfwd, nt sellise sisuga
STARTUP=1 # Config file CONF=/etc/postfix/postfwd.cf # IP where listen to INET=127.0.0.1 # Port where listen to PORT=10045 # run as user postfwd RUNAS="postfw" # Arguments passed on start (--daemon implied) ARGS="--summary=600 --cache=600 --cache-rdomain-only --cache-no-size"
kus
- CONF=/etc/postfix/postfwd.cf - kirjade liikumist kontrollivad reeglid
- ARGS - deemoni tööd kontrollivad suvandid
- võib olla alguses lisada ARGS järele veel ka --verbose
postfwd logib vaikimisi /var/log/mail.* failidesse.
Liidestamine Postfixiga
Postfixiga liidestamiseks sobib kasutada nt smtpd_recipient_restrictions direktiivi, paigutades ta viimasele postitsioonile
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination check_policy_service inet:127.0.0.1:10045
kus
- check_policy_service näitab, et policy kontrolliks tuleb pöörduda aadressil 127.0.0.1 port 10045 töötava postfwd deemoni poole
Postfwd reeglite seadistamine
Reeglid asuvad failis /etc/postfix/postfwd.cf ning reegel koosneb sellistest elementidest
ID ; tingimused ; action
nt
id=RULE-03 ; sender=priit@auul.pri.ee; recipient=priit@kibana.auul.pri.ee; action=REJECT kirja ei saadetud edasi
kus
- id peab olema unikaalne, see kirjutatakse ka logisse ja võimaldab debugimist hõlpsamini
- reegli rakendumiseks peavab kõik tingimused olema täidetud
- action näitab tegevust (REJECT keeldub kirja vastu võtmast, DUNNO ei tee midagi jne, vt http://www.postfix.org/access.5.html)
Reeglites tehtud muudatuste kehtestamiseks sobib öelda
# /etc/init.d/postfwd restart
või õigemini
# systemctl status|stop|start postfwd
Kasulikud lisamaterjalid
- http://postfwd.org/quick.html
- http://postfwd.org/doc.html
- man postfwd, postfwd -m
Tunnustele vastavate kirjade vastuvõtu keelamine
Postfwd tööd kontrollivad reeglid, üldiselt kontrollitakse reegleid järjest ning esimene action näidatud tegevusega lõpetatakse, nt
# cat /etc/postfix/postfwd.cf id=RULE-01 ; sender=mart@auul.pri.ee; action=REJECT kirja ei saadetud edasi id=RULE-02 ; recipient=root@kibana.auul.pri.ee; action=REJECT kirja ei saadetud edasi id=RULE-03 ; sender=priit@auul.pri.ee; recipient=priit@kibana.auul.pri.ee; action=REJECT kirja ei saadetud edasi
Reeglite esitamiseks
# postfwd -f /etc/postfix/postfwd.cf -C Rule 0: id->"RULE-01"; action->"REJECT kirja ei saadetud edasi"; sender->"=;mart@auul.pri.ee" Rule 1: id->"RULE-02"; action->"REJECT kirja ei saadetud edasi"; recipient->"=;root@kibana.auul.pri.ee" Rule 2: id->"RULE-03"; action->"REJECT kirja ei saadetud edasi"; sender->"=;priit@auul.pri.ee"; recipient->"=;priit@kibana.auul.pri.ee"
kus
- mail from aadressiga mart@auul.pri.ee kirjad blokeeritakse
- rcpt to aadressiga root@kibana.auul.pri.ee kirjad blokeeritakse
- mail from priit@auul.pri.ee ja rcpt to priit@kibana.auul.pri.ee kirjad blokeeritakse
- natuke ebaselge on, mis puhul tuleks kasutada = ja mis puhul == operaatorit, ideeliselt peaks olema esimene omistamine ja teine võrdlus, aga katse näitab, et päris nii see nagu pole; reeglina kasutatakse käesolevas tekstis ainult = operaatorit
src ip ja rcpt to alusel läbilubamine + sageduspiirang
src ip ja rcpt to alusel läbilubamine + sageduspiirang rakendamiseks sobib kasutada sellist seadistust
id=EVAL-01 ; action=set(SRC_IP_IK_AUUL_EE=1) &&WL_SRC_IP_IK_AUUL_EE { client_address=file:/etc/postfix/wl-src-ip-ik-auul-ee.txt; }; id=RULE-00 ; &&WL_SRC_IP_IK_AUUL_EE; action=set(SRC_IP_IK_AUUL_EE=0); id=RULE-01 ; SRC_IP_IK_AUUL_EE = 0; recipient=^[0-9]{11}@kibana.auul.pri.ee$ ; action=DUNNO id=RULE-02 ; SRC_IP_IK_AUUL_EE = 1; recipient=^[0-9]{11}@kibana.auul.pri.ee$ ; action=REJECT ip aadressilt $$client_address ei ole lubatud isikukood@kibana.auul.pri.ee aadressile kirju saata id=RULE-03 ; SRC_IP_IK_AUUL_EE = 0; recipient=@kibana.auul.pri.ee$; action=DUNNO id=RULE-04 ; SRC_IP_IK_AUUL_EE = 1; recipient=@kibana.auul.pri.ee$; action=rate(client_address/5/300/450 4.7.1 only 5 recipients per 5 minutes allowed)
ning
# cat /etc/postfix/wl-src-ip-ik-auul-ee.txt 10.0.1.1 10.0.1.2
kus
- id=EVAL-01 - väärtustatakse nn muutuja SRC_IP_IK_AUUL_EE 'false' väärtusega (vaikeväärtus)
- &&WL_SRC_IP_IK_AUUL_EE - kirjeldatakse mitmeelemendiline muutuja (tõsi, antud juhul see väga erilist efekti ei anna)
- id=RULE-00 - kui kliendi aadress on nimekirjas, siis SRC_IP_IK_AUUL_EE väärtustakse 0 ('true')
- id=RULE-01 - kui kliendi aadress on nimekirjas ning rcpt to aadress on kujul isikukood@kibana.auul.pri.ee, siis lubatakse kiri läbi ilma piiranguteta
- id=RULE-02 - kui kliendi aadress ei ole nimekirjas ning rcpt to aadress on kujul isikukood@kibana.auul.pri.ee, siis kirja ei lubata läbi mingitel tingimustel ja kasutajale antakse veateade 5xx
- id=RULE-03 - kui kliendi aadress on nimekirjas ning rcpt to aadress on lõpuga @kibana.auul.pri.ee, siis lubatakse kiri läbi ilma piiranguteta
- id=RULE-04 - kui kliendi aadress ei ole nimekirjas ning rcpt to aadress on lõpuga @kibana.auul.pri.ee, siis rakendatakse sageduspiirangut (5/300/450 - viis kirja 300 sekundi jooksul per ip aadress, mis üle lähevad saavad 450 smtp ajutise veateate)
Testimine
Mitte lubatud ip aadressilt kirja saatmise katse paistab selline
# sendemail -f imre@moraal.ee -t 37003212713@auul.pri.ee -u test_4 -m 'test 4' -s 10.204.62.114:25 -o tls=no Mar 30 01:07:36 haldus sendemail[24788]: WARNING => The recipient <37003212713@auul.pri.ee> was rejected by the mail server, error follows: Mar 30 01:07:36 haldus sendemail[24788]: WARNING => Received: 554 5.7.1 <37003212713@auul.pri.ee>: Recipient address rejected: ip aadressilt 10.146.76.121 ei ole lubatud isikukood@auul.pri.ee aadressile kirju saata
Analoogilised sissekanded tehakse postiserveri logisse.
Otseselt serveri testimiseks sobib öelda
# nc 127.0.0.1 10045 </usr/share/doc/postfwd/request.sample action=DUNNO
kus
# cat /usr/share/doc/postfwd/request.sample ccert_fingerprint= size=64063 helo_name=english-breakfast.cloud9.net reverse_client_name=english-breakfast.cloud9.net queue_id= encryption_cipher= encryption_protocol= etrn_domain= ccert_subject= request=smtpd_access_policy protocol_state=RCPT recipient=someone@domain.local instance=6748.46adf3f8.62156.0 protocol_name=ESMTP encryption_keysize=0 recipient_count=0 ccert_issuer= sender=imre@kibana.auul.pri.ee client_name=english-breakfast.cloud9.net client_address=95.163.127.178
kus
- lõpus on vajalik tühi rida, mille lõpetab reavahetus
# postfwd --dumpcache %rate_cache -> %client_address=10.80.96.209 -> @list -> 'RULE-04+5_300' %rate_cache -> %client_address=10.80.96.209 -> %RULE-04+5_300 -> @action -> '450 4.7.1 only 5 recipients per 5 minutes allowed' %rate_cache -> %client_address=10.80.96.209 -> %RULE-04+5_300 -> @count -> '5' %rate_cache -> %client_address=10.80.96.209 -> %RULE-04+5_300 -> @maxcount -> '5' %rate_cache -> %client_address=10.80.96.209 -> %RULE-04+5_300 -> @rule -> 'RULE-04' %rate_cache -> %client_address=10.80.96.209 -> %RULE-04+5_300 -> @time -> '1461537624.75926' %rate_cache -> %client_address=10.80.96.209 -> %RULE-04+5_300 -> @ttl -> '300' %rate_cache -> %client_address=10.80.96.209 -> %RULE-04+5_300 -> @type -> 'rate' %rate_cache -> %client_address=10.80.96.209 -> %RULE-04+5_300 -> @until -> '1461537924.75926'
# postfwd --dumpstats [STATS] postfwd2::cache 1.35: 6 queries since 0 days, 01:38:02 hours [STATS] Requests: 0.0/min last, 0.0/min overall, 0.0/min top [STATS] Hitrates: 0.0% requests, 0.0% dns, 0.0% rates [STATS] Contents: rate=1 [STATS] postfwd2::policy 1.35: 6 requests since 0 days, 01:38:02 hours [STATS] Requests: 3.61/min last, 0.06/min overall, 3.61/min top [STATS] Dnsstats: 0.00/min last, 0.00/min overall, 0.00/min top [STATS] Hitrates: 0.0% ruleset, 0.0% parent, 0.0% child, 16.7% rates [STATS] Timeouts: 0.0% (0 of 0 dns queries) [STATS] 6 matches for id: EVAL-01 [STATS] 6 matches for id: RULE-04
Kasulikud lisamaterjalid
- PCRE avaldiste testimine - https://www.debuggex.com/
- http://blog.erben.sk/2011/08/19/fighting-againts-spam-postfwd/