Portál AbcLinuxu, 5. května 2024 07:55

Stavíme poštovní server – 14 (Sieve)

19. 2. 2010 | Lukáš Jelínek
Články - Stavíme poštovní server – 14 (Sieve)  

Velmi oblíbenou funkcí poštovních serverů je filtrace zpráv a jejich třídění. K tomu se tvůrci serverů stavějí různě – dobré však je, když je tato funkce nejen přítomna, ale když také funguje podle otevřeného standardu. Takovým standardem je technologie Sieve, kterou lze provozovat prostřednictvím pluginu do programu Dovecot.

Obsah

Doplnění předchozího dílu

link

Z předchozího dílu seriálu bohužel vypadla jedna „maličkost“, která je však důležitá pro správnou funkci Dovecot LDA. Jde o to, že se doručovací agent potřebuje dotazovat do databáze uživatelů, aby mohl zprávy správně doručovat. Agent se však nedotazuje sám, využívá k tomu stejnou službu, jakou využívají i služby pro IMAP a POP3.

Výchozí nastavení je takové, že by komunikace měla fungovat. Často to však fungovat nebude – a to konkrétně tehdy, nebude-li mít dotazující se proces dostatečná práva. Proto je dobré nastavit si věci okolo práv explicitně. Následující fragment souboru /etc/dovecot.conf obsahuje – jako obvykle – jen to, co se mění:

auth default {
  socket listen {
    user = vmail
    group = vmail
  }
}

Speciální soubor socketu je zde umístěn na /var/run/dovecot/auth-master (výchozí hodnota) a oprávnění jsou 0600 (dtto), tedy s přístupem pouze pro vlastníka. Výchozím vlastníkem je však root, v čemž může být právě problém, protože pokud se pokusí připojit proces běžící pod jiným uživatelem (typicky vmail, což je vlastník úložiště pošty), selže to. Z bezpečnostních důvodů není dobré rozšiřovat okruh oprávněných uživatelů, čili se zde nastaví ten uživatel, který bude tento socket používat, což je vmail.

Filtrace, třídění, přesměrování, automatická odpověď

link

Přestože spousta lidí pracuje s elektronickou poštou pouze formou čtení a odesílání zpráv, je nemálo těch, kteří žádají víc. Tím „víc“ se v tomto smyslu rozumí to, že si vytvářejí pro své zprávy různé složky, kam je chtějí třídit, a to často nejlépe automaticky. Chtějí také, aby se některé zprávy zahazovaly (nemusí přitom jít o spam) nebo aby se přesměrovávaly na jiné adresy. Někdo také požaduje, aby během jeho pobytu na dovolené server automaticky posílal informaci o tom, že si příjemce zprávu přečte až někdy později.

Některé z těchto požadavků splňují implementace v klientech (např. Mozilla Thunderbird), nicméně některé z požadavků takto splnit nejdou. Navíc se klientsky řešené třídění/filtrace uplatní jen v tomto klientovi, což činí problémy při přístupu z více počítačů, případně ještě v kombinaci s webovým rozhraním. Proto je mnohem výhodnější, když se o všechno postará server – nastaví se to jen jednou, může to umět mnohem víc a zpracování probíhá ihned po příchodu zprávy.

Co je Sieve?

link

Pro snadnou implementaci uvedených funkcí vznikla otevřená technologie Sieve (jejími otci jsou vývojáři Cyrus IMAP Serveru) popsaná aktuálně dokumentem RFC 5228. Základem technologie je jazyk, jímž se popisuje požadované chování serveru. Aby technologie „ožila“, je samozřejmě potřeba implementovat program, který na základě pravidel popsaných jazykem Sieve zpracovává přijaté zprávy a provádí s nimi požadované akce.

V rámci poštovního serveru na bázi Postfix + Dovecot bude takovou implementací plugin do Dovecot LDA, tedy do doručovacího agenta. Existují v zásadě dva možné způsoby, jak takový plugin připravit. Jednou z možností je použít nativní plugin, což je od verze 1.2 doporučená cesta. Lze však také využít upravenou implementaci ze serveru Cyrus (CMU Sieve), což je jediný možný způsob u verze 1.1 a starších. CMU Sieve však nepodporuje tak širokou škálu funkcí jako Dovecot Sieve, což se týká i některých příkladů uvedených v tomto článku.

Teď by někdo možná očekával popis toho, co všechno Sieve a jeho implementace umí. Ale tento popis bude lepší nechat na později, na konkrétní ukázky Sieve kódu. Ještě totiž zbývá vyřešit jeden netriviální problém, a to jak na server definovaná pravidla dostat.

Opět je více možností. Nejjednodušší je uložit si ta pravidla do souboru a ten pak nakopírovat na patřičné místo v souborovém systému poštovního serveru. To samozřejmě lze a je to výhodné pro globální pravidla (pokud nějaká jsou; například ve firmě se to může někdy hodit). Uživatelé však přivítají spíše jiný způsob, tedy takový, kde si budou moci definovat pravidla přímo z poštovního klienta.

