Bezpieczne filtrowanie poczty przy pomocy imapfilter

Jeśli dostajecie mnóstwo maili codziennie, zapewne filtrujecie je w tym czy innym programie pocztowym. Jeśli jednak wyłączycie ten program, wszystkie maile trafiają do INBOX i tam czekają na swój los do czasu uruchomienia programu pocztowego który je odfiltruje. Problem pojawia się kiedy odbieramy maile na telefonie, lub na innym komputerze. Na innej maszynie można od biedy przenieść regułki filtrowania, ale robić to przy okazji każdego użycia nowego komputera albo webmaila nie ma sensu. W przypadku telefonu jest jeszcze gorzej, a ikonka koperty z liczbą 900+ zniechęca w ogóle do przeglądania poczty.

Do sprawy podchodzimy oczywiście kompleksowo, jako Admini wiemy, że trzeba się tak napracować aby się na dłuższą metę nie narobić :) Dlatego najrozsądniejszym rozwiązaniem jest użycie imapfilter‘a na jakiejś UNIXowej maszynie, która i tak ciągle mieli powietrze (oczywiście w przerwach kiedy coś robi pożytecznego ;). Jeśli jesteście adminami własnego serwera pocztowego to już nie ma lepszego miejsca – łączenie do localhost jest najszybsze i najbezpieczniejsze bo nie wychodzimy poza maszynę gdzie mamy pocztę.

Imapfilter korzysta z języka LUA, którego składnia jest dość prosta a opcje imapfiltra bardzo dobrze opisane w man imapfilter_config.

Mój przykładowy konfig wygląda tak:

options.timeout = 120
options.subscribe = true

account = IMAP {
server = 'localhost',
username = 'login@domena.pl',
password = 'haslo',
}

arpwatch = account.INBOX:contain_from('arpwatch@domena.pl')
account.INBOX:move_messages(account['Raporty.Arpwatch'], arpwatch)

vpnok = account.INBOX:contain_subject('VPN Accepted!')
account.INBOX:move_messages(account['Raporty.VPN.OK'], vpnok)

vpnbad = account.INBOX:contain_subject('VPN Rejected')
account.INBOX:move_messages(account['Raporty.VPN.Rejected'], vpnbad)

eventsentry = account.INBOX:contain_from('eventsentry@domena.pl')
account.INBOX:move_messages(account['Raporty.Event\ Sentry'], eventsentry)

potwierdzenia = account.INBOX:contain_subject('Przeczyt') +
account.INBOX:contain_subject('Potwierdzenie doręczenia wiadomości') +
account.INBOX:contain_subject('Potwierdzenie dostarczenia wiadomosci') +
account.INBOX:contain_subject('Read:') +
account.INBOX:contain_subject('Potwierdzenie otrzymania:') +
account.INBOX:contain_subject('Potwierdzenie dostarczenia wiadomości') +
account.INBOX:contain_subject('wietlono)')
account.INBOX:move_messages(account['Potwierdzenia'], potwierdzenia)

Na co warto zwrócić uwagę:
+ oznacza OR
* oznacza AND
– oznacza NOT

Jeśli podkatalog w Maildirze zawiera spację, trzeba ją wyESCkejpować – np. Raporty.Event\ Sentry

Cały konfig zapisujemy w domyślnym katalogu dla imapfiltra czyli $HOME/.imapfilter/config.lua i odpalamy na początek z opcją -v aby zobaczyć więcej komunikatów. Jeśli plik z konfiguracją nazywa się inaczej lub jest w innym miejscu wywołujemy imapfilter -v -c /sciezka/do/konfiga

Jeśli nie ma błędów możemy przejść do dalszej części.

W zasadzie to jest gotowe rozwiązanie, jeśli jesteśmy sami na serwerze. Jeśli są inni użytkownicy, którzy dodatkowo posiadają prawa root’a albo po prostu nie pasuje nam pozostawiania swojego hasła gdzieś w postaci jawnego tekstu możemy zrobić taki manewr.

W przypadku NetBSD instalujemy paczkę:
wip/ccrypt: Encrypts/decrypts files using Rijndael block cipher
oraz
sysutils/shc: Shell script to C compiler

Piszemy prosty skrypt który będzie:

– dekryptował nasz konfig
– wykonywał konfig przy pomocy imapfiltra
– kryptował konfig z powrotem

na poczatek kodujemy config:

ccencrypt -e -K supertajnehaslo! config.lua

w wyniku dostajemy plik config.lua.cpt

Teraz skrypt:

#!/bin/sh
ccencrypt -d -K supertajnehaslo! config.lua.cpt
imapfilter -c /sciezka/do/pliku/config.lua
ccencrypt -e -K supertajnehaslo! config.lua

Po wykonaniu tego skryptu jeśli ścieżki się w nim zgadzają do programów i do konfiga, uprzednio skonfigurowane filtrowanie powinno zadziałać.

No dobra, tylko co daje kodowanie pliku jeśli hasło podajemy jako parametr? W takim wypadku nic nie daje, łatwo podejrzeć hasło i zdekodować plik konfiguracji gdzie jest hasło do naszej poczty.

Należy zatem “skompilować” skrypt przy pomocy shc.

shc -v -r -T -f skrypt.sh

W wyniku dostaniemy:

skrypt.sh.x – binarka gotowa do odpalenia
skrypt.sh.x.c – kod źródłowy wygenerowany z naszego skryptu w takim jakby C.

Sprawdzamy czy uruchomienie ./skrypt.sh.x robi dokładnie to samo co odpalenie imapfiltra lub skrypt.sh. Jeśli tak to pozostaje nam skasować skrypt.sh gdzie mamy jawny klucz do zakodowanego pliku z konfigiem do imapfiltra gdzie mamy jawne hasło do naszego konta pocztowego :) oraz kasujemy skrypt.sh.x.c gdzie mamy źródła naszej binarki. Nadajemy prawo x do wykonywanie pliku – chmod 700 skrypt.sh.x

Na koniec dodajemy do crona wywoływanie programu co ileś tam minut:

crontab -e
*/1 * * * * /usr/home/cancer/skrypt.sh.x

Od teraz skrypt będzie dokonywał filtrowania co minutę na chwilę dekodując plik z konfiguracją, po czym będzie go kodował. Oczywiście rozwiązanie nie jest idealne, co prawda w ps hasło się nie pojawi, ale można debugować jakby się ktoś uparł. Lepsze jednak takie rozwiązanie niż żadne.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)
Related Posts with Thumbnails

© odwiedź stronę http://maciejewski.org po więcej fajnych postów!

2 thoughts on “Bezpieczne filtrowanie poczty przy pomocy imapfilter

  1. A nie lepiej użyć po prostu procmaila? Albo sieve (są pluginy do różnych webmaili, jeśli używasz jakiegoś).

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. procmail do virtualnych kont chyba raczej kiepsko, a o sieve nie słyszałem, ale popatrzę, chociaż składnia chyba trudniejsza niż imapfilter :)

    VN:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Time limit is exhausted. Please reload the CAPTCHA.

CommentLuv badge