rkubera
03-08-2006, 23:05
Chciałbym ogłosić (może troszkę pochwalić), że da się zintegrować joomlę ze skrzynkami pocztowymi tak, jak robią to duże portale.
Chcę zaznaczyć, że opis ten jest moim zdaniem trudny i raczej ma pokazać problemy pojawiające się podczas integracji niż stanowić kompletny opis tego typu rozwiązań. Podobne rozwiązania można znaleźć w wielu miejscach sieci, ja skupię się raczej na tym, co jest specyficzne dla naszego rozwiązania. Każdy system jest specyficzny i poniższe pliki konfiguracyjne mają jedynie wskazać drogę, a nie mogą być kopiowane 1:1 do Waszych systemów.
Aby przystąpić do tego co tu jest napisane, trzeba mieć uprawnienia admina na serwerze ( nie stronie) oraz wiedzę z administracji systemami linux (BSD). Moja instalacja została przeprowadzona na systemie debian, ale to w zasadzie nie ma większego znaczenia.
Wspomnę tylko, że należy każdą z paczek ściągnąć w najnowszej wersji z oficjalnych stron projektu, skompilować i zainstalować, nie używać do tego funkcji apt-get czy podobnych, ponieważ w przypadku np. debiana, pakiety w dystrybucji były za stare.
Jakie paczki będą nam zatem potrzebne:
- postfix+sasl
- pam mysql
- dovecot
Jak opisy wstępne opisujące tę tematykę mogę polecić:
http://linux.zsp2.edu.pl/
Więc zaczynamy.
Założenia:
Chcemy uruchomić system mailowy, do którego można dostać się przy pomocy klienta pop3/smtp lub IMAP z zewnątrz tak, aby hasło i użytkownik był taki sam jak w portalu. Zmiana hasła w portalu powoduje zmianę hałsa w skrzynce pocztowej. Dodatkowo założenie nowego użytkownika w portalu ma się wiązać z automatycznym założeniem mu skrzynki pocztowej.
Ja zdecydowałem się na rozwiązanie typu:
- serwer pocztowy postfix z autentykacją sasl
- serwer imap/pop3 na serwerze dovecot
Założenia dodatkowe:
Baza kont znajduje się w serwerze MYSQL w bazie joomla. I tu dochodzimy do najważniejszego problemu przy integracji. Otóż wszystkie tego typu systemy zakładają, że hasła użytkowników w systemie przechowywane są w postaci jawnej lub w postaci CRAMD MD5 lub DIGEST MD5. No i tu leży właśnie problem. Baza MYSQL wraz z joomla trzyma hasła w postaci MD5, jednak jest to prezentacja HEX MD5 a nie CRAMD czy DIGEST, które są zanane ogólnie jako bin MD5. Niestety – HEX MD5 i BIN MD5 mają inną prezentację.
Zatem większość rozwiązań opartych o podobnie systemy nie zadziała – ze względu na to, że po prostu system nie zautentykuje użytkownika ze względu na różnicę prezentacji haseł w postaci MD5. W ten sposób dział np. Postfix+sasl w standardowej konfiguracji z MYSQL, czy bardzo popularny i dobry serwer imap/pop3 COURIER.
Jak zatem wybrnąć z tej sytuacji?
Aby tego dokonać trzeba użyć pewnego obejścia – musimy do naszego rozwiązania dodać inny moduł autentykacji – PAM. Otóż w ostatnich wersjach PAM MYSQL umożliwia autentykację przy pomocy HEX MD5. Czyli nasze rozwiązanie ustawiamy w taki sposób, aby autentykował się przez PAM(mówimy tu głównie o sasl). Jako serwer imap/pop3 użyjemy dodatkowo najnowszej wersji serwera DOVECOT która umożliwia autentykację przy pomocy HEX MD5.
Zatem przedstawię tu pokrótce jak powinna wyglądać konfiguracja naszego środowiska.
NA początku do bazy mysql z joomla do tabeli jos_users dokładamy pole typu „mailbox” raz pole typu „domain”.
Pole mailbox ma przyjmować tylko dwie możliwe wartości – 1 gdy użytkownik ma mieć skrzynkę oraz 0 – gdy jej nie ma.
Jeżeli wartość domyślną ustawimy na 1 – wtedy każdy nowy użytkownik będzie miał zakładaną skrzynkę pocztową, gdy 0 – dopiero ręczna modyfikacja tego wpisu stworzy skrzynkę dla tego użytkownika. Domain – wartość domyślna powinna być taka, jak nazwa naszej domeny. Możemy ewentualnie wpisać tu nazwę innej wirtualnej domeny obsługującej nasz system. Ja ten przykład opisuję na podstawie domeny eturystyka.org (którą właśnie uruchomiłem), gdzie rozwiązanie to zostało wdrożone. Zapraszam na http://eturystyka.org gdzie po rejestracji każdy użytkownik dostaje 10 MB darmową skrzynkę pocztową.
Aby połączyć się z serwerem pop3/ smtp: należy podać dane w klienice:
Serwer POP3: etyrystyka.org
Serwer SMTP: turystyka.org
Użytkownik: <jak podczas rejestracji>
Hało: <jak podczas rejestracji>
Dodatkowo: serwer SMTP wymaga autentykacji, użytkownik i hasło takie same.
W przypadku połączenia po IMAP: serwer imap: eturystyka.org
No to do rzeczy:
Oto przykład tabeli:
CREATE TABLE `jos_users` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL default '',
`username` varchar(25) NOT NULL default '',
`email` varchar(100) NOT NULL default '',
`password` varchar(100) NOT NULL default '',
`usertype` varchar(25) NOT NULL default '',
`block` tinyint(4) NOT NULL default '0',
`sendEmail` tinyint(4) default '0',
`gid` tinyint(3) unsigned NOT NULL default '1',
`registerDate` datetime NOT NULL default '0000-00-00 00:00:00',
`lastvisitDate` datetime NOT NULL default '0000-00-00 00:00:00',
`activation` varchar(100) NOT NULL default '',
`params` text NOT NULL,
`mailbox` int(11) NOT NULL default '1',
`domain` varchar(20) NOT NULL default 'eturystyka.org',
PRIMARY KEY (`id`),
KEY `usertype` (`usertype`),
KEY `idx_name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=84 ;
Czyli nasze rozwiązanie będzie bazować na dwóch podastawowych polach: ów wspomnianym “mailbox” oraz polu “blocked” – ustawienie 1 ma też z automatu wyłaczać skrzynkę.
Pole domain jest potrzebne w przypadku, gdy chcemy obsługiwać kilka domen ( w mailu) przy pomocy jednego systemu pocztowego.
Oto moja konfiguracje POXSIX:
/etc/postfix/main.cf:
inet_interfaces = all
myhostname = eturystyka.org
mydestination = localhost
mynetworks = <tu Twoje adresy ip>
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
#receive_override_options = no_address_mappings
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
html_directory = no
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/local/man
daemon_directory = /usr/libexec/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 450
maximal_queue_lifetime = 5d
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual-mailbox-limit-maps.cf
virtual_mailbox_limit = 51200000
# Override the message_size_limit setting
virtual_mailbox_limit_override = yes
# Follow Maildir++ specs
virtual_maildir_extended = yes
# Create the maildirsize file (Vital for Courier-IMAP)
virtual_create_maildirsize = yes
# Bounce rather than defer when over quota
virtual_overquota_bounce = yes
# mailbox_transport = virtual
header_checks = regexp:/etc/postfix/header_checks
message_size_limit=5000000
Oto dodatkowe pliki konfiguracyjne:
/etc/postfix/mysql-virtual_domains.cf:
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_postfix_domains
select_field = 'virtual'
where_field = domain
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_forwardings.cf
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_postfix_forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_mailboxes.cf:
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_users
select_field = CONCAT(LOWER(username),'/')
where_field = mailbox='1' and block='0' and CONCAT(username,'@',domain)
hosts = 127.0.0.1
Chcę zaznaczyć, że opis ten jest moim zdaniem trudny i raczej ma pokazać problemy pojawiające się podczas integracji niż stanowić kompletny opis tego typu rozwiązań. Podobne rozwiązania można znaleźć w wielu miejscach sieci, ja skupię się raczej na tym, co jest specyficzne dla naszego rozwiązania. Każdy system jest specyficzny i poniższe pliki konfiguracyjne mają jedynie wskazać drogę, a nie mogą być kopiowane 1:1 do Waszych systemów.
Aby przystąpić do tego co tu jest napisane, trzeba mieć uprawnienia admina na serwerze ( nie stronie) oraz wiedzę z administracji systemami linux (BSD). Moja instalacja została przeprowadzona na systemie debian, ale to w zasadzie nie ma większego znaczenia.
Wspomnę tylko, że należy każdą z paczek ściągnąć w najnowszej wersji z oficjalnych stron projektu, skompilować i zainstalować, nie używać do tego funkcji apt-get czy podobnych, ponieważ w przypadku np. debiana, pakiety w dystrybucji były za stare.
Jakie paczki będą nam zatem potrzebne:
- postfix+sasl
- pam mysql
- dovecot
Jak opisy wstępne opisujące tę tematykę mogę polecić:
http://linux.zsp2.edu.pl/
Więc zaczynamy.
Założenia:
Chcemy uruchomić system mailowy, do którego można dostać się przy pomocy klienta pop3/smtp lub IMAP z zewnątrz tak, aby hasło i użytkownik był taki sam jak w portalu. Zmiana hasła w portalu powoduje zmianę hałsa w skrzynce pocztowej. Dodatkowo założenie nowego użytkownika w portalu ma się wiązać z automatycznym założeniem mu skrzynki pocztowej.
Ja zdecydowałem się na rozwiązanie typu:
- serwer pocztowy postfix z autentykacją sasl
- serwer imap/pop3 na serwerze dovecot
Założenia dodatkowe:
Baza kont znajduje się w serwerze MYSQL w bazie joomla. I tu dochodzimy do najważniejszego problemu przy integracji. Otóż wszystkie tego typu systemy zakładają, że hasła użytkowników w systemie przechowywane są w postaci jawnej lub w postaci CRAMD MD5 lub DIGEST MD5. No i tu leży właśnie problem. Baza MYSQL wraz z joomla trzyma hasła w postaci MD5, jednak jest to prezentacja HEX MD5 a nie CRAMD czy DIGEST, które są zanane ogólnie jako bin MD5. Niestety – HEX MD5 i BIN MD5 mają inną prezentację.
Zatem większość rozwiązań opartych o podobnie systemy nie zadziała – ze względu na to, że po prostu system nie zautentykuje użytkownika ze względu na różnicę prezentacji haseł w postaci MD5. W ten sposób dział np. Postfix+sasl w standardowej konfiguracji z MYSQL, czy bardzo popularny i dobry serwer imap/pop3 COURIER.
Jak zatem wybrnąć z tej sytuacji?
Aby tego dokonać trzeba użyć pewnego obejścia – musimy do naszego rozwiązania dodać inny moduł autentykacji – PAM. Otóż w ostatnich wersjach PAM MYSQL umożliwia autentykację przy pomocy HEX MD5. Czyli nasze rozwiązanie ustawiamy w taki sposób, aby autentykował się przez PAM(mówimy tu głównie o sasl). Jako serwer imap/pop3 użyjemy dodatkowo najnowszej wersji serwera DOVECOT która umożliwia autentykację przy pomocy HEX MD5.
Zatem przedstawię tu pokrótce jak powinna wyglądać konfiguracja naszego środowiska.
NA początku do bazy mysql z joomla do tabeli jos_users dokładamy pole typu „mailbox” raz pole typu „domain”.
Pole mailbox ma przyjmować tylko dwie możliwe wartości – 1 gdy użytkownik ma mieć skrzynkę oraz 0 – gdy jej nie ma.
Jeżeli wartość domyślną ustawimy na 1 – wtedy każdy nowy użytkownik będzie miał zakładaną skrzynkę pocztową, gdy 0 – dopiero ręczna modyfikacja tego wpisu stworzy skrzynkę dla tego użytkownika. Domain – wartość domyślna powinna być taka, jak nazwa naszej domeny. Możemy ewentualnie wpisać tu nazwę innej wirtualnej domeny obsługującej nasz system. Ja ten przykład opisuję na podstawie domeny eturystyka.org (którą właśnie uruchomiłem), gdzie rozwiązanie to zostało wdrożone. Zapraszam na http://eturystyka.org gdzie po rejestracji każdy użytkownik dostaje 10 MB darmową skrzynkę pocztową.
Aby połączyć się z serwerem pop3/ smtp: należy podać dane w klienice:
Serwer POP3: etyrystyka.org
Serwer SMTP: turystyka.org
Użytkownik: <jak podczas rejestracji>
Hało: <jak podczas rejestracji>
Dodatkowo: serwer SMTP wymaga autentykacji, użytkownik i hasło takie same.
W przypadku połączenia po IMAP: serwer imap: eturystyka.org
No to do rzeczy:
Oto przykład tabeli:
CREATE TABLE `jos_users` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL default '',
`username` varchar(25) NOT NULL default '',
`email` varchar(100) NOT NULL default '',
`password` varchar(100) NOT NULL default '',
`usertype` varchar(25) NOT NULL default '',
`block` tinyint(4) NOT NULL default '0',
`sendEmail` tinyint(4) default '0',
`gid` tinyint(3) unsigned NOT NULL default '1',
`registerDate` datetime NOT NULL default '0000-00-00 00:00:00',
`lastvisitDate` datetime NOT NULL default '0000-00-00 00:00:00',
`activation` varchar(100) NOT NULL default '',
`params` text NOT NULL,
`mailbox` int(11) NOT NULL default '1',
`domain` varchar(20) NOT NULL default 'eturystyka.org',
PRIMARY KEY (`id`),
KEY `usertype` (`usertype`),
KEY `idx_name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=84 ;
Czyli nasze rozwiązanie będzie bazować na dwóch podastawowych polach: ów wspomnianym “mailbox” oraz polu “blocked” – ustawienie 1 ma też z automatu wyłaczać skrzynkę.
Pole domain jest potrzebne w przypadku, gdy chcemy obsługiwać kilka domen ( w mailu) przy pomocy jednego systemu pocztowego.
Oto moja konfiguracje POXSIX:
/etc/postfix/main.cf:
inet_interfaces = all
myhostname = eturystyka.org
mydestination = localhost
mynetworks = <tu Twoje adresy ip>
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
#receive_override_options = no_address_mappings
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
html_directory = no
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/local/man
daemon_directory = /usr/libexec/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 450
maximal_queue_lifetime = 5d
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual-mailbox-limit-maps.cf
virtual_mailbox_limit = 51200000
# Override the message_size_limit setting
virtual_mailbox_limit_override = yes
# Follow Maildir++ specs
virtual_maildir_extended = yes
# Create the maildirsize file (Vital for Courier-IMAP)
virtual_create_maildirsize = yes
# Bounce rather than defer when over quota
virtual_overquota_bounce = yes
# mailbox_transport = virtual
header_checks = regexp:/etc/postfix/header_checks
message_size_limit=5000000
Oto dodatkowe pliki konfiguracyjne:
/etc/postfix/mysql-virtual_domains.cf:
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_postfix_domains
select_field = 'virtual'
where_field = domain
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_forwardings.cf
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_postfix_forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_mailboxes.cf:
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_users
select_field = CONCAT(LOWER(username),'/')
where_field = mailbox='1' and block='0' and CONCAT(username,'@',domain)
hosts = 127.0.0.1