Aby toto bylo možné, musí server podporovat mechanismus pro práci s pravidly. Takovým mechanismem je ManageSieve, což je otevřený komunikační protokol – jeho definice je sice zatím jen ve fázi draftu, nicméně se tento protokol běžně používá. I tady je více možností, jak ManageSieve provozovat. Jednou z nich je použít nativní implementaci, která je distribuována samostatně a bohužel vyžaduje určité úpravy zdrojového kódu. Dále existuje démon pysieved napsaný v jazyce Python, který je snadno a bezproblémově použitelný, vyžaduje však samozřejmě interpret Pythonu. Případně lze použít některé další existující implementace.

Konfigurace Dovecot LDA

link

Základem zprovoznění Sieve na serveru je nastavení správných parametrů v konfiguračním souboru /etc/dovecot/dovecot.conf. Nejprve musí však být plugin nainstalován, a to buď z balíčku, nebo kompilací ze zdrojových kódů. Výsledný nativní plugin se jmenuje sieve; plugin kompilovaný na základě starého CMU Sieve nese název cmusieve. Takto může vypadat konfigurační soubor dovecot.conf:

protocol lda {
  mail_plugins = sieve quota
}

plugin {
  sieve = /var/mail/virtual/%d/%n/script.sieve
  sieve_global_path = /etc/sieve/default.sieve
}

Jsou uvedeny jen ty části, které jsou nové nebo se mění. V první sekci, tedy lda, přibyl v seznamu pluginů plugin sieve (plugin quotaminulého dílu zůstává). Pokud by byl nainstalován plugin cmusieve, použil by se pochopitelně ten.

Další dvě volby jsou v sekci plugin. Parametr sieve je velmi důležitý, protože definuje šablonu pro tvorbu cesty ke skriptům (souborům s pravidly) pro jednotlivé uživatele. V tomto případě jde o cestu z minulého dílu – virtuální uživatelé mají adresáře tvořené názvem domény a uživatelským jménem. Lze používat běžné proměnné určené pro konfiguraci programu Dovecot. Parametr sieve_global_path není až tolik potřeba, definuje cestu k souboru s globálními pravidly. Tento soubor se použije jen tehdy, nemá-li uživatel vytvořen svůj vlastní. Nelze přes něj tedy vynucovat nějaká pravidla, je však užitečný v případě, že je žádoucí nějak obecně nakládat se zprávami a jen uživatelé, kteří potřebují něco specifického, si vytvářejí své vlastní soubory.

Konfigurace může být bohatší, nicméně toto zcela postačuje pro plnohodnotný provoz Sieve. Pokud nyní budou v uživatelském nebo globálním souboru nějaká pravidla, doručovací agent se podle nich zachová a například zprávu zatřídí do požadované složky nebo ji přesměruje jinému příjemci.

Základy tvorby pravidel

link

Přestože existují i určité možnosti, jak si pravidla jednoduše „naklikat“, GUI nástroje nikdy nevloží do rukou uživatele takovou sílu, jakou nabízí přímé psaní pravidel v jazyce Sieve. Proto je dobré znát aspoň základy toho, jak se pravidla píší a hlavně co vůbec Sieve umožňuje. Asi bude nejlepší začít hned příkladem:

require "fileinto";

if header :contains "subject" "faktura" {
  fileinto "Faktury";
}

Příklad je jednoduchý a dá se z něj snadno zjistit, co taková definice dělá. Na prvním řádku je direktiva require, která říká, které rozšíření je potřeba použít. Jednotlivá rozšíření totiž implementují různé operace – a podle toho, co se použije v pravidlech, je také potřeba si vyžádat potřebná rozšíření. Některá rozšíření jsou definována přímo v RFC 5228, další v jiných dokumentech, například RFC 5229, 5490 a řadě dalších.

Pak už je tu přímo samotné pravidlo. To zjišťuje, zda hlavička Subject (tedy předmět zprávy) obsahuje slovo „faktura“ – v takovém případě přesune zprávu do složky „Faktury“. Jednoduché, že? Zde skutečně ano. Ovšem pro psaní složitějších pravidel je třeba pochopit, jak se konstruují podmínky a jak se vůbec potom pravidla zpracovávají.

Výše uvedený test nerozlišuje velká a malá písmena, proto bude pravidlem zpracován stejně předmět „Faktura č. 12345“ jako „Re: faktura“ nebo jiné takové. To se týká všech testů hlaviček.

Pravidla sestávají z podmínek (testů) a akcí. Podmínka je prostě nějaký test (typicky na obsah některé hlavičky, těla apod.), akce je to, co se v případě splnění podmínky vykoná. Opět krátký příklad:

if size :over 1M {
  discard;
}

Toto pravidlo říká, že pokud velikost zprávy překročí 1 MB, zpráva se zahodí (akce discard). Je-li toto pravidlo jediné a zpráva jím není explicitně zahozena, doručí se jako obvykle. Implicitně se totiž zpráva ponechává ke zpracování. Lze si to představit i tak, jako by byla na konci uvedena akce keep, tedy ponechání zprávy.

