Job / Praca

    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.

    Related Posts with Thumbnails

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

    Comments

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

    2. procmail do virtualnych kont chyba raczej kiepsko, a o sieve nie słyszałem, ale popatrzę, chociaż składnia chyba trudniejsza niż imapfilter :)

    Leave a Reply

    Add your widget here