Postfix, Postscreen ja before-queue kontrollide kasutamine

Allikas: Imre kasutab arvutit
Redaktsioon seisuga 1. juuni 2025, kell 13:20 kasutajalt Imre (arutelu | kaastöö) (→‎2025 kevad tähelepanekud)
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

Postfix, Postscreen ja before-queue kontrollide kasutamisele on iseloomulik, et enne kui internetist saabunud kirja osas võtab vastutuse postimasin, toimuvad nö igasugused kontrollid sh viiruste ja spämmi osas. See peaks oluliselt vähendama võimalusi, et mõni kiri nö kaob karantiini, kusutatakse vaikselt kuna sisaldas viiruse tunnuseid vms kohta. Kirja saatja saab kohe teate ja küllap ise otsib võimalusi kirja uuesti saata. Võimalikud probleemid võivad tekkida sellest, et kirjade saatmisel eeldatakse teatud ajaaknasse mahtumist, aga teisipidi need täiendavad kontrollid nõuavad lisaks aega. St edukaks töötamiseks võib nõuda antud süsteem rohkem ressurssi, samas postscreen jms esmaselt toimuvad testid blokeerivad üsna varases staadiumis märkimisväärselt pahalaste pöördumisi.

Lisaks on püütud jälgida seda, et epostiga tegelemise logi oleks analüüsisõbralikum. Käesolev tekst eeldab Postfix v. 2.11 kasutamist kuigi teatud mööndustega saab kasutada ka varasemaid versioone.

Mõisted

  • client hostname - tundub, et see on pöörduja ip aadressile vastava ptr kirje väärtus juhul kui viimane lahendub tagasi pöörduja ip aadressiks
  • unverified reverse client hostname - tundub, et see on pöörduja ip aadressile vastava ptr kirje väärtus

Tööpõhimõte

Postix, Postscreen ja before-queue kontrollide süsteemi kasutamist kirjeldab üldiselt selline skeem

                       ____                        ____
                      |    | zen.spamhaus.net     |    | dbl.spamhaus.org
                      |____|                      |____|

    ____                     ____                            ____
   |    | smtp klient       |    | frontend smtp server     |    | backend postfix + dovecot postkastid
   |____| 10.204.62.116     |____| 192.168.7.80             |____| 192.168.7.143

kus

  • 10.204.62.116 - smtp klient (ka server)
  • 192.168.7.80 - frontend smtp server
  • 192.168.7.143 - backend postfix + dovecot postkastid
  • zen.spamhaus.net poole esitatakse reversed ip aadresside kujul dns päring
  • dbl.spamhaus.org poole esitatakse rhsbl päring (mail from aadressis kasutatud domeeninimi + dbl.spamhaus.org, nt moraal.ee.dbl.spamhaus.org)

Kontrollid toimuvad enne kirja nn sabasse võtmist, sellises järjekorras

  • postscreen (muu hulgas dnsbl, greylisting)
  • postfix-policyd-spf-python - smtpd_recipient_restrictions -> check_policy_service unix:private/policyd-spf abil
  • postfwd - smtpd_recipient_restrictions -> check_policy_service inet:127.0.0.1:10045 abil
  • clamav-milter - lisaks nö traditsioonilistele viiruste nimekirjadele kasutatakse ka http://c4s.pikker.ee/ nimekirju
  • spamass-milter - ilma bayes tehnikata

Süsteemist läbi mineva kirjaga kaasneb selline logi

Jan  4 23:21:55 http-dns-7-80 postfix/postscreen[32612]: CONNECT from [10.204.62.116]:51893 to [192.168.7.80]:25
Jan  4 23:21:55 http-dns-7-80 postfix/dnsblog[32614]: addr 10.204.62.116 listed by domain zen.spamhaus.net as 127.0.5.1

Postscreen viivitus mõni sekund

Jan  4 23:22:00 http-dns-7-80 postfix/postscreen[32612]: NOQUEUE: reject: RCPT from [10.204.62.116]:51893: \
  450 4.3.2 Service currently unavailable; from=<priit@imool.org>, to=<imre@auul.pri.ee>, proto=ESMTP, helo=<mail.imool.org>
Jan  4 23:22:00 http-dns-7-80 postfix/postscreen[32612]: PASS NEW [10.204.62.116]:51893
Jan  4 23:22:00 http-dns-7-80 postfix/postscreen[32612]: DISCONNECT [10.204.62.116]:51893

Postscreen katkestab ühenduse kuna kasutatakse nn 'deep protocol tests' kontrolle

Jan  4 23:22:22 http-dns-7-80 postfix/postscreen[32612]: CONNECT from [10.204.62.116]:55369 to [192.168.7.80]:25
Jan  4 23:22:22 http-dns-7-80 postfix/postscreen[32612]: PASS OLD [10.204.62.116]:55369

Jan  4 23:22:22 http-dns-7-80 postfix/smtpd[32618]: connect from mail.imool.org[10.204.62.116]

Jan  4 23:22:22 http-dns-7-80 policyd-spf[32623]: None; identity=helo; client-ip=10.204.62.116; helo=mail.imool.org; \
  envelope-from=priit@imool.org; receiver=imre@auul.pri.ee
Jan  4 23:22:22 http-dns-7-80 policyd-spf[32623]: Softfail; identity=mailfrom; client-ip=10.204.62.116; helo=mail.imool.org; \
  envelope-from=priit@imool.org; receiver=imre@auul.pri.ee

Jan  4 23:22:22 http-dns-7-80 postfix/smtpd[32618]: 806EF41847: client=mail.auul.pri.ee[10.204.62.116]
Jan  4 23:22:22 http-dns-7-80 postfix/cleanup[32624]: 806EF41847: message-id=<56262.9227965488-sendEmail@moraal>

Jan  4 23:22:22 http-dns-7-80 clamav-milter[27596]: Clean message from <priit@imool.org> to <imre@auul.pri.ee>

Jan  4 23:22:22 http-dns-7-80 spamd[25832]: spamd: connection from localhost [127.0.0.1]:54275 to port 783, fd 6
Jan  4 23:22:22 http-dns-7-80 spamd[25832]: spamd: processing message <56262.9227965488-sendEmail@moraal> for spamass-milter:1002
Jan  4 23:22:22 http-dns-7-80 spamd[25832]: spamd: clean message (2.0/5.0) for spamass-milter:1002 in 0.0 seconds, 1896 bytes.
Jan  4 23:22:22 http-dns-7-80 spamd[25832]: spamd: result: . 2 - SPF_SOFTFAIL scantime=0.0,size=1896,\
  user=spamass-milter,uid=1002,required_score=5.0,rhost=localhost,raddr=127.0.0.1,\
  rport=54275,mid=<56262.9227965488-sendEmail@moraal>,autolearn=no autolearn_force=no

Jan  4 23:22:22 http-dns-7-80 postfix/qmgr[32598]: 806EF41847: from=<priit@imool.org>, size=1770, nrcpt=1 (queue active)
Jan  4 23:22:22 http-dns-7-80 postfix/smtpd[32618]: disconnect from mail.imool.org[10.204.62.116]
Jan  4 23:22:22 http-dns-7-80 spamd[25831]: prefork: child states: II
Jan  4 23:22:22 http-dns-7-80 postfix/smtp[32627]: 806EF41847: to=<imre@auul.pri.ee>, relay=192.168.7.143[192.168.7.143]:25, \
  delay=0.5, delays=0.36/0.01/0/0.13, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B2C0840223)
Jan  4 23:22:22 http-dns-7-80 postfix/qmgr[32598]: 806EF41847: removed

kus

  • kell 23:21:55 pöördub klient ja kuigi tema ip on kirjas spamhaus andmebaasis ei ole skoor piisav, et selle alusel blokeeritakse
  • seejärel toimub esimene Postscreen põhjustatud viivitus, näidatakse kaherealist bannerit kliendile (nb! esimesel real on 220- ja teisel 220 tühik)
# tcpflow -c -i eth0 port 25
tcpflow[1016]: listening on eth0

192.168.007.080.00025-190.204.062.116.59799: 220-mail.auul.pri.ee ESMTP Postfix (Debian/GNU)
viivitus

192.168.007.080.00025-190.204.062.116.59799: 220 mail.auul.pri.ee ESMTP Postfix (Debian/GNU)
  • kell 23:22:00 algavad deep protocol testid ja seejärel ühendus lõpetatakse (greylistingu moodi tegevus)
10.204.062.116.59799-192.168.007.080.00025: MAIL FROM:<priit@imool.org> SIZE=1348 BODY=7BIT
192.168.007.080.00025-10.204.062.116.59799: 250 2.1.0 Ok
10.204.062.116.59799-192.168.007.080.00025: RCPT TO:<imre@auul.pri.ee> ORCPT=rfc822;imre@auul.pri.ee
192.168.007.080.00025-10.204.062.116.59799: 450 4.3.2 Service currently unavailable
10.204.062.116.59799-192.168.007.080.00025: RSET
192.168.007.080.00025-10.204.062.116.59799: 250 2.0.0 Ok
10.204.062.116.59799-192.168.007.080.00025: QUIT
192.168.007.080.00025-10.204.062.116.59799: 221 2.0.0 Bye
  • kell 23:22:22 pöördub klient uuesti, nüüd ta enam ei takerdu nn greylistinguss (PASS OLD)
  • esimesena rakendatakse postfix-policyd-spf-python kontrolli smtpd_recipient_restrictions -> check_policy_service abil
  • seejärel viiruste kontrolli, clamav-milter abil
  • ja lõpuks spammikontrolli spamass-milter abil (logis on mitte spamass-milteri logi vaid tema poolt välja kutsutud spamd st spamassassini logi)
  • antud juhul miski ei takistanud kirja liikumist ja kiri saadetakse edasi backend dovecot arvutile, 192.168.7.143
  • sellist logi on äärmiselt hea lugeda kuna postfix ei saada nö ise enda sees kirju ringi, ainult üks message id väärtus 806EF41847 on kasutusel
  • piirangute kirjeldamise direktiivide (nt smtpd_recipient_restrictions) loetelu töötab selliselt, et esimene, mis kirjaga klapib rakendatakse (Restrictions are applied in the order as specified; the first restriction that matches wins.)

DNS

Postimasina ip aadressiga seoses peab olemas üks ja ainult üks PTR kirje, mis nö selle ip aadressi samaks nimeks lahendab. Ja see sedasi saadud nimi peab lahenema samaks postimasina ip aadressiks

$ dig +short -x 10.198.206.1
mx1.imool.org
$ dig +short 1.206.198.10.in-addr.arpa.
$ dig +short mx1.imool.org
10.198.206.1

Kui ip aadressil on mitu PTR kirjet ja nad lahenduvad erinevateks nimedeks, ja ainult üks vastab samale ip aadressile, siis see ei ole piisvalt hea.

Lisaks peab postimasin

  • välja pöördudes ütlema sama nimega helo
EHLO mx1.imool.org
  • väljast pöördujat teenindades tervitama teda sama nimega
220 mx1.imool.org ESMTP Postfix (Debian/GNU)

Postfix

Debian v. 8 Jessie