Dále si v obou příkladech povšimněte, že se v podmínce uvádí vždy nejdřív druh testu, potom operátor (:contains, :over) a potom všechny potřebné operandy. Jinak řečeno, pro zápis testu se používá prefixová notace (operátor je na začátku). Další zákonitosti se ukáží opět v příkladu:

require "fileinto";
require "imap4flags";

if header :contains "subject" "upomínka" {
  setflag "$Label1";
} elsif header :contains "subject" "***spam***" {
  setflag "$Junk";
  fileinto "Junk";
}

Podmínky lze skládat způsobem uvedeným v příkladu. Lze tak zamezit nechtěnému spouštění akcí nebo zbytečným testům. Zde bude druhá podmínka testována jen v případě, že zpráva první podmínce nevyhověla. Dále je v příkladu vidět použití rozšíření imap4flags. To slouží k nastavování příznaků zpráv – jak specifických (zde Junk, tedy „označení jako spam“), tak obecných štítků (zde použitý štítek č. 1 bývá v klientech obvykle červený, což lze využít k automatickému zvýraznění důležitých zpráv). Akcí může být pro každou podmínku více, což je zde také vidět.

Testy na hlavičky mohou samozřejmě testovat kteroukoli hlavičku zprávy. Většinou se v praxi testují Subject, FromTo, lze však testovat i některé méně používané nebo vysloveně specifické hlavičky a dát tak zpracování zpráv doslova novou dimenzi. Takovou zajímavou hlavičkou je například Precedence, používaná u hromadných zpráv.

require "copy";

if header :contains "subject" ["faktura", "výzva k platbě", "vyzva k platbe"] {
  redirect :copy "uctarna@moje.firma";
}
elsif header :contains "subject" ["upomínka", "upominka"] {
  redirect "uctarna@moje.firma";
}

Příklad ukazuje, jak naložit s příchozími fakturami a upomínkami. Obě mají být přeposílány do účtárny, ovšem faktury je třeba přeposílat jen jako kopii, tedy nechat zprávu doručit i do schránky, zatímco u upomínek to potřeba není. K tomu se používá rozšíření copy a do akce redirect se přidá ještě :copy, čímž se změní chování této akce (pošle kopii místo přesměrování zprávy).

České znaky v příkladu jsou kódovány jako UTF-8. To se zde týká i názvů složek. Dovecot Sieve si je pro vnitřní potřebu překódovává, protože například názvy složek jsou v upraveném UTF-7.

V příkladu si povšimněte ještě jedné věci – způsobu zápisu polí. Dávají se do hranatých závorek a prvky se oddělují čárkou. Pokud se pole použije jako parametr testu, testují se všechny hodnoty, dokud nějaká neuspěje. Je-li třeba testovat více podmínek najednou, ať už ve smyslu logického součtu či součinu (tj. musí být splněna aspoň jedna podmínka nebo naopak všechny), použije se tento zápis:

if allof(header :contains "subject" "New version", header :contains "from" "releases@nejaka.domena") {
  redirect "admin@moje.domena";
}

Cílem uvedeného konstruktu je přesměrovat na administrátora informace o nových verzích určitého programu – testuje se proto předmět zprávy a současně i adresa odesílatele. Operátor allof říká, že musí být splněny všechny podmínky uvedené v kulatých závorkách. Pro případ opačný, tedy splnění kterékoli podmínky, by se použil operátor anyof.

Ze zajímavých funkcí lze zmínit ještě například automatickou odpověď. Někdo požaduje, aby se odesílatelé zpráv dozvěděli, že si zprávy přečte až později. To lze zajistit například takovýmto pravidlem:

require ["vacation", "variables"];

if header :matches "subject" "*" {
  vacation :days 7 :subject "Auto Re: ${1}"
    "Bohužel si teď vaši zprávu nemohu přečíst. Odpovím Vám po 1.8.2010. Děkuji za pochopení.";
}

Toto bude fungovat tak, že pokud přijde zpráva, Dovecot LDA na ni automaticky odpoví. Použije k tomu původní předmět (kterému předřadí Auto Re:) a určený text. Přijde-li další zpráva od stejného odesílatele během intervalu určeného pomocí :days (zde 7 dní), další automatická odpověď se již neodesílá. Na prvním řádku si můžete všimnout zápisu požadovaných rozšíření pomocí pole (nahrazuje dva příkazy require), v podmínce zase testu matches, který umožňuje testovat za pomoci „divokých karet“ (* a ?; komu by to nestačilo, existuje rozšíření regex, které přidává do Sieve podporu regulárních výrazů).

Text je opět v kódování UTF-8. Lze však použít i jiná kódování nebo dokonce mnohem bohatší možnosti dané standardem MIME (např. alternativní verze, případně i přílohy, jakkoli je to bizarní). Jak se s tím pracuje, se dozvíte například v dokumentu RFC 5230, který se zabývá rozšířením vacation.

Uvedené příklady a komentáře k nim nepopisují ani nepatrný zlomek toho, co všechno Sieve dokáže. Ostatně už fakt, že skoro každé rozšíření má svůj vlastní dokument RFC, svědčí o komplexnosti této technologie. Koho zajímají detaily, nechť nahlédne například právě do RFC, protože dobrých informačních zdrojů o této problematice zatím bohužel moc není.

