Levelezőszerver telepítése - Debian Jessie alapokon

2015. április 25-én megjelent a Debian soron következő kiadása, a Debian Jessie (8.0). A bejelentés szerint a rendszer 5 év támogatást élvez, így hosszú távon számíthatunk rá. Régóta érlelődik bennem az elhatározás, hogy készítek egy garantáltan működő leírást egy levelezőszerver telepítéséről, amelynek alapjául így az új Debian kiadást választottam.

A leírást leginkább azoknak szánom, akik most ismerkednek ezzel a kérdéssel, és szeretnének a lehető leggyorsabban egy működő rendszer birtokába kerülni. Egy levelezőszerver éles környezetben történő üzemeltetése napi szintű feladatokat jelent, és az alapjául szolgáló konfigurációs fájlokat rendszeresen érdemes (és kell is) finomítani az aktuális követelményeknek és körülményeknek megfelelően. Így a leírás végén kapott rendszert kizárólag kiindulási alapnak tekintem, nem pedig végleges rendszernek. A naplófájlokból gyűjtött tapasztalatok és az ügyfelek visszajelzései alapján mindig lesznek teendőink a beállítások módosításával kapcsolatban, azonban kiindulásként mindenképpen szükségünk lesz egy olyan levelezőszerverre, amely az alapvető szolgáltatásokat biztosítja számunkra. Egy ilyen rendszer összeállításáról szól ez a leírás.

A levelezőszervert virtuális környezetben, a hálózati telepítő segítségével, Oracle Virtualbox használatával készítettem el. A Debian alaprendszer telepítését Expert módban végeztem, az alábbi paraméterek felhasználásával:

  • Language – English
  • Location – Hungary
  • Locales – en_US.UTF-8, hu_HU.UTF-8
  • Keymap to use – Hungarian
  • IP címek: 192.168.100.200, 192.168.100.1, 8.8.8.8, 8.8.4.4
  • Hostname – mailserver
  • Domain name – comega7.local
  • Time - NTP - Europe/Budapest
  • Lemez felhasználás - egyetlen partíció (tesztkörnyezet)
  • Debian archive mirror country - Hungary (ftp.hu.debian.org)
  • Non-free software - Yes
  • Services to use - security upates, release updates, backported software
  • Tasksel - SSH server
  • Grub - MBR (dev/sda)
  • UTC - Yes

Az alaprendszer telepítését ennél részletesebben nem ismertetem, ezzel kapcsolatban rengeteg jó leírás található az interneten. De ha ilyenre van szükséged, akkor nem vagyok benne biztos, hogy ez a leírás Neked szól...

Képességek és összetevők

A levelezőszervert az alábbi képességekkel és az ehhez szükséges komponensekkel fogjuk ellátni:

  • Postfix Admin: lehetővé teszi korlátlan számú levelezési tartomány és a hozzá tartozó postafiókok felvételét. Lehetőség van az egyes postafiókok részére kvóta meghatározására is, így a postafiókok mérete nem nőhet a végtelenségig.
  • MySQL: a Postfixadmin az egyes tartományok és postafiókok adatait MySQL adatbázisban fogja tárolni, így szükségünk lesz erre a kiszolgálóra is.
  • Apache webszerver: a Postfix Admin egy webes alapú menedzsment eszköz, így szükség lesz egy webkiszolgálóra, hogy a böngészőben futtathassuk a programot.
  • PHP: a Postfix Admin egy PHP alapú alkalmazás, így szükségünk lesz az ennek megfelelő komponensekre. A PHP-t a PHP-FPM FastCGI Process Manager segítségével fogjuk futtatni, így a weboldal, mint alkalmazás, a saját felhasználói neve alatt fog futni, és nem fog összekeveredni más weboldalak tulajdonosaival és azok jogosultságaival sem.
  • Postfix: a levelek célba juttatását erre az SMTP kiszolgálóra fogjuk bízni. Nagyon rugalmasan konfigurálható, biztonságos levelező kiszolgáló.
  • Clamav: a beérkező levelek közül érdemes kiszűrni a vírusokat tartalmazó példányokat.
  • Spamassassin: nem csak a vírusos, hanem a kéretlen reklámokat tartalmazó leveleket sem szeretjük. Jelöljük meg az ilyen leveleket, és bízzuk rá a postafiókok tulajdonosaira, hogy mit kezdenek velük.
  • Amavis: az "átjáró" a Postfix és az előző két tartalomszűrő (Clamav és Spamassassin) között. A Postfix a levelet az Amavisnak továbbítja, ahol beállítható, hogy milyen tartalomszűrést fogunk végezni: Clamav és/vagy Spamassassin. Mi mindkét szűrést el fogjuk végezni.
  • Dovecot: a leveleket nem elég célba juttatni, hanem biztosítani kell azt is, hogy az ügyfelek hozzáférjenek a postafiókjukban található leveleikhez. Erre szolgál ez a remek IMAP/POP3 kiszolgáló. A Sieve plugin segítségével pedig megvalósítjuk a szerver oldali levélszűrést és a vakációs üzenetek kezelését is.
  • Roundcube webes levelező: a leveleinket nem csak levelezőkliensekkel (Outlook, Thunderbird), hanem tetszőleges böngésző segítségével, webes levelező szolgáltatásként is tudjuk kezelni. A Roundcube gyakorlatilag mindazt tudja, amire a levelek kezelésével kapcsolatban szükségünk lehet (jelszócsere, vakációs üzenetek beállítása, szerveroldali levélszűrés beállítása, stb).

A fenti összetevők kivétel nélkül nyílt forráskódú komponensek, így nem szükséges a bankkártya után kapkodni, ha éles környezetben szeretnéd használni az így felépített levelezőszerveredet.

MySQL telepítése

Mielőtt belevágnánk a MySQL telepítésébe, tegyük fel az aptitude csomagkezelőt:

apt-get install aptitude

A könnyebb kezelhetőség kedvéért érdemes feltenni a Midnight Commandert is:

aptitude install mc

Akkor jöjjön az adatbázis kiszolgáló telepítése:

aptitude install mysql-server

A jelszó legyen az egyszerűség kedvéért "Pa$$w0rd". Tesztrendszerhez megfelelő. Most helyezzük biztonságba MySQL kiszolgálónkat:

mysql_secure_installation

A következő kérdésekre válaszoljunk az alábbi módon:

Change root password: n
Remove anonymous users: Y
Disallow root login remotely? Y
Remove test database and access to it? Y
Reload privilege tables now? Y

Készítsük el a Postfix Admin adatbázisát:

mysql -u root -p
CREATE DATABASE postfix CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY 'Pa$$w0rd';
FLUSH PRIVILEGES;
exit

Próbáljunk meg belépni az új postfix felhasználóval a hasonló nevű adatbázisba:

mysql -u postfix -D postfix -p

Ha sikerült belépni, akkor rendben vagyunk.

exit

Ezzel a MySQL kiszolgáló telepítése és a postfix adatbázis létrehozás és beállítása elkészült.

Apache és PHP-FPM telepítése, beállítása

Következzen a webszerver és a PHP telepítése:

aptitude install apache2-mpm-worker php5-fpm