Postfix v. 2.11 tarkvara paigaldamiseks Debian v. 8 Jessie keskkonnas sobib öelda

# apt-get install postfix postfix-ldap procmail

Debian v. 7 Wheezy

Debian v. 7 Wheeze keskkonnas saab Postfix v. 2.11 paigaldada backports repositooriumist lisades /etc/apt/sources.list faili

deb http://ftp.ee.debian.org/debian/ wheezy-backports main contrib non-free
deb-src http://ftp.ee.debian.org/debian/ wheezy-backports main contrib non-free

Ning seejärel saab kasutada Backportsidest pakette öeldes

# apt-get -t wheezy-backports install postfix postfix-ldap

Ligipääsupiirangud

Postfix abil saab piirata otsekoheselt kahel alusel

  • ip from
  • mail from

Isegi kui süsteemi seadistamise ajal ei ole need vajalikud, nad ikkagi seadistada mingite dummy andmetega, et vajadusel saaks neid kiiresti rakendada.

ip from aadressi põhised

CIDR vahemike blokeermiseks sobib kaustada sellist lookup table't

# cat /etc/postfix/smtpd_client_restrictions_ip_access
10.255.141.0/24 WARN 20160111_priit_kask_reported_spammijad
10.63.104.0/22 WARN 20160111_priit_kask_reported_spammijad

hash andmebaasi moodustamiseks tuleb öelda

# postmap /etc/postfix/smtpd_client_restrictions_ip_access

ning Postfix main.cf seadisusfailis nt

smtpd_client_restrictions = warn_if_reject reject_unknown_client_hostname
  check_client_access cidr:/etc/postfix/smtpd_client_restrictions_ip_access

mail from aadressi põhised

Ümbriku mail from aadressi alusel piiramiseks sobib kasutada sellist lookup table't (nb! ümbriku mail from aadress on hõlpsasti võltsitav, aga võib sellegi poolest olla efektiivne meede)

# cat /etc/postfix/smtpd_recipient_restrictions_mail_from_access
priit@imool.org REJECT

hash andmebaasi moodustamiseks tuleb öelda

# postmap /etc/postfix/smtpd_recipient_restrictions_mail_from_access

ning Postfix main.cf seadisusfailis nt

smtpd_recipient_restrictions = ... 
  check_sender_access hash:/etc/postfix/smtpd_recipient_restrictions_mail_from_access

Misc

Vaikimisi teeb Postfix internetist sisse tuleva ühendusega seoses kaks dns päringut

23:34:45.363276 IP 192.168.1.250.43650 > 10.192.0.53.53: 30547+ PTR? 1.206.198.10.in-addr.arpa. (43)
23:34:45.468384 IP 10.192.0.53.53 > 192.168.1.250.43650: 30547 1/2/0 PTR mx1.imool.org. (110)
23:34:45.468826 IP 192.168.1.250.44838 > 10.192.0.53.53: 22332+ A? mx1.imool.org. (33)
23:34:45.469374 IP 10.192.0.53.53 > 192.168.1.250.44838: 22332 1/2/1 A 10.198.206.1 (97)

kus

  • pöörduja ip aadressi peale revers nimelahendus
  • saadud vastusele päripidi nimelahendus

Kui need ei klapi, siis logitakse midagi sellist

Jan  8 22:35:01 post-relay postfix/smtpd[6842]: warning: hostname mx2.imool.org does not resolve \
  to address 10.198.206.158: Name or service not known

Postfixi seadistustes kasutatud smtpd_*_restriction parameetritest sõltub, kui otsustavalt selle omandatud teadmisega edasi töötatakse. Nt keeldutakse sellistelt saatjatelt kirju vastu võtmast

smtpd_client_restrictions = reject_unknown_client_hostname

Postfix reject_* direktiivide ette sobib kirjutada warn_if_reject, sel juhul reject ei toimu, aga logitakse võimalikud toimumised, nt

smtpd_helo_restrictions = warn_if_reject reject_unknown_helo_hostname

Postscreen

Postscreen on Postfix komponent, eraldi paigaldada ei ole midagi tarvis, ainult seadistada.

  • greylisting - postscreen greylisting erineb nö tavalisest greylistingust (nt OpenBSD spamd) selle poolest, et hõlpsasti saab rakendada dns põhiseid whitelist'isid mille kasutamist kontrollib muu hulgas parameeter postscreen_dnsbl_whitelist_threshold.

NB! Tänu ajutiste vigade andmise jms viguritele ei pruugi olla selline teenus sobiv lõppkasutajale eposti releetamise jaoks (nn MUA programmidele nagu Icedove, Outlook jt).

Tööpõhimõte

MX policy test kasutamisel pannakse nö söödaks üles 2nd MX postimasina aadress, mille poole pöördumisi teenindab tegelikult sama Postfix protsess, mis teenindab 1st MX poole pöördumisi. Kui pahalane pöördub ainult 2nd MX aadressi poole, siis teada kunagi ei whitelistita; ja teada on, et mõned spammarid arvavad, et on kavalad ja töötavad 2nd MX'iga (kuna see saadab ise kirjad edasi 1st MX'ile). Tõsi, kui spämmar pöördub ka 1st MX poole ja tal õnnestub ennast lasta whitelistida, siis edasi saab ta kasutada teenust mõlema kanali kaudu. 2nd MX käest saab pöörduja ajutise veateate

Feb 26 23:19:03 www-2 sendemail[5953]: WARNING => The recipient <priit@moraal.ee> was rejected by the mail server, error follows:
Feb 26 23:19:03 www-2 sendemail[5953]: WARNING => Received:     450 4.3.2 Service currently unavailable
Feb 26 23:19:03 www-2 sendemail[5953]: ERROR => Exiting. No recipients were accepted for delivery by the mail server.

Seadistamine

Seoses Postscreen kasutamisega on /etc/postfix/master.cf failis tehtud sellised muudatused

# diff /var/tmp/etc-20150101-postfix/master.cf /etc/postfix/master.cf 
11,15c11,15
< smtp       inet  n       -       -       -       -       smtpd
< #smtp      inet  n       -       -       -       1       postscreen
< #smtpd     pass  -       -       -       -       -       smtpd
< #dnsblog   unix  -       -       -       -       0       dnsblog
< #tlsproxy  unix  -       -       -       -       0       tlsproxy
---
> # smtp     inet  n       -       -       -       -       smtpd
> smtp       inet  n       -       -       -       1       postscreen
> smtpd      pass  -       -       -       -       -       smtpd
> dnsblog    unix  -       -       -       -       0       dnsblog
> tlsproxy   unix  -       -       -       -       0       tlsproxy

kus

  • smtp inet teenus, st port 25/tcp peal tegeleb klientidega mitte nö tavaline smtpd protsess aga postscreen

ning /etc/postfix/main.cf failis kasutusel sellised direktiivid

# POSTSCREEN ALGUS

# testid enne before 220 teste
# permanent white/blacklist (postscreen_blacklist_action ytleb kui otsustavalt kaituda)
postscreen_access_list = permit_mynetworks
  cidr:/etc/postfix/postscreen_access.cidr

postscreen_blacklist_action = enforce

# mx policy test
postscreen_whitelist_interfaces = !192.168.7.81 static:all

# tests before 220 greeting
postscreen_greet_banner = "PGB at RT"
postscreen_greet_action = enforce

# dnsbl testid
postscreen_dnsbl_sites = zen.spamhaus.org*3
  list.dnswl.org=127.[0..255].[0..255].0*-2
  list.dnswl.org=127.[0..255].[0..255].1*-3
  list.dnswl.org=127.[0..255].[0..255].[2..255]*-4

postscreen_dnsbl_threshold = 3
postscreen_dnsbl_whitelist_threshold = -2

# mida teha vastavalt permanent blacklist, pregreet ja dnsbl tabamuste puhul
postscreen_dnsbl_action = enforce

# test after 220 greeting i.e. deep protocol test
postscreen_pipelining_enable = yes
postscreen_pipelining_action = enforce  

postscreen_non_smtp_command_enable = yes
postscreen_non_smtp_command_action = drop

postscreen_bare_newline_enable = yes
postscreen_bare_newline_action = enforce  

# POSTSCREEN LOPP

kus

  • TODO

/etc/postfix/postscreen_access.cidr faili sisu on nt selline

# cat /etc/postfix/postscreen_access.cidr 
192.168.10.0/24 permit

Näiteks, mingi komplekti nn Eesti ip aadresse saab aadressilt ftp://ftp.ripe.net/ripe/stats/delegated-ripencc-latest.

Kasutamine

Millegipärast kirjutatakse mail.log logisse episoodiliselt sellist teadet, aga väidetavalt ei pea selle pärast muretsema

Jan 11 06:26:52 post-relay postfix/postscreen[15938]: close database \
  /var/lib/postfix/postscreen_cache.db: No such file or directory (possible Berkeley DB bug)

postscreen_cache.db sisu esitamiseks sobib öelda nt

# db_dump -d a /var/lib/postfix/postscreen_cache.db
In-memory DB structure:
btree: 0x110000 (open called, read-only)
bt_meta: 0 bt_root: 1
bt_minkey: 2
bt_compare: 0x7fbabdb42ea0 bt_prefix: 0x7fbabdb43080
bt_compress: 0 bt_decompress: 0
bt_lpgno: 0
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
page 0: btree metadata: LSN [0][1]: level 0
        magic: 0x53162
        version: 9
        pagesize: 4096
..
        root: 1
page 1: btree internal: LSN [0][1]: level 2 records: 0
        entries:    4 offset: 4020
        [000] 4084 pgno:    2 type: 1 len:   0
        [001] 4036 pgno:    4 type: 1 len:   5 data: 207.8
        [002] 4056 pgno:    3 type: 1 len:  15 data: 213.129.163.50\0
        [003] 4020 pgno:    5 type: 1 len:   1 data: 37
page 2: btree leaf: LSN [0][1]: level 1
        prev:    0 next:    4 entries:   64 offset: 1564
        [000] 4080 len:  13 data: 109.74.0.211\0
        [001] 4020 len:  55 data: 1420809183;1420809183;1420809183;1420809183;1420809183\0
        [002] 4000 len:  15 data: 113.105.168.20\0
        [003] 3940 len:  55 data: 1420816370;1420733570;1423321971;1423321971;1423321971\0
        [004] 3920 len:  16 data: 136.173.162.208\0
...

Kasulikud lisamaterjalid

DNS blocklistid

DNSBL

DNSBL (DNS Blacklist) töö põhineb asjaolul, et smtp ühenduse alguses on teada, milliselt ip aadressilt pöördutakse. Kui see ip aadress on seotud tuntud pahalasega vms, siis kiri blokeeritakse. Nende ip aadresside pahasust kontrollitakse reaalajas üle DNS'i, mitmed teenusepakkujad pakuvad sellist teenust. Üks on Spamhaus zen.spamhaus.org. Kasutamine toimub postscreen seest nii nagu allpool kirjeldatakse.

DNSBL päringus kasutatakse reversed ip aadressi + teenusepakkuja teenuse domeeninime, nt

1.2.3.4.zen.spamhaus.org

Vastuseks on NXDOMAIN (non existent domainname) või 127.x.x.x ip aadress.

