Drupal + Postfix integrácia v Ubuntu 8.04

Autor: Alex Saavedra
Preložil: Erik Valentín
Licencia: © 2008 Alex Saavedra
General Public License (http://www.gnu.org/licenses/gnu.html).

Tento dokument je odvodený od Christoph Haasovej príručky “Howto: ISP-style Email Server with Debian-Etch and Postfix” (http://workaround.org) a Falko Timmeovej príručky “Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail (Ubuntu 8.04 LTS)” (http://www.howtoforge.com). Asociatívny Mailfix Drupal modul musí byť nainštalovaný ako časť tejto príručky.

Ciele:
Drupal ovladaný email účtami
Podpora virtuálnej domény
Automatické odosielanie
Postfix čiastková podpora
Tichý BCC monitoring 
Iné ťahy: anti-spam, anti-vírus
Treba postupovať podľa nasledujúcich krokov. 


Predslov

Tento návod je výsledkom mnohých pokusov nahradiť niekoľko Postfix mail serverov ktoré boli udržiavané v platnosti s textovými súbormi. Vždy ked som chcel vytvoriť alebo zrušiť konto, vyžadovalo to znovu načítanie Postfix configurácie. Taká istá vec ked išiel používateľ na dovolenku (automatické preposielanie) alebo sa dohliadacé programi pýtali na BCC monitoring. Ano, bez srandy. 

Potom Drupal uvedený do našej spoločnosti na kontrolu nášho Intranetu. Výsledok bol totálny úspech. Pomyslel som si aké skvelé by mohlo byť ak by sme mohli ovládať našich mailových uživateľov z toho istého miesta.

Prešiel som si práce od Christoph Haas (http://workaround.org/articles/ispmail-etch/) a 
Falko Timme (http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-ubuntu8.04). 


Potom som našiel skvelý Drupal modul od Thomas Barregren (http://drupal.org/project/mailserver) ktorý má vačšinu funkcionality akú potrebujeme, a bola založená na Christoph Haasovej práci pre Postfix/MySQL spojenie. Po testoch sme sa rozhodli pre Drupal 6, aby sme všetky veci spojili do jedného.

Tento návod uvádza Drupal Mailfix modul do života.

Počiatočné úlohy

Najskôr treba nainštalovať linux. My sme nainštalovali Linux Ubuntu 8.04 Server.

Zvolte nasledovné softwarové balíky:
Otvorte SSH server

Ujistite sa, že vaše ip adresy sú vždy rovnaké that (fixná IP, alebo DHCP + IP rezervácia).
Napíšte si vaše inštalačne detaily:

 

Credentials Sample Settings 
Linux user: someuser 
password: opensesame 
MySQL 
user: root@localhost
password: opensesame
Drupal database: drupal_example_com
user: drupal_example_com@localhost
password: opensesame 
Drupal user: admin
password: opensesame


Pri čerstvom bootovaní a inštalovaní OS, všetky úlohy vyžadujú root privilégia. Teda by ste mali začať ihneď:

sudo –i

Inštalovanie porebných balíkov

Môžete použiť oboje apt-get alebo aptitude. My preferujeme aptitude. Najprv aktualizujte repository tree ("u" prikaz). Potom zabezpečiť, aby sa nainštalovali nasledujúce balíky:

amavisd-new apache2 build-essential cabextract clamav-daemon debhelper dovecot-imapd dovecot-pop3d dpatch elinks fakeroot libcdb-dev libclass-dbi-mysql-perl phpmyadmin libapache2-mod-php5 libdb-dev libgdbm-dev libldap2-dev libmysqlclient15-dev libpam-mysql libpam-smbpass libpcre3-dev libpq-dev libsasl2-2 libsasl2-modules libsasl2-modules-sql libsasl2-dev libssl-dev mutt mysql-server nomarch openssl pax php5 php5-dev php5-mysql php-pear postfix postfix-doc postfix-mysql sasl2-bin spamassassin squirrelmail squirrelmail-decode vim vim-runtime

Nasledovná konfigurácia bude vyzerať (namiesto example.com dajte vhodnejšú doménu):

MySQL root password: opensesame 
Postfix Configuration: Internet Site 
System Mail Name: example.com 
phpMyAdmin Configuration: apache2


Ak ste silnejší používateľ(vim user), môžete chcieť povoliť silnú(vim) zvýraznenú syntax vo /etc/vim/vimrc konfiguračný súbor:

vim /etc/vim/vimrc

syntax on

Aplikujte Quota Patch na Postfix

Potrebujeme stiahnuť zdrojáky Postfix, aplikujte quota patch, vytvorte nové .deb balíky a nainštalujte ich.

cd /usr/src
apt-get source postfix 

Teraz sťahujeme Postfix Virtual Delivery Agents (VDA) patches od Anderson Nadal (http://vda.sourceforge.net/). Ujistite sa že sťahujete vhodnú verziu pre váš server. Ak ste na pochybách, nasledujúci príkaz vám zobrazí Postfix verziu:

postconf | grep ^mail_version 

mail_version = 2.5.1

V našom prípade sťahujeme patch pre verziu 2.5.1:

wget http://vda.sourceforge.net/VDA/postfix-2.5.1-vda-ng.patch.gz 
gunzip postfix-2.5.1-vda-ng.patch.gz
Rozbalte postfix-2.5.1-vda-ng.patch súbor.

cd postfix-2.5.1
patch -p1 < ../postfix-2.5.1-vda-ng.patch
dpkg-buildpackage


Ak uvidíte nasledujúcu správu, kompilácia je ukončená, nebojte sa, je to tak očakávané:

dpkg-buildpackage: warning: Failed to sign .dsc and .changes file

Presuňte do vyššieho adresára, kde čerstvé generované subory .deb prebývajú:

cd ..
ls -1 *.deb

postfix_2.5.1-2ubuntu1.1_i386.deb
postfix-cdb_2.5.1-2ubuntu1.1_i386.deb
postfix-dev_2.5.1-2ubuntu1.1_all.deb
postfix-doc_2.5.1-2ubuntu1.1_all.deb
postfix-ldap_2.5.1-2ubuntu1.1_i386.deb
postfix-mysql_2.5.1-2ubuntu1.1_i386.deb
postfix-pcre_2.5.1-2ubuntu1.1_i386.deb
postfix-pgsql_2.5.1-2ubuntu1.1_i386.deb


(Aktuálna verzia vašich kompilovaných balikov môže byť nepatrne odlišná)

Potom nainštalujeme patchovaný postfix a postfix-mysql balíkov:

dpkg -i postfix_2.5.1-2ubuntu1.1_i386.deb 
dpkg -i postfix-mysql_2.5.1-2ubuntu1.1_i386.deb


Apache konfigurácia

/etc/hosts podľa nasledujúceho riadku:
127.0.0.1 localhost myserver.example.com


Konfigurácia podľa chuti.. Návod odhaľuje nastavenie Drupal multi-hosted stánky.
Doména example.com je pod /var/www/example.com
SSL aplikácia root pod /var/ssl/example.com 
Drupal uploadnuté súbory pod /var/files/example.com.

Vytvorte http priečinok pod /var/www a https priečinok pod /var/ssl:

mkdir /var/www/html
mv /var/www/index.html /var/www/html/
mkdir -p /var/ssl/example.com


/var/www/html priečinok bude pozostávať zo základnej webovej konfigurácie. Napríklad, ak pristupujete k hostovi používajúc IP adresu, Apache obslúži súbory v tomto adresáry.

/var/ssl priečinok bude obsahovať stránky pre SSL spojenia.

Spodok v /etc/apache2/apache2.conf zahŕňa nasledujúce riadky:
NameVirtualHost *:80
NameVirtualHost *:443
ServerName myserver.example.com


Základná konfigurácia súboru /etc/apache2/sites-available/default:

vim /etc/apache2/sites-available/default


<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/html/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ServerSignature On
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>

Example.com konfiguračný súbor /etc/apache2/sites-available/example.com:

vim /etc/apache2/sites-available/example.com


<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName example.com
ServerAlias www.example.com
DirectoryIndex index.php
DocumentRoot /var/www/example.com/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/example.com/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /var/www/example.com/cgi-bin/
<Directory "/var/www/example.com/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/example.com.error.log
CustomLog /var/log/apache2/example.com.access.log combined
LogLevel warn
ServerSignature On
</VirtualHost>
<VirtualHost *:443>
ServerAdmin admin@example.com
ServerName example.com
ServerAlias www.example.com
DirectoryIndex index.html
DocumentRoot /var/ssl/example.com/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/ssl/example.com/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /var/ssl/example.com/cgi-bin/
<Directory "/var/ssl/example.com/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/ssl.example.com.error.log
CustomLog /var/log/apache2/ssl.example.com.access.log combined
LogLevel warn
ServerSignature On
</VirtualHost>

Teraz máme sprístupnené obe stránky a uvedieme do platnosti konfiguráciu:

cd /etc/apache2/sites-enabled/
ln –s ../sites-available/default 000-default
ln –s ../sites-available/example.com 001-example.com 
/etc/init.d/apache2 restart





Drupal Inštalácia a Konfigurácia

Stiahneme a nainštalujeme Drupal 6.x. Potom stiahneme a nainštalujeme Mailfix modul (http://drupal.org/project/mailfix) ktorý je vhodný pre Drupal verzia 6.x.

Drupal súbory rozbalíme /var/www/example.com.

cd /var/www
wget http://ftp.drupal.org/files/projects/drupal-6.x.tar.gz


Súčastná verzia je 6.4, teda cieľový súbor by mal byť drupal-6.4.tar.gz. Už len pamätajte že musíte nahradiť 6.x part vhodnejšou Drupal verziou. 

tar -xvzf drupal-6.x.tar.gz
mv drupal-6.x example.com
cd example.com
mkdir -p sites/all/modules
cd sites/all/modules
wget http://ftp.drupal.org/files/projects/mailfix-6.x-1.1.tar.gz


tar -xvzf mailfix-6.x-1.1.tar.gz
cd /var/www
chown -R www-data.www-data example.com

Teraz potrebujeme vytvoriť Drupal databázu, ktorá sa bude nazývať drupal_example_com v našej príručke a bude prístupná s plnými právami pre používatela. 

drupal_example_com@localhost:

mysql -p 
mysql> create database drupal_example_com;

Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on drupal_example_com.* to drupal_example_com @localhost identified by 'secret' with grant option;

Query OK, 0 rows affected (0.00 sec)

mysql> quit

Webové rozhranie sa bude dať nastaviť ihneď na http://www.example.com. 

Nasleduje dokončenie vytvorenia prvého Drupal účtu s plnými právami.
Potom nakonfigurujeme cron pístup pre Drupal vlastnú obsluhu:

crontab -e
# Example Drupal site cron
49 * * * * /usr/bin/wget -O - -q http://www.example.com/cron.php &> /dev/null

The &> /dev/null part is intended to reduce mail alerts issued by crontab. 

Nastavíme upload adresár. My preferujeme prenos cez Drupal, ciže /var/www/example.com adresár. Vytvoríme /var/drupal_files adresár pre tento účel zapisovateľný cez Apache daemon:

cd /var
mkdir -p drupal_files/example.com
chown -R www-data.www-data drupal_files/

Vnútorný Drupal nastavíme File System with takto:

File System Path: /var/drupal_files/example.com
Download Method: Private

Inštalovanie Mailfix modulu:
Chodte do Administer → Site building → Modules
Povolne Mailfix module

Pridávanie domén na váš Drupal system:
Chodte do Administer → Site building → Modules → Mailfix domains 
Potom do Add domains

Mailfix dokumentácia je samovysvetlujúca.


Postfix konfigurácia

Vytvorili sme uživatela a skupinu pod menom vmail s uid a gid nastaveným na 5000 s domovom directory /home/vmail. Tu sa budú maily uchovávať.

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Teraz je čas nakonfigurovať Postfix smernice. 

Drupal-domains.cf hovorí Postfix aké sú domény vašej Drupal inštalácie:

vim /etc/postfix/drupal-domains.cf

user = drupal_example_com
password = opensesame
dbname = drupal_example_com
query = SELECT domain_name AS domain FROM mailfix_domains
WHERE domain_name = '%s'
hosts = 127.0.0.1

Len aktívne Drupal kontá (users.status = 1) obdržia e-mail. Môžete nakonfigurovať odpojené účty na preposielanie e-mailov na iné miesta v mailfix_users..

vim /etc/postfix/drupal-mailboxes.cf
user = drupal_example_com
password = opensesame
dbname = drupal_example_com
query = SELECT CONCAT(md.domain_name, '/', LEFT(u.mail, LOCATE('@', u.mail) - 1),'/') AS maildir
FROM mailfix_domains md JOIN (mailfix_users mu JOIN users u
ON mu.uid = u.uid)
ON md.domain_id = mu.domain_id
WHERE u.status = 1 AND u.mail ='%s'
hosts = 127.0.0.1

Preposielané maily používajú aktívne aj odpojené Drupal účty. Niektorí uživatelia by mohli byť odcestovaný alebo na dovolenke (users.status = 1) pokiaľ si uživatelia dopisujú mimo inštitúciu, inak.. (disabled accounts, i.e. users.status = 0). Obe situácie môžu byť ovládane automatickým preposielaním.

vim /etc/postfix/drupal-forward.cf
user = drupal_example_com
password = opensesame
dbname = drupal_example_com
query = SELECT mu.forward
FROM mailfix_users mu JOIN users u
ON mu.uid = u.uid
WHERE u.mail = '%s' AND LENGTH(mu.forward) > 0
hosts = 127.0.0.1

Postfix tichý BCC monitoring sa delí na 2 časti: monitoring prichádzajúcich a odchadzajúcich mailov. 

vim /etc/postfix/drupal-recipient-bcc.cf
user = drupal_example_com
password = opensesame
dbname = drupal_example_com
query = SELECT mu.incoming_bcc
FROM mailfix_users mu JOIN users u
ON mu.uid = u.uid
WHERE u.status = 1 AND u.mail = '%s' AND LENGTH(mu.incoming_bcc) > 0
hosts = 127.0.0.1

vim /etc/postfix/drupal-sender-bcc.cf
user = drupal_example_com
password = opensesame
dbname = drupal_example_com
query = SELECT mu.outgoing_bcc
FROM mailfix_users mu JOIN users u
ON mu.uid = u.uid
WHERE u.status = 1 AND u.mail = '%s' AND LENGTH(mu.outgoing_bcc) > 0
hosts = 127.0.0.1

Quota manažment.

vim /etc/postfix/drupal-quota.cf
user = drupal_example_com
password = opensesame
dbname = drupal_example_com
query = SELECT mu.quota
FROM mailfix_users mu JOIN users u
ON mu.uid = u.uid
WHERE u.mail = '%s'
hosts = 127.0.0.1

Potom sa musíme ujistiť MD5 heslo-kódovanie bolo použité. Pre to modifikujeme /etc/pam.d/smtp zobrazenie Drupal používatelov:

 

vim /etc/pam.d/smtp 

auth required pam_mysql.so user=drupal_example_com passwd=opensesame host=127.0.0.1 db=drupal_example_com table=users usercolumn=mail passwdcolumn=pass crypt=0
account sufficient pam_mysql.so user=drupal_example_com passwd=opensesame host=127.0.0.1 db=drupal_example_com table=users usercolumn=mail passwdcolumn=pass crypt=0

(Parameter crypt=1 seems to be for ENCRYPT function, and crypt=0 seems to be for MD5 function.)

Teraz potrebujeme reštartovať Postfix a Saslauthd:

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

Potom modifikujeme /etc/postfix/sasl/smtpd.conf:

vim /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: drupal_example_com
sql_passwd: opensesame
sql_database: drupal_example_com
sql_select: SELECT pass FROM users WHERE mail = '%u' AND status = 1

Aplikujte požadované smernice k vytvoreniu Postfix mapy pre všetky súbory:

postconf -e 'myhostname = server1.example.com'
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/drupal-forward.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/drupal-domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/drupal-mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_mailbox_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/drupal-quota.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = "The user you are trying to reach is over quota."'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e 'recipient_bcc_maps = proxy:mysql:/etc/postfix/drupal-recipient-bcc.cf'
postconf -e 'sender_bcc_maps = proxy:mysql:/etc/postfix/drupal-sender-bcc.cf'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps $recipient_bcc_maps $sender_bcc_maps'

smtpd_tls_cert_file a smtpd_tls_key_file smernice pre SSL klienta boli nastavené. Hoci príslušný súbor už neexistuje. Nasledujúce príkazy ho vytvoria (nahradte zvýraznene nastavenia vlastnými):

cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Country Name (2 letter code) [AU]: BO 
State or Province Name (full name) [Some-State]: La Paz 
Locality Name (eg, city) []: La Paz 
Organization Name (eg, company) [Internet Widgits Pty Ltd]: My Company 
Organizational Unit Name (eg, section) []: IT 
Common Name (eg, YOUR name) []: John Dos Passos 
Email Address []: john@example.com 

Z bezpečnostných dôvodov zmente smtpd.key:

chmod o= /etc/postfix/smtpd.key

Doručovanie prichádzajúcich mailov cez Dovecot LDA

K vytvoreniu Postfix požívajúc Dovecot potrebujete doplniť jeden riadok do /etc/postfix/master.cf:

vim /etc/postfix/master.cf
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Znovu načítajte Postfix:

 

/etc/init.d/postfix reload 

Teraz Postfix posiela maily cez službu:

postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1


Konfigurácia Dovecot

Dovecot podporuje PO3, POP3S, IMAP a IMAPS. Pre povolenie všetkých služieb modifikujte /etc/dovecot/dovecot.conf nasledovne:

vim /etc/dovecot/dovecot.conf
protocols = imap imaps pop3 pop3s
mail_location = maildir:/home/vmail/%d/%n/Maildir
auth default {
mechanisms = plain login
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0600
user = postfix
group = postfix
}
}
}
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
global_script_path = /home/vmail/globalsieverc
postmaster_address = postmaster@example.com
auth_socket_path = /var/run/dovecot/auth-master
mail_plugins = cmusieve
}

Editujte /etc/dovecot/dovecot-sql.conf a ujistite sa ze smernice sú nastavené nasledovne:

 

vim /etc/dovecot/dovecot-sql.conf

driver = mysql
connect = host=127.0.0.1 dbname=drupal_example_com user=drupal_example_com password=opensesame
default_pass_scheme = PLAIN-MD5
password_query = SELECT mail AS user, pass FROM users WHERE mail='%u';

Then you must restart Dovecot:

/etc/init.d/dovecot restart


Tod vše! Teraz Drupal a Postfix zdielajú tú istú autentifikačnú schránku.


Referencie
Falko Timme, © 2008, Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail (Ubuntu 8.04 LTS), http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-ubuntu8.04 
Christoph Haas, © 2007, Howto: ISP-style Email Server with Debian-Etch and Postfix, http://workaround.org/articles/ispmail-etch/ 
Matt Butcher, Learning Drupal 6 Module Development, ISBN 190-4811-80-9, © 2008 Packt Publishing
Thomas Barregren, Mailserver Drupal Module, http://drupal.org/project/mailserver 
Alex Saavedra, © 2008, Mailfix Drupal Module, http://drupal.org/project/mailfix