Érdemes a böngészőben ellenőrizni a webszerver működését (http://192.168.100.200).

Engedélyezzük a szükséges Apache modulokat:

a2enmod proxy
a2enmod proxy_fcgi
service apache2 restart

Módosítsuk a /etc/php5/fpm/php.ini fájlt:

short_open_tag = On
max_execution_time = 300
sendmail_path = /usr/sbin/sendmail -t -i

Készítsük el a Postfx Admin futtatásához szükséges PHP felhasználót a Debian rendszerben (a jelszó itt is legyen Pa$$w0rd):

mkdir -p /srv/web/www
useradd -b /srv/web/www/ -g www-data -m -N -s /bin/false postfixadmin.comega7.local
passwd postfixadmin.comega7.local
rm /srv/web/www/postfixadmin.comega7.local/.*

Készítsük el a fenti felhasználóhoz tartozó PHP pool konfigurációs fájlt: /etc/php5/fpm/pool.d/postfixadmin.comega7.local.conf

[postfixadmin.comega7.local]
user = postfixadmin.comega7.local
group = www-data
listen = /var/run/postfixadmin.comega7.local.php5-fpm.sock
listen.owner = postfixadmin.comega7.local
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/postfixadmin.comega7.local.fpm-php.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M

indítsuk újra a PHP-FPM szolgáltatást:

service php5-fpm restart

A Postfix Admin weboldalt természetesen https protokoll segítségével fogjuk elérni, amelyhez szükség van egy tanúsítványra is. Mi most készítünk egyet, amit saját magunk is írunk alá:

mkdir /etc/apache2/cert
cd /etc/apache2/cert
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout postfixadmin.comega7.local.key -out postfixadmin.comega7.local.crt

A kérdésekre így válaszoljunk:

Country Name: HU
State or Province Name: Pest
Locality Name: Budapest
Organization Name: Comega7
Organizational Unit Name: IT
Common Name: postfixadmin.comega7.local
Email Address: bolemanyi.attila@comega7.local

Amire mindenképpen figyelj, hogy a Common Name az a név legyen, amilyen néven eléred a böngészőben a Postfix Admin alkalmazást. A többire úgy válaszolsz, ahogyan akarsz.

Engedélyezzük az Apache részére az SSL modult:

a2enmod ssl
service apache2 restart

Készítsük el az Apache számára a Postfix Admin futtatásához szükséges VirtualHost beállítást: /etc/apache2/sites-available/postfixadmin.comega7.local.conf

<VirtualHost *:443>
    ServerName          postfixadmin.comega7.local
    ServerAdmin         webmaster@comega7.local
    DocumentRoot        /srv/web/www/postfixadmin.comega7.local/

    <Directory "/srv/web/www/postfixadmin.comega7.local">
        Options +SymLinksIfOwnerMatch
        AllowOverride AuthConfig FileInfo Indexes Limit Options=Indexes,MultiViews
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/postfixadmin.comega7.local.php5-fpm.sock|fcgi://localhost"
    </FilesMatch>

    SSLEngine                   On
    SSLCertificateFile          /etc/apache2/cert/postfixadmin.comega7.local.crt
    SSLCertificateKeyFile       /etc/apache2/cert/postfixadmin.comega7.local.key

    ErrorLog                    /var/log/postfixadmin.comega7.local.error.log
    CustomLog                   /var/log/postfixadmin.comega7.local.access.log combined
</VirtualHost>

Engedélyezzük az új weboldalt:

a2ensite postfixadmin.comega7.local
service apache2 restart

Ezzel az Apache és a PHP beállítása készen van.

Postfix Admin telepítése

Töltsük le és tegyük a helyére a Postfix Admin alkalmazást:

cd /tmp
wget http://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz
tar -xzvf ./postfixadmin.tar.gz
cd ./postfixadmin-2.92
cp -a /tmp/postfixadmin-2.92/. /srv/web/www/postfixadmin.comega7.local
chown -R postfixadmin.comega7.local:www-data /srv/web/www/postfixadmin.comega7.local

A böngészőben látogasd meg az oldalt: https://postfixadmin.comega7.local

Ahhoz, hogy működjön a névfeloldás, Linux alatt a /etc/hosts, Windows alatt pedig a C:\Windows\System32\drivers\etc\hosts fájlba kell egy sor:

192.168.100.200 postfixadmin.comega7.local

Mivel a tanúsítványt mi írtuk alá, a böngésző panaszkodni fog, hogy a tanúsítvány hitelessége nem ellenőrizhető, de ezzel most nem foglalkozunk. A Postfix Admin telepítése még nincsen kész, de már jó úton járunk. Készítsünk egy fájlt a Postfix Admin gyökér mappájába, config.local.php néven, az alábbi tartalommal:

<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'Pa$$w0rd';
$CONF['database_name'] = 'postfix';
$CONF['configured'] = true;
?>

Telepítsük fel a PHP MySQL és IMAP kiegészítéseit:

aptitude install php5-mysqlnd php5-imap

Most látogassuk meg a https://postfixadmin.comega7.local/setup.php oldalt. A telepítési jelszó legyen "Pa$$w0rd12". Ha sikerült a Postfix Admin beállítása a böngészőben, a jelszavak beírására szolgáló rovatok felett megjelenik egy pirossal kiemelt sor, amely egy hash értéket tartalmaz. A fentebb elkészített config.local.php fájlt egészítsük ki ezzel a sorral:

$CONF['setup_password'] = 'hash-from-the-screen';

Most pedig hozzunk létre a Postfix Admin alkalmazásban egy ADMIN felhasználót, akinek teljes joga lesz valamennyi tartományt és postafiókot kezelni. Ehhez most egy valódi email címre lesz szükséged. A jelszó most is legyen "Pa$$w0rd12".

Itt az idő ellátogatni a https://postfixadmin.comega7.local címre és bejelentkezni az előbb létrehozott Admin felhasználóval. A Postfix Admin kezelése szerintem magától értetődik, így ezzel nem foglalkozom.

A Postfix Admin valamennyi beállítását célszerű a fentebb létrehozott config.local.php fájlban elvégezni, így a későbbi verziófrissítések ezeket nem fogják felülírni. Ezen a ponton érdemes végignézni a lehetséges beállításokat, és testre szabni a Postfix Admin működését. Ha türelmetlen vagy, akkor pedig itt egy jól használható minta:

<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'Pa$$w0rd';
$CONF['database_name'] = 'postfix';
$CONF['configured'] = true;
$CONF['setup_password'] = '6236cd50c78a37a28e809aac89ec9894:eae14a8c7e2dce3752cc42ef52626a1ca7cd69ee';
$CONF['default_language'] = 'hu';

$CONF['database_prefix'] = '';
$CONF['database_tables'] = array (
    'admin' => 'admin',
    'alias' => 'alias',
    'alias_domain' => 'alias_domain',
    'config' => 'config',
    'domain' => 'domain',
    'domain_admins' => 'domain_admins',
    'fetchmail' => 'fetchmail',
    'log' => 'log',
    'mailbox' => 'mailbox',
    'vacation' => 'vacation',
    'vacation_notification' => 'vacation_notification',
    'quota' => 'quota',
    'quota2' => 'quota2',
);

$CONF['admin_email'] = '';
$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';
$CONF['encrypt'] = 'md5crypt';
$CONF['authlib_default_flavor'] = 'md5raw';
$CONF['dovecotpw'] = "/usr/sbin/doveadm pw";

$CONF['password_validation'] = array(
    '/.{5}/'                    => 'password_too_short 5',      # minimum length 5 characters
    '/([a-zA-Z].*){3}/'         => 'password_no_characters 3',  # must contain at least 3 characters
    '/([0-9].*){2}/'            => 'password_no_digits 2',      # must contain at least 2 digits
);

$CONF['generate_password'] = 'NO';
$CONF['show_password'] = 'NO';
$CONF['page_size'] = '100';
$CONF['default_aliases'] = array (
    'abuse' => 'abuse@comega7.local',
    'hostmaster' => 'hostmaster@comega7.local',
    'postmaster' => 'postmaster@comega7.local',
    'webmaster' => 'webmaster@comega7.local'
);

$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['maildir_name_hook'] = 'NO';
$CONF['admin_struct_hook'] = '';
$CONF['domain_struct_hook'] = '';
$CONF['alias_struct_hook'] = '';
$CONF['mailbox_struct_hook'] = '';
$CONF['alias_domain_struct_hook'] = '';
$CONF['aliases'] = '10';
$CONF['mailboxes'] = '10';
$CONF['maxquota'] = '10';
$CONF['domain_quota_default'] = '2048';

$CONF['quota'] = 'YES';
$CONF['domain_quota'] = 'YES';
$CONF['quota_multiplier'] = '1024000';

$CONF['transport'] = 'NO';
$CONF['transport_options'] = array (
    'virtual',  // for virtual accounts
    'local',    // for system accounts
    'relay'     // for backup mx
);
$CONF['transport_default'] = 'virtual';
$CONF['vacation'] = 'NO';
$CONF['vacation_domain'] = 'autoreply.comega7.local';
$CONF['vacation_control'] ='NO';
$CONF['vacation_control_admin'] = 'NO';
$CONF['vacation_choice_of_reply'] = array (
    0 => 'reply_once',                          // Sends only Once the message during Out of Office
    # considered annoying - only send a reply on every mail if you really need it
    # 1 => 'reply_every_mail',                  // Reply on every email
    60*60 *24*7 => 'reply_once_per_week'        // Reply if last autoreply was at least a week ago
);

$CONF['users_domain_controle'] = 'YES';
$CONF['alias_control'] = 'YES';
$CONF['alias_control_admin'] = 'YES';
$CONF['special_alias_control'] = 'NO';
$CONF['alias_goto_limit'] = '0';
$CONF['alias_domain'] = 'YES';
$CONF['backup'] = 'NO';
$CONF['sendmail'] = 'YES';
$CONF['logging'] = 'YES';
$CONF['fetchmail'] = 'YES';
$CONF['fetchmail_extra_options'] = 'NO';

$CONF['show_header_text'] = 'NO';
$CONF['header_text'] = ':: Postfix Admin ::';

$CONF['show_footer_text'] = 'NO';
$CONF['footer_text'] = 'Return to comega7.local';
$CONF['footer_link'] = 'http://comega7.local';

$CONF['motd_user'] = '';
$CONF['motd_admin'] = '';
$CONF['motd_superadmin'] = '';

$CONF['welcome_text'] = <<<EOM
Hi,

Welcome to your new account.
EOM;

$CONF['emailcheck_resolve_domain']='NO';
$CONF['show_status']='YES';
$CONF['show_status_key']='YES';
$CONF['show_status_text']='  ';
$CONF['show_undeliverable']='YES';
$CONF['show_undeliverable_color']='tomato';
$CONF['show_undeliverable_exceptions']=array("unixmail.domain.ext","exchangeserver.domain.ext");
$CONF['show_popimap']='YES';
$CONF['show_popimap_color']='darkgrey';
$CONF['show_custom_domains']=array("subdomain.domain.ext","domain2.ext");
$CONF['show_custom_colors']=array("lightgreen","lightblue");
$CONF['recipient_delimiter'] = "";
$CONF['mailbox_postcreation_script'] = '';
$CONF['mailbox_postedit_script'] = '';
$CONF['mailbox_postdeletion_script'] = '';
$CONF['domain_postcreation_script'] = '';
$CONF['domain_postdeletion_script'] = '';
$CONF['create_mailbox_subdirs'] = array();
$CONF['create_mailbox_subdirs_host']='localhost';
$CONF['create_mailbox_subdirs_prefix']='';
$CONF['used_quotas'] = 'YES';
$CONF['new_quota_table'] = 'YES';
$CONF['create_mailbox_subdirs_hostoptions'] = array('');
$CONF['theme_logo'] = 'images/logo-default.png';
$CONF['theme_css'] = 'css/default.css';
$CONF['theme_custom_css'] = '';
$CONF['xmlrpc_enabled'] = false;

Ezzel a Postfix Admin telepítése elkészült.

Postfix telepítése

Miután szépen megágyaztunk a Postfix levelezőszervernek, itt az idő feltelepíteni.

aptitude install postfix-mysql

A szerver típusa Internet Site legyen, a neve pedig az alapértelmezett mailserver.comega7.local

Készítsük el a Postfix számára a MySQL táblákra mutató konfigurációs fájlokat:

mkdir /etc/postfix/sql
cd /srv/web/www/postfixadmin.comega7.local/DOCUMENTS
sh ./POSTFIX_CONF.txt

A szkript a /tmp mappában készít egy postfixadmin-XXXX nevű mappát, ahol az elkészített konfigurációs fájlok szerepelnek. Az XXX négy számjegye véletlenszerű. Másoljuk be a fájlokat a megfelelő helyre:

cd /tmp/postfixadmin-xxxx
cp * /etc/postfix/sql

A Postfix fő konfigurációs fájlja a /etc/postfix/main.cf:

#Basic settings
myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = /usr/share/doc/postfix
html_directory = /usr/share/doc/postfix/html
myhostname = mailserver.comega7.local
mydomain = comega7.local
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.100.0/24
inet_interfaces = all
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = mailserver.comega7.local, localhost
relayhost =
mailbox_size_limit = 0
recipient_delimiter = +
notify_classes = resource, software
message_size_limit = 31457280

# TLS parameters
smtpd_tls_cert_file=/etc/postfix/ssl/certs/postfix.pem
smtpd_tls_key_file=/etc/postfix/ssl/private/postfix.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes

# PostfixAdmin configuration options
virtual_gid_maps = static:5000
virtual_uid_maps = static:5000

dovecot_destination_recipient_limit = 1
virtual_transport = dovecot
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_alias_maps =
    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
    proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf

# SASLAUTH options
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes

# SMTPD basic settings
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks,
    check_helo_access
        hash:/etc/postfix/helo_access,
    reject_non_fqdn_helo_hostname,
    reject_invalid_helo_hostname,
    permit

# SMTPD sender restrictions
smtpd_sender_restrictions =
    permit_sasl_authenticated,
    permit_mynetworks,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    permit

# SMTPD relay restrictions
smtpd_relay_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    defer_unauth_destination,
    permit

# SMTPD recipient restrictions
smtpd_recipient_restrictions =
    permit_mynetworks,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_rbl_client zen.spamhaus.org,
    reject_rbl_client bl.spamcop.net,
    permit

smtpd_data_restrictions =
    reject_unauth_pipelining

#content_filter = amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings

A részletes magyarázatba most nem megyek bele, de nagyon ajánlom a Postfix dokumentáció szorgalmas tanulmányozását. Levelező szerver üzemeltetőjeként ez vitathatatlan kötelességed lesz a jövőben.

A Postfix szervernek szüksége lesz egy tanúsítványra, amelynek segítségével az 587-es porton bejövő SMTP kapcsolatokat titkosítja le (TLS). Ez az a port, ahol felhasználónév és jelszó megadásával a Postfix Admin segítségével felvett felhasználók levelek küldésére is használhatják szerverünket.

mkdir -p /etc/postfix/ssl/certs
mkdir -p /etc/postfix/ssl/private
openssl req -new -x509 -days 365 -nodes -out /etc/postfix/ssl/certs/postfix.pem -keyout /etc/postfix/ssl/private/postfix.key

A válaszok pedig:

Country Name: HU
State or Province Name: Pest
Locality Name: Budapest
Organization Name: Comega7
Organizational Unit Name: IT
Common Name: mailserver.comega7.local
Email Address: bolemanyi.attila@comega7.local

Az adatokat itt is szabadon variálhatod, egyetlen kivétellel: a Common Name itt az a név, amelyet a Postfix szervered használ, amikor bemutatkozik másoknak.

Az 587-es port (submission) kinyitásához az alábbi sorokat add hozzá a /etc/postfix/master.cf fájl végéhez:

submission inet n - n - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_helo_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,defer_unauth_destination

(A félkövérrel kiemelt kiegészítést köszönöm Harasztia Rolandnak) Szükségünk lesz egy olyan felhasználóra, aki létezik a Debian rendszerben, és akinek a tulajdonában lesz valamennyi tartomány és postafiók a szerver fájlrendszerében:

mkdir /srv/mail
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /srv/mail/vmail -m
rm /srv/mail/vmail/.*

Készítsük el a /etc/postfix/helo_access fájlt:

mailserver.comega7.local    REJECT
comega7.local               REJECT
192.168.100.200             REJECT

Készítsük el a fájl hash változatát:

postmap /etc/postfix/helo_access

Indítsuk újra a Postfix szervert:

service postfix restart

Dovecot telepítése

Annak érdekében, hogy hozzáférjünk postafiókunkban található leveleinkhez, szükségünk lesz a Dovecot szolgáltatásra is. A jelenlegi példánkban nem csak a felhasználóknak, hanem a Postfix szervernek is szüksége van a Dovecotra, mivel a bejövő leveleket nem közvetlenül a Postfix dobja be a postaládánkba, hanem átadja azt kézbesítésre a Dovecot szervernek. Így a Dovecot naprakész lesz a felhasználók kvóta adataival, el tudja végezni a szerver oldali levélszűrést és a vakációs üzenetek kezelését is. Sőt, a Postfixen keresztül levelet küldeni szándékozó felhasználókat is a Dovecot hitelesíti a megadott felhasználói név és jelszó alapján a Postfix szerver számára.

aptitude install dovecot-mysql dovecot-imapd dovecot-pop3d

Az /etc/postfix/master.cf fájl alábbi kiegészítése mondja meg a Postfixnek, hogyan adja át a levelet a Dovecotnak kézbesítésre:

dovecot unix    -   n   n   -   -   pipe 
    flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}