ManageSieve

link

Zbývá vyřešit ještě poslední část celého systému Sieve. Uživatel si chce nastavovat pravidla z klienta. Aby tak mohl činit, musí na serveru běžet již zmíněná služba ManageSieve. Následující popis je určen pro řešení pomocí pysieved, nicméně úprava pro nativní Dovecot ManageSieve (samozřejmě po vlastní instalaci) není těžká a potřebné informace jsou k dispozici v dokumentaci programu Dovecot.

Zprovoznění opět začíná instalací, ať už z distribučního balíčku nebo od autora. Pak je potřeba pysieved nakonfigurovat. Ještě dříve je ovšem nutno si ujasnit, zda má běžet jako standardní démon (tedy naslouchat na portu a přímo obsluhovat připojené klienty), anebo zda se bude spouštět pomocí superserveru, typicky inetd nebo xinetd. Toto rozhodnutí bude vycházet z toho, jak často budou uživatelé měnit svá pravidla. Většinou bude k takovým změnám docházet zřídka, proto je obvykle lepší šetřit paměť a využít superserver.

Konfigurace superserveru

link

Následující konfigurační soubor je určen pro xinetd a může být uložen například jako /etc/xinetd.d/sieve (za předpokladu, že se soubory jednotlivých služeb načítají z adresáře /etc/xinetd.d). Zde je pysieved nainstalován pod /opt, jde o balík získaný z webu autora.

service sieve
{
    id = sieve
    type = UNLISTED
    port = 2000
    flags = KEEPALIVE
    socket_type = stream
    wait = no
    server = /usr/bin/python
    server_args = /opt/pysieved/pysieved.py --inetd --config=/etc/pysieved.ini
    user = root
}

Typ služby je UNLISTED (nejedná se o žádnou ze specifických služeb), služba ManageSieve běží na portu 2000. KEEPALIVE říká, že se mají periodicky posílat pakety pro udržování spojení (vhodné hlavně proto, aby nezůstávaly zbytečně viset spuštěné instance pro klienty, se kterými už nelze komunikovat). Komunikace je streamová (tj. TCP), wait = no zakáže čekání na ukončení spuštěného programu (takže lze obsluhovat další klienty). Jako „server“ je zde uveden interpret jazyka Python, argumenty udávají cestu k implementaci démona a ke konfiguračnímu souboru; nezbytný je také parametr zapínající spolupráci se superserverem. Uživatel bude root, protože konkrétního uživatele pro práci si nastaví až pysieved.

Pro starší superserver inetd bude konfigurace vypadat podobně, jen bude mít jiný formát. Do konfiguračního souboru inetd (typicky /etc/inetd.conf) se přidá takovýto řádek:

sieve  stream  tcp  nowait  root  /usr/bin/python python /opt/pysieved/pysieved.py --inetd --config=/etc/pysieved.ini

Konfigurace pysieved

link

Nyní to tedy bude fungovat tak, že pokud se klient připojí na port 2000, superserver spustí instanci pysieved a předá jí komunikační kanál s klientem. Tím se to dostává do podobné situace, jako kdyby se klient připojil k trvale běžícímu démonu pysieved. Dále tedy už záleží na jeho konfiguraci. Ve výše uvedené konfiguraci xinetd je definováno, že se konfigurace pysieved bude načítat ze souboru /etc/pysieved.ini – ten může vypadat například takto:

[main]
auth = Dovecot
userdb  = Dovecot
storage = Dovecot
pidfile = /var/run/pysieved.pid

[Dovecot]
mux = /var/spool/postfix/private/auth
master = /var/run/dovecot/auth-master
sievec = /usr/libexec/dovecot/sievec
scripts = .pysieved
active = script.sieve
uid = 100
gid = 100

Konfigurační soubor má různé sekce. Zde jsou použity dvě – hlavní sekce main a sekce Dovecot pro konfiguraci programu Dovecot, jakožto služby využívané pro zajišťování různých činností. pysieved podporuje celou řadu jiných služeb (backendů), např. dokáže přímo pracovat s PAM nebo s databází MySQL, není závislý na jediném programu.