RHSBL

RHSBL ehk Right Hand Side Block List töö põhineb asjaolul, et smtp ühenduse alguses ütleb klient kirja 'mail from' ehk ümbriku from aadressi. Kui selles aadressis kasutatud domeeninime osa on seotud tuntud pahalasega vms, siis kiri blokeeritakse. Nende domeeninimede pahasust kontrollitakse reaalajas üle DNS'i, mitmed teenusepakkujad pakuvad sellist teenust. Üks on Spamhaus DBL (Domain Blocklist). Kasutamiseks sobib kasutada nt sellist rida

smtpd_sender_restrictions = reject_unknown_sender_domain, reject_rhsbl_sender dbl.spamhaus.org

DNSBL päringus kasutatakse mail from domeeninime osa + teenusepakkuja teenuse domeeninime, nt

moraal.ee.zen.spamhaus.org

Vastuseks on NXDOMAIN (non existent domainname) või 127.x.x.x ip aadress.

DNSWL

DNSWL (DNS Whitelist) töö põhineb asjaolul, et smtp ühenduse alguses on teada, milliselt ip aadressilt pöördutakse. Kui see ip aadress on seotud tuntud korraliku kaustajaga, siis kiri lubatakse läbi. Nende ip aadresside korralikkust kontrollitakse reaalajas üle DNS'i, mitmed teenusepakkujad pakuvad sellist teenust. Üks on Spamhaus zen.spamhaus.org. Kasutamine toimub postscreen seest nii nagu allpool kirjeldatakse.

SPF kontroll

SPF ise ei blokeeri kõiki kirju, mida ta blokeerida saaks, osalt kasutatakse SPF poolt lisatud päiseid Spamassassini poolt.

Paigaldamine

Tarkvara paigaldamiseks sobib öelda

# apt-get install postfix-policyd-spf-python

Paigaldamise käigus

  • tekitatakse kasutaja:grupp policyd-spf:policyd-spf
  • seadistusfail /etc/postfix-policyd-spf-python/policyd-spf.conf

Seadistamine

postfix-policyd-spf-python tööd juhib seadistusfail

# cat /etc/postfix-policyd-spf-python/policyd-spf.conf 
#  For a fully commented sample config file see policyd-spf.conf.commented

debugLevel = 1 
defaultSeedOnly = 0
 
HELO_reject = SPF_Not_Pass
Mail_From_reject = Fail

PermError_reject = False
TempError_Defer = False

skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0//104,::1//128

kus

  • TODO

Kasutamiseks tuleb /etc/postfix/main.cf faili lisada rida smtpd_receipient_restrictions juurde vastav rida

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
 check_policy_service unix:private/policyd-spf

ning /etc/postfix/master.cf faili lisada read (nb! python v. 3 Jessie kasutamisel; kui järgmine rida algab whitespace'iga, siis käsitletakse seda eelmise rea jätkumisena)

policyd-spf  unix  -       n       n       -       0       spawn
 user=nobody argv=/usr/bin/python /usr/bin/policyd-spf
   /etc/postfix-policyd-spf-python/policyd-spf.conf

Kasutamine

postfix-policyd-spf-python programmiga seoses mingit deemon protsessi vms ei käi.

Kasulikud lisamaterjalid

Header checks

Postfix võimaldab kontrollida regulaaravaldiste abil kirja erinevaid headereid ja kirja sisu.

mime_header_checks

mime_header_checks kasutamiseks peab /etc/postfix/main.cf failis sisalduma rida

mime_header_checks = regexp:/etc/postfix/mime_header_checks.regexp

ja mime header checks seadistusfailis võiks kasutada midagi sellist

# cat /etc/postfix/mime_header_checks.regexp
/filename=\"?(.*)\.(bat|chm|cmd|com|do|exe|hta|jse|rm|scr|pif|vbe|vbs|vxd|xl)\"?$/
  REJECT For security reasons we reject attachments of this type
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+\.(lnk|asd|hlp|ocx|reg|bat|c[ho]m|cmd|exe|dll|vxd|pif|scr|hta|jse?|sh[mbs]|vb[esx]|ws[fh]|wav|mov|wmf|xl))"?\s*$/
  REJECT Attachment type not allowed. File "$2" has the unacceptable extension "$3"

Kus

  • \"? - kaldkriips iskeibid " märgi ja ? ütleb, et temast vasakul olev sümbol või esineda või puududa
  • (.*) - suvaline sümbol või esineda suvaline arv kordi, sulud võimaldavad edaspidi $N abil viidata
  • (bat|cdm..) - püstkriips väljendab, et võib esineda üks mitmete hulgast
  • \. - iskeibitud punkt tähistab punkti esinemist nö literally
  • $ - tähistab rea lõppu
  • $2 - tähistab teisel positsioonil esinenud sulgude sisu

Mõnelpool soovitatakse nt sellist regulaararvaldist

/name=[^>]*\.(bat|com|exe|dll|vbs)/ REJECT

kus

  • [^>]* - caret (^) märk kasutamine kantsulgudes tähistab eitust, tundub, et antud juhul soovitakse väljendada, et praktiliselt suvaline sümbol (kõik v.a. > märk) võib esineda 0 või enam kordi

Testimine

Käsurealt kontrollimiseks

# postmap -q 'filename=tere.exe' regexp:/etc/postfix/mime_header_checks.regexp 
REJECT For security reasons we reject attachments of this type

Kirjaga (.exe faili sisu ei ole oluline)

# sendemail -a /tmp/tere.exe -f imre@auul.pri.ee -t imre@imool.org -u 'test kiri' -m 'sisu' -o tls=no
Dec 27 17:48:34 www-2 sendemail[30765]: ERROR => Received:      550 5.7.1 Attachment type not allowed. File "tere.exe" has the unacceptable extension "exe"

Kasulikud lisamaterjalid

ClamAV

ClamAV töötab tasuta internetis jagatava viiruste andmebaasiga kusjuures lisaks kasutatakse ka C4S aadressil http://c4s.pikker.ee/ olevaid reegleid.

Paigaldamine

Tarkvara paigaldamiseks sobib öelda

# apt-get install clamav-daemon
# apt-get install clamav-freshclam

Seadistamine

clamav-daemon tööd juhib seadistusfail /etc/clamav/clamd.conf

TODO

clamav-freshclam tööd juhib seadistusfail /etc/clamav/freshclam.conf, sobib default ja kus saab vajadusel näidata http proxy asukoha

HTTPProxyServer 192.168.9.39
HTTPProxyPort 3128

C4S reeglite kasutamine