/etc/dovecot/conf.d/10-master.conf fájl tartalma:

default_vsz_limit = 256M 
service imap-login {
    inet_listener imap {
        port = 143
    }
    inet_listener imaps {
        port = 993
        ssl = yes
    }
    service_count = 1
    process_min_avail = 0
}
service pop3-login {
    inet_listener pop3 {
        port = 110
    }
    inet_listener pop3s {
        port = 995
        ssl = yes
    }
}
service lmtp {
    unix_listener lmtp {
        mode = 0666
    }
}
service imap {
    process_limit = 1024
}
service pop3 {
    process_limit = 1024
}
service auth {
    unix_listener auth-userdb {
        mode = 0660
        user = vmail
        group = vmail
    }

    # Postfix SMTP-auth
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
    user =
    group =
}
service auth-worker {
    user = $default_internal_user
}
service dict {
    unix_listener dict {
        mode = 0660
        user = vmail
        group = vmail
    }
}

/etc/dovecot/conf.d/10-auth.conf tartalma:

disable_plaintext_auth = yes
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
auth_username_format = %Lu
auth_worker_max_count = 30
auth_failure_delay = 2 secs
auth_ssl_require_client_cert = no
auth_mechanisms = plain login

!include auth-sql.conf.ext

A Dovecotnak is szüksége van tanúsítványra a titkosított IMAP és POP3 kapcsolatok felépítéséhez:

mkdir /etc/dovecot/certs
openssl req -new -x509 -days 365 -nodes -out /etc/dovecot/certs/dovecot.pem -keyout /etc/dovecot/private/dovecot.key

A válaszok ismét:

Country Name: HU
State or Province Name: Pest
Locality Name: Budapest
Organization Name: Comega7
Organizational Unit Name: IT
Common Name: mailserver.comega7.local
Email Address: bolemanyi.attila@comega7.local

A Common Name itt is a levelezőszerver neve kell, hogy legyen. A felhasználóknak ezt a nevet kell megadni POP3 és IMAP szerver névnek, amikor a levelezőprogramjaik beállításával foglalatoskodnak.

A /etc/dovecot/conf.d/10-ssl.conf fájl tartalma:

ssl = yes
ssl_cert = </etc/dovecot/certs/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.key
ssl_protocols = !SSLv2
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL

/etc/dovecot/conf.d/10-mail.conf fájl tartalma:

mail_location = maildir:/srv/mail/vmail/%d/%n
mail_home = /srv/mail/sieve/%d/%n

namespace inbox {
    type = private
    separator =
    prefix =
    location =
    inbox = yes
    hidden = no
    list = yes
    subscriptions = yes
}

mail_shared_explicit_inbox = no
mail_uid = vmail
mail_gid = vmail
mail_full_filesystem_access = no

first_valid_uid = 5000
last_valid_uid = 5000

first_valid_gid = 5000
last_valid_gid = 5000

auth_socket_path = /var/run/dovecot/auth-userdb
mail_plugin_dir = /usr/lib/dovecot/modules
mail_plugins = $mail_plugins quota

/etc/dovecot/conf.d/15-mailboxes.conf fájl tartalma:

namespace inbox {
    mailbox Drafts {
        special_use = \Drafts
        auto = subscribe
    }
    mailbox Junk {
        special_use = \Junk
        auto = subscribe
    }
    mailbox Trash {
        special_use = \Trash
        auto = subscribe
    }
    mailbox Sent {
        special_use = \Sent
        auto = subscribe
    }
    mailbox "Sent Messages" {
        special_use = \Sent
        auto = no
    }
}