V tomto případě se pro autentizaci (auth, databázi uživatelů (userdb) a úložiště (storage) využívá Dovecot, proto je u všech služeb uveden. pidfile je obvyklý soubor s PID sloužící ke zjištění, zda je již program spuštěn a jaký má identifikátor.

Sekce Dovecot obsahuje cesty ke speciálním souborům pro autentizaci (mux) a přístup k databázi uživatelů (master). Nastaví se samozřejmě podle toho, jak je to nastaveno v konfiguračním souboru /etc/dovecot.conf. Parametr sievec je cesta ke kompilátoru pravidel Sieve – pravidla se totiž nepoužívají v původní textové podobě, nýbrž se kompilují do mezijazyka (bytecode). Plugin Sieve do Dovecot LDA si kompilaci po změně zdrojového souboru zavolá sám, nicméně využití kompilátoru v ManageSieve je výhodné pro dálkové ověření, zda jsou pravidla syntakticky správná (viz dále).

Další parametr je scripts. To je adresář (v rámci domovského adresáře uživatele pošty), do kterého se ukládají jednotlivé soubory s pravidly. Aktivní je však vždy nejvýše jeden soubor – na něj se v domovském adresáři vytvoří symbolický odkaz s názvem podle parametru active (je to přesně ta cesta, která vzniká zpracováním šablony uvedené v parametru sieve sekce plugin v konfiguračním souboru dovecot.conf). Parametry uidgid jsou identifikátor uživatele, resp. skupiny, pro běh démona (bude stejný jako uživatel pro úložiště pošty).

Takto nakonfigurovaný pysieved bude dělat přesně to, co se od něj čeká. Podle požadavků připojeného klienta bude spravovat soubory s pravidly a aktivovat/deaktivovat je. Klient se samozřejmě musí autentizovat, a to úplně stejně jako pro práci s poštou. Jak bylo řečeno výše, o toto se postará Dovecot.

Správa z klientů

link

K využití správy pravidel Sieve je potřeba mít klienta, který podporuje protokol ManageSieve. Takovými klienty jsou například Mulberry, Mozilla Thunderbird (s doplňkem Sieve) nebo webmail RoundCube. Mulberry nabízí relativně jednoduchou správu (bohužel však jeho vývoj skomírá), Thunderbird má podporu pouze pro přímou editaci kódu pravidel (ovšem s možností okamžité kontroly pomocí již zmíněného kompilátoru sievec a se zabudovanou referenční příručkou), RoundCube obsahuje snadno ovladatelnou „klikací“ správu pravidel (která však využívá jen malou část možností Sieve). Lze očekávat, že se v blízké budoucnosti dočkáme většího počtu klientských implementací (ovšem již dnes jich není zase až tak málo).

Kdo využije Thunderbird s doplňkem Sieve, bude normálně psát pravidla v té podobě, jak se objevila v příkladech v tomto článku. Která všechna rozšíření Sieve jsou k dispozici, lze najít například v tabulce na webu programu Dovecot.

Zmínku si zaslouží také globální soubor s pravidly. Ten je typicky normální soubor, který upravuje správce serveru. Nic však nebrání tomu, aby si správce vytvořil speciální poštovní účet, v uživatelsky přívětivém klientském programu si běžným způsobem připravoval pravidla pro globální použití a pak příslušný soubor použil jako globální (buď nastavením přímé cesty nebo přes symbolický odkaz, což je asi vhodnější).

Další zajímavý plugin

link

Příští díl seriálu se bude zabývat dalším zajímavým zásuvným modulem do Dovecot LDA. Bude to modul implementující přístupové seznamy. K čemu je to dobré? Uživatelé mohou různě sdílet některé své složky a nastavovat k nim přístupová práva jiným uživatelům. Zejména ve firmách je to možnost, jak si při týmové práci udržet pořádek v poště a jak zajistit, aby měli všichni k dispozici ty funkce, které potřebují.

Seriál Stavíme poštovní server (dílů: 17)

První díl: Stavíme poštovní server – 1 (Postfix), poslední díl: Stavíme poštovní server – 17 (optimalizace výkonu).
Předchozí díl: Stavíme poštovní server – 13 (doručovací agent)
Následující díl: Stavíme poštovní server – 15 (sdílení, ACL)

Související články

SPAM – greylisting ve firmě
Mailserver s odvirováním pošty
DKIM – podepisujeme e-maily na serveru
Spam: naučte se bránit
MessageWall - kladivo nejen na spam
Jsme na dovolené - automatická odpověď

Další články z této rubriky

PowerDNS – přívětivý a jednoduchý DNS server
Bootování ze sítě: pxelinux a kořenový adresář na NFS
Těžký život Do Not Track
OpenAFS – servery
Architektura IPv6 – konfigurace adres a objevování sousedů (2)

Diskuse k tomuto článku

p_a_l_o avatar 19.2.2010 07:50 p_a_l_o | skóre: 5
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Odpovědět | Sbalit | Link | Blokovat | Admin
Dekuji za dalsi dil zajimaveho clanku.

Sieve na serveru vyuzivam, konfiguraci si uzivatele zajistuji pomoci webmailu Roundcube. Mam nastaveno podobne default pravidlo pro presun spamu do slozky Junk, jako je uvedeno v clanku. Avsak pripade, ze si uzivatel nastavi sve vlastni, prestava se default pouzivat. Napada Vas jednoduche reseni, jak nejake pravidlo defaultne uplatnovat pro vsechny schranky tak, aby jej uzivatel nemohl ovlivnit? Dekuji.
19.2.2010 19:23 obrazkovy spam
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Tak odpoved na tuto otazku by zaujimala aj mna.
Luk avatar 19.2.2010 20:59 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Takové řešení existuje - resp. hned dvojí, podle toho, co je cílem. Existují totiž konfigurační parametry sieve_before a sieve_after, které umožňují definovat další Sieve skripty (nebo celé adresáře se skripty). Pravidla v sieve_before se zpracují před uživatelskými pravidly, sieve_after po nich (ale jen v případě, že zpráva zůstává ve zpracování). Takže pokud už se má nějaké zpracování vynucovat všem uživatelům (i když to obecně nevidím jako přínosné), lze to využít. Všechny tyto skripty (stejně jako skript s globálními pravidly) se musí předem kompilovat pomocí sievec.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
p_a_l_o avatar 24.2.2010 15:56 p_a_l_o | skóre: 5
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Toto jsem uz neuspesne zkousel drive. Projdu si to znovu a v pripade, ze bych neobjevil chybu, to zkusim popsat detailni konfiguraci.

Vy sieve_before a sieve_after pouzivate uspesne?
Luk avatar 24.2.2010 18:39 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Vy sieve_before a sieve_after pouzivate uspesne?
Nepoužívám vůbec. Zatím jsem neměl takovou potřebu a obecně mě nenapadá příliš případů, kdy to má smysl (proto jsem to ani neuvedl v článku). Nicméně to mohu příležitostně vyzkoušet.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
Luk avatar 24.2.2010 18:52 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Tak jsem teď čistě pro zajímavost vyzkoušel sieve_before a funguje bez problémů.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
19.2.2010 09:12 Lampa
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Odpovědět | Sbalit | Link | Blokovat | Admin
Je nejaky duvod proc nepouzit nativní Dovecot ManageSieve ?

19.2.2010 09:40 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
V mém případě dřív důvod byl - prostě neexistoval :-) Shodou okolností jsem asi před měsícem instaloval další mailserver a tam jsem ho už nahodil, funguje dobře, akorát jsem musel kompilovat balíček, protože v distribuci se s ním zatím nepočítá :-(
-- Nezdar není hanbou, hanbou je strach z pokusu.
rudiik avatar 20.2.2010 18:02 rudiik | skóre: 16 | blog: rudiikuv miniblog
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Ja sem pri migraci z Cyrusu na Dovecot s radosti shledal, ze v Debianu se se Sieve pocita na 100% a je tam podpora pro Sieve i managesieve primo v Dovecotim balicku.
KDE 2.0 .. KDE 3.5.10 -> KDE 4.1 .. KDE 4.4.5 -> E17 Alpha/Beta -> Trinity 3.5.12 -> GNOME 2.30 -> KDE 4.6.5
Luk avatar 20.2.2010 20:18 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
U které verze Debianu? Totiž že pro poslední stabilní verzi, tj. 5.0 čili Lenny, toto rozhodně neplatí (tam je dokonce pořád ještě Dovecot 1.0).
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
21.2.2010 12:51 PM
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
lenny-backports - dovecot 1.2.10
Luk avatar 21.2.2010 13:19 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
V Backports ano, v distribuci jako takové (ve standardních repozitářích) ne. Navíc toto platí jen v poslední době, ještě relativně nedávno (před pár týdny, již během vzniku seriálu) byly Dovecot balíčky v Backports o několik verzí za zdrojáky (lze to dohledat v diskusích, tam už jsme to jednou řešili).
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
19.2.2010 10:16 ext3fs
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Odpovědět | Sbalit | Link | Blokovat | Admin
Lze nejak pomoci Sieve nahradir nasledujici pravidla maildropu?
...
xfilter "/usr/sbin/spamc"

... 

if (/^X-Spam-Status: *Yes/)
{
  exception {
   to ...
  }
}
...
19.2.2010 13:00 ext3fs
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Uz jsem prisel na jedno z reseni. V master.cf dat pred radek kde se posta dorucuje jednoduchy skript, kterym se zprava prozene pres spamc a sendmailem vrati zpet do fronty.
19.2.2010 23:49 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Není lepší používat Amavis na kontrolu spamu (spamassassin, dspam co je libo) a virů (lze použít prakticky libovolný antivir), který navíc umožňujě integraci třeba s LDAPem nebo nějakou vhodnou SQL DB a uživatel si pak může nastavit co a jak chce kontrolovat?
-- Nezdar není hanbou, hanbou je strach z pokusu.
Luk avatar 20.2.2010 00:33 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Já rozumím tomu, co chce tazatel realizovat - ostatně to mám v Sieve nastaveno také. Prostě když se něco při kontrole označí jako spam, spadne to do složky Junk. Tím je zajištěno, že to nestraší v Inboxu, ale současně si to uživatel může přečíst. Jediné, co na tom nechápu, je potřeba nutit takové chování všem uživatelům, bez možnosti ho změnit. Ať si to každý nastaví, jak chce. To už považuji za vhodnější generovat nově vytvářeným uživatelům jejich vlastní skript, kde takové pravidlo bude - pak si ho tam mohou ponechat nebo ho odstranit, jak budou chtít.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
Luk avatar 19.2.2010 20:47 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Co by to mělo dělat (maildrop po této stránce vůbec neznám, nic mi to neříká)?
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
20.2.2010 14:32 ext3fs
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Ten priklad pro maildrop hleda v dobe trideni zpravy do slozek zda je v hlavicce mail oznacen jako spam a dle toho se zprava kopiruje do prichozi posty nebo do slozky Spam.

Uz jsem pro Sieve naspal neco takoveho:
require ["fileinfo", "copy"];

if header :contains "X-Spam-Status" "Yes"
{
       setflag "$Junk";
       fileinto ".Spam";
       stop;
}
else
{
        "fileinto" :copy folder: "/home/backup/%d/%n";
Nicmene mi to nefunguje. Domnival jsem se, ze misto %d se doplni domena.tld a misto %n username. Existuje nejaky elegantni a funkcni zpusob, jak dostat z hlavicky uzivatele a domenu (treba i nejak parsovat To:)...?
20.2.2010 15:39 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Řešit To: není dobrý nápad, protože obecně nemá vůbec žádnou souvislost s adresou příjemce.
Luk avatar 20.2.2010 17:06 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Nepochopil jsem, proč se má zpráva kopírovat do příchozí pošty. Vložení do příchozí pošty je přece výchozí akce, kterou není třeba explicitně definovat - stačí udělat explicitní přesun v případě spamu, čili stačí úvodní if, to else už je zbytečné. Mimochodem zbytečný je i příkaz stop, protože akce fileinto ruší implicitní keep (viz RFC 5228, bod 2.10.2) a žádný jiný důvod k uvedení zde není.

Není to myšleno jako zálohování (když tam vidím to backup)? Pokud ano, tak mi to nepřijde jako příliš smysluplné řešení, spíš jako takové "velkobratrské" (ukládá se všechno, nezálohuje se stav ke konkrétnímu okamžiku).
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
20.2.2010 18:55 ext3fs
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Ano, /home/backup/... je opravdu zalohovani nebo spis kopirovani veskere prichozi posty (coz je prani zamestnavatele), takze mne jde jen o to, jak to do te zalozni slozky dostat.
20.2.2010 19:35 jozefmak
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Ak je SMTP server Postfix, asi by som taketo nieco riesil skor direktivou always_bcc - a je to riesene pre vsetkych prijimatelov na serveri.
Luk avatar 20.2.2010 20:53 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Kdyby Dovecot Sieve podporoval rozšíření editheader podle RFC 5293, bylo by to velmi jednoduché - stačilo by podle obálkového příjemce vytvořit novou hlavičku (např. X-Original-Recipient), pak to přeposlat na speciálního uživatele (třeba velkybratr@moje.domena), u něj pak tuto hlavičku rozežírat a zprávy správně třídit. Jenže protože zatím toto rozšíření podporováno není, nelze takové řešení použít.

Možná by se ale dala rozežírat hlavička Delivered-To, protože je možné (ale to právě nevím), že se přidává do zprávy až na konci zpracování LDA. Chtělo by to prověřit, zda tam po přeposlání kopie nejsou ty hlavičky dvě. Pokud je tam opravdu jen ta první, je vyhráno - stačí hlavičku pomocí :domain a :localpart rozežrat do proměnných a podle nich pak uložit zprávu do správné složky.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
21.2.2010 13:26 ext3fs
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
V postfixu resim pres externi content filtr (v master.cf) vyhodnoceni zda je prijemce v hlavicce a obalce stejny a pokud je z nasi domeny, vyhodnuciji take zda sla zprava z povolenych siti (cimz samozrejme nervyresim pokud nekdo posila pres T-Mobile, atp) coz je dostatecna kontrola proti falsovani adresy odesilatele. Do hlavicky pridam X-Muj-Filtr: {OK,BAD} a dle toho si SpamAssasin prideli odpovidajici skore. Takze zpravy kde je falsovana adresa odesilatele stejne skonci ve spamu a co ma jit do meho /home/backup/DOMAIN/USERNAME mi klidne staci urcit z hlavicky To:. Ted se divam, ze by to melo jit pomoci pluginu "envelope" tedy urcit :domain a :localpart.

Staci pak tedy neco takoveho?
require ["fileinfo", "copy", "envelope"];

if header :contains "X-Spam-Status" "Yes"
{
       setflag "$Junk";
       fileinto ".Spam";
       stop;
}
else
{
        "fileinto" :copy folder: "/home/backup/:domain/:localpart";
}
Luk avatar 21.2.2010 14:40 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Tohle je bohužel chybná syntaxe. Jsou tam dva problémy - jednak nevím o tom, že by šlo místo názvů složek (resp. schránek) uvádět absolutní cesty. Navíc takto to definovat nejde. Muselo by se udělat něco tohoto typu:
require ["fileinto", "copy", "envelope", "variables"];

...

if allof(envelope :domain :matches "to" "*", envelope :localpart :matches "to" "*") {
  fileinto :copy "/home/backup/${1}/${2}";
}
Je to jen hrubý nástřel. Dělá to to, že se vyhodnocují obě části adresy obálkového příjemce, dají se do proměnných a tyto proměnné se pak použijí. Jenže zásadní problém bude v tom, že asi nebude možné použít absolutní cestu k poštovní složce (nezkoušel jsem, v dokumentaci o tom nic není, nicméně velmi pochybuji).
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
21.2.2010 15:41 ext3fs
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
To je docela skoda, ze to nijak jednoduse nepujde. Vytvarim zalozni mail server ktery by byl migrovan po odladeni i na hlavni mailserver (na kterem ted bezi prave Courier IMAP + Courier maildrop). Dovecot se mi v posledni dobe velmi zamlouva, nicmene mame reseno pres maildrop dost specialnich veci a bude asi tezke preklopeni na Dovecot LDA.
Luk avatar 21.2.2010 16:03 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Ono by to šlo řešit "jednoduše", tedy přeposláním kopie na nějakého speciálního uživatele. Jenže problém je v tom, že jediná hlavička, ze které by se dala získat adresa původního uživatele, je To:, která nemusí odpovídat skutečnosti. Hlavičku Delivered-To: jsem teď zkusil, ale tu použít nelze, protože se tam vloží ve druhém exempláři při doručování po přeposlání.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
21.2.2010 17:03 ext3fs
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
To ale stale neresi situaci, kdy potrebuji mit kopie ne v Maildiru urciteho uzivatele, ale v uplne jine ceste, ktera by mela vypadat nejlepe takto:

/home/backup/DOMENA/UZIVATEL/new

kde platne virtualni ucty jsou v /home/virtual/DOMENA/UZIVATEL

Jeste mne teda napada vlozit pred frontu (v master.cf) skript, ktery by udelal kopii, respektive nakopiroval email do zaloh a zpravu poslal zpet do fronty postfixu kde ji prevezme deliver. Tohle asi neni uplne nejsistci reseni.

Luk avatar 21.2.2010 18:00 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
To ale stale neresi situaci, kdy potrebuji mit kopie ne v Maildiru urciteho uzivatele, ale v uplne jine ceste
To je velmi snadno řešitelné tím, že se ten Maildir umístí na tu správnou cestu.
Jeste mne teda napada vlozit pred frontu (v master.cf) skript, ktery by udelal kopii, respektive nakopiroval email do zaloh a zpravu poslal zpet do fronty postfixu kde ji prevezme deliver. Tohle asi neni uplne nejsistci reseni.
Pak existují ještě jiná řešení. Tak například využít incron, pokud by už uměl rekurzivně sledovat celé podstromy filesystému (ššššššššš - to se snáší popel na moji hlavu ;-)). Nebo použít jiné programy, které už to umějí, např. inotify-tools. Pak stačí jen chytat událost IN_MOVED_TO, testovat, zda šlo o přesun z adresáře tmp do new v rámci inboxu (protože to je operace, kterou je završeno doručení zprávy) a pak už jen kopírovat příslušné zprávy.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
Luk avatar 21.2.2010 18:02 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
zda šlo o přesun z adresáře tmp do new v rámci inboxu
Resp. spíš nejen v rámci inboxu, ale ve všech poštovních složkách kromě spamové.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
21.2.2010 19:25 ext3fs
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Reseni to pochopitelne je, ale pak se vkrada myslenka, zda neni pro mou situaci lepsi zustat u maildropu...coz je dost neprijemna myslenka. Snazim se jak to jde po letech maildrop opustit (minimalne proto, ze overovani proti MySql je u maildropu v kombinaci Cyrus SASL (authlib) problematicky provozuschopne a overovani pomoci Dovecotu vyzaduje patch maildropu,...).
Luk avatar 21.2.2010 20:05 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Osobně pro podobné případy využívám právě incron (ostatně právě proto jsem ho vytvořil, přestože prvotní impuls vyšel od někoho v diskusi), i když je samozřejmě žádoucí řešit věci co nejjednodušeji, nejčistěji a s použitím co nejméně komponent.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
rudiik avatar 20.2.2010 17:58 rudiik | skóre: 16 | blog: rudiikuv miniblog
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
To jsou v zasade 2 odlisne problemy. Dive jsem sice take volal spamc z procmailu, ale postupem casu jsem presel na zminovany Amavis, ktery se pro Postfix chova jako content_filter, dostane zpravu od postfixu pres SMTP, provede testy dle definic (0-x antiviru), dspam, spamassassin a zase pres SMTP vrati zpet postfixu se Spam a AV hlavickami. Obavam se, ze volat externi program ze sieve scriptu nejde, ale mohu se mylit. Samotne filtrovani X-Spam-Status neni se Sieve zadny problem, mam to tusim dokonce definovane jako global rule pro vsechny usery.
KDE 2.0 .. KDE 3.5.10 -> KDE 4.1 .. KDE 4.4.5 -> E17 Alpha/Beta -> Trinity 3.5.12 -> GNOME 2.30 -> KDE 4.6.5
20.2.2010 19:37 jozefmak
Rozbalit Rozbalit vše Re: Stavíme poštovní server – 14 (Sieve)
Odpovědět | Sbalit | Link | Blokovat | Admin
Mna by skor zaujimalo, ci existuje sposob, ako skompilovany sieve skript dekompilovat naspat na povodny skript - sieved dekompiluje len na uroven akehosi metajazyka...

Napriklad, ked si pouzivatel zmaze svoj 'vymazleny' sieve skript a zostane len v binarnej podobe...

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.