2016 aasta suvel leivitatakse aadressil http://c4s.pikker.ee/

  • reeglite komplekti 3RDP (http://c4s.pikker.ee/3rdp.database.list.txt) - partnerite poolt tehtud analüüsi põhjal koostatud ja C4S projekti poolt vahendatud andmestik
  • reeglite kompleti C4S (http://c4s.pikker.ee/c4s.database.list.txt) - C4S projekti tehtud analüüsi põhjal koostatud andmestik
  • C4S update versiooni 3.15 (versioonide erinevused seisnevad nt clamd reload tegemises, logimise võimalustes, pixz vs xz kasutamises jms)

C4S http://c4s.pikker.ee/ reeglite kasutamiseks tuleb paigaldada kolm utiliiti

  • curl - kopeerib reeglite nimekirjad
  • gpg - kontrollib signatuurid
  • pixz - paralleelet tööd tegev pakkimise tarkvara

Paigaldamiseks sobub Debian v. 8 Jessie keskkonnas öelda

# apt-get install curl gnupg pixz

Debian v. 7 Wheezy keskkonnas tuleb pixz kompileerida või kasutada pixz asemel tavalist versiooni

# apt-get install xz-utils

Tööd teeb üks shell skript http://c4s.pikker.ee/c4s.updater.sh, mille alguses on kasutamisõpetus. Skript sobib paigutada kataloogi

# mkdir -p /opt/c4s/bin
# cd /opt/c4s/bin
# wget http://c4s.pikker.ee/c4s.updater.sh

Seejärel üle vaadata selliste muutujate väärtused, nt kasutada selliseid

# cat /etc/C4S.cfg 
# kommenteerida valja http proxy kasutamiseks
# export http_proxy="http://192.168.1.241:3128"

CLAMAV_USER=`grep User /etc/clamav/clamd.conf  | cut -d " " -f2`
DOWNLOAD_DIR=`grep DatabaseDirectory /etc/clamav/clamd.conf  | cut -d " " -f2`
C4S_DB_IGNORE_LIST="c4s.0days|c4s.adult.0days|c4s.junk.0days"
MY_3RDP_DB_IGNORE_LIST="3rdp.doppelstern|3rdp.something.else"
 
C4S_CLIENT_OUTPUT="LOG"
C4S_XZ_TOOL=pixz
C4S_CLIENT_AUTOUPDATE="OFF"

kus

  • C4S ja 3RDP ignore listid
  • kuhu logitakse, TTY või LOG
  • kas C4S uuendamise skripti uuendatakse võimalusel automaatselt

Lisada root kasutaja võtmehoidjasse teenusega soetud gpg võti

# gpg --keyserver keyserver.ubuntu.com --recv-keys DAD341E9
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: requesting key DAD341E9 from hkp server keyserver.ubuntu.com
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key DAD341E9: public key "Heiki Pikker <heiki.pikker@pikker.ee>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Kui serverist on suvaline internetti pääsemine piiratud, siis saab võtme paigaldada ajutise ssh tunneli kaudu

tookohaarvuti-kust-saab-piiramatult-internetti$ ssh imre@10.249.6.186 -R 11371:keyserver.ubuntu.com:11371
server# gpg --keyserver 127.0.0.1 --recv-keys DAD341E9

Käivitada esmakordselt

# chmod 0755 /opt/c4s/bin/c4s.updater.sh
# /opt/c4s/bin/c4s.updater.sh

Skripti töö tulemusena tekib olemasolevasse kataloogi /var/lib/clamav juurde hulka selliseid faile, uute signatuuride kasutuselevõtmine toimub automaatselt

/var/lib/clamav/c4s*

C4S logisse kirjutatakse midagi sellist

###############################################################
# C4S Updater 3.15 started at: Sun Jul 17 13:40:23 EEST 2016
###############################################################

Signature for c4s.malware.email.autogen.ndb database is missing
No updates for c4s.adult.bin.hdb
No updates for c4s.adult.dom.ndb
..
Summary: Some databases where updated at. Reloading clamd at: Sun Jul 17 13:43:16 EEST 2016

ClamAV logisse kirjutatakse midagi sellist

# tail -f /var/log/clamav/clamav.log
..
Thu Jan  8 13:48:20 2015 -> Reading databases from /var/lib/clamav
Thu Jan  8 13:50:01 2015 -> Database correctly reloaded (4406737 signatures)

Selleks, et C4S nimekiri uueneks edaspidi automaatselt, sobib kasutada nt sellist cron tööd

# cat /etc/cron.daily/c4s-updater
#!/bin/sh
/opt/c4s/bin/c4s.updater.sh 1>>/var/log/c4s.updater.log 2>&1
# /etc/init.d/clamav-daemon reload-daemon 1>/dev/null 2>&1
# chmod 0755 /etc/cron.daily/c4s-updater

Mustrite haldamiseks sobib öelda nt

# sigtool --find-sigs C4S.STOCK.DOM.45 | sigtool --decode-sigs
VIRUS NAME: C4S.STOCK.DOM.45
FUNCTIONALITY LEVEL: >=48
TARGET TYPE: MAIL
OFFSET: *
DECODED SIGNATURE:
{BOUNDARY_LEFT}imool.orgCHAR_ALTERNATIVE:'|"| |/|=|_|
|?|&|>}

Whitelist jaoks, nt tutvuda olemasolevatega ning moodustada nende eeskujul juurde (muudatus kehtestub automaatselt 'natukese aja pärast' või peale clamd deemoni restarti)

# find /var/lib/clamav/ -name \*ign2
/var/lib/clamav/3rdp.sanesecuritywhitelist.ign2
/var/lib/clamav/c4s.whitelists.ign2

Nt Eicar läbilubamiseks sobib selline nimekiri, millegipärast tunneb ClamAV teda kolme erineva nimega ja nad kõik on vaja lubada

# cat /var/lib/clamav/imre.whitelists.ign2 
Eicar-Test-Signature
Clamav.Test.File-7
Win.Test.EICAR_NDB-1

Üldiselt, probleeme tekitava nime loetakse ClamAV logist, antud juhul 'C4S.MALWARE.URL.AUTOGEN.8170799', UNOFFICIAL lisatakse whitelist kasutamisel automaatselt

May 18 16:22:38 post-relay clamav-milter[28658]: Message 5A47E6368F from <trac@arendus.moraal.ee> to <trac@auul.pri.ee> \
  with subject 'Minu kiri' message-id '<062.b420a68e87a7f62a01d87bf10783da68@arendus.tarkvaralabor.ee>' date \
 'Wed, 18 May 2016 13:22:38 -0000' infected by C4S.MALWARE.URL.AUTOGEN.8170799.UNOFFICIAL

Märkused

  • Kui updater skript ei moodusta puhtasse kataloogi sisu ära, sel juhul tuleb kopeerid alla mingi varaseme versiooni seis ning käivitada uuem updater

C4S sissekande nimi

C4S.MALWARE.DOM.AUTOGEN.43349

kus

  • toode - C4S
  • tüüp - malware
  • dom - domeenid
  • autogen - genereeritud s.t. üle küll kiirelt vaadatud aga pole käsitsi kirjutatud reeglid
  • id - mille järgi baasist leida

Probleemid

Tundub, et kui ClamAV loeb andmebaasi sisse, siis sel ajal on süsteemis suur koormus ning praktiliselt SMTP teenuste ei pakuta, logisse tekivad veateated

..
Jul 14 12:45:07 post-relay clamav-milter[16919]: Timed out while reading clamd reply
Jul 14 12:45:07 post-relay clamav-milter[16919]: No reply from clamd
...

ning strace abil clamd protssessi jälgides paistab midagi sellist

# strace -p 21758 
Process 21758 attached
read(636, "3742e65752f6d61646f6e6e612d66617"..., 4096) = 4096
read(636, "3686d617262726561645f31302e61737"..., 4096) = 4096
read(636, "MALWARE.URL.AUTOGEN.6177736:4:*:"..., 4096) = 4096
read(636, "*:(B)7777772e70617472656e612e636"..., 4096) = 4096
read(636, "2e363231353638343538393139:48\nC4"..., 4096) = 4096
read(636, "682d737461727475702d746861742d61"..., 4096) = 4096
read(636, "772e706179732d70657269676f72642d"..., 4096) = 4096
read(636, "6f6e696e732e636f6d2f666565642f3f"..., 4096) = 4096
read(636, "0:4:*:(B)7777772e7062636f6e66657"..., 4096) = 4096
read(636, "772e7062636f6e666572656e6365732e"..., 4096) = 4096
...

Tundub, et vahel ei lase clamd lahti kustutatud faile

# zgrep "Lib" /var/log/syslog.1 | grep open | tail -n 5
Jul 25 23:44:07 clamav-node1 clamd[22500]: LibClamAV Error: cli_gentempfd: Can't create temporary file /tmp/clamav- 96e4e691bb8582169020c2768523d6b1.tmp: Too many open files
Jul 25 23:54:07 clamav-node1 clamd[22500]: LibClamAV Error: cli_gentempfd: Can't create temporary file /tmp/clamav-ee9bf463650e05adc1f100b77918c2e5.tmp/clamav-e06ca48c48ed802d63762619c500a30c.tmp: Too many open files
...
# lsof -u clamav | grep deleted | nl | tail -n 5
  962  clamd   6234 clamav  974u   REG              253,0     1682   19670 /tmp/clamav-f541120373cb14246373558040cc14a3.tmp (deleted)
  963  clamd   6234 clamav  975u   REG              253,0     1617   19674 /tmp/clamav-ff81947319c7dff89561756657a049cc.tmp (deleted)
  964  clamd   6234 clamav  976u   REG              253,0     4395   19672 /tmp/clamav-f199c6bccf9801dc59ce20976eb35a25.tmp (deleted)
  965  clamd   6234 clamav  977u   REG              253,0     2501   19676 /tmp/clamav-e4d307356f89a9b44558b3cc1b5d66c0.tmp (deleted)
  966  clamd   6234 clamav  978u   REG              253,0     2219   19678 /tmp/clamav-f74efe200480353f0f9c41f84b04a7c2.tmp (deleted)

paistab Debian, et aitab

# grep Temp /etc/clamav/clamd.conf        
TemporaryDirectory /var/tmp/clamd
LeaveTemporaryFiles true

ning

# cat /etc/cron.d/clamav-workaround
# 10 1 * * * find /var/tmp/clamd ! -name clamd -mtime +4 -delete
# */20 * * * * root find /var/tmp/clamd -maxdepth 1 -user clamav -mmin +60 -exec rm -rf {} \;
*/20 * * * * root find /var/tmp/clamd -maxdepth 1 ! -name clamd -user clamav -mmin +60 -exec rm -rf {} \;

Või Ubuntu peal (tundub, et seal TemporaryDirectory nagu ei toimi ja failid asuvad /tmp kataloogis)

# cat /etc/cron.d/clamav-workaround 
*/20 * * * * root find /tmp -maxdepth 1 ! -name clamd -user clamav -mmin +60 -exec rm -rf {} \;

Kontrollide väljalülitamine

Võib juhtuda, et nt C4S.JUNK.IP.AUTOGEN tabab nö ebaõiglaselt saatjat, nt

# sigtool --find-sigs C4S.JUNK.IP.AUTOGEN.5274350 | sigtool --decode-sigs
VIRUS NAME: C4S.JUNK.IP.AUTOGEN.5274350
FUNCTIONALITY LEVEL: >=48
TARGET TYPE: MAIL
OFFSET: *
DECODED SIGNATURE:
{STRING_ALTERNATIVE:://| [|) (| ([}209.85.192.178

kus 209.85.192.178 on Google ip aadress ja seega küllap piisavalt hea, et siiski vastu võtta. Ükshaaval ei saa ip aadresse whitelistida, lahenduseks võib olla kogu C4S.JUNK.IP.AUTOGEN välja lülitada. Selleks tuleb kasutada nt sellist C4S seadistusfaili

# cat /etc/C4S.cfg 
C4S_CLIENT_AUTOUPDATE="ON"
C4S_CLIENT_OUTPUT="LOG"
C4S_DB_IGNORE_LIST="c4s.0days|c4s.adult.0days|c4s.junk.0days|c4s.junk.ip.autogen"

kustutada ära vastav .ndb ja .ndb.sig

# rm /var/lib/clamav/c4s.junk.ip.autogen.ndb*

ning öelda

# /opt/c4s/bin/c4s.updater.sh

C4S RBL kasutamine

C4S RBL jagatakse aadressil https://lab.pikker.ee/ ja tõenäoliselt piisab kasutamiseks nad lisada olemasolevate vastavate parameetrite väärtuste lõppu. Blokeeritud kiri paistab logis sarnaselt

Sep 17 13:50:30 post-relay postfix/smtpd[4005]: NOQUEUE: reject: RCPT from unknown[10.122.156.197]: 554 5.7.1 Service unavailable; 
  Client host [10.122.156.197] blocked using ipbl.lab.pikker.ee; E-mail was rejected due to the 10.122.156.197 reputation. 
  Look your mailserver logs for explanation.; from=<liusl@gdca.com.ee> to=<priit@helioest.ee> proto=ESMTP helo=<mail.gdca.com.ee>

kus tekst on aadressil

# dig +short 197.122.156.10.ipbl.lab.pikker.ee txt
"E-mail was rejected due to the 10.156.122.197 reputation. Look your mailserver logs for explanation."

Kasulikud lisamaterjalid

clamav-milter

Postfix kasutab clamav-milter abil ClamAV teenust. Selliselt kasutades toimub before-queue viiruste kontroll.

Paigaldamine

# apt-get install clamav-milter

Seadistamine

clamav-milter tööd juhib seadistusfail /etc/clamav/clamav-milter.conf, kus võib olla vajalik kohendada selliste parameetrite väärtusi

MilterSocket /var/spool/postfix/clamav/clamav-milter.ctl
OnInfected Reject
LogFacility LOG_MAIL
LogInfected Basic
LogClean Basic
MaxFileSize 25M
MilterSocketGroup clamav
MilterSocketMode 666
RejectMsg "Rejected by ClamAV"
LogSyslog true
ReportHostname mx1.imool.org

Kasutamiseks tuleb Postfix /etc/postfix/main.cf seadisusfaili lisada rida

smtpd_milters = unix:/clamav/clamav-milter.ctl

clamav-milter deemoni käivitamiseks sobib öelda

# /etc/init.d/clamav-milter start

Testimine

Testiks saata kiri

$ sendemail -f priit@imool.org -t root@mail.auul.pri.ee -u sub -m 'sisu' -s 192.168.1.252 -o tls=no

ja eicar test viirusega kiri

$ sendemail -f priit@imool.org -t root@mail.auul.pri.ee -u sub \
  -m 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' -s 192.168.1.252 -o tls=no

Whitelistimine

Selleks, et ClamAV seisukohast tingimusteta võtta vastu mingi mail from saatja kiri sobib kasutada sellist tekstifaili

# cat /etc/clamav/clamav-milter-whitelist.txt
From:imre@moraal.ee

ning viidata sellele /etc/clamav/clamav-milter.conf failist reaga

Whitelist /etc/clamav/clamav-milter-whitelist.txt

ning läbi saanud kiri paistab logis

Thu Feb  8 01:37:58 2018 -> Skipping scan for <imre@moraal.ee> (whitelisted from)

SpamAssassin

Antud juhul ei kasutata sa-learn abil bayesian treenimist, aga bayes_auto_learn on sisse lülitatud. ClamAV kasutamine toimub spamass-milter vahendusel.

Paigaldamine

Tarkvara paigaldamiseks sobib öelda

# apt-get install spamassassin

Tulemusena tekib failisüsteemi omajagu perl teeke

  • /etc/default/spamassassin
  • /usr/bin/sa-update
  • /usr/sbin/spamd
  • /lib/systemd/system/spamassassin.service

Selleks, et automaatselt alglaadimisel käivituks tuleb öelda systemd keskkonnas

# systemctl enable spamassassin.service
Synchronizing state for spamassassin.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d spamassassin defaults
Executing /usr/sbin/update-rc.d spamassassin enable

Seadistamine

Seadistused asuvad kataloogis /etc/spamassassin, eriti failis /etc/spamassassin/local.cf, kus

  • report_safe - 0 kasutamisel saadetakse spam kirjad edasi (praktiliselt need, mis jäävad spam tunnuse skoori ja spamass-milter -r reject väärtuse vahele) muutmata sisuga, lisatakse vaid päiseid; 1 kasutamisel moodustatakse uus kiri ja attachmentina lisatakse saabunud kiri
Spam detection software, running on the system "post-relay.auul",
has identified this incoming email as possible spam.  The original
message has been attached to this so you can view it or label
similar future email.  If you have any questions, see
the administrator of that system for details.

Content preview:  XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
   [...] 

Content analysis details:   (1000.0 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
1000 GTUBE                  BODY: Generic Test for Unsolicited Bulk Email
 0.0 TVD_SPACE_RATIO        No description available.

The original message was not completely plain text, and may be unsafe to
open with some email clients; in particular, it may contain a virus,
or confirm that your address can receive spam.  If you wish to view
it, it may be safer to save it to a file and open it with an editor.

...
  • use_bayes 1 - kas kasutatakse bayesian kontrolle
  • bayes_auto_learn 1 - kas toimub automaatne nö õpetamine, selle tulemusena moodustuvad failid (nb! need on spamassassini protsessi omad, mitte spamass-milter kasutaja omad, siiski tundub, et vähemalt Debian v. 8 Jessie puhul on nad spamass-milter:nogroup omad)
# find /var/lib/spamass-milter/.spamassassin -type f -ls
278180   12 -rw-------   1 spamd    spamd       12288 Jan  4 21:49 /var/lib/spamass-milter/.spamassassin/bayes_seen
277998   12 -rw-------   1 spamd    spamd       12288 Jan  4 21:49 /var/lib/spamass-milter/.spamassassin/bayes_toks
# tail -n 5 /etc/spamassassin/local.cf 
# SPF Overwrite
score SPF_SOFTFAIL 2
score SPF_HELO_FAIL 2

score UNPARSEABLE_RELAY 0

Spamassassin uuenduste kopeerimiseks läbi http proxy sobib kasutada failis /etc/default/spamassassin rida

CRON=1
http_proxy="http://192.168.1.241:3128"

Võiks katseks öelda käsitsi

# http_proxy="http://192.168.1.241:3128" sa-update -D

Uuendusi teeb cron töö

/etc/cron.daily/spamassassin

ja selleks, et uuendused saaksid toimida peab olema /var/lib/spamassassin alune kasutaja:grupp debian-spamd:debian-spamd

# chown -R debian-spamd:debian-spamd /var/lib/spamassassin

Kontrollid

Spamassassin teeb vaikimisi mitmesuguseid kontrolle

DNS põhised
  • mail from juures kasutatud domeenimi (nn RHSBL)
  • kirja sisus olevate urlide domeeninimed (nn URIDNSBL)

mida kontrollivad direktiivid

# grep -i dns /etc/spamassassin/*.pre
/etc/spamassassin/init.pre:loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
/etc/spamassassin/v320.pre:loadplugin Mail::SpamAssassin::Plugin::DNSEval
/etc/spamassassin/v340.pre:loadplugin Mail::SpamAssassin::Plugin::AskDNS
SPF

Kasutab postfix-policyd-spf-python poolt lisatud päiseid oma SPF skoori arvutamiseks. Millegipärast ei õnnestus Spamassassini enda sisemist SPF moodulit kasutada nii, et ta DNS päringuid teeks.

Saata testiks gmail.com pealt kiri, peab olema headerites midagi sellist

Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=209.85.212.177; \
  helo=mail-wi0-f177.google.com; envelope-from=imre.oolberg@gmail.com; receiver=imre@auul.pri.ee
DKIM

Vajadusel paigaldada pakett libmail-dkim-perl

# apt-get install libmail-dkim-perl

Saata testiks gmail.com pealt kiri, peavad olema headerites midagi sellist

X-Spam-Status: No, score=-0.1 required=5.0 tests=DKIM_SIGNED,DKIM_VALID,
   DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE,SPF_PASS autolearn=ham
   autolearn_force=no version=3.4.0

spamass-milter

Postfix kasutab spamass-milter abil Spamassassin teenust. Selliselt kasutades toimub before-queue spammi kontroll (ja muude näitajate osas kirjadele skooride arvestamine, nt SPF ja DKIM).

Paigaldamine

Tarkvara paigaldamiseks sobib öelda kusjuures paigaldamise käigus ei tekitata nö kodukataloogi /var/lib/spamass-milter

# apt-get install spamass-milter
..
Warning: The home dir /var/lib/spamass-milter you specified can't be accessed: No such file or directory
Adding system user `spamass-milter' (UID 115) ...
Adding new user `spamass-milter' (UID 115) with group `nogroup' ...
Not creating home directory `/var/lib/spamass-milter'.

ning tekitada kataloog

# mkdir /var/lib/spamass-milter
# chown spamass-milter:nogroup /var/lib/spamass-milter

kuhu moodustatakse bayesiani failid

# find /var/lib/spamass-milter -type f -ls
399162   12 -rw-------   1 spamass-milter nogroup     12288 Jan  8 05:39 /var/lib/spamass-milter/.spamassassin/bayes_toks
399016    4 -rw-r--r--   1 spamass-milter nogroup      1869 Jan  8 03:23 /var/lib/spamass-milter/.spamassassin/user_prefs
399164   12 -rw-------   1 spamass-milter nogroup     12288 Jan  8 05:39 /var/lib/spamass-milter/.spamassassin/bayes_seen

Seadistamine

# cat /etc/default/spamass-milter 

# Reject emails with spamassassin scores > 15.
OPTIONS="-m -i 127.0.0.1 -r 15 -- -s 10240000"

SOCKET="/var/spool/postfix/spamass/spamass.sock"
SOCKETOWNER="postfix:postfix"
SOCKETMODE="0660"

kus

  • -i - mitte rakendada kontrolli sellelt ip aadressilt saabuvatele andmetele
  • -m - mitte muuta kirjade subject, content-type ega sisu
  • -r - reject kirjadele, millel on kõrgem spam score
  • -- järel olevad suvandid saadetakse edasi spamc programmile (spamd klient), -s määrab analüüsitava kirja maksimaalse suuruse, mis on vaikimisi 512 kB

Kasutamiseks tuleb Postfix /etc/postfix/main.cf seadisusfaili lisada smtpd_milters reale element juurde, kokku nii

smtpd_milters = unix:/clamav/clamav-milter.ctl, unix:/spamass/spamass.sock

Kuna spämmi saatjate jaoks on oluline saata kiiresti ja palju kirju, siis reeglina nad ei saada suuru kirju. Kui kiri on suurem -s parameetriga näidatud väärtusest, siis tekib logisse midagi sellist, kusjuures kiri liigub süsteemist läbi ilma Spammassassini töötluseta (ja vastavad päiseid kirjale ka ei lisata)

Feb  4 10:12:23 post-relay spamc[22715]: skipped message, greater than max message size (512000 bytes)
Feb  4 10:12:23 post-relay spamass-milter[22698]: Could not extract score from <>

spamass-milter deemoni käivitamiseks sobib öelda

# /etc/init.d/spamass-milter start

Testimine

Tundub, et peale süsteemi käivitamist, kaasneb alati esimese kirjaga kaasneb selline teade

Jan  8 13:22:12 mx-fend spamass-milter[420]: Could not retrieve sendmail macro "i"!.  \
 Please add it to confMILTER_MACROS_ENVFROM for better spamassassin results

Testimiseks sobib saata selline kiri

$ sendemail -f priit@imool.org -t root@mail.auul.pri.ee -u sub \
  -m 'XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X' -s 192.168.1.252 -o tls=no

Subject rea muutmine

Spämmikahtlusega kirjade Subject rea muutmiseks sobib kasutada milteri seadistusfailis OPTIONS parameetrit ilma -m suvandita

OPTIONS="-i 127.0.0.1 -r 15 -- -s 10240000"

ning Spammassassin seadisusfailis /etc/spamassassin/local.cf rida

rewrite_header Subject *****SPAM*****

Non-local delivery kontrollimine

Non-local delivery juhtumiks on nt 2nd MX kasutamine või frontend smtp serveri pidamine teise, local deliveriga postimasina ees (nt MS Exchange). Front-end postimasina ülesandeks on lasta läbi ettenähtud domeenidele saabuvad kirjad suunates nad edasi sobivale backend serverile + seejuures kontrollides, et rcpt to aadressid eksisteerivad (nt Active Directory LDAP serveri abil). Nt sobib kasutada sellist seadistusfaili

# NON-LOCAL DELIVERY
relay_domains = /etc/postfix/relay-domains.txt
transport_maps = hash:/etc/postfix/transport
relay_recipient_maps = ldap:/etc/postfix/relay-recipient-maps-ad-users.cf
  ldap:/etc/postfix/relay-recipient-maps-ldap-ad-groups.cf
# NON-LOCAL DELIVERY

kus

  • relay_domains fail sisaldab releetatavaid non-delivery domeeninimesid, igal real üks domeeninimi, postmap käsuga .db baasi pole vajalik moodustada
# cat /etc/postfix/relay-domains.txt
imool.org
auul.pri.ee
  • transport_maps näitab, kus asub backend postimasin, või 1nd mx server (kui seda ei näidata, siis leitakse ta üles dns abil nö tavalisel viisil)
# cat /etc/postfix/transport
imool.org :[192.168.1.251]
auul.pri.ee :[192.168.1.252]
  • relay_recipient_maps näitab antud juhul ära AD LDAP kataloogi asukoha ning kirjeldab, kuidas saada LDAP kataloogist vastused (search base ja query_filter) - tüüpiliselt on eposti aadress kirjas AD kasutaja ja AD grupi sissekannete mõne atribuudi väärtusena; relay_recipient_maps parameeril võib olla palju väärtusi
# cat /etc/postfix/relay-recipient-maps-ad-users.cf
server_host = 10.249.9.4
search_base = ou=IMOOL,dc=imool,dc=local
query_filter = (&(|(mail=%s)(proxyAddresses=smtp:%s))(objectClass=person)(!(userAccountControl=514)))
result_attribute = mail
version         = 3
bind            = yes
start_tls       = no
bind_dn         = postfix@imool.local
bind_pw         = parool
scope           = sub
debuglevel      = 0

ning

# cat /etc/postfix/relay-recipient-maps-ad-groups.cf
server_host = 10.249.9.4
search_base = ou=Grupid,ou=IMOOL,dc=imool,dc=local
query_filter = (&(|(mail=%s)(proxyAddresses=smtp:%s))(objectclass=group))
result_attribute = mail
version         = 3
bind            = yes
start_tls       = no
bind_dn         = postfix@imool.local
bind_pw         = parool
scope           = sub
debuglevel      = 0

Logianalüüs ELK platvormil

Tundub, et sobib kasutada sellist logstash seadistust /etc/logstash/conf.d/ls.conf

# cat /etc/logstash/conf.d/ls.conf
input {

 file {
   path => [ "/srv/logs/192.168.1.250/mail.*.log" ]
   type => "mail"
   start_position => "beginning"
 } 

filter {

 if [type] == "mail" {

  grok {
    match => { "message" => "%{POSTFIXSMTPD}" }
    add_tag => "SMTPD"
    tag_on_failure => []
  }

  grok {
    match => { "message" => "%{SPF}" }
    add_tag => "SPF"
    tag_on_failure => []
  }

  grok {
    match => [ "message", "%{POSTFIXSMTPRELAY}" ]
    add_tag => "SMTP"
    tag_on_failure => []
  }

  grok {
    match => [ "message", "%{CLAMAVMILTERCLEAN}" ]
    add_tag => "CLAMAV"
    add_field => [ "virusname", "PUHASKIRI" ]
    tag_on_failure => []
  }

  grok {
    match => [ "message", "%{CLAMAVMILTERINFECTED}" ]
    add_tag => "CLAMAV"
    tag_on_failure => []
  }

  grok {
    match => [ "message", "%{POSTSCREENCONNECT}",
               "message", "%{POSTSCREENNOQUEUE}" 
             ]
    add_tag => "POSTSCREEN"
    tag_on_failure => []   
  }
   
  grok {
    match => [ "message", "%{SPAMD}" ]
    add_tag => "SPAMD"
    tag_on_failure => []
  }

if "SMTPD" not in [tags] and "SPF" not in [tags] and "SMTP" not in [tags] and "CLAMAV" not in [tags] \
  and "POSTSCREEN" not in [tags] and "SPAMD" not in [tags] {
    drop { }
}
 
 date {
   match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
  }
}  

output { elasticsearch { host => localhost } stdout { codec => rubydebug } }

kus

  • TODO

Lisaks on kirjeldatud sellised patternid

# cat /opt/logstash/patterns/mail-imool
VIRUSNAME ([\W\w._\/%-]+)
COMPONENT ([\w._\/%-]+)
COMPID (postfix\/%{COMPONENT:component}(?:\[%{POSINT:pid}\])?)
RELAY (?:%{HOSTNAME:remote_host}(?:\[%{IP:remote_ip}\](?::[0-9]+(.[0-9]+)?)?)?)
POSTFIXSMTPDCONNECTS (connect from %{RELAY})

# Jan 11 16:34:22 post-relay postfix/smtpd[18424]: connect from unknown[185.66.13.225]"
POSTFIXSMTPD %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME} %{COMPID}: %{POSTFIXSMTPDCONNECTS}

# Jan 10 16:49:44 post-relay clamav-milter[11029]: Clean message from <imre.oolberg@gmail.com> to <imre@auul.pri.ee>
# Jan 10 20:24:51 post-relay clamav-milter[11029]: Message from <maili@vastus.biz> to <talepaju@talepaju.ee> infected by C4S.MMAILER.DOM.250.UNOFFICIAL

PROGNAME ([\w_-]+)
PROGNAMEPID (%{PROGNAME:progname}(?:\[%{POSINT:pid}\])?)
EMAILADDRESS ([a-zA-Z0-9_.+-=:]+@[a-zA-Z0-9_.+-=:]+)

CLAMAVMILTERCLEAN %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME} %{PROGNAMEPID}: Clean message from <%{EMAILADDRESS:mail_from}> to <%{EMAILADDRESS:rcpt_to}>
CLAMAVMILTERINFECTED %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME} %{PROGNAMEPID}: Message from <%{EMAILADDRESS:mail_from}> to <%{EMAILADDRESS:rcpt_to}> infected by %{VIRUSNAME:virusname}

# Jan 10 22:23:24 post-relay postfix/postscreen[15420]: CONNECT from [185.66.13.225]:52207 to [192.168.1.250]:25

POSTSCREENCONNECT %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:hostname} %{COMPID}: CONNECT from \[%{IP:remote_ip}\]:%{POSINT} to \[%{IP:local_ip}\]:25

# Jan 10 22:05:57 post-relay postfix/postscreen[15403]: NOQUEUE: reject: RCPT from [114.97.104.46]:2944: 550 5.7.1 Service unavailable; client [114.97.104.46] blocked  using zen.spamhaus.org; from=<hyciaadkhz@ovsi.com>, to=<mailman@lists.wwoof.ee>, proto=SMTP, helo=<LB63BPY4OBNA8RC.com>
POSTSCREENNOQUEUE %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:hostname} %{COMPID}: NOQUEUE: reject: RCPT from \[%{IP:remote_ip}\]:%{POSINT}: %{POSINT:smtp_code}  5.7.1 Service unavailable; client \[%{IP:remote_ip}\] blocked using %{HOSTNAME:blocking_rbl}; from=<%{EMAILADDRESS:mail_from}>, to=<%{EMAILADDRESS:mail_to}>,  proto=SMTP, helo=<%{HOSTNAME:helo}>

# Jan 10 23:49:27 post-relay policyd-spf[15556]: None; identity=helo; client-ip=192.80.102.33; helo=ftp.moraal.ee; envelope-from=debian@ftp.moraal.ee; receiver=imre@auul.pri.ee
# Jan 10 23:49:27 post-relay policyd-spf[15556]: None; identity=mailfrom; client-ip=192.80.102.33; helo=ftp.moraal.ee; envelope-from=debian@ftp.moraal.ee; receiver=imre@auul.pri.ee

SPF %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME} %{PROGNAMEPID}: %{WORD:spf_result}; identity=%{WORD:spf_identity}; client-ip=%{IPV4:client_ip}; helo=%{HOSTNAME:helo}; envelope-from=%{EMAILADDRESS:mail_from}; receiver=%{EMAILADDRESS:mail_to}

# Jan 10 23:49:46 post-relay postfix/smtp[15560]: 5A9CA5FD4E: to=<imre@auul.pri.ee>, relay=post.auul[192.168.1.251]:25, delay=20, delays=19/0.04/0.09/0.82, dsn=2.0.0,  status=sent (250 2.0.0 Ok: queued as 0FE242C2BD)

QUEUEID (?:[A-F0-9]+|NOQUEUE)
POSREAL ([0-9]+(.[0-9]+)?)
DSN (%{NONNEGINT}.%{NONNEGINT}.%{NONNEGINT})
STATUS (sent|deferred|bounced|expired) 

POSTFIXSMTPRELAY %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:hostname} %{COMPID}: %{QUEUEID:qid}: to=<%{EMAILADDRESS:rcpt_to}>,(?:\sorig_to=<%{EMAILADDRESS:orig_to}>,)? relay=%{RELAY},(?: conn_use=%{POSREAL:conn_use},)? (%{WORD}=%{DATA},)+ dsn=%{DSN:dsn}, status=%{STATUS:result} %{GREEDYDATA:reason}

# Jan 11 15:11:44 post-relay spamd[12090]: spamd: identified spam (1000.0/5.0) for spamass-milter:112 in 0.1 seconds, 1425 bytes.
# Jan 11 15:24:11 post-relay spamd[12090]: spamd: clean message (0.9/5.0) for spamass-milter:112 in 0.4 seconds, 5380 bytes.

SPAM_CHECK_RESULT ([\w._\/%-]+ [\w._\/%-]+)

SPAMD %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:hostname} %{PROGNAMEPID}: spamd: %{SPAM_CHECK_RESULT:scr} \(%{NUMBER:spam_score:float}/%{NUMBER:spam_score_limit:float}\) for spamass-milter:%{NUMBER} in %{NUMBER:spam_check_time} seconds, %{NUMBER:message_size:int} bytes.

Kasulikud lisamaterjalid

Alternatiivne logianalüüs ELK platvormil

Huvipakkuvad andmed

  • timestamp - kirja sissetulemise aeg (Jan 2 2016 19:05:02)
  • in_pf_qid - Postfixi sisemine ID (243BF507AF)
  • in_client_name - postfix/smtpd juures kasutatav klient SMTP serveri nimi, o3.bn.imool.net
  • in_client_ip - postfix/smtpd juures kasutatav klient SMTP serveri nimi, 10.21.6.101
  • toodeldud - sisemist protsessimist abistav parameeter
  • mid - message-id (ye123@ismtpd0002p1lon1.imool.net)
  • mail_from - saatja@aadress
  • rcpt_to - aadressaadi@aadress
  • relay_ip - edasitoimetamise ip (nt smtp relee puhul)
  • reject_reason - põhjus, mille ütleb postfix/cleanup 'ile milter
  • qmgr_removed - kirjaga töötlemise lõpu aeg
  • clamav_virusname - viirusenimi, mida clamd logib ilusti koos queue id väärtusega

SpamAssassin toimetamisi käsitletakse ainult blokeerimise faktina, nt kaasnevat spam score väärtust ei saa hästi kindlaks teha.

Logstash kasutamine

# cat /etc/logstash/conf.d/ls.conf
input {

  file {
    type => "mailjson"
    path => [ "/var/tmp/pf2k-20160102-log.json" ]
    start_position => "beginning"
    sincedb_path => "/srv/sincedb/since.mailjson"
    codec => json
  }
}

filter {

  if [type] == "mailjson" {
    date {
      match => [ "timestamp", "MMM dd YYYY HH:mm:ss" ]
    }

    if [in_client_ip]  {
      geoip {
        source => "in_client_ip"
        target => "geoip"
        database => "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-filter-geoip-2.0.4/vendor/GeoLiteCity-2013-01-18.dat"
        add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
        add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
      }
      mutate {
        convert => [ "[geoip][coordinates]", "float" ]
      }
    }
  }

output { elasticsearch { hosts => "localhost" } stdout { codec => rubydebug } }

kus

  • match => [ "timestamp", "MMM dd YYYY HH:mm:ss" ] - teisendab "Jan 2 2016 06:18:34" formaadis aja elasticsearch @timestampiks

Märkused

  • utf8 kodeeringus subjectid enne logimist teisendada loetavaks

Testimine

Eposti serveri testimiseks sobib kasutada Postal http://doc.coker.com.au/projects/postal/ tarkvara. Debian operatsioonisüsteemile paigaldamiseks sobib öelda

# apt-get install postal

ning kasutamiseks nt

$ postal -r 160 -m 20 -f /var/tmp/sender-file.txt 10.35.179.67 /var/tmp/user-list-filename.txt
time,messages,data(K),errors,connections,SSL connections
22:42,7,53,0,8,0
22:43,10,103,0,10,0
22:44,10,101,0,10,0
22:45,10,131,0,10,0
22:46,10,98,0,10,0

kus

  • -r mitu kirja püütakse minutis saata
  • -m maksimaalne genereeritud kirja suurus
  • -f saatjate aadressid
  • 10.35.179.67 - testitav smtp server
  • /var/tmp/user-list-filename.txt - adressaatide nimekiri
  • väljundis on tulpades 'time,messages,data(K),errors,connections,SSL connections'

Kasulikud lisamaterjalid

smtpd TLS

smtpd TLS sisselülitamiseks sobib /etc/postfix/main.cf seadistusfailis kasutada sellist osa (smtpd_tls_CAfile puudumisel ära jätta)

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_CAfile=/etc/dovecot/ca.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_loglevel = 1
smtpd_tls_security_level = may
smtpd_tls_received_header = yes

kus

  • smtpd_tls_key_file - salajane võti, võiks öelda 'chmod 0600 /etc/ssl/private/ssl-cert-snakeoil.key'
  • smtpd_tls_cert_file - sertifikaat või parem ahel (self-signed juurikas on tõenäoliselt kliendil olemas ja pole tarvis siia)
# cat server_cert.pem intermediate_CA.pem > server.pem

Logis paistab vastav osa nt sedasi

Jan  9 00:51:38 post-relay postfix/smtpd[7703]: Anonymous TLS connection established from \
  bendel.debian.org[82.195.75.100]: TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)

Ja kirja päises

Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172])
   (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits))
   (No client certificate requested)
   by mail.auul.pri.ee (Postfix) with ESMTPS id 38F2C6121F
   for <imre@auul.pri.ee>; Fri, 9 Jan 2015 01:02:04 +0200 (EET)

Testimiseks sobib öelda

$ openssl s_client -starttls smtp -crlf -connect 10.249.9.78:25

smtp TLS

Antud juhul tähendab smtp TLS, et serverist välja pöördumised toimuvad võimalusel krüpteeritud ühendust kasutades, sellise funktsionaalsuse sisselülitamiseks sobib /etc/postfix/main.cf seadistusfailis kasutada

smtp_use_tls = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_loglevel = 1
smtp_tls_security_level = may
smtp_tls_note_starttls_offer = yes

kus

  • TODO

Logis paistab

Jan  9 00:53:58 post-relay postfix/smtp[7890]: Trusted TLS connection established to \
  gmail-smtp-in.l.google.com[173.194.71.26]:25: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)

SMTP TLS AUTH 587/submission

Tundub, et 2016 aastal soovitatakse üldiselt kasutada 587/submissionit kirjade välja saatmisel.

Antud juhul toimub SMTP relee klientide autentimine vastu Dovecot serverit. St sama kasutajate baas, mis on kasutusel Dovecot imap klientide jaoks. SMTP AUTH toimub eraldi nö tavalisest port 25/tcp liiklusest port 587/tcp peal, Postfix seadistusfailis /etc/postfix/master.cf vastab sellel sektsioon

submission inet n - - - - smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=inet:192.168.7.143:12345
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

kus

  • smtpd_sasl_path - Dovecot auth serveri teenuse aadress

Dovecot osas on oluline selline sektsioon seadistusfailis /etc/dovecot/conf.d/10-master.conf

# cat /etc/dovecot/conf.d/10-master.conf
..
service auth {
...
  inet_listener {
    port = 12345
  }
}
....

Testimine

SMTP AUTH testimiseks sobib öelda

$ /usr/bin/sendemail -f imre@auul.pri.ee -t imre@mujale.imool.ee -u subject -m sisu -s 10.103.6.25:587 -xu imre -xp parool -o tls=yes

Teenuse krüpto omaduste uurimiseks

# sslscan --starttls 10.103.6.25:587 | grep Acce
   Accepted  TLSv1  256 bits  ECDHE-RSA-AES256-SHA
   Accepted  TLSv1  256 bits  DHE-RSA-AES256-SHA
   Accepted  TLSv1  256 bits  DHE-RSA-CAMELLIA256-SHA
...

Eposti kliendi seadistamine

Eposti kliendi seadistamisel tuleb väljuva eposti serveri jaoks kirjeldada

  • domeeninimi (või ip aadress, sel juhul tuleb tõenäoliselt esimesel pöördumisel aktsepteerida serveri sertifikaat)
  • port - 587
  • kasutajanimi
  • parool
  • Connection Security - STARTTLS
  • Authentication Method - Normal password

SMTP TLS AUTH 465/smtps

Tundub, et 2016 aastal soovitatakse üldiselt kasutada 587/submissionit kirjade välja saatmisel. Käesolevat juhtumist sobib kasutada nt mingi legacy kliendi piiratuse vms põhjusel.

Antud juhul toimub SMTP relee klientide autentimine vastu Dovecot serverit. St sama kasutajate baas, mis on kasutusel Dovecot imap klientide jaoks. SMTP AUTH toimub eraldi nö tavalisest port 25/tcp liiklusest port 465/tcp peal, Postfix seadistusfailis /etc/postfix/master.cf vastab sellel sektsioon

smtps inet n - - - - smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot   
  -o smtpd_sasl_path=inet:192.168.7.143:12345
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

kus

  • smtpd_sasl_path - Dovecot auth serveri teenuse aadress

Dovecot osas on oluline selline sektsioon seadistusfailis /etc/dovecot/conf.d/10-master.conf

# cat /etc/dovecot/conf.d/10-master.conf
..
service auth {
...
  inet_listener {
    port = 12345
  }
}
....

Kasulikud lisamaterjalid

Postfix seadistusfailid

Kogu Postfix seadistusfaili /etc/postfix/main.cf sisu, sektsioonide kaupa

# MISC ALGUS
biff = no
append_dot_mydomain = no
readme_directory = no   

myorigin = /etc/mailname
myhostname = mail.auul.pri.ee
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
message_size_limit =  37000000
# MISC LOPP 
# VORK ALGUS
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.10.0/24 192.168.1.0/24
inet_interfaces = all
inet_protocols = ipv4
proxy_interfaces = 10.204.62.116
# VORK LOPP
# LOKAALNE DELIVERY ALGUS
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = post-relay.auul, localhost.imool, localhost
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0  
recipient_delimiter = +
# LOKAALNE DELIVERY LOPP
# TLS ALGUS
# TLS server parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_CAfile=/etc/dovecot/ca.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_loglevel = 1
smtpd_tls_security_level = may
smtpd_tls_received_header = yes

# TLS client parameters
smtp_use_tls = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_loglevel = 1
smtp_tls_security_level = may
smtp_tls_note_starttls_offer = yes
# TLS LOPP
# POSTSCREEN ALGUS

# testid enne before 220 teste
# permanent white/blacklist (postscreen_blacklist_action ytleb kui otsustavalt kaituda)
postscreen_access_list = permit_mynetworks
  cidr:/etc/postfix/postscreen_access.cidr

postscreen_blacklist_action = enforce

# mx policy test
postscreen_whitelist_interfaces = !192.168.7.81 static:all

# tests before 220 greeting
postscreen_greet_banner = "PGB at RT"
postscreen_greet_action = enforce

# dnsbl testid
postscreen_dnsbl_sites = zen.spamhaus.org*3
  list.dnswl.org=127.[0..255].[0..255].0*-2
  list.dnswl.org=127.[0..255].[0..255].1*-3
  list.dnswl.org=127.[0..255].[0..255].[2..255]*-4

postscreen_dnsbl_threshold = 3
postscreen_dnsbl_whitelist_threshold = -2

# mida teha vastavalt permanent blacklist, pregreet ja dnsbl tabamuste puhul
postscreen_dnsbl_action = enforce

# test after 220 greeting i.e. deep protocol test
postscreen_pipelining_enable = yes
postscreen_pipelining_action = enforce 

postscreen_non_smtp_command_enable = yes
postscreen_non_smtp_command_action = drop

postscreen_bare_newline_enable = yes
postscreen_bare_newline_action = enforce

# POSTSCREEN LOPP
# HELO, CLIENT, SENDER, RECIPIENT ja RELAY kontrollid ALGUS
# helo kontrollid
# logitakse sellised vead  
# Jan  9 00:39:34 post-relay postfix/smtpd[7509]: NOQUEUE: reject_warning: RCPT from \
#    unknown[10.198.206.158]: 450 4.7.1 <mx1.imool.org>: Helo command rejected: Host not found; \
#    from=<priit@imool.org> to=<imre@auul.pri.ee> proto=ESMTP helo=<mx1.imool.org>

smtpd_helo_required = yes
smtpd_helo_restrictions = warn_if_reject reject_unknown_helo_hostname

# client kontrollid, leitakse poorduja ip aadressile vastav nimi
# ja kontrollitakse, kas see laheneb esialgseks ip aadressiks
# logitakse sellised vead (eelduseks on, et ptr kirje üldse eksisteerib)
# Jan  9 00:39:34 post-relay postfix/smtpd[7509]: warning: hostname mx1.imool.org \
#    does not resolve to address 10.198.206.158
# Jan  9 00:39:34 post-relay postfix/smtpd[7509]: NOQUEUE: reject_warning: RCPT \
#    from unknown[10.198.206.158]: 450 4.7.1 Client host rejected: cannot find your hostname, \
#    [10.198.206.158]; from=<priit@imool.org> to=<imre@auul.pri.ee> proto=ESMTP helo=<mx1.imool.org>

smtpd_client_restrictions = warn_if_reject reject_unknown_client_hostname

# valjast tulevad olematu @domeeni.osaga kirjad, 450 error
# logitakse sellised vead
# Jan  9 00:45:13 post-relay postfix/smtpd[7534]: NOQUEUE: reject: RCPT from unknown[10.198.206.158]: \
#    450 4.1.8 <priit@imooll.ee>: Sender address rejected: Domain not found; from=<priit@imooll.ee>\
#    to=<imre@auul.pri.ee> proto=ESMTP helo=<mx1.imool.org>
#
# küsitakse mail from domeeni osa kohta Spamhaus käest, kas on kahtlane domeen
# nö dig moraal.ee.dbl.spamhaus.org 

smtpd_sender_restrictions = reject_unknown_sender_domain, reject_rhsbl_sender dbl.spamhaus.org

# lubatakse kohalikke vorke ja autenditud kasutajaid, ei lubata tundmatutesse kohtadesse
# releetamisi

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

# lubatakse kohalikke vorke ja autenditud kasutajaid, ei lubata tundmatutesse kohtadesse
# releetamisi ja lisaks toimub SPF kontroll postfix policy sistema abil

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
  check_policy_service unix:private/policyd-spf

# HELO, CLIENT, SENDER, RECIPIENT ja RELAY kontrollid LOPP
# HEADER CHECKS
mime_header_checks = regexp:/etc/postfix/mime_header_checks.regexp
# HEADER CHECKS LOPP
# MILTERS: CLAMAV, SPAMASSASSIN
smtpd_milters = unix:/clamav/clamav-milter.ctl, unix:/spamass/spamass.sock
# MILTERS LOPP
# NON-LOCAL DELIVERY
relay_domains = /etc/postfix/relay-domains.txt
transport_maps = hash:/etc/postfix/transport
relay_recipient_maps = ldap:/etc/postfix/relay-recipient-maps-ad-users.cf
# NON-LOCAL DELIVERY

Seadistusfailist viidatud failide sisu

# cat /etc/postfix/postscreen_access.cidr
192.168.10.0/24 permit
# cat /etc/mailname
mail.auul.pri.ee
# cat /etc/postfix/relay-domains.txt
auul.pri.ee
# cat /etc/postfix/transport
auul.pri.ee :[10.249.6.143]
# cat /etc/postfix/relay-recipient-maps-ad-users.cf
server_host = 10.249.9.4
search_base = dc=imool,dc=local
query_filter = (&(|(mail=%s)(proxyAddresses=smtp:%s))(objectClass=person)(!(userAccountControl=514)))
result_attribute = mail
version         = 3
bind            = yes
start_tls       = no
bind_dn         = postfix@imool.local
bind_pw         = parool
scope           = sub
debuglevel      = 0
# cat /etc/postfix/mime_header_checks.regexp
/filename=\"?(.*)\.(bat|chm|cmd|com|do|exe|hta|jse|rm|scr|pif|vbe|vbs|vxd|xl)\"?$/
  REJECT For security reasons we reject attachments of this type
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+\.(lnk|asd|hlp|ocx|reg|bat|c[ho]m|cmd|exe|dll|vxd|pif|scr|hta|jse?|sh[mbs]|vb[esx]|ws[fh]|wav|mov|wmf|xl))"?\s*$/
  REJECT Attachment type not allowed. File "$2" has the unacceptable extension "$3"

Postfix seadistusfailis /etc/postfix/master.cf on tehtud muudatused kahes osas

  • vt Postscreen
  • vt SMTP AUTH

OpenBSD iseärasused

  • OpenBSD clamav pakett sisaldab clamav, freshclam ning milter-clamav tarkvara, paigaldamiseks sobib öelda
# pkg_add clamav
  • Paralleelselt töötav pixz tundub puuduvat, aga on olemas tavaline xz
# pkg_add xz
  • c4s.updater.sh on bash skript
# pkg_add bash
  • SpamAssassin
# pkg_add p5-Mail-SpamAssassin
quirks-2.9 signed on 2014-07-31T22:37:55Z
|No change in quirks-2.9Ambiguous: choose dependency for p5-Mail-SpamAssassin-3.4.0p3: 
 a       0: p5-Mail-SPF-2.8.0
         1: p5-Mail-SPF-Query-1.999.1p4
Your choice: 0
p5-Mail-SpamAssassin-3.4.0p3:p5-URI-1.60: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Net-SSLeay-1.65: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-IO-Socket-SSL-1.997: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-HTML-Tagset-3.20p0: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-HTML-Parser-3.71p0: ok
p5-Mail-SpamAssassin-3.4.0p3:libghttp-1.0.9p2: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-HTTP-GHTTP-1.07p5: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-libwww-5.837p0: ok
p5-Mail-SpamAssassin-3.4.0p3:re2c-0.13.6: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Digest-HMAC-1.03: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Net-DNS-0.78: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Net-DNS-Resolver-Programmable-0.003: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-NetAddr-IP-4.075: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Error-0.17019: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Mail-SPF-2.8.0: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Socket6-0.25p0: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Net-CIDR-Lite-0.21: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Net-Patricia-1.19p1: ok
p5-Mail-SpamAssassin-3.4.0p3:GeoIP-1.6.2: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Geo-IP-1.43p0: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Time-TimeDate-2.30: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Mail-Tools-2.07: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Crypt-OpenSSL-Bignum-0.04p5: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Crypt-OpenSSL-Random-0.06p0: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Crypt-OpenSSL-RSA-0.28p0: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Mail-DKIM-0.40p0: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-Encode-Detect-1.01p3: ok
p5-Mail-SpamAssassin-3.4.0p3:p5-IO-Socket-IP-0.31: ok
useradd: Warning: home directory `/var/db/spamassassin' doesn't exist, and -m was not specified
p5-Mail-SpamAssassin-3.4.0p3: ok
The following new rcscripts were installed: /etc/rc.d/spamassassin
See rc.d(8) for details.
Look in /usr/local/share/doc/pkg-readmes for extra documentation.

Kui clamd reload ajal kiri saata, siis tavaliselt saab saatja ajutise veateate

..
Feb  6 01:14:42 tm clamav-milter[12438]: Timed out while reading clamd reply
Feb  6 01:14:42 tm clamav-milter[12438]: No reply from clamd
Feb  6 01:14:42 tm postfix/cleanup[9813]: 674C67EE82: milter-reject: END-OF-MESSAGE from mail.auul.pri.ee[10.204.62.116]: \
  4.7.1 Service unavailable - try again later; from=<imre@auul.pri.ee> to=<imre@imool.org> proto=ESMTP helo=<mail.auul.pri.ee>
Feb  6 01:14:42 tm postfix/smtpd[22995]: disconnect from mail.auul.pri.ee[194.204.62.116]
...

queue haldamine

Vahel on väljuv queue täitunud mingi sodiga, siis võib olla abi selle puhastamisest mingi tunnuse alusel, nt selline skript

# cat qp.sh
for i in `mailq | egrep '^[0-9,A-Z]' | awk {'print $1'}`; do
  if postcat -q $i | egrep -q "www.mailikampaania.imool" | egrep -q "^Message-ID"; then
    #    echo leitud: $i
    #     postsuper -d $i
    postcat -q $i | grep "^Message-ID" | grep "www.mailikampaania.imool"
  #  else
    #    echo pole leitud: $i
  fi
done

kus

  • TODO

2nd MX kasutamine

Esmalt peaks 2nd MX kasutamist väga kaaluma ja seejuures arvestama kui palju spämmi seejuures edasi saatma hakatakse; ja millist kahju see 1nd MX jaoks 2nd MX enda jaoks kaasa toob või tuua võib. Kui Postfix releetab ise kirju oma backendidele + on 2nd MX teatud domeenidele, siis võiks sobida sellise seadistus sektsiooni kasutamine

# NON-LOCAL DELIVERY
virtual_mailbox_domains = /etc/postfix/virtual_mailbox_domains.txt
relay_domains = /etc/postfix/relay_domains.txt
virtual_transport = smtp:10.249.6.188:10025
transport_maps = hash:/etc/postfix/transport_maps.txt

# relay_recipient_maps = hash:/etc/postfix/smtp.moraal.ee-relay_recipients_imool-ee.txt

virtual_mailbox_maps = hash:/etc/postfix/smtp.imool.ee-relay_recipients_by_domains-txt
  hash:/etc/postfix/smtp.imool.ee-relay_recipients_lists-txt
  pgsql:/etc/postfix/smtp.imool.ee-relay_recipients_cyrus-pgsql
  mysql:/etc/postfix/smtp.imool.ee-relay_recipients_imool.ee-mysql
  ldap:/etc/postfix/virtual-mailbox-maps-ldap-users-IMOOL.cf
  ldap:/etc/postfix/virtual-mailbox-maps-ldap-users-Ressursid.cf
  ldap:/etc/postfix/virtual-mailbox-maps-ldap-users-Teenuskontod.cf
  ldap:/etc/postfix/virtual-mailbox-maps-ldap-groups-IMOOL.cf
  ldap:/etc/postfix/virtual-mailbox-maps-ldap-groups-Grupid.cf
  pgsql:/etc/postfix/smtp.imool.ee-relay_recipients_imool.ee-pgsql

virtual_alias_maps = hash:/etc/postfix/virtual_aliases_maps.txt

# NON-LOCAL DELIVERY

kus

  • virtual_mailbox_domains - domeeninimed, mida hallatakse virtual_* direktiividega
  • relay_domains - domeeninimed, millele vastavate rcpt_to aadressidega kirju releetatakse; siin on domeeninimed millele ollakse 2nd MX; need kirjad saadetakse edasi sinna kuhu dns neid saadab
  • transport_maps - üldine transportide kirjeldus, töötab virtual_mailbox_domains ja relay_domains rcpt_to domeenile vastavate kirjade jaoks
  • virtual_transport - kirjad, mille rcpt_to domeen on kirjas virtual_mailbox_domains juures, aga millele ei rakendu ükski transport_maps saadetakse näidatud kohta
  • virtual_mailbox_maps - frontend smtp serveris omab see rcpt_to aadressi olemasolu kontrollimise funktsiooni
  • virtual_alias_maps - võimaldab frontend smtp serveris virtual_mailbox_domains juures näidatud rcpt_to aadressidega kirjadele teha edasisuunamisi suvalisele muule aadressile (lisaks sellele, et tõenäoliselt reeglina vastava domeeni kirjad saadetakse transport_maps abil kuhugi backendi)

TLS enforce kasutamine valikuliselt

TODO

Kasulikud lisamaterjalid

2025 kevad tähelepanekud

Väited

  • spamassassini protsess töötab vähemalt pealtnäha root kasutajana
  • Spamassassin asemel võiks kaaluda rspamd kasutamist (nt kaalutlusel, et spamassassinil puudub nö usaldusväärne docker konteiner lahenduse, rspamd puhul on olemas; sama kas rspamd on usaldusväärne tarkvara nö tänastes tingimustes)

Spamd puhul tundub, et automaatselt lisandunud kontrollidega seoses

# tail -f /var/log/mail.log
2025-06-01T11:49:39.408460+03:00 post-relay spamd[4007]: check: dns_block_rule RCVD_IN_VALIDITY_RPBL_BLOCKED hit, creating /root/.spamassassin/dnsblock_bl.score.senderscore.com (This means DNSBL blocked you due to too many queries. Set all affected rules score to 0, or use "dns_query_restriction deny bl.score.senderscore.com" to disable queries)
2025-06-01T11:49:39.408639+03:00 post-relay spamd[4007]: check: dns_block_rule RCVD_IN_VALIDITY_SAFE_BLOCKED hit, creating /root/.spamassassin/dnsblock_sa-accredit.habeas.com (This means DNSBL blocked you due to too many queries. Set all affected rules score to 0, or use "dns_query_restriction deny sa-accredit.habeas.com" to disable queries)
2025-06-01T11:49:39.408715+03:00 post-relay spamd[4007]: check: dns_block_rule RCVD_IN_VALIDITY_CERTIFIED_BLOCKED hit, creating /root/.spamassassin/dnsblock_sa-trusted.bondedsender.org (This means DNSBL blocked you due to too many queries. Set all affected rules score to 0, or use "dns_query_restriction deny sa-trusted.bondedsender.org" to disable queries)

tuleks nad pigem välja lülitada

root@post-relay:/etc/postfix# grep ^dns /etc/mail/spamassassin/local.cf 
dns_query_restriction deny bl.score.senderscore.com
dns_query_restriction deny sa-trusted.bondedsender.org
dns_query_restriction deny sa-accredit.habeas.com

Automaatsete spamassassin mustrite kopeerimiseks internetist lülitada timer sisse

root@post-relay:/etc/postfix# systemctl enable --now spamassassin-maintenance.timer
root@post-relay:/etc/postfix# systemctl list-timers

Üle 'postfix/submission' smtp auth klietide kirjadele lisatakse vaikimisi kõrge spammi skoor kuna dmarc arvates on nad nö madala reputatsiooniga kirjad (puudub dkim signatuur, spf mõttes valest kohast jne), seda võiks saada leevendada smtpd_milters kasutamisega master.cf failis, nt

..
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=inet:192.168.1.252:12345
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_milters=inet:192.168.1.243:8892
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
...

Kasulikud lisamaterjalid