/etc/dovecot/conf.d/auth-sql.conf.ext fájl tartalma:

passdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf.ext
}

/etc/dovecot/conf.d/20-imap.conf fájl tartalma:

imap_max_line_length = 64k
imap_logout_format = in=%i out=%o
imap_capability =
imap_idle_notify_interval = 2 mins
imap_id_send =
imap_id_log =
imap_client_workarounds = delay-newmail tb-extra-mailbox-sep tb-lsub-flags
imap_urlauth_host =

protocol imap {
    mail_plugins = $mail_plugins imap_quota
    mail_max_userip_connections = 10
}

A /etc/dovecot/conf.d/20-pop3.conf fájl tartalma:

pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
protocol pop3 {
  mail_plugins = $mail_plugins quota
}

/etc/dovecot/dovecot-dict-sql.conf.ext fájl tartalma:

connect = host=localhost dbname=postfix user=postfix password=Pa$$w0rd
map {
    pattern = priv/quota/storage
    table = quota2
    username_field = username
    value_field = bytes
}
map {
    pattern = priv/quota/messages
    table = quota2
    username_field = username
    value_field = messages
}

/etc/dovecot/conf.d/90-quota.conf fájl tartalma:

plugin {
    quota = dict:user::proxy::quota_dict
}

/etc/dovecot/dovecot.conf fájl tartalma:

!include_try /usr/share/dovecot/protocols.d/*.protocol
base_dir = /var/run/dovecot/
instance_name = dovecot
login_greeting = Dovecot ready.
shutdown_clients = yes
dict {
    quota_dict = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
!include conf.d/*.conf
!include_try local.conf

/etc/dovecot/conf.d/15-lda.conf fájl tartalma:

protocol lda {
    mail_plugins = $mail_plugins quota
}

/etc/dovecot/dovecot-sql.conf.ext fájl tartalma:

driver = mysql
connect = dbname=postfix user=postfix host=127.0.0.1 password=Pa$$w0rd
default_pass_scheme = MD5-CRYPT
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active ='1'
user_query = SELECT maildir, 5000 AS uid, 5000 AS gid, CONCAT('*:bytes=', CAST(quota AS CHAR)) AS quota_rule FROM mailbox WHERE username = '%u' AND active ='1'

Indítsuk újra a Dovecot és a Postfix szervereket:

service dovecot restart
service postfix restart

 

Az első próbalevél

Itt az ideje, hogy kirpóbáljuk, mit raktunk össze eddig. Ehhez a Postfix Admin segítségével vegyél fel egy próba tartományt, mondjuk a comega7.local nevűt. :-) Ezután pedig az első felhasználót is felvesszük, nem meglepő módon ez nálam bolemanyi.attila@comega7.local lesz. Ezután belenézünk a fájlrendszerbe és a naplófájlokba, és ha minden jól megy, akkor van egy működőképes alaprendszerünk.

A felhasználónak adjunk 1 MB kvótát.

Ha sikerült létrehoznunk első postafiókunkat, akkor a Postfix Admin megpróbál számára küldeni egy levelet. Ezzel létrejön a comega7.local mappa a /srv/mail/vmail mappában, és egy bolemanyi.attila nevű mappa a comega7.local alatt. A new mappában pedig ott az első levél...

root@mailserver:~# ls -la /srv/mail/vmail/comega7.local/bolemanyi.attila/new
total 12
drwx------ 2 vmail vmail 4096 May 18 15:48 .
drwx------ 5 vmail vmail 4096 May 18 15:43 ..
-rw------- 1 vmail vmail  658 May 18 15:43 1431956628.M286562P2166.mailserver,S=658,W=675

Ha pedig belenézel a /var/log/syslog fájlba, az alábbi új sorokat láthatod:

May 18 15:43:47 mailserver postfix/smtpd[2159]: connect from localhost[::1]
May 18 15:43:47 mailserver postfix/smtpd[2159]: B8192804F2: client=localhost[::1]
May 18 15:43:47 mailserver postfix/cleanup[2164]: B8192804F2: message-id=<20150518134347.B8192804F2@mailserver.comega7.local>
May 18 15:43:47 mailserver postfix/qmgr[2156]: B8192804F2: from=<bolemanyi.attila@comega7.local>, size=582, nrcpt=1 (queue active)
May 18 15:43:47 mailserver postfix/smtpd[2159]: disconnect from localhost[::1]
May 18 15:43:48 mailserver dovecot: lda(bolemanyi.attila@comega7.local): msgid=<20150518134347.B8192804F2@mailserver.comega7.local>: saved mail to INBOX
May 18 15:43:48 mailserver postfix/pipe[2165]: B8192804F2: to=<bolemanyi.attila@comega7.local>, relay=dovecot, delay=0.7, delays=0.09/0.1/0/0.51, dsn=2.0.0, status=sent (delivered via dovecot service)
May 18 15:43:48 mailserver postfix/qmgr[2156]: B8192804F2: removed

Vagyis a Postfix és a Dovecot működik és teszik a dolgukat. A Postfix Admin beköszön a localhost-on, átadja a levelet a Postfix számára, amely pedig kézbesítésre továbbítja a Dovecot szervernek. A Dovecot pedig szépen bedobja a levelet a postaládába.

Tegyük fel az nmap programot...

aptitude install nmap

... és futtassunk egy port szkennelést is. Lássuk, milyen szolgáltatások futnak?

root@mailserver:~# nmap localhost

Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-18 15:55 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 990 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
80/tcp   open  http
110/tcp  open  pop3
143/tcp  open  imap
443/tcp  open  https
587/tcp  open  submission
993/tcp  open  imaps
995/tcp  open  pop3s
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 3.99 seconds<-pre>

Az egyes portok mögött az alábbi szolgáltatásokat találjuk:

  • 22: SSH szerver
  • 25: SMTP szerver (Postfix)
  • 80: HTTP (Apache)
  • 110: POP3 (Dovecot)
  • 143: IMAP (Dovecot)
  • 443: HTTPS (Apache)
  • 587: Submission (Postfix)
  • 993: IMAPS (Dovecot)
  • 995: POP3S (Dovecot)
  • 3306: MySQL

Annak érdekében, hogy kicsit próbálgathassuk új rendszerünket, a következő lépésben feltelepítjük a RoundCube webes levelezőprogramot. Miután pedig meggyőződtünk arról, hogy tökéletesen működik mindaz, amit eddig csináltunk, tovább építjük rendszerünket (spam- és vírusszűrés, sieve protokoll).

Roundcube telepítése

Először is készítsünk ennek a webes alkalmazásnak is egy külön felhasználót a Debian rendszerben:

useradd -b /srv/web/www/ -g www-data -m -N -s /bin/false webmail.comega7.local
passwd webmail.comega7.local
rm /srv/web/www/webmail.comega7.local/.*

A weboldal konfigurációs fájlja, a /etc/apache2/sites-available/webmail.comega7.local.conf a következő legyen:

<VirtualHost *:443>
    ServerName          webmail.comega7.local
    ServerAdmin         webmaster@comega7.local
    DocumentRoot        /srv/web/www/webmail.comega7.local/

    <Directory "/srv/web/www/webmail.comega7.local">
        Options +SymLinksIfOwnerMatch
        AllowOverride AuthConfig FileInfo Indexes Limit Options=Indexes,MultiViews
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/webmail.comega7.local.php5-fpm.sock|fcgi://localhost"
    </FilesMatch>

    SSLEngine                   On
    SSLCertificateFile          /etc/apache2/cert/webmail.comega7.local.crt
    SSLCertificateKeyFile       /etc/apache2/cert/webmail.comega7.local.key

    ErrorLog                    /var/log/webmail.comega7.local.error.log
    CustomLog                   /var/log/webmail.comega7.local.access.log combined
</VirtualHost>

Engedélyezzük az új oldalt:

a2ensite webmail.comega7.local

Készítsünk tanúsítványt is az új weboldalnak:

mkdir /etc/apache2/cert
cd /etc/apache2/cert
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout webmail.comega7.local.key -out webmail.comega7.local.crt

A válaszok ismét:

Country Name: HU
State or Province Name: Pest
Locality Name: Budapest
Organization Name: Comega7
Organizational Unit Name: IT
Common Name: webmail.comega7.local
Email Address: bolemanyi.attila@comega7.local

Itt ismét figyelj arra, hogy a Common Name után a weboldal címét írd be, ahogyan az megjelenik a böngésző címsorában. Indítsuk újra az Apache szervert:

service apache2 restart

Készítsük el az oldal PHP konfigurációs fájlját is - /etc/php5/fpm/pool.d/webmail.comega7.local.conf - az alábbi tartalommal:

[webmail.comega7.local]
user = webmail.comega7.local
group = www-data
listen = /var/run/webmail.comega7.local.php5-fpm.sock
listen.owner = webmail.comega7.local
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/webmail.comega7.local.fpm-php.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M

Indítsuk újra a PHP-FPM szolgáltatást:

service php5-fpm restart

Töltsük le a Roundcube webes levelezőprogramot és tegyük a helyére:

cd /tmp
wget --no-check-certificate https://downloads.sourceforge.net/project/roundcubemail/roundcubemail/1.1.1/roundcubemail-1.1.1-complete.tar.gz
tar -xvzf roundcubemail-1.1.1-complete.tar.gz
cd roundcubemail-1.1.1
cp -a /tmp/roundcubemail-1.1.1/. /srv/web/www/webmail.comega7.local
chown -R webmail.comega7.local:www-data /srv/web/www/webmail.comega7.local

A Roundcube szintén igényel egy MySQL adatbázist, készítsük el:

mysql -u root -p
CREATE DATABASE roundcube CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL ON roundcube.* TO roundcube@localhost IDENTIFIED BY 'Pa$$w0rd';
FLUSH PRIVILEGES;
exit

Készítsük el az adatbázis tábláit:

cd /srv/web/www/webmail.comega7.local
mysql -D roundcube -u roundcube -p <./SQL/mysql.initial.sql

A Roundcube újabb PHP kiegészítőket igényel:

aptitude install php5-mcrypt php5-intl

/etc/php5/fpm/php.ini fájlban állítsuk be az időzónát (keress rá és vedd ki a kommentet, majd egészítsd ki):

date.timezone = Europe/Budapest

A böngészőben látogasd meg a https://webmail.comega7.local/installer oldalt. Ehhez ki kell egészíteni Linux alatt a /etc/hosts fájlt, Windows alatt pedig a C:\Windows\System32\driver\etc\hosts fájlt (az első sor már benne van):

192.168.100.200 postfixadmin.comega7.local
192.168.100.200 webmail.comega7.local

Az első oldalon a konfiguráció ellenőrzése történik meg (Check environment). Az LDAP és a MySQL-en kívüli komponensek nem elérhetőek (NOT AVAILABLE), de a többinek zöld OK állapotban kell lennie. Ha rendben van, jöhet a lap alján a NEXT gomb.

A második oldalon csak a legfontosabb mezőket töltjük most ki, tulajdonképpen csak a Database setup csoport mezőit, ahol meg kell adni:

  • az adatbázis típusát (MySQL),
  • a kiszolgáló nevét (localhost),
  • az adatbázis nevét (roundcube),
  • felhasználóját (roundcube)
  • és a jelszót (Pa$$w0rd).

A lap alján kattints a CREATE CONFIG gombra. Egyelőre semmit sem tesztelünk, jöhet a CONTINUE gomb. A Roundcube program Config nevű mappájában elkészült egy config.inc.php nevű fájl, amely csak a Roundcube adatbázisához tartozó beállításokat tartalmazza. Egészítsük ki a fájlt az alábbi tartalom szerint:

<?php
$config['db_dsnw'] = 'mysql://roundcube:Pa%24%24w0rd@localhost/roundcube';
$config['default_host'] = 'ssl://localhost';
$config['default_port'] = 993;
$config['imap_conn_options'] = array (
    'ssl' => array (
        'verify_peer'           => true,
        'verify_peer_name'      => false,
        'allow_self_signed'     => true,
        ),
    );

$config['smtp_server'] = 'tls://localhost';
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['smtp_timeout'] = 10;
$config['smtp_conn_options'] = array (
    'ssl' => array (
        'verify_peer'           => true,
        'verify_peer_name'      => false,
        'allow_self_signed'     => true,
        ),
    );

$config['support_url'] = '';
$config['plugins'] = array();
$config['language'] = 'hu_HU';
$config['create_default_folders'] = false;
$config['login_autocomplete'] = 2;

$config['des_key'] = 'EYM+mLQ!4nP&sI5%ZpDisCgC';

$config['log_logins'] = true;
$config['product_name'] = 'Comega7 - Webmail';
$config['preview_pane'] = true;

A fájlban található 'des_key' értéke a Te telepítésedben ne az legyen, mint ami itt szerepel, hanem amit a telepítés közben kapsz a programtól! Az is látható, hogy az IMAP kapcsolódás titkosított csatornán történik (SSL) a 993-as porton keresztül, illetve a levélküldés szintén titkosítva történik (TLS) az 587-es porton keresztül.

A Roundcube mappájából töröld ki az Installer nevű almappát. A Roundcube konfigurációs paraméterei a Config mappa defaults.inc.php fájljában találhatóak. Amelyik paraméter szerepel a config.inc.php fájlban, ott az lesz érvényben, amelyik nem szerepel, annak az értéke a defaults.inc.php fájlból kerül beolvasásra. Ez utóbbi fájl alaposan el van látva magyarázatokkal, így mindenképpen csak ajánlani tudom az áttanulmányozását. Amelyik paraméterét meg akarod változtatni, azt a config.inc.php fájlban tedd meg.

Eljött az idő, hogy meglátogasd a https://webmail.comega7.local oldalt, és bejelentkezz az előző oldalon létrehozott teszt felhasználóval. A jobb felső sarokban találod a Beállítások menüpontot. Jó felfedezést! :-)

 

További tesztelések

Érdemes a Postfix Admin segítségével még egy postafiókot felvenni a comega7.local tartományba (vagy abba, amelyiket Te készítettél). Mindkét felhasználóval jelentkezz be a Roundcube programban, és végezd el a legfontosabb beállításokat.

Én erre a célra egy wattacukor@comega7.local felhasználót hoztam létre.

Érdemes a bejelentkezés után írni egy levelet a másik felhasználónak, és elküldeni neki. Utána nézd meg a /var/log/syslog fájlban, hogy mi történik mindeközben. Roppant tanulságos olvasmány... :-)

A bejelentkezés után valami ilyesmit fogsz látni:

May 18 19:51:13 mailserver dovecot: imap-login: Login: user=<bolemanyi.attila@comega7.local>, method=PLAIN, rip=::1, lip=::1, mpid=1441, TLS, session=<vHEF114WXgAAAAAAAAAAAAAAAAAAAAAB>
May 18 19:51:13 mailserver dovecot: imap(bolemanyi.attila@comega7.local): Disconnected: Logged out in=82 out=652
May 18 19:51:13 mailserver dovecot: imap-login: Login: user=<bolemanyi.attila@comega7.local>, method=PLAIN, rip=::1, lip=::1, mpid=1443, TLS, session=<4PgG114WXwAAAAAAAAAAAAAAAAAAAAAB>
May 18 19:51:13 mailserver dovecot: imap(bolemanyi.attila@comega7.local): Disconnected: Logged out in=70 out=652
May 18 19:51:14 mailserver dovecot: imap-login: Login: user=<bolemanyi.attila@comega7.local>, method=PLAIN, rip=::1, lip=::1, mpid=1449, TLS, session=<btMM114WYAAAAAAAAAAAAAAAAAAAAAAB>
May 18 19:51:14 mailserver dovecot: imap-login: Login: user=<bolemanyi.attila@comega7.local>, method=PLAIN, rip=::1, lip=::1, mpid=1450, TLS, session=<8+MM114WYQAAAAAAAAAAAAAAAAAAAAAB>
May 18 19:51:14 mailserver dovecot: imap(bolemanyi.attila@comega7.local): Disconnected: Logged out in=233 out=892
May 18 19:51:14 mailserver dovecot: imap(bolemanyi.attila@comega7.local): Disconnected: Logged out in=320 out=9171

Látszik, hogy működik a titkosított kapcsolódás az IMAP szolgáltatáshoz (TLS session). Ha küldesz egy új levelet, akkor pedig az alábbiakhoz hasonló dolgok fognak történni:

May 18 20:06:30 mailserver postfix/smtpd[1749]: connect from localhost[::1]
May 18 20:06:30 mailserver postfix/smtpd[1749]: 0BE60BFC6D: client=localhost[::1], sasl_method=LOGIN, sasl_username=bolemanyi.attila@comega7.local
May 18 20:06:30 mailserver postfix/cleanup[1753]: 0BE60BFC6D: message-id=<a1abd76f262b4b6e775e829eccc303ab@comega7.local>
May 18 20:06:30 mailserver postfix/qmgr[1626]: 0BE60BFC6D: from=<bolemanyi.attila@comega7.local>, size=1517, nrcpt=1 (queue active)
May 18 20:06:30 mailserver dovecot: lda(wattacukor@comega7.local): msgid=<a1abd76f262b4b6e775e829eccc303ab@comega7.local>: saved mail to INBOX
May 18 20:06:30 mailserver postfix/pipe[1755]: 0BE60BFC6D: to=<wattacukor@comega7.local>, relay=dovecot, delay=0.08, delays=0.03/0/0/0.05, dsn=2.0.0, status=sent (delivered via dovecot service)
May 18 20:06:30 mailserver postfix/cleanup[1753]: 1E37FBFE37: message-id=<20150518180630.1E37FBFE37@mailserver.comega7.local>
May 18 20:06:30 mailserver postfix/bounce[1762]: 0BE60BFC6D: sender delivery status notification: 1E37FBFE37
May 18 20:06:30 mailserver postfix/qmgr[1626]: 1E37FBFE37: from=<>, size=2889, nrcpt=1 (queue active)
May 18 20:06:30 mailserver postfix/qmgr[1626]: 0BE60BFC6D: removed
May 18 20:06:30 mailserver dovecot: imap-login: Login: user=<bolemanyi.attila@comega7.local>, method=PLAIN, rip=::1, lip=::1, mpid=2189, TLS, session=<4mqkDV8WlgAAAAAAAAAAAAAAAAAAAAAB>
May 18 20:06:30 mailserver dovecot: lda(bolemanyi.attila@comega7.local): msgid=<20150518180630.1E37FBFE37@mailserver.comega7.local>: saved mail to INBOX
May 18 20:06:30 mailserver postfix/pipe[1755]: 1E37FBFE37: to=<bolemanyi.attila@comega7.local>, relay=dovecot, delay=0.07, delays=0.01/0/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
May 18 20:06:30 mailserver postfix/qmgr[1626]: 1E37FBFE37: removed
May 18 20:06:30 mailserver postfix/smtpd[1749]: disconnect from localhost[::1]

A fenti sorokból az is látszik, hogy kértem kézbesítési visszaigazolást (sender delivery status notification), valamint működik az 587-es porton való levélküldés, felhasználónévvel és jelszóval (sasl_method, sasl_username), természetesen titkosítva, ahogyan kell.

Jelszócsere - Password plugin

Amint a felhasználók birtokba veszik postafiókjaikat, szinte azonnal jelentkezni fog az egyik leggyakoribb probléma: hol tudják megváltoztatni a jelszavukat? Erre szolgál a Roundcube Password pluginje.

A Roundcube config.inc.php fájlját egészítsük ki egy sorral:

$config['plugins'] = array('password');

Készítsünk egy másolatot a Password plugin konfigurációs fájlról:

cd ./plugins/password
cp config.inc.php.dist config.inc.php

A Password plugin config.inc.php fájl tartalma legyen:

<?php
$config['password_driver'] = 'sql';
$config['password_confirm_current'] = true;
$config['password_minimum_length'] = 8;
$config['password_require_nonalpha'] = false;
$config['password_log'] = true;
$config['password_login_exceptions'] = null;
$config['password_hosts'] = null;
$config['password_force_save'] = false;
$config['password_force_new_user'] = false;
$config['password_db_dsn'] = 'mysql://postfix:Pa$$w0rd@localhost/postfix';
$config['password_query'] = 'UPDATE mailbox SET password=%c WHERE username=%u';
$config['password_crypt_hash'] = 'md5';
$config['password_idn_ascii'] = false;
$config['password_dovecotpw_method'] = 'CRAM-MD5';
$config['password_dovecotpw_with_method'] = false;
$config['password_hash_algorithm'] = 'sha1';
$config['password_hash_base64'] = false;
$config['password_blowfish_cost'] = 12;

Most lépj be a Roundcube programba, és válaszd a jobb felső sarokban a Beállítások menüpontot. A bal oldali menüsorban megjelenik egy új menüpont, Jelszó néven. A többi már gyerekjáték...

Sieve támogatás - szerver oldali üzenetszűrés

A Sieve nem más, mint egy levélszűrő nyelv, amelynek segítségével ügyes kis szabályokat tudunk készíteni, amelyekkel a levelek további sorsa felől dönthetünk. Például a ***SPAM*** jelöléssel rendelkező leveleket egyből a Junk mappába helyezhetjük, mielőtt még egyetlen levelezőprogrammal bejelentkeznénk a postafiókba. De ezzel a kiegészítővel tudunk vakációs (házon kívül vagyok) típusú automatikus válasz üzeneteket is küldeni.

A Dovecot rendelkezik ezzel a kiegészítéssel, és a Roundcube is tudja kezelni ezeket a szabályokat egy erre a célra kifejlesztett plugin segítségével.

Telepítsük fel a szükséges csomagokat:

aptitude install dovecot-sieve dovecot-managesieved

A /etc/dovecot/conf.d/15-lda.conf fájl tartalmát módosítsuk így:

protocol lda {
    mail_plugins = $mail_plugins quota sieve
}

Látható, hogy a quota plugin után bekerült a sieve is. A /etc/dovecot/conf.d/90-sieve.conf fájl tartalma a következő legyen:

plugin {
  sieve = /srv/mail/sieve/%d/%n/.dovecot.sieve
  sieve_dir = /srv/mail/sieve/%d/%n/sieve
}

/etc/dovecot/conf.d/20-managesieve.conf fájl tartalma a következő legyen:

protocols = $protocols sieve
service managesieve-login {
    inet_listener sieve {
    port = 4190
    }
    service_count = 1
    process_min_avail = 0
    vsz_limit = 64M
}
service managesieve {
    process_limit = 1024
}
protocol sieve {
    managesieve_max_line_length = 65536
    mail_max_userip_connections = 10
    managesieve_logout_format = bytes=%i/%o
    managesieve_implementation_string = Dovecot Pigeonhole
    managesieve_max_compile_errors = 5
    log_path = /var/log/sieve.log
    info_log_path = /var/log/sieve.log
}

Készítsük el a sieve szkriptek mappáját:

mkdir /srv/mail/sieve
chown vmail:vmail /srv/mail/sieve

Indítsuk újra a Dovecot szervert:

service dovecot restart

A Dovecot mostantól támogatja a Sieve protokollt, amelyet egy erre alkalmas levelezőprogrammal már akár most is kipróbálhatunk. Nézzük meg, hogyan kell a Roundcube webes levelezőprogramot megtanítani a sieve szűrők kezelésére.

Először is, a Roundcube config.inc.php fájlját egészítsük ki így:

$config['plugins'] = array('password','managesieve');

Készítsük fel a Managesieve plugint a használatra:

cd ./plugins/managesieve
cp config.inc.php.dist config.inc.php

A Managesieve plugin config.inc.php fájl tartalma:

<?php
$config['managesieve_port'] = 4190;
$config['managesieve_host'] = 'localhost';
$config['managesieve_auth_type'] = null;
$config['managesieve_auth_cid'] = null;
$config['managesieve_auth_pw'] = null;
$config['managesieve_usetls'] = false;
$config['managesieve_conn_options'] = null;
$config['managesieve_default'] = '/etc/dovecot/sieve/global';
$config['managesieve_script_name'] = 'managesieve';
$config['managesieve_mbox_encoding'] = 'UTF-8';
$config['managesieve_replace_delimiter'] = '';
$config['managesieve_disabled_extensions'] = array();
$config['managesieve_debug'] = false;
$config['managesieve_kolab_master'] = false;
$config['managesieve_filename_extension'] = '.sieve';
$config['managesieve_filename_exceptions'] = array();
$config['managesieve_domains'] = array();
$config['managesieve_vacation'] = 1;
$config['managesieve_notify_methods'] = array('mailto');

Ezzel készen van a Roundcube is. Ha bejelentkezel és rákattintasz a Beállítások menüpontra, a bal oldalon új menüpontok jelennek meg a Beállítások alatt: az Üzenetszűrők és a Vakáció. Mivel van két postafiókod, így ki is tudod próbálni a vakációs üzeneteket is. Ismételten: jó felfedezést!

Ha most küldesz levelet a másik teszt felhasználónak, a syslog üzenetek is láthatóan megváltoznak: a "dovecot: lda" sorokban a címzett után megjelenik a "sieve" szó is. Egyszóval, a szerver oldali üzenetszűrő köszöni, jól van, és várja a parancsaidat. Akarom mondani, szűrő szkriptjeidet. ;-)

May 18 21:04:54 mailserver postfix/smtpd[3283]: connect from localhost[::1]
May 18 21:04:54 mailserver postfix/smtpd[3283]: 2D681BFE15: client=localhost[::1], sasl_method=LOGIN, sasl_username=bolemanyi.attila@comega7.local
May 18 21:04:54 mailserver postfix/cleanup[3287]: 2D681BFE15: message-id=<a95131bfd373ad82ac848567dd8ab5dc@comega7.local>
May 18 21:04:54 mailserver postfix/qmgr[1626]: 2D681BFE15: from=<bolemanyi.attila@comega7.local>, size=1528, nrcpt=1 (queue active)
May 18 21:04:54 mailserver dovecot: lda(wattacukor@comega7.local): sieve: msgid=<a95131bfd373ad82ac848567dd8ab5dc@comega7.local>: stored mail into mailbox 'INBOX'
May 18 21:04:54 mailserver postfix/pipe[3289]: 2D681BFE15: to=<wattacukor@comega7.local>, relay=dovecot, delay=0.09, delays=0.03/0.01/0/0.05, dsn=2.0.0, status=sent (delivered via dovecot service)
May 18 21:04:54 mailserver postfix/cleanup[3287]: 411D2BFE2E: message-id=<20150518190454.411D2BFE2E@mailserver.comega7.local>
May 18 21:04:54 mailserver postfix/bounce[3292]: 2D681BFE15: sender delivery status notification: 411D2BFE2E
May 18 21:04:54 mailserver postfix/qmgr[1626]: 411D2BFE2E: from=<>, size=2894, nrcpt=1 (queue active)
May 18 21:04:54 mailserver postfix/qmgr[1626]: 2D681BFE15: removed
May 18 21:04:54 mailserver dovecot: imap-login: Login: user=<bolemanyi.attila@comega7.local>, method=PLAIN, rip=::1, lip=::1, mpid=3294, TLS, session=<klqB3l8WxgAAAAAAAAAAAAAAAAAAAAAB>
May 18 21:04:54 mailserver dovecot: lda(bolemanyi.attila@comega7.local): sieve: msgid=<20150518190454.411D2BFE2E@mailserver.comega7.local>: stored mail into mailbox 'INBOX'
May 18 21:04:54 mailserver postfix/pipe[3289]: 411D2BFE2E: to=<bolemanyi.attila@comega7.local>, relay=dovecot, delay=0.07, delays=0.01/0.01/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
May 18 21:04:54 mailserver postfix/qmgr[1626]: 411D2BFE2E: removed
May 18 21:04:54 mailserver postfix/smtpd[3283]: disconnect from localhost[::1]

Roundcube pluginek

A Roundcube még sok hasznos pluginnel rendelkezik, így érdemes átnézni a program plugins mappáját. A beállítások hasonló menetrendet követnek:

Először is, a Roundcube config mappájában található config.inc.php fájlban kell regisztrálni a használni kívánt plugint:

$config['plugins'] = array('password','managesieve','userinfo','filesystem_attachments','emoticons');

Másodszor, amennyiben szükséges, a plugin saját config.inc.php fájljában újabb paramétereket kell beállítanunk.

A fenti pluginek külön beállítást nem igényelnek, így bátran használhatod azokat.

Vírus- és spamszűrés beállítása

A vírusok és a kéretlen reklámlevelek szűrése gyakorlatilag egy külön tudományág, és kétség nélkül kijelenthető, hogy az ennek érdekében hozott rendszabályok és beállítások folyamatos figyelemmel kísérése, és igény szerinti, megfelelő irányban történő változtatása veszi el a legtöbb időt a levelezőszervereket üzemeltető emberek életéből.

Éppen ezért az itt olvasható beállítások ténylegesen csak a belépőt jelentik ebbe a meglehetősen barátságtalannak tűnő világba. Ha naprakész szeretnél maradni, jól teszed, ha rendszeresen látogatod az ilyen témákkal foglalkozó fórumokat és blogbejegyzéseket is. Az ezen a téren felhalmozott és egymás között megoszott tapasztalatokat roppant értékesnek fogod találni, ezt megígérem...

Kezdjük az alapvető csomagok telepítésével:

aptitude install amavisd-new spamassassin clamav-daemon libnet-dns-perl libmail-spf-perl pyzor razor arj bzip2 cabextract cpio file gzip lhasa nomarch pax rar unrar unzip zip zoo

Az Amavis egy keretrendszer, amely sokféle víruskeresőt és levélszemét szűrőt képes közös munkára fogni. Ennek érdekében:

adduser clamav amavis
adduser amavis clamav
su - amavis -s /bin/bash
razor-admin -create
razor-admin -register
pyzor discover
exit

/etc/amavis/conf.d/15-content_filter_mode fájl tartalma:

use strict;
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1;

Indítsuk újra az Amavis szolgáltatást:

service amavis restart

A /etc/postfix.master.cf fájl végéhez adjuk hozzá ezeket a sorokat:

amavis     unix    -       -       -       -       2       smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20

127.0.0.1:10025 inet    n       -       -       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_relay_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

A /etc/postfix/main.cf fájl végén vegyük ki a kommentet az amavisra hivatkozó sor elől:

content_filter = amavis:[127.0.0.1]:10024

Indítsuk újra a Postfix szolgáltatást:

service postfix restart

A Clamav ezen a ponton még nem fog működni, ezért változtassuk meg a /etc/clamav/clamd.conf tartalmában egy sort:

AllowSupplementaryGroups true

Indítsuk újra a víruskereső szolgáltatást:

service clamav-daemon restart

És ezzel készen vagyunk.

Teljesen...

:-)

Egy utolsó(?) teszt

Mert a tesztelésnek soha nincs vége.

Egy újabb tesztlevél fejléce az alábbiakat tartalmazza (érdemes felfigyelni az X-Virus-Scanned sorra):

Return-Path: <bolemanyi.attila@comega7.local>
Delivered-To: wattacukor@comega7.local
Received: from localhost (localhost [127.0.0.1])
    by mailserver.comega7.local (Postfix) with ESMTP id BA412BFF27
    for <wattacukor@comega7.local>; Mon, 18 May 2015 21:37:02 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at mailserver.comega7.local
Received: from mailserver.comega7.local ([127.0.0.1])
    by localhost (mailserver.comega7.local [127.0.0.1]) (amavisd-new, port 10024)
    with ESMTP id KYaaIOpIbwGq for <wattacukor@comega7.local>;
    Mon, 18 May 2015 21:37:01 +0200 (CEST)
Received: from webmail.comega7.local (localhost [IPv6:::1])
    (Authenticated sender: bolemanyi.attila@comega7.local)
    by mailserver.comega7.local (Postfix) with ESMTPSA id 35415BFE15
    for <wattacukor@comega7.local>; Mon, 18 May 2015 21:37:01 +0200 (CEST)
MIME-Version: 1.0
Content-Type: multipart/alternative;
    boundary="=_85c53260ef7b736f209151df5f90ad47"
Date: Mon, 18 May 2015 21:37:01 +0200
From: =?UTF-8?Q?Bolem=C3=A1nyi_Attila?= <bolemanyi.attila@comega7.local>
To: Wattacukor <wattacukor@comega7.local>
Subject: =?UTF-8?Q?Pr=C3=B3balev=C3=A9l_=28sokadik=29?=
Organization: Comega 7 Bt
Reply-To: bolemanyi.attila@comega7.local
Mail-Reply-To: bolemanyi.attila@comega7.local
Return-Receipt-To: =?UTF-8?Q?Bolem=C3=A1nyi_Attila?=
    <bolemanyi.attila@comega7.local>
Disposition-Notification-To: =?UTF-8?Q?Bolem=C3=A1nyi_Attila?=
    <bolemanyi.attila@comega7.local>
Message-ID: <579040459d9b95c6e3064294477f41c2@comega7.local>
X-Sender: bolemanyi.attila@comega7.local
User-Agent: Roundcube Webmail/1.1.1

A syslogban pedig ez látható:

May 18 21:37:17 mailserver postfix/smtpd[3722]: connect from localhost[::1]
May 18 21:37:17 mailserver postfix/smtpd[3722]: 2B652BFE15: client=localhost[::1], sasl_method=LOGIN, sasl_username=wattacukor@comega7.local
May 18 21:37:17 mailserver postfix/cleanup[3727]: 2B652BFE15: message-id=<274d42662ccfa2694830164599c420e1@comega7.local>
May 18 21:37:17 mailserver postfix/qmgr[3687]: 2B652BFE15: from=<>, size=2037, nrcpt=1 (queue active)
May 18 21:37:17 mailserver postfix/smtpd[3722]: disconnect from localhost[::1]
May 18 21:37:17 mailserver dovecot: imap(wattacukor@comega7.local): Disconnected: Logged out in=476 out=2335
May 18 21:37:17 mailserver postfix/smtpd[3771]: connect from localhost[127.0.0.1]
May 18 21:37:17 mailserver postfix/smtpd[3771]: D57ECBFF27: client=localhost[127.0.0.1]
May 18 21:37:17 mailserver postfix/cleanup[3727]: D57ECBFF27: message-id=<274d42662ccfa2694830164599c420e1@comega7.local>
May 18 21:37:17 mailserver postfix/smtpd[3771]: disconnect from localhost[127.0.0.1]
May 18 21:37:17 mailserver postfix/qmgr[3687]: D57ECBFF27: from=<>, size=2539, nrcpt=1 (queue active)
May 18 21:37:17 mailserver amavis[1284]: (01284-02) Passed CLEAN {RelayedOutbound}, LOCAL [::1]:40146 <> -> <bolemanyi.attila@comega7.local>, Queue-ID: 2B652BFE15, Message-ID: <274d42662ccfa2694830164599c420e1@comega7.local>, mail_id: ArV95TwJz5cs, Hits: -0.2, size: 2037, queued_as: D57ECBFF27, 714 ms
May 18 21:37:17 mailserver postfix/smtp[3728]: 2B652BFE15: to=<bolemanyi.attila@comega7.local>, relay=127.0.0.1[127.0.0.1]:10024, delay=0.73, delays=0.01/0/0/0.71, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as D57ECBFF27)
May 18 21:37:17 mailserver postfix/qmgr[3687]: 2B652BFE15: removed
May 18 21:37:17 mailserver dovecot: lda(bolemanyi.attila@comega7.local): sieve: msgid=<274d42662ccfa2694830164599c420e1@comega7.local>: stored mail into mailbox 'INBOX'
May 18 21:37:17 mailserver postfix/pipe[3743]: D57ECBFF27: to=<bolemanyi.attila@comega7.local>, relay=dovecot, delay=0.07, delays=0.02/0/0/0.05, dsn=2.0.0, status=sent (delivered via dovecot service)
May 18 21:37:17 mailserver postfix/qmgr[3687]: D57ECBFF27: removed

Az Amavis tisztának találta a levelet (Passed CLEAN). Ha pedig szeretnél látni egy kis balhét, küldd el az alábbi levelet az egyik teszt felhasználótól a másiknak. Meg fogsz lepődni ;-)

This is the GTUBE, the
	Generic
	Test for
	Unsolicited
	Bulk
	Email

If your spam filter supports it, the GTUBE provides a test by which you
can verify that the filter is installed correctly and is detecting incoming
spam. You can send yourself a test mail containing the following string of
characters (in upper case and with no white spaces and line breaks):

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

You should send this test mail from an account outside of your network.

A levelző nem is továbbítja a leveledet, hanem kapsz egy válaszlevelet, amelyben tájékoztat a rendszer, hogy ezt a szemetet ugyan nem továbbítja sehová.

A syslogban is támadt egy kis ribillió:

May 18 21:47:31 mailserver amavis[1285]: (01285-02) Blocked SPAM {BouncedOutbound,Quarantined}, LOCAL [::1]:40167 <wattacukor@comega7.local> -> <bolemanyi.attila@comega7.local>, quarantine: 5/spam-5kXu6aLa4mZ2.gz, Queue-ID: 41D28BFE15, Message-ID: <82aed3015e262f0722e7eefdb305d64f@comega7.local>, mail_id: 5kXu6aLa4mZ2, Hits: 1000.18, size: 2340, 765 ms
May 18 21:47:31 mailserver postfix/smtp[3853]: 41D28BFE15: to=<bolemanyi.attila@comega7.local>, relay=127.0.0.1[127.0.0.1]:10024, delay=0.8, delays=0.02/0.01/0/0.76, dsn=2.5.0, status=sent(250 2.5.0 Ok, id=01285-02, BOUNCE)

Egy biztos: a vírus- és spamszűrő működik. És miután van egy jól működő levelezőszervered, itt az idő rendesen elolvasni valamennyi idevonatkozó dokumentációt. Az a néhány száz oldal csak nem vág földhöz, nem igaz?

:-)

Amavis finomhangolás

Az Amavis egy trükkös kis jószág. Annyira jól hangzik, hogy képes többféle víruskereső motorral és spamszűrővel is együttműködni, hogy szinte könnybe lábad tőle az ember szeme. Természetesen az Amavis valóban képes erre, azonban a Spamassassinnal való együttműködés azért mégsem annyira egyértelmű.

A jelenlegi összeállításban nem szerepel a Spamassassin démon telepítése, mivel az Amavis önmaga spamszűrője is egyben. Ehhez felhasználja a Spamassassin libraryket, meg beleolvas a Spamassassin konfigurációs fájljaiba is (néhány, az interneten elérhető leírás ezt egyébként tagadja), de ebből nem minden beállítást vesz figyelembe, illetve az Amavis konfigurációs fájlokban meghatározhatunk olyan beállításokat, amelyek előnyt élveznek az ugyanilyen, Spamassassinban beállított értékekkel szemben.

Szóval, nem is annyira egyértelmű ezt a két jómadarat közös munkára fogni, mint az első látásra egyértelmű lenne.

Az alábbiakban igyekszem egy-két pontot tisztázni és ajánlatot tenni néhány kiegészítő beállításra is.

Amikor az Amavis átvizsgál egy levelet, megpróbálja kideríteni, hogy a levél bejövő levél (a címzett postafiókja ezen a szerveren található), vagy pedig kimenő levélről van szó. Ehhez megnézi a @local_domains_acl változó értékét (a /etc/amavis/conf.d/05-domain_id fájlban található), amely alapesetben a levelezőszerver tartománynevét tartalmazza. Abban az esetben viszont, amikor egy szerveren több virtuális domain található, akkor erre a célra ez a változó nem használható. Szerencsére van lehetőségünk egy SQL lekérdezést lefuttatni, amely választ ad erre a kérdésre.

A /etc/amavis/conf.d/50-user fájlnak legyen ez a tartalma:

use strict;

#
# Place your configuration directives here.  They will override those in earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of the directives you can use in this file
#

$sa_tag_level_deflt = -9999; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_spam_subject_tag = '***Possible SPAM***';
$final_spam_destiny  = D_PASS;

@lookup_sql_dsn = ([
   'DBI:mysql:database=postfix;host=127.0.0.1;port=3306',
   'postfix',
   'Pa$$w0rd'
]);

$sql_select_policy = 'SELECT domain FROM domain WHERE CONCAT("@",domain) IN (%k)';

#------------ Do not modify anything below this line -------------
1;  # ensure a defined return

A fenti beállítások több mindent is megoldanak az érdekünkben.

  • A @lookup_sql_dsn változó tartalmazza a postfix adatbázishoz való kapcsolódás paramétereit.
  • A $sql_select_policy által definiált lekérdezést futtatja le az Amavis, amikor átvizsgál egy levelet.
    • Ha az eredmény alapján a vizsgált levél bejövő levélnek minősül (azaz a címzett postafiókja ezen a szerveren található), akkor egyrészt elvégzi a vírus- és spamszűrési feladatokat, másrészt a levél fejlécében elhelyezi az X-Spam-Flag, az X-Spam-Score, az X-Spam-Level és az X-Spam-Status bejegyzéseket. Ezek a bejegyzések csak akkor jelennek meg tehát, ha a levél címzettjének postafiókja a mi szerverünkön található.
    • Ha a vizsgálandó levél kimenő levélnek minősül, akkor az Amavis nem tolja át a szűrőn, így például néhány száz hírlevél kiküldése nem fog órákon keresztül tartani.
  • Az $sa_tag_level_deflt után írt pontszám felett az X-Spam információk bekerülnek a levél fejlécébe.
  • Az $sa_tag2_level_deflt után írt pontszám felett a "Spam detected" fejlécadat is megjelenik.
  • Az $sa_spam_subject_tag határozza meg, hogy az Amavis a levél tárgyába mit írjon, ha egy levelet spamnek osztályozott. Erre a tartalomra viszont a felhasználók könnyen meghatározhatnak például egy szerver oldali szűrőt a sieve segítségével.
  • A $final_spam_destiny pedig a spamnek ítélt levéllel végzendő műveletet határozza meg, amely jelen esetben a felhasználónak való továbbítást jelenti (azzal együtt, hogy a tárgyban már szerepel a vizsgálat eredménye). Az alapértelmezett beállítás szerint az Amavis visszaküldi a levelet a feladónak (D_BOUNCE), aminek nincs sok értelme, ugyanis a raklámlevelek legtöbbje nem létező email címet ad meg feladónak. Mi viszont átadjuk a felhasználóknak (D_PASS), hogy ők hozzák meg a végső döntést a levéllel kapcsolatban.

Indítsuk újra az Amavist:

service amavisd-new restart

Ha a fenti beállítások elmaradnak, hiába is várjuk a levél fejlécében az X-Spam adatokat:

Return-Path: <attila@free-learning.local>
Delivered-To: bolemanyi.attila@comega7.local
Received: from localhost (localhost [127.0.0.1])
    by mailserver.comega7.local (Postfix) with ESMTP id F10A1BF934
    for <bolemanyi.attila@comega7.local>; Wed, 20 May 2015 20:03:11 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at mailserver.comega7.local
Received: from mailserver.comega7.local ([127.0.0.1])
    by localhost (mailserver.comega7.local [127.0.0.1]) (amavisd-new, port 10024)
    with ESMTP id WiocgyLqvvt6 for <bolemanyi.attila@comega7.local>;
    Wed, 20 May 2015 20:03:06 +0200 (CEST)
.
.
.
Content-Transfer-Encoding: 7bit

Ha viszont a fenti beállításokat elvégezzük és újraindítjuk az Amavist, rögtön látszik a különbség:

Return-Path: <attila@free-learning.local>
Delivered-To: bolemanyi.attila@comega7.local
Received: from localhost (localhost [127.0.0.1])
    by mailserver.comega7.local (Postfix) with ESMTP id 5A518BFBEF
    for <bolemanyi.attila@comega7.local>; Wed, 20 May 2015 23:02:03 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at mailserver.comega7.local
X-Spam-Flag: NO
X-Spam-Score: -1
X-Spam-Level:
X-Spam-Status: No, score=-1 tagged_above=-9999 required=6.31
    tests=[ALL_TRUSTED=-1] autolearn=disabled
Received: from mailserver.comega7.local ([127.0.0.1])
    by localhost (mailserver.comega7.local [127.0.0.1]) (amavisd-new, port 10024)
    with ESMTP id IpYCiP3MYct1 for <bolemanyi.attila@comega7.local>;
    Wed, 20 May 2015 23:02:01 +0200 (CEST)
.
.
.
Content-Transfer-Encoding: 8bit

Az X-Spam-Status végén olvasható, hogy a Spamassassin Bayes filtere ki van kapcsolva: autolearn=disabled. Az alapértelmezett telepítés beállításai alapján ez persze be van kapcsolva a Spamassassin /etc/spamassassin/local.cf fájlban, és én csak azért iktattam ki, hogy egyértelmű legyen: az Amavis igenis használja a Spamassassin beállításait (ha nem is az összeset).

Ha a /etc/spamassassin/local.cf fájlban ezek szerepelnek (vagy a telepítéskor egyáltalán nem is nyúlsz hozzá, mivel ezek az alapértelmezett értékek):

use_bayes 1
bayes_auto_learn 1
bayes_auto_expire 0

Akkor, újraindítva az Amavist, egy levél beérkezésekor az alábbiakat találjuk annak fejlécében:

Return-Path: <attila@free-learning.local>
Delivered-To: bolemanyi.attila@comega7.local
Received: from localhost (localhost [127.0.0.1])
    by mailserver.comega7.local (Postfix) with ESMTP id 7DF69BF9C7
    for <bolemanyi.attila@comega7.local>; Wed, 20 May 2015 23:12:38 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at mailserver.comega7.local
X-Spam-Flag: NO
X-Spam-Score: -1
X-Spam-Level:
X-Spam-Status: No, score=-1 tagged_above=-9999 required=6.31
    tests=[ALL_TRUSTED=-1] autolearn=ham autolearn_force=no
Received: from mailserver.comega7.local ([127.0.0.1])
.
.
.
Content-Transfer-Encoding: 8bit

Az X-Spam-Status sorának végén most változott a kép: autolearn=ham. Vagyis a Bayes filter működik és tapasztalatokat szerez. Most éppen hasznosnak ítélte a kapott levelet (ham).

Egy biztos: a Spamassassin és az Amavis párost jól beállítani sok utánajárást és dokumentum olvasást igényel. Ideje hozzálátni...