Qmail

Qmail jest alternatywnym systemem transportu poczty elektronicznej, opracowanym przez prof. Dana J. Bernsteina. Podobnie jak inne oprogramowanie jego autorstwa, również qmail charakteryzuje się dość nietypową konstrukcją, ale również ponadprzeciętnym bezpieczeństwem i ogromną wydajnością.

Głównym powodem, dla którego administratorzy chętnie instalują tą aplikację jest bezpieczeństwo. Autor oferuje nagrodę w wysokości $1000 dla pierwszej osoby, która odnajdzie jakikolwiek błąd zagrażający bezpieczeństwu. Nie jest to łatwe, gdyż qmail nie wykorzystuje prawie żadnych funkcji ze standardowej biblioteki libc. Zamiast tego autor opracował własne biblioteki, zawierające ogrom przydatnych funkcji, jednakże zbudowanych w sposób absolutnie bezpieczny. Nie bez znaczenia jest również fakt, że qmail jest rozwiązaniem całkowicie modularnym, przy czym prawie żaden z modułów nie pracuje z uprawnieniami superużytkownika, dodatkowo nie ufając innym częściom. Wszystkie te czynniki sprawiły, że jak do tej pory nie odnaleziono żadnego błędu zagrażającemu bezpieczeństwu qmaila, tak więc nagroda ufundowana przez autora nie została odebrana.

Innym ważnym dla administratorów aspektem jest wydajność. W połączeniu z pakietami daemontools oraz ucspi-tcp, qmail pozwala osiągnąć poziom 9 milionów lokalnych wiadomości dziennie na komputerze klasy 486. Czyni go to bezsprzecznym liderem wśród Unixowych systemów dostarczania poczty. Pamiętajmy, że autor jest profesorem matematyki, tak więc bez wątpienia potrafi projektować wydajne algorytmy -- jednym z takich przykładów jest doskonały format baz danych -- cdb, używany w większości aplikacji autorstwa DJB.

Godny wspomnienia jest również fakt, że do qmaila istnieje mnóstwo łat, modyfikujących jego funkcjonalność, np. wprowadza obsługę użytkowników w bazie SQL.

Struktura

Aplikacja składa się z następujących modułów:





   qmail-smtpd - obsługuje pocztę przychodzącą przez SMTP,

   qmail-inject - obsługuje pocztę przychodzącą lokalnie,

   qmail-queue - współpracując z powyższymi dwoma modułami, umieszcza wiadomości w kolejce,

   qmail-send - odczytuje kolejkę i decyduje o dostarczeniu wiadomości,

   qmail-clean - czyści i zarządza kolejką,

   qmail-lspawn - wykonuje moduł przeprowadzający lokalne dostarczanie,

   qmail-local - lokalne dostarczenie wiadomości

   qmail-rspawn - wykonuje moduł przeprowadzający zdalne dostarczenie,

   qmail-remote - przekazuje wiadomość przy pomocy protokołu SMTP do innego hosta,

   tcpenv+inetd lub ucspi-tcp - przyjmuje połączenie na port usługi SMTP, ustawia potrzebne zmienne środowiskowe, ogranicza dostęp,

   qmail-pop3d - demon POP3 obsługujący jedynie format Maildir,

   qmail-popup oraz checkpassword - autoryzują użytkownika oraz uruchamiają qmail-pop3d.

Z prawami superużytkownika pracuje jedynie moduł qmail-lspawn, gdyż musi mieć możliwość zmiany swoich przywilejów przed lokalnym dostarczeniem wiadomości. Moduł qmail-queue uruchamiany jest z podwyższonymi prawami pozwalającymi na zapis do kolejki (użytkownik qmailq). Pozostałe części nie mają żadnych dodatkowych praw, ani nie są zależne od innych aplikacji. Dostarczanie poczty na konto z UID=0 jest celowo zabronione, administrator może jedynie skorzystać z aliasa.

Cała aplikacja zbudowana jest w oparciu o własne biblioteki autorstwa D. J. Bernsteina, zastępujące większość funkcjonalności libc. Autor rezygnuje z funkcji z rodziny *printf(), wszystkie bufory alokuje dynamicznie (stralloc()), a operacje łączenia i kopiowania łańcuchów przeprowadza własnymi funkcjami, sprawdzającymi rozmiar kopiowanych danych i operujących na dynamicznych buforach. Docelowo również zostanie zastosowana biblioteka dnslib z pakietu djbdns, która jest o wiele bardziej wydajna i schludna niż rozwiązanie pochodzące z ISC i dołączone do biblioteki standardowej w każdym systemie.

Instalacja

Instalacja qmaila na FreeBSD jest niezwykle prosta. Ogranicza się zbudowania aplikacji z systemu portów lub zainstalowania gotowego pakietu. Osobiście polecam to pierwsze rozwiązanie, które polega na wydaniu następującej komendy:

