Konfiguracja uwierzytelniania poczty w LDAP
Zakładam, że Dovecot i Postfix już działają i można odebrać i wysłać pocztę logując się na użytkownika systemowego (patrz poprzednie wpisy). Nadszedł zatem czas na uruchomienie uwierzytelniania w naszym katalogu LDAP (patrz konfiguracja LDAP).
Wykorzystanie LDAPa do uwierzytelniania użytkowników pozwala na elastyczne zarządzanie hostingiem poczty i nie tylko. LDAP jest już przyjętym standardem w zakresie uwierzytelniania i autoryzacji, praktycznie każde szanujące się oprogramowanie wymagające uwierzytelnienia ma wsparcie dla tego protokołu.
Zaczniemy od serwera POP3/IMAP, który również dostarcza mechanizmu uwierzytelniania dla Postfixa czyli od Dovecota:
/usr/bin/sudo -i
cd /etc/dovecot
vi dovecot-ldap.conf
W tym pliku musimy zdefiniować parametry serwera lub serwerów LDAP, metodę uwierzytelnienia oraz filtry i atrybuty, wymienię te, które trzeba ustawić:
hosts = localhost
auth_bind = yes
base = o=hosting,dc=example,dc=com
scope = subtree
user_attrs = homeDirectory=home
user_filter = (&(objectClass=mailUser)(mail=%u))
pass_attrs = mail=user,userPassword=password
pass_filter = (&(objectClass=mailUser)(mail=%u))
a teraz pokrótce je opiszę:
hosts - lista serwerów LDAP rozdzielona spacjami, dopuszczalne jest także podanie portu, np. localhost ldap1:1389 192.168.1.2:2389
auth_bind - sposób przypięcia do LDAPa, yes oznacza, że dovecot użyje tego co poda klient, drugi sposób to zdefiniowanie użytkownika,
posiadającego uprawnienie do odczytania atrybutu userPassword i porównanie go z hasłem podanym przez klienta
base - bazowy DN, w którym należy szukać użytkowników
scope - zakres przeszukiwania, subtree oznacza bazowy DN i poniżej całe drzewo, możliwe są jeszcze base (tylko bazowy DN) i onelevel (poziom poniżej DN)
user_attrs - mapowanie atrybutów użytkownika, tutaj ustawiam atrybut homeDirectory z LDAP jako katalog domowy użytkownika (home)
user_filter - filtr używany do przeszukiwania katalogu LDAP, tutaj interesują wpisy, które posiadają klasę obiektu mailUser i adres email
podany przez klienta (%u), proszę zwrócić uwagę, że używam pełnego adresu email (atrybut mail) a nie domyślnego uid
pass_attrs - mapowanie atrybutów hasła i znów jako użytkownika używam adresu email (niemal wymagane gdy się hostuje więcej domen)
pass_filter - jak user_filter
To jeszcze nie koniec konfiguracji Dovecota, ale na razie przeniesiemy się do LDAPa i dodamy odpowiednie wpisy. Można do tego celu użyć jakiegoś narzędzia do zarządzania, o których wspomniałem wcześniej, ja np. użyłem phpLDAPadmina i dodałem taki wpis:
dn: o=hosting,dc=example,dc=com
o: hosting
objectclass: organization
objectclass: top
będzie to bazowy DN dla naszego systemu pocztowego. Tutaj umieścimy nasze wirtualne domeny bazując na klasie mailDomain ze schematu iredmail.ldif
, którego konwersję i dodawanie do LDAPa opisałem wcześniej. LDIF dla domeny:
dn: domainName=example.com,o=hosting,dc=example,dc=com
domainname: example.com
objectclass: mailDomain
objectclass: top
Klasa mailDomain ma możliwość ustawienia jeszcze wielu przydatnych atrybutów, ale na razie tyle nam wystarczy. Dodajemy pierwszego użytkownika, oczywiście żeby nie być RFC ignorant powinien to być postmaster (tutaj z hasłem: ‘example’):
dn: uid=postmaster,domainName=example.com,o=hosting,dc=example,dc=com
cn: postmaster
mail: postmaster@example.com
objectclass: inetOrgPerson
objectclass: top
sn: Postmaster
uid: postmaster
userpassword: {MD5}Gnmk1g3mcY6OWzJuM4rlMw==
Proszę zwrócić uwagę, że nie dodałem mailUser lecz inetOrgPerson, gdyż mailUser nie jest klasą strukturalną i jako samodzielnej nie będzie się dało dodać do katalogu. Teraz dodamy klasę mailUser, bo inaczej filtr dovecota nie wybierze tego wpisu. Nasz LDIF:
dn: uid=postmaster,domainName=example.com,o=hosting,dc=example,dc=com
changetype: modify
add: objectclass
objectclass: mailUser
Czas wrócić do konfiguracji dovecota i włączyć uwierzytelnianie w katalogu LDAP, edytujemy plik dovecot.conf
i ustawiamy:
mail_uid = 501
mail_gid = 501
auth_verbose = yes
auth_debug = yes
w sekcji auth default
:
mechanisms = plain login
passdb ldap {
# Path for LDAP configuration file
args = /etc/dovecot/dovecot-ldap.conf
}
userdb ldap {
# Path for LDAP configuration file
args = /etc/dovecot/dovecot-ldap.conf
}
Dodajemy grupę i użytkownika do systemu i tworzymy katalog domowy:
groupadd -g 501 vmail
useradd -g vmail -u 501 -d /vdhome -m -s /bin/false -c "Virtual mail user" vmail
Restartujemy dovecota, konfigurujemy program pocztowy i próbujemy się zalogować z klienta (np. Thunderbird) przy okazji śledząc logi:
service dovecot restart
tail -f /var/log/mail.log /var/log/auth.log /var/log/syslog
Jeśli udało się Wam zalogować do poczty to albo opis jest taki dobry albo po prostu nie wiecie wszystkiego. Prawo Murphyego dotyczące elektroniki mówi, że gdy układ elektroniczny zadziała za pierwszym razem to na pewno jest wadliwy 😉 W informatyce jest podobnie. Prawdopodobnie pierwszy problem jaki napotkacie, to będzie upór klienta poczty aby użyć samej nazwy użytkownika (postmaster) a nie pełnego adresu email (postmaster@example.com) do logowania. Szczególnie te nowe wersje, które same próbują się konfigurować są pod tym względem uparte – jak ja nie lubię jak maszyny próbują wiedzieć lepiej…
No ale załóżmy, że opis faktycznie jest dobry i udało się przekonać klienta, żeby używał pełnego emaila do logowania lub zmieniliście filtry i mapowanie atrybutów tak, aby logował po nazwie bez domeny i udało się zalogować. Powinna zostać utworzona podobna struktura katalogów:
ls -la /vdhome/example.com/postmaster/Maildir/
total 40
drwx------ 6 vmail vmail 4096 2010-12-03 22:34 .
drwx------ 3 vmail vmail 4096 2010-12-03 22:34 ..
drwx------ 2 vmail vmail 4096 2010-12-03 22:34 cur
-rw------- 1 vmail vmail 248 2010-12-03 22:34 dovecot.index.log
-rw------- 1 vmail vmail 17 2010-12-03 22:34 dovecot-uidlist
-rw------- 1 vmail vmail 8 2010-12-03 22:34 dovecot-uidvalidity
-rw------- 1 vmail vmail 0 2010-12-03 22:34 dovecot-uidvalidity.4cf9626e
drwx------ 2 vmail vmail 4096 2010-12-03 22:34 new
-rw------- 1 vmail vmail 6 2010-12-03 22:34 subscriptions
drwx------ 2 vmail vmail 4096 2010-12-03 22:34 tmp
drwx------ 5 vmail vmail 4096 2010-12-03 22:34 .Trash
To może spróbujemy wysłać mail na zewnątrz? Ciekawe czy zadziała? Ha! Mówiłem, że nie zadziała za pierwszym razem – znowu uparty klient poczty podaje samą nazwę użytkownika bez domeny, trzeba poprawić w kliencie poczty. Ale po poprawce powinno zadziałać, gdyż Postfix uwierzytelnia wysyłanie przez Dovecota, a ten już wie, że ma szukać w LDAPie. W strukturze katalogów powinien pojawić się katalog .Sent
(jeśli korzystacie z IMAPa).
Tyle na dziś, mamy załatwione logowanie do poczty i wysyłanie z uwierzytelnieniem w katalogu LDAP, trzeba jeszcze Postfixa nauczyć dostarczać pocztę do skrzynek, ale o tym w następnym odcinku.