====== Postfix в качестве почтового шлюза организации ======
Черновик!
===== Список задач =====
* Postfix должен выступать шлюзом для Microsoft Exchange
* Должна проводиться проверка на существование почтового ящика перед приемом письма - как довольно простой этап отсеивания спама
* Серые списки - борьба со спамом
* Проверка антивирусом. Все зараженные письма блокировать
* Проверка и анализ на принадлежность к спаму: пометить письмо, но доставить пользователю
* Dualdelivery. Входящая почта должна доставляться на основной и дополнительный почтовые сервера
===== Используемое ПО =====
* postfix - почтовый сервер (MTA)
* postfix-ldap - для работы с MS Active Directory
* postgrey - серые списки
* amavis - анализатор, использует антивирус и антиспам
* clamav - антивирус
* spamassassin - оценка спама
===== Установка =====
Postfix & Active Directory integration
# apt-get install postfix
Postfix & Active Directory integration
# apt-get install postfix-ldap
Amavis
# apt-get install amavis amavisd-new
ClamAV
# apt-get install clamav clamav-daemon clamav-dreshclam
Архиваторы для распаковки вложений
# apt-get install zoo unzip bzip2 p7zip cpio cabextract tnef pax nomarch lzop altermime arj lhasa ripole unrar
...
===== Интеграция с Microsoft Active Directory =====
Создаем файл ldap_mydomain.ru.cf с примерно таким содержимым:
# Проверка существования почтовых ящиков в Active Directory
server_host = ldap://mydomain.int
server_port = 3268
timeout = 60
search_base = DC=mydomain,DC=int
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)(objectClass=contact)(objectClass=publicFolder)))
result_format = %s
result_attribute = cn
#result_attribute = sAMAccountName
special_result_attribute =
scope = sub
bind = yes
bind_dn = ldaplookup@mydomain.int
bind_pw = LDAPSecretPassword
dereference = 0
domain = mydomain.ru
version=3
debuglevel = 0
#debuglevel = 9
Проверяем как оно работает:
# postmap -q someuser@mydomain.ru ldap://etc/postfix/ldap_mydomain.ru.cf
Если все хорошо и правильно - должны показаться ФИО учетной записи someuser@mydomain.ru
Добавляем проверку в postfix/main.cf:
virtual_mailbox_maps = ldap:/etc/postfix/ldap_mydomain.ru.cf
===== Amavis =====
Настраиваем по очереди в /etc/amavis/conf.d/ (показаны только основные изменения)
**01-debian**
use strict;
$ENV{PATH} = $path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin';
$file = 'file';
$gzip = 'gzip';
$bzip2 = 'bzip2';
$lzop = 'lzop';
$rpm2cpio = ['rpm2cpio.pl','rpm2cpio'];
$cabextract = 'cabextract';
$uncompress = ['uncompress', 'gzip -d', 'zcat'];
$unfreeze = ['unfreeze', 'freeze -d', 'melt', 'fcat'];
$arc = ['nomarch', 'arc'];
$unarj = ['arj', 'unarj'];
$unrar = ['rar', 'unrar']; #disabled (non-free, no security support)
$zoo = 'zoo';
$lha = 'lha';
$lha = undef;
$pax = 'pax';
$cpio = 'cpio';
$ar = 'ar';
$ripole = 'ripole';
$dspam = 'dspam';
1; # ensure a defined return
**15-av_scanners**
### http://www.clamav.net/
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.ctl"],
qr/\bOK$/m, qr/\bFOUND$/m,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
**15-content_filter_mode**
use strict;
# You can modify this file to re-enable SPAM checking through spamassassin
# and to re-enable antivirus checking.
#
# Default antivirus checking mode
# Please note, that anti-virus checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
#
# Default SPAM checking mode
# Please note, that anti-spam checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1; # ensure a defined return
**20-debian_defaults**
use strict;
$QUARANTINEDIR = "$MYHOME/virusmails";
$quarantine_subdir_levels = 1; # enable quarantine dir hashing
$log_recip_templ = undef; # disable by-recipient level-0 log entries
$DO_SYSLOG = 1; # log via syslogd (preferred)
$syslog_ident = 'amavis'; # syslog ident tag, prepended to all messages
$syslog_facility = 'mail';
$syslog_priority = 'debug'; # switch to info to drop debug output, etc
$enable_db = 1; # enable use of BerkeleyDB/libdb (SNMP and nanny)
$enable_global_cache = 1; # enable use of libdb-based cache if $enable_db=1
$inet_socket_port = 10024; # default listening socket
$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt = -999; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.0; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 21.0; # triggers spam evasive actions
$sa_dsn_cutoff_level = 7; # spam level beyond which a DSN is not sent
$sa_mail_body_size_limit = 200*1024; # don't waste time on SA if mail is larger
$sa_local_tests_only = 0; # only tests which do not require internet access?
$MAXLEVELS = 14;
$MAXFILES = 1500;
$MIN_EXPANSION_QUOTA = 100*1024; # bytes
$MAX_EXPANSION_QUOTA = 300*1024*1024; # bytes
$final_virus_destiny = D_DISCARD; # (data not lost, see virus quarantine)
$final_banned_destiny = D_BOUNCE; # D_REJECT when front-end MTA
$final_spam_destiny = D_DISCARD;
$final_bad_header_destiny = D_PASS; # False-positive prone (for spam)
$enable_dkim_verification = 1;
$virus_admin = "postmaster\@$mydomain"; # due to D_DISCARD default
$X_HEADER_LINE = "$myproduct_name at $mydomain";
@viruses_that_fake_sender_maps = (new_RE(
[qr'\bEICAR\b'i => 0], # av test pattern name
[qr/.*/ => 1], # true for everything else
));
@keep_decoded_original_maps = (new_RE(
qr'^MAIL-UNDECIPHERABLE$', # recheck full mail if it contains undecipherables
qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i,
));
$banned_filename_re = new_RE(
# block certain double extensions anywhere in the base name
qr'\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i,
qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?$'i, # Windows Class ID CLSID, strict
qr'^application/x-msdownload$'i, # block these MIME types
qr'^application/x-msdos-program$'i,
qr'^application/hta$'i,
qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl)$'i, # banned extension - basic
qr'^\.(exe-ms)$', # banned file(1) types
);
@score_sender_maps = ({ # a by-recipient hash lookup table,
# results from all matching recipient tables are summed
## site-wide opinions about senders (the '.' matches any recipient)
'.' => [ # the _first_ matching sender determines the score boost
new_RE( # regexp-type lookup table, just happens to be all soft-blacklist
[qr'^(bulkmail|offers|cheapbenefits|earnmoney|foryou)@'i => 5.0],
[qr'^(greatcasino|investments|lose_weight_today|market\.alert)@'i=> 5.0],
[qr'^(money2you|MyGreenCard|new\.tld\.registry|opt-out|opt-in)@'i=> 5.0],
[qr'^(optin|saveonlsmoking2002k|specialoffer|specialoffers)@'i => 5.0],
[qr'^(stockalert|stopsnoring|wantsome|workathome|yesitsfree)@'i => 5.0],
[qr'^(your_friend|greatoffers)@'i => 5.0],
[qr'^(inkjetplanet|marketopt|MakeMoney)\d*@'i => 5.0],
),
{ # a hash-type lookup table (associative array)
#'nobody@cert.org' => -3.0,
#'cert-advisory@us-cert.gov' => -3.0,
#'owner-alert@iss.net' => -3.0,
#'slashdot@slashdot.org' => -3.0,
#'securityfocus.com' => -3.0,
#'ntbugtraq@listserv.ntbugtraq.com' => -3.0,
#'security-alerts@linuxsecurity.com' => -3.0,
#'mailman-announce-admin@python.org' => -3.0,
#'amavis-user-admin@lists.sourceforge.net'=> -3.0,
#'amavis-user-bounces@lists.sourceforge.net' => -3.0,
#'spamassassin.apache.org' => -3.0,
#'notification-return@lists.sophos.com' => -3.0,
#'owner-postfix-users@postfix.org' => -3.0,
#'owner-postfix-announce@postfix.org' => -3.0,
#'owner-sendmail-announce@lists.sendmail.org' => -3.0,
#'sendmail-announce-request@lists.sendmail.org' => -3.0,
#'donotreply@sendmail.org' => -3.0,
#'ca+envelope@sendmail.org' => -3.0,
#'noreply@freshmeat.net' => -3.0,
#'owner-technews@postel.acm.org' => -3.0,
#'ietf-123-owner@loki.ietf.org' => -3.0,
#'cvs-commits-list-admin@gnome.org' => -3.0,
#'rt-users-admin@lists.fsck.com' => -3.0,
#'clp-request@comp.nus.edu.sg' => -3.0,
#'surveys-errors@lists.nua.ie' => -3.0,
#'emailnews@genomeweb.com' => -5.0,
#'yahoo-dev-null@yahoo-inc.com' => -3.0,
#'returns.groups.yahoo.com' => -3.0,
#'clusternews@linuxnetworx.com' => -3.0,
#lc('lvs-users-admin@LinuxVirtualServer.org') => -3.0,
#lc('owner-textbreakingnews@CNNIMAIL12.CNN.COM') => -5.0,
# soft-blacklisting (positive score)
#'sender@example.net' => 3.0,
#'.example.net' => 1.0,
},
], # end of site-wide tables
});
1; # ensure a defined return
**21-ubuntu_defaults**
use strict;
#
# These are Ubuntu specific defaults for amavisd-new configuration
#
# DOMAIN KEYS IDENTIFIED MAIL (DKIM)
$enable_dkim_verification = 1;
# Don't be verbose about sending mail:
@whitelist_sender_acl = qw( .$mydomain );
$final_virus_destiny = D_DISCARD; # (defaults to D_BOUNCE)
$final_banned_destiny = D_DISCARD; # (defaults to D_BOUNCE)
$final_spam_destiny = D_DISCARD; # (defaults to D_REJECT)
$final_bad_header_destiny = D_PASS; # (defaults to D_PASS), D_BOUNCE suggested
#$bad_header_quarantine_to = undef # use this for not quarantine mails with bad_header
$virus_admin = undef;
$spam_admin = undef;
#------------ Do not modify anything below this line -------------
1; # insure a defined return
Ну и все остальное по желанию
===== Dualdelivery - двойная доставка =====
Для некоторых целей требуется чтобы входящая почта пересылалась на несколько серверов: основной и резервный.
Для этого был найдена интересная статейка: http://pjrlost.blogspot.ru/2012/11/smtp-delivery-to-two-mail-servers-via.html
Осталось только немного заменить настройку чтобы почта шла таким путем: Internet -> Postfix -> Amavis(Antivirus -> AntiSpam) -> Postfix -> Dualdelivery -> Мои почтовые сервера
* Устаналиваем msmtp # apt-get install msmtp
* Создаем пользователя smtpdd, создаем папки и даем на них права этому пользователю
* /opt/smtpdd
* /var/spool/smtpdd
* /var/tmp/smtpdd
* Скачиваем файл https://dl.dropbox.com/u/49959760/smtpdd.tar.gz и разворачиваем содержимое в /opt/smtpdd
* Создаем задание cron # crontab -e -u smtpdd
со следующим содержимым: 0 * * * * /opt/smtpdd/smtpdd.sh /var/spool/smtpdd/ qrun > /dev/null 2>&1
* Добавляем в /etc/postfix/main.cf строчки relay_domains = domain.whatever
transport_maps = hash:/etc/postfix/domain.whatever.transport
* Создаем файл /etc/postfix/domain.whatever.transport и прописываем в него адрес нашего основного почтового сервера domain.whatever smtp:[192.168.1.1]
* Даем команду # postmap /etc/postfix/domain.whatever.transport
* Изменяем postfix/master.cf следующим образом: #
# ==========================================================================
smtp inet n - - - - smtpd
## Отправляем письмо в Amavis
-o content_filter=amavis:[127.0.0.1]:10024
-o receive_override_options=no_address_mappings
## Dualdelivery - пересылаем письмо на основной и резервный почтовые сервера
dualdelivery unix - n n - 5 pipe
user=smtpdd argv=/opt/smtpdd/smtpdd.sh /var/spool/smtpdd/ ${sender} ${recipient}
# Options:
# q - deliver and queue if fail
# d - deliver and delete if fail
# o - deliver and only queue the mail
192.168.102.10:25:q 192.168.102.234:25:d
# Amavis
amavis unix - - n - 2 lmtp
-o disable_dns_lookups=yes
-o lmtp_send_xforward_command=yes
-o smtp_data_done_timeout=1200
-o max_use=20
## Получаем письма с Amavis и обрабатываем дальше
127.0.0.1:10025 inet n - n - 2 smtpd
-o content_filter=dualdelivery
-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_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