cd /usr/ports/mail/qmail && make all install clean

Instalacja z pakietu jest rownie nieskomplikowana, przy okazji nieco szybsza:

pkg_add ftp://ftp.pl.freebsd.org/pub/FreeBSD/releases/i386/4.2-STABLE/packages/All/qmail-1.03.tgz

Po instalacji, binaria oraz pliki konfiguracyjne programu znajdują się w katalogu /var/qmail. Struktura katalogów wygląda następująco:





   alias/ - lokalne aliasy, każdy w postaci pliku .qmail-nazwa

   bin/ - binaria programu

   boot/ - skrypty startowe

   configure/ - skrypty autokonfiguracji

   control/ - pliki konfiguracyjne

   doc/ - dokumentacja

   man/ - manuale

   queue/ - kolejka pocztowa

   users/ - bazy użytkowników wirtualnych

Pierwszym krokiem jest wyłączenie dotychczas używanego oprogramowania pocztowego. Dla sendmaila czynimy to wykonując następujące komendy:

echo "sendmail_enable=\"NO\"">> /etc/rc.conf
killall sendmail
chmod a-s /usr/libexec/sendmail/sendmail /usr/libexec/mail.local
echo "sendmail /var/qmail/bin/sendmail"> /etc/mail/mailer.conf
echo "send-mail /var/qmail/bin/sendmail">> /etc/mail/mailer.conf

Następnie, należy wybrać skrypt startowy spośród tych znajdujących się w katalogu boot/:





   binm1 - dostarczanie poczty przez mail.local (BSD)

   binm2 - dostarczanie poczty przez mail (SVR)

   binm3 - dostarczanie poczty przez mail (V7)

   home - dostarczanie poczty do ~/Mailbox

   maildir - dostarczanie poczty do ~/Maildir/

   proc - dostarczanie poczty przez procmail

We wszystkich powyższych przypadkach, logi są przesyłane do demona systemowego syslogd. Po wybraniu stosownego skryptu, należy go przenieść do /var/qmail/rc.

Ostatnim wymaganym krokiem konfiguracji jest zapewnienie odbierania poczty przy pomocy protokołu SMTP. Czynimy to dopisując odpowiednią linijkę do pliku /etc/inetd.conf:

echo "smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd">> /etc/inetd.conf
killall -HUP inetd

Od tej chwili korzystanie z podstawowych funkcji pakietu qmail jest już możliwe.

Konfiguracja

Pakiet qmail mimo prostej kontrukcji zapewnia ciekawe możliwości dostosowywania do własnych potrzeb. Konfigurację przeprowadza się poprzez tworzenie plików w katalogu control/. Jedną z najczęściej używanych możliwości qmaila są domeny wirtualne. Zarządzanie nimi jest banalnie proste, gdyż sprowadza się jedynie do dopisania domeny do pliku control/rcpthosts i control/virtualdomains, a następnie na utworzeniu aliasa obsługującego domenę.

Aliasy systemowe dostępne są w katalogu /var/qmail/alias. Są one pojedynczymi plikami o nazwach w postaci .qmail-nazwa, zawierającymi odwołanie do innego konta (ew. listy kont) lub programu. Dostępne są również aliasy domyślne w postaci plików .qmail-nazwa-default, przekazujące całą pocztę wysyłaną na adres nazwa-*@host.

Użytkownicy mogą również tworzyć swoje własne aliasy, bez konieczności ingerencji administratora. Pozwala to na prostą realizację list wysyłkowych, a osiągnąć to można poprzez utworzenie pliku $HOME/.qmail-nazwa. Działanie takie sprawi, że docierać do niego będzie poczta wysłana na adres uzytkownik-nazwa@host. Domyślnym plikiem, który brany jest podczas doręczania poczty do użytkownika, jest plik $HOME/.qmail.

Zezwolenie na przepuszczanie adresu docelowego można uzyskać dopisując go do pliku control/rcpthosts, natomiast w przypadku hostów źródłowych wystarczy ustawienie zmiennej środowiskowej $RELAYCLIENT z poziomu tcpwrappers.

Możliwości konfiguracji może nie są tak duże, jak w przypadku sendmaila, czy niektórych innych MTA, aczkolwiek konfiguracja jest dość prosta i logicznie zaprojektowana, a także pozwala na dostosowywanie wielu cech do własnych potrzeb.

Podsumowanie

Pakiet qmail stanowi bardzo ciekawe alternatywne rozwiązanie dla administratorów kładących nacisk na wydajność i bezpieczeństwo. Aczkolwiek jeżeli priorytetem jest elastyczność konfiguracji, należy przemyśleć instalację zmailera lub sendmaila.


Creative Commons License
Wszystkie materiały na mojej stronie dostępne są na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Na tych samych warunkach 2.5